"""Повторное открытие и расчёт четырёх сохранённых FEM с русскими именами.
Исходные файлы из models/ не перезаписываются.
"""
import os
import sys
import json
import math

script = globals().get('__file__') or (sys.argv[0] if sys.argv else '')
if not script or not os.path.isfile(script):
    raise RuntimeError('Запустите сохранённый verify_models.py в FEMM 5.')
os.chdir(os.path.dirname(os.path.abspath(script)))
with open('results.json') as stream:
    reference = json.load(stream)
index = 1
while os.path.exists('reopened-%02d' % index):
    index += 1
folder = 'reopened-%02d' % index
os.mkdir(folder)
rows = []
for item in reference['saved_models']:
    # FEMM перегружает open('*.fem') как команду открытия документа.
    # Явный режим 'r' выбирает файловое чтение текста вместо нативной команды.
    with open(item['model'], 'r') as stream:
        text = stream.read()
    for name in ['Воздух', 'Сталь — учебная нелинейная кривая',
                 'Обмотка возбуждения', 'Внешняя граница: A = 0']:
        assert name in text, 'Имя свойства не сохранено: '+name
    old = reference['evaluations'][item['id']]
    opendocument(os.path.abspath(item['model']))
    mi_saveas(os.path.join(folder, item['name']+'.fem'))
    mi_analyze(1)
    mi_loadsolution()
    mo_smooth('off')
    mo_clearblock(); mo_groupselectblock(2)
    force = -float(mo_blockintegral(19))
    mo_clearblock()
    linkage = float(mo_getcircuitproperties('Обмотка возбуждения')[2])
    elements = mo_numelements()
    mo_close(); mi_close()
    assert math.isfinite(force) and math.isfinite(linkage)
    assert abs(force/old['force_N']-1) < 1e-6
    assert abs(linkage/old['flux_linkage_Wb_turn']-1) < 1e-6
    assert elements == old['elements']
    rows.append({'name': item['name'], 'force_N': force,
                 'flux_linkage_Wb_turn': linkage, 'elements': elements,
                 'russian_property_names_preserved': True, 'passed': True})
with open(os.path.join(folder, 'verification.json'), 'w') as stream:
    json.dump({'passed': True, 'models': rows}, stream)
print('Повторно открыты и рассчитаны модели:', len(rows), folder)
