# Электромагнит с отдельным якорем
# Шаг 9: Локальные размеры сетки и готовая модель
# Запускайте внутри FEMM 5 через File → Open Python Script.
# Исходные учебные модели не изменяются; новый полевой расчёт не выполняется.
import math
# Новый документ: последующие команды относятся только к нему.
newdocument(0)
mi_probdef(0, "millimeters", "planar", 1e-08, 20, 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)
mi_addmaterial("Магнитопровод 2000", 2000, 2000, 0, complex(0, 0), 0, 0, 0, 1, 0, 0, 0, 0, 0)
# Токи комплексные; код 1 означает последовательную цепь.
mi_addcircprop("Катушка", complex(5, 0), 1)
mi_addboundprop("Нулевой потенциал", 0, 0, 0, 0, 0, 0, complex(0, 0), complex(0, 0), 0, 0, 0)
# Координаты сохранены с исходной точностью; единицы — миллиметры.
_nodes = [
    (-150, -150, 0),
    (150, -150, 0),
    (150, 150, 0),
    (-150, 150, 0),
    (-30, -40, 0),
    (30, -40, 0),
    (30, 20, 0),
    (10, 20, 0),
    (10, -20, 0),
    (-10, -20, 0),
    (-10, 20, 0),
    (-30, 20, 0),
    (-30, 21, 2),
    (30, 21, 2),
    (30, 41, 2),
    (-30, 41, 2),
    (-40, -10, 0),
    (-30, -10, 0),
    (-30, 10, 0),
    (-40, 10, 0),
    (-10, -10, 0),
    (0, -10, 0),
    (0, 10, 0),
    (-10, 10, 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, 8, -1, "", 0, 0),
    (8, 9, -1, "", 0, 0),
    (9, 20, -1, "", 0, 0),
    (10, 11, -1, "", 0, 0),
    (11, 18, -1, "", 0, 0),
    (12, 13, -1, "", 0, 2),
    (13, 14, -1, "", 0, 2),
    (14, 15, -1, "", 0, 2),
    (15, 12, -1, "", 0, 2),
    (17, 4, -1, "", 0, 0),
    (16, 17, -1, "", 0, 0),
    (18, 17, -1, "", 0, 0),
    (18, 19, -1, "", 0, 0),
    (19, 16, -1, "", 0, 0),
    (20, 23, -1, "", 0, 0),
    (20, 21, -1, "", 0, 0),
    (21, 22, -1, "", 0, 0),
    (23, 10, -1, "", 0, 0),
    (22, 23, -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 = [
    (127.5, 127.5, "Воздух", 7.5, "", 0, 0, 1),
    (-20, 0, "Магнитопровод 2000", 1, "", 0, 0, 1),
    (0, 31, "Магнитопровод 2000", 1, "", 0, 2, 1),
    (-35, 0, "Обмоточная область", 1, "Катушка", 0, 0, 100),
    (-5, 0, "Обмоточная область", 1, "Катушка", 0, 0, -100),
    (20, 20.5, "Воздух", 0.20000000000000001, "", 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. Модель полная; автоматический расчёт не запускался.")
