# Трёхфазный магнитопровод: три заданных тока
# Шаг 9: Локальные размеры сетки и готовая модель
# Запускайте внутри 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.05, 1.05, 909456.81766797334, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
# Токи комплексные; код 1 означает последовательную цепь.
mi_addcircprop("Первичная фаза А", complex(1, 0), 1)
mi_addcircprop("Первичная фаза В", complex(-0.5, -0.8660254037844386), 1)
mi_addcircprop("Первичная фаза С", complex(-0.5, 0.8660254037844386), 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),
]
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),
]
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, "Воздух", 11, "", 0, 0, 1),
    (0, 50, "Линейная сталь", 2, "", 0, 0, 1),
    (-77.5, 0, "Обмоточная область", 2, "Первичная фаза А", 0, 0, 200),
    (-42.5, 0, "Обмоточная область", 2, "Первичная фаза А", 0, 0, -200),
    (-17.5, 0, "Обмоточная область", 2, "Первичная фаза В", 0, 0, 200),
    (17.5, 0, "Обмоточная область", 2, "Первичная фаза В", 0, 0, -200),
    (42.5, 0, "Обмоточная область", 2, "Первичная фаза С", 0, 0, 200),
    (77.5, 0, "Обмоточная область", 2, "Первичная фаза С", 0, 0, -200),
    (-30, 35, "Воздух", 2, "", 0, 0, 1),
    (30, 35, "Воздух", 2, "", 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("Готов шаг 9. Модель полная; автоматический расчёт не запускался.")
