"""Откройте во встроенном Python FEMM 5 после задания ROOT.

Нулевой ток проверяет построение, материалы, кириллицу и повторное открытие.
Это не проверка рабочих характеристик. Исходные файлы не изменяются.
"""
import os, sys, json

ROOT = globals().get('TVV_ROOT', '')
if not ROOT:
    raise ValueError('Задайте TVV_ROOT — абсолютный путь к каталогу учебного комплекта')
if ROOT not in sys.path:sys.path.insert(0,ROOT)
from build import build


def load(name):
    with open(ROOT+'/'+name+'.json') as file:return json.loads(file.read())


def new_run():
    parent=globals().get('TVV_OUTPUT_ROOT',ROOT+'/runs')
    if not os.path.exists(parent):os.mkdir(parent)
    for n in range(1,100000):
        folder=parent+'/geometry-%05d'%n
        if not os.path.exists(folder):
            os.mkdir(folder)
            return folder
    raise ValueError('Не удалось создать новый каталог')


folder=new_run()
machine=load('machine');winding=load('winding')['rows']
materials={tag:load(tag+'-bh') for tag in ('rotor','stator')}
model=folder+'/ТВВ-320 — проверка построения.fem'
record={'status':'running','purpose':'zero-current topology and Cyrillic roundtrip only','inputs':{},'programs':{}}
try:
    import hashlib, binascii
    for name in ('machine.json','winding.json','rotor-bh.json','stator-bh.json'):
        record['inputs'][name]=binascii.hexlify(hashlib.sha256(open(ROOT+'/'+name,'rb').read()).digest()).decode()
    for name in ('geometry.py','physics.py','build.py','run_geometry.py'):
        record['programs'][name]=binascii.hexlify(hashlib.sha256(open(ROOT+'/'+name,'rb').read()).digest()).decode()
    record['geometry']=build(globals(),machine,winding,materials,model)
    mi_close()
    opendocument(model)
    mi_analyze(1);mi_loadsolution()
    record['nodes']=mo_numnodes();record['elements']=mo_numelements()
    record['areas_mm2']={}
    for group in (11,101,102,103,104,105,106):
        mo_groupselectblock(group)
        area=mo_blockintegral(5)*1e6
        mo_clearblock()
        expected=(252*machine['rotor']['conductor_width_mm']*machine['rotor']['conductor_height_mm'] if group==11
                  else 18*machine['stator']['conductor_width_mm']*machine['stator']['conductor_height_mm'])
        record['areas_mm2'][str(group)]={'native':area,'independent_rectangles':expected}
        if abs(area-expected)>expected*1e-8:raise ValueError('Площадь проводников не совпадает: группа '+str(group))
    record['circuits']={}
    for name in ['A1 — ветвь статора','A2 — ветвь статора','B1 — ветвь статора','B2 — ветвь статора','C1 — ветвь статора','C2 — ветвь статора','F — возбуждение ротора']:
        record['circuits'][name]=mo_getcircuitproperties(name)
    mo_groupselectblock();record['energy_J']=mo_blockintegral(2);mo_clearblock()
    if abs(record['energy_J'])>1e-12:raise ValueError('Ненулевая энергия при нулевых токах')
    record['status']='passed_zero_current_roundtrip'
    mo_close();mi_close()
    record['outputs']={}
    for suffix in ('.fem','.ans'):
        path=model[:-4]+suffix
        record['outputs'][path.rsplit('/',1)[-1]]=binascii.hexlify(hashlib.sha256(open(path,'rb').read()).digest()).decode()
except Exception as error:
    record['status']='failed';record['error']=str(error)
    raise
finally:
    with open(folder+'/receipt.json','w') as file:file.write(json.dumps(record))
print('TVV_GEOMETRY_RESULT',folder,record['status'])
