# Дополнительные топологии: наружный ротор LRK и линейная асинхронная машина.
# FEMM 5, встроенный MicroPython. Запускайте сохранённый файл из полного ZIP.
import os
import sys
import json

script = globals().get('__file__', '') or (sys.argv[0] if sys.argv else '')
assert script, 'Откройте сохранённый файл во встроенном Python FEMM 5'
os.chdir(os.path.dirname(os.path.abspath(script)))
if 'calculated-course' not in os.listdir('.'):
    os.mkdir('calculated-course')

def real(value):
    return complex(value).real

rows=[]
for name, model in (('lrk','lrk-course.fem'),('DoubleSidedLIM','double-sided-lim-course.fem')):
    opendocument(model)
    mi_saveas('calculated-course/'+name+'.fem')
    mi_analyze(1)
    mi_loadsolution()
    mo_smooth('off')
    row={'model':name,'elements':mo_numelements(),'nodes':mo_numnodes()}
    mo_clearblock()
    if name=='lrk':
        # Группа 2 — весь наружный ротор: магниты и спинка.
        mo_groupselectblock(2)
        row['rotor_torque_Nm']=real(mo_blockintegral(22))
    else:
        # Группа 0 объединяет все тела; выбирается только проводящая пластина.
        mo_selectblock(42,-1.5)
        row['plate_force_WST_N']=[real(mo_blockintegral(18)),real(mo_blockintegral(19))]
        row['plate_force_Lorentz_N']=[real(mo_blockintegral(11)),real(mo_blockintegral(12))]
        row['plate_loss_W']=real(mo_blockintegral(4))
    mo_clearblock()
    rows.append(row)
    mo_close()
    mi_close()
with open('calculated-course/result.json','w') as stream:
    json.dump(rows,stream)
print(json.dumps(rows))
