# Трёхфазный трансформатор: холостой ход
# Шаг 7: Метки замкнутых областей
# Запускайте внутри FEMM 5 через File → Open Python Script.
# Исходные учебные модели не изменяются; новый полевой расчёт не выполняется.
import math
# Новый документ: последующие команды относятся только к нему.
newdocument(0)
mi_probdef(50, "millimeters", "planar", 1e-08, 40, 25, 0)
mi_smartmesh(1)
# Материалы задаются явно, без зависимости от установленной библиотеки.
mi_addmaterial("Воздух", 1, 1, 0, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
mi_addmaterial("Обмоточная область", 1, 1, 0, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
mi_addmaterial("Линейная сталь", 1000, 1000, 0, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
mi_addmaterial("Нелинейная сталь", 1, 1, 0, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
mi_addbhpoint("Нелинейная сталь", 0, 0)
mi_addbhpoint("Нелинейная сталь", 0.25, 100)
mi_addbhpoint("Нелинейная сталь", 0.5, 200)
mi_addbhpoint("Нелинейная сталь", 0.90000000000000002, 400)
mi_addbhpoint("Нелинейная сталь", 1.2, 800)
mi_addbhpoint("Нелинейная сталь", 1.45, 2000)
mi_addbhpoint("Нелинейная сталь", 1.6000000000000001, 5000)
mi_addbhpoint("Нелинейная сталь", 1.7, 10000)
mi_addmaterial("Постоянный магнит", 1.05, 1.05, 909456.81766797334, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
# Токи комплексные; код 1 означает последовательную цепь.
mi_addcircprop("Первичная фаза А", complex(-0.099954836828649404, -0.48640204063636233), 1)
mi_addcircprop("Первичная фаза В", complex(-0.30046856274431327, 0.16047423486517901), 1)
mi_addcircprop("Первичная фаза С", complex(0.35688255274411812, 0.31649362216577392), 1)
mi_addcircprop("Вторичная фаза А", complex(0, 0), 1)
mi_addcircprop("Вторичная фаза В", complex(0, 0), 1)
mi_addcircprop("Вторичная фаза С", complex(0, 0), 1)
mi_addboundprop("Нулевой потенциал", 0, 0, 0, 0, 0, 0, complex(0, 0), complex(0, 0), 0, 0, 0)
# Координаты сохранены с исходной точностью; единицы — миллиметры.
_nodes = [
    (-220, -220, 0),
    (220, -220, 0),
    (220, 220, 0),
    (-220, 220, 0),
    (-70, -60, 0),
    (70, -60, 0),
    (70, 60, 0),
    (-70, 60, 0),
    (-50, -40, 0),
    (-10, -40, 0),
    (-10, 40, 0),
    (-50, 40, 0),
    (10, -40, 0),
    (50, -40, 0),
    (50, 40, 0),
    (10, 40, 0),
    (-80, -25, 0),
    (-75, -25, 0),
    (-75, 25, 0),
    (-80, 25, 0),
    (-45, -25, 0),
    (-40, -25, 0),
    (-40, 25, 0),
    (-45, 25, 0),
    (-20, -25, 0),
    (-15, -25, 0),
    (-15, 25, 0),
    (-20, 25, 0),
    (15, -25, 0),
    (20, -25, 0),
    (20, 25, 0),
    (15, 25, 0),
    (40, -25, 0),
    (45, -25, 0),
    (45, 25, 0),
    (40, 25, 0),
    (75, -25, 0),
    (80, -25, 0),
    (80, 25, 0),
    (75, 25, 0),
    (-88, -25, 0),
    (-83, -25, 0),
    (-83, 25, 0),
    (-88, 25, 0),
    (-39, -25, 0),
    (-35, -25, 0),
    (-35, 25, 0),
    (-39, 25, 0),
    (-27, -25, 0),
    (-22, -25, 0),
    (-22, 25, 0),
    (-27, 25, 0),
    (22, -25, 0),
    (27, -25, 0),
    (27, 25, 0),
    (22, 25, 0),
    (35, -25, 0),
    (39, -25, 0),
    (39, 25, 0),
    (35, 25, 0),
    (83, -25, 0),
    (88, -25, 0),
    (88, 25, 0),
    (83, 25, 0),
]
for x, y, group in _nodes:
    mi_addnode(x, y)
    if group:
        mi_selectnode(x, y)
        mi_setnodeprop('', group)
        mi_clearselected()
# Отрезки: индексы узлов, локальный размер, имя границы, видимость, группа.
_segments = [
    (0, 1, -1, "Нулевой потенциал", 0, 0),
    (1, 2, -1, "Нулевой потенциал", 0, 0),
    (2, 3, -1, "Нулевой потенциал", 0, 0),
    (3, 0, -1, "Нулевой потенциал", 0, 0),
    (4, 5, -1, "", 0, 0),
    (5, 6, -1, "", 0, 0),
    (6, 7, -1, "", 0, 0),
    (7, 4, -1, "", 0, 0),
    (8, 9, -1, "", 0, 0),
    (9, 10, -1, "", 0, 0),
    (10, 11, -1, "", 0, 0),
    (11, 8, -1, "", 0, 0),
    (12, 13, -1, "", 0, 0),
    (13, 14, -1, "", 0, 0),
    (14, 15, -1, "", 0, 0),
    (15, 12, -1, "", 0, 0),
    (16, 17, -1, "", 0, 0),
    (17, 18, -1, "", 0, 0),
    (18, 19, -1, "", 0, 0),
    (19, 16, -1, "", 0, 0),
    (20, 21, -1, "", 0, 0),
    (21, 22, -1, "", 0, 0),
    (22, 23, -1, "", 0, 0),
    (23, 20, -1, "", 0, 0),
    (24, 25, -1, "", 0, 0),
    (25, 26, -1, "", 0, 0),
    (26, 27, -1, "", 0, 0),
    (27, 24, -1, "", 0, 0),
    (28, 29, -1, "", 0, 0),
    (29, 30, -1, "", 0, 0),
    (30, 31, -1, "", 0, 0),
    (31, 28, -1, "", 0, 0),
    (32, 33, -1, "", 0, 0),
    (33, 34, -1, "", 0, 0),
    (34, 35, -1, "", 0, 0),
    (35, 32, -1, "", 0, 0),
    (36, 37, -1, "", 0, 0),
    (37, 38, -1, "", 0, 0),
    (38, 39, -1, "", 0, 0),
    (39, 36, -1, "", 0, 0),
    (40, 41, -1, "", 0, 0),
    (41, 42, -1, "", 0, 0),
    (42, 43, -1, "", 0, 0),
    (43, 40, -1, "", 0, 0),
    (44, 45, -1, "", 0, 0),
    (45, 46, -1, "", 0, 0),
    (46, 47, -1, "", 0, 0),
    (47, 44, -1, "", 0, 0),
    (48, 49, -1, "", 0, 0),
    (49, 50, -1, "", 0, 0),
    (50, 51, -1, "", 0, 0),
    (51, 48, -1, "", 0, 0),
    (52, 53, -1, "", 0, 0),
    (53, 54, -1, "", 0, 0),
    (54, 55, -1, "", 0, 0),
    (55, 52, -1, "", 0, 0),
    (56, 57, -1, "", 0, 0),
    (57, 58, -1, "", 0, 0),
    (58, 59, -1, "", 0, 0),
    (59, 56, -1, "", 0, 0),
    (60, 61, -1, "", 0, 0),
    (61, 62, -1, "", 0, 0),
    (62, 63, -1, "", 0, 0),
    (63, 60, -1, "", 0, 0),
]
for a, b, size, boundary, hidden, group in _segments:
    x0, y0 = _nodes[a][:2]
    x1, y1 = _nodes[b][:2]
    mi_addsegment(x0, y0, x1, y1)
    mi_selectsegment((x0+x1)/2, (y0+y1)/2)
    mi_setsegmentprop(boundary, size, 1 if size <= 0 else 0, hidden, group)
    mi_clearselected()
# Метки: положение, материал, размер элемента, цепь, намагничивание, группа, витки.
_labels = [
    (187, 187, "", 0, "", 0, 0, 1),
    (0, 50, "", 0, "", 0, 0, 1),
    (-77.5, 0, "", 0, "", 0, 0, 1),
    (-42.5, 0, "", 0, "", 0, 0, 1),
    (-17.5, 0, "", 0, "", 0, 0, 1),
    (17.5, 0, "", 0, "", 0, 0, 1),
    (42.5, 0, "", 0, "", 0, 0, 1),
    (77.5, 0, "", 0, "", 0, 0, 1),
    (-85.5, 0, "", 0, "", 0, 0, 1),
    (-37, 0, "", 0, "", 0, 0, 1),
    (-24.5, 0, "", 0, "", 0, 0, 1),
    (24.5, 0, "", 0, "", 0, 0, 1),
    (37, 0, "", 0, "", 0, 0, 1),
    (85.5, 0, "", 0, "", 0, 0, 1),
    (-30, 35, "", 0, "", 0, 0, 1),
    (30, 35, "", 0, "", 0, 0, 1),
]
for x, y, material, size, circuit, direction, group, turns in _labels:
    mi_addblocklabel(x, y)
    if material:
        mi_selectlabel(x, y)
        mi_setblockprop(material, 1 if size <= 0 else 0, size, circuit, direction, group, turns)
        mi_clearselected()
mi_zoomnatural()
# Скрипт воспроизводит этап в памяти. При необходимости сохраните свою копию через File → Save As.
print("Готов шаг 7. Модель неполная: переходите к следующему этапу, не запускайте решение.")
