# Укрупнение ротора и явная сетка: только после отдельной проверки.
# Пазовая катушка: отдельная проверяемая копия собственного построителя.
"""Самостоятельная сборка по адаптированным входам; штатный API FEMM 5."""
from geometry import make_geometry, emit_geometry
from physics import dq0_to_abc
import math

DEFAULT_MESH={'arc_deg':2.0,'edge_mm':12.0,'copper_mm':9.0,'iron_mm':22.0,'gap_mm':14.0,'outer_mm':120.0}


def build(api, machine, winding, materials, path, mesh=None, theta_deg=0, currents=(0,0,0)):
    """Токи d,q,f в А. Функция не утверждает подтверждённость входных данных."""
    mesh=DEFAULT_MESH.copy() if mesh is None else mesh
    api['newdocument'](0)
    api['mi_smartmesh'](0)
    api['mi_probdef'](0,'millimeters','planar',1e-8,machine['geometry']['stack_length_mm'],30)
    for name in ('Воздух','Область обмотки'):
        api['mi_addmaterial'](name,1,1,0,0,0)
    # Нулевая проводимость области заданного тока: не моделируем вихревые токи
    # и не приписываем сплошному прямоугольнику сопротивление полого стержня.
    api['mi_addmaterial']('Сталь ротора',1,1,0,0,0)
    api['mi_addmaterial']('Сталь статора',1,1,0,0,0,.5,0,machine['stator']['stack_factor'],0)
    for tag,name in (('rotor','Сталь ротора'),('stator','Сталь статора')):
        for b,h in materials[tag]['points']:
            api['mi_addbhpoint'](name,b,h)
    api['mi_addboundprop']('Внешняя граница A=0',0,0,0,0,0,0,0,0,0)
    phase=dq0_to_abc([currents[0],currents[1],0],math.radians(theta_deg))
    for k,letter in enumerate('ABC'):
        for branch in (1,2):
            api['mi_addcircprop'](letter+str(branch)+' — ветвь статора',phase[k]/2,1)
    api['mi_addcircprop']('F — возбуждение ротора',currents[2],1)
    geometry=make_geometry(machine,winding,theta_deg,rotor_discrete=False)
    count=emit_geometry(geometry,api,mesh)
    api['mi_saveas'](path)
    return {'nodes_created':count,'edge_count':len(geometry['edges']),
            'label_count':len(geometry['labels']),'copper_sides':sum(bool(r['circuit']) for r in geometry['labels']),
            'stator_sides':108,'rotor_sides':36,'mesh':mesh,'theta_deg':theta_deg,
            'currents_dqf_A':currents,'status':'diagnostic_geometry_not_physical_validation'}
