# Машина со встроенными постоянными магнитами
# Шаг 7: Метки замкнутых областей
# Запускайте внутри FEMM 5 через File → Open Python Script.
# Исходные учебные модели не изменяются; новый полевой расчёт не выполняется.
import math
# Новый документ: последующие команды относятся только к нему.
newdocument(0)
mi_probdef(0, "millimeters", "planar", 1e-08, 80, 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(1.0000000000000002, 0), 1)
mi_addcircprop("Фаза В", complex(1.0000000000000002, 0), 1)
mi_addcircprop("Фаза С", complex(-2, 0), 1)
mi_addboundprop("Нулевой потенциал", 0, 0, 0, 0, 0, 0, complex(0, 0), complex(0, 0), 0, 0, 0)
# Координаты сохранены с исходной точностью; единицы — миллиметры.
_nodes = [
    (-170, -170, 0),
    (170, -170, 0),
    (170, 170, 0),
    (-170, 170, 0),
    (60, 0, 0),
    (59.552769098479317, 7.3121606043088487, 0),
    (55.230291207146422, 23.443867709356425, 0),
    (47.918130602837572, 36.108901389122899, 0),
    (36.108901389122906, 47.918130602837572, 0),
    (23.443867709356422, 55.230291207146422, 0),
    (7.3121606043088496, 59.552769098479317, 0),
    (3.6738190614671318e-15, 60, 0),
    (-7.3121606043088416, 59.552769098479324, 0),
    (-23.443867709356425, 55.230291207146415, 0),
    (-36.108901389122906, 47.918130602837564, 0),
    (-47.918130602837579, 36.108901389122892, 0),
    (-55.230291207146422, 23.443867709356425, 0),
    (-59.552769098479317, 7.3121606043088523, 0),
    (-60, 7.3476381229342635e-15, 0),
    (-59.552769098479324, -7.312160604308839, 0),
    (-55.230291207146422, -23.443867709356415, 0),
    (-47.918130602837572, -36.108901389122906, 0),
    (-36.108901389122899, -47.918130602837572, 0),
    (-23.443867709356429, -55.230291207146415, 0),
    (-7.3121606043088301, -59.552769098479324, 0),
    (-1.1021457184401395e-14, -60, 0),
    (7.3121606043088612, -59.552769098479317, 0),
    (23.443867709356411, -55.230291207146429, 0),
    (36.108901389122877, -47.918130602837586, 0),
    (47.918130602837572, -36.108901389122899, 0),
    (55.230291207146415, -23.443867709356432, 0),
    (59.552769098479324, -7.3121606043088336, 0),
    (100, 0, 0),
    (99.254615164132204, 12.186934340514748, 0),
    (92.050485345244041, 39.07311284892738, 0),
    (79.863551004729288, 60.181502315204824, 0),
    (60.181502315204838, 79.863551004729288, 0),
    (39.073112848927373, 92.050485345244041, 0),
    (12.18693434051475, 99.254615164132204, 0),
    (6.1230317691118863e-15, 100, 0),
    (-12.186934340514737, 99.254615164132204, 0),
    (-39.07311284892738, 92.050485345244027, 0),
    (-60.181502315204838, 79.863551004729274, 0),
    (-79.863551004729288, 60.181502315204817, 0),
    (-92.050485345244041, 39.07311284892738, 0),
    (-99.254615164132204, 12.186934340514755, 0),
    (-100, 1.2246063538223773e-14, 0),
    (-99.254615164132204, -12.18693434051473, 0),
    (-92.050485345244041, -39.073112848927352, 0),
    (-79.863551004729288, -60.181502315204838, 0),
    (-60.181502315204824, -79.863551004729288, 0),
    (-39.07311284892738, -92.050485345244027, 0),
    (-12.186934340514718, -99.254615164132204, 0),
    (-1.8369095307335659e-14, -100, 0),
    (12.186934340514769, -99.254615164132204, 0),
    (39.073112848927352, -92.050485345244056, 0),
    (60.181502315204796, -79.863551004729302, 0),
    (79.863551004729288, -60.181502315204824, 0),
    (92.050485345244027, -39.073112848927387, 0),
    (99.254615164132204, -12.186934340514723, 0),
    (84.366422889512378, -10.358894189437514, 0),
    (85, -2.0818308014980413e-14, 0),
    (84.366422889512364, 10.358894189437548, 0),
    (78.242912543457436, 33.212145921588274, 0),
    (67.884018354019886, 51.154276967924105, 0),
    (51.154276967924112, 67.884018354019886, 0),
    (33.212145921588267, 78.242912543457436, 0),
    (10.358894189437537, 84.366422889512364, 0),
    (5.2045770037451033e-15, 85, 0),
    (-10.358894189437526, 84.366422889512378, 0),
    (-33.212145921588274, 78.242912543457422, 0),
    (-51.154276967924112, 67.884018354019886, 0),
    (-67.884018354019901, 51.154276967924091, 0),
    (-78.242912543457436, 33.212145921588274, 0),
    (-84.366422889512364, 10.358894189437541, 0),
    (-85, 1.0409154007490207e-14, 0),
    (-84.366422889512378, -10.358894189437521, 0),
    (-78.242912543457436, -33.212145921588252, 0),
    (-67.884018354019886, -51.154276967924112, 0),
    (-51.154276967924105, -67.884018354019886, 0),
    (-33.212145921588274, -78.242912543457422, 0),
    (-10.35889418943751, -84.366422889512378, 0),
    (-1.561373101123531e-14, -85, 0),
    (10.358894189437553, -84.366422889512364, 0),
    (33.212145921588245, -78.242912543457436, 0),
    (51.154276967924076, -67.884018354019915, 0),
    (67.884018354019886, -51.154276967924105, 0),
    (78.242912543457422, -33.212145921588281, 0),
    (18, 0, 2),
    (17.865830729543795, 2.1936481812926547, 2),
    (16.569087362143925, 7.0331603128069275, 2),
    (14.37543918085127, 10.832670416736869, 2),
    (10.832670416736871, 14.37543918085127, 2),
    (7.0331603128069267, 16.569087362143925, 2),
    (2.1936481812926547, 17.865830729543795, 2),
    (1.1021457184401395e-15, 18, 2),
    (-2.1936481812926525, 17.865830729543799, 2),
    (-7.0331603128069275, 16.569087362143925, 2),
    (-10.832670416736871, 14.375439180851268, 2),
    (-14.375439180851274, 10.832670416736867, 2),
    (-16.569087362143925, 7.0331603128069275, 2),
    (-17.865830729543795, 2.193648181292656, 2),
    (-18, 2.2042914368802791e-15, 2),
    (-17.865830729543799, -2.1936481812926516, 2),
    (-16.569087362143925, -7.033160312806924, 2),
    (-14.37543918085127, -10.832670416736871, 2),
    (-10.832670416736869, -14.37543918085127, 2),
    (-7.0331603128069293, -16.569087362143925, 2),
    (-2.1936481812926489, -17.865830729543799, 2),
    (-3.3064371553204186e-15, -18, 2),
    (2.1936481812926583, -17.865830729543795, 2),
    (7.0331603128069231, -16.569087362143929, 2),
    (10.832670416736862, -14.375439180851275, 2),
    (14.37543918085127, -10.832670416736869, 2),
    (16.569087362143925, -7.0331603128069302, 2),
    (17.865830729543799, -2.1936481812926503, 2),
    (58, 0, 2),
    (57.567676795196675, 7.0684219174985534, 2),
    (53.389281500241545, 22.662405452377879, 2),
    (46.320859582742983, 34.9052713428188, 2),
    (34.905271342818807, 46.320859582742983, 2),
    (22.662405452377875, 53.389281500241545, 2),
    (7.0684219174985543, 57.567676795196675, 2),
    (3.551358426084894e-15, 58, 2),
    (-7.0684219174985472, 57.567676795196682, 2),
    (-22.662405452377879, 53.389281500241538, 2),
    (-34.905271342818807, 46.320859582742976, 2),
    (-46.32085958274299, 34.905271342818793, 2),
    (-53.389281500241545, 22.662405452377879, 2),
    (-57.567676795196675, 7.0684219174985579, 2),
    (-58, 7.1027168521697881e-15, 2),
    (-57.567676795196682, -7.0684219174985436, 2),
    (-53.389281500241545, -22.662405452377865, 2),
    (-46.320859582742983, -34.905271342818807, 2),
    (-34.9052713428188, -46.320859582742983, 2),
    (-22.662405452377882, -53.389281500241538, 2),
    (-7.0684219174985357, -57.567676795196682, 2),
    (-1.0654075278254682e-14, -58, 2),
    (7.0684219174985659, -57.567676795196675, 2),
    (22.662405452377861, -53.389281500241552, 2),
    (34.905271342818779, -46.320859582742997, 2),
    (46.320859582742983, -34.9052713428188, 2),
    (53.389281500241538, -22.662405452377886, 2),
    (57.567676795196682, -7.0684219174985392, 2),
    (43, -11, 2),
    (47, -11, 2),
    (47, 11, 2),
    (43, 11, 2),
    (11.000000000000002, 43, 2),
    (11.000000000000004, 47, 2),
    (-10.999999999999996, 47, 2),
    (-10.999999999999998, 43, 2),
    (-43, 11.000000000000005, 2),
    (-47, 11.000000000000005, 2),
    (-47, -10.999999999999995, 2),
    (-43, -10.999999999999995, 2),
    (-11.000000000000007, -43, 2),
    (-11.000000000000009, -47, 2),
    (10.999999999999991, -47, 2),
    (10.999999999999993, -43, 2),
]
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),
    (31, 60, -1, "", 0, 0),
    (5, 62, -1, "", 0, 0),
    (6, 63, -1, "", 0, 0),
    (7, 64, -1, "", 0, 0),
    (8, 65, -1, "", 0, 0),
    (9, 66, -1, "", 0, 0),
    (10, 67, -1, "", 0, 0),
    (12, 69, -1, "", 0, 0),
    (13, 70, -1, "", 0, 0),
    (14, 71, -1, "", 0, 0),
    (15, 72, -1, "", 0, 0),
    (16, 73, -1, "", 0, 0),
    (17, 74, -1, "", 0, 0),
    (19, 76, -1, "", 0, 0),
    (20, 77, -1, "", 0, 0),
    (21, 78, -1, "", 0, 0),
    (22, 79, -1, "", 0, 0),
    (23, 80, -1, "", 0, 0),
    (24, 81, -1, "", 0, 0),
    (26, 83, -1, "", 0, 0),
    (27, 84, -1, "", 0, 0),
    (28, 85, -1, "", 0, 0),
    (29, 86, -1, "", 0, 0),
    (30, 87, -1, "", 0, 0),
    (144, 145, -1, "", 0, 2),
    (145, 146, -1, "", 0, 2),
    (146, 147, -1, "", 0, 2),
    (147, 144, -1, "", 0, 2),
    (148, 149, -1, "", 0, 2),
    (149, 150, -1, "", 0, 2),
    (150, 151, -1, "", 0, 2),
    (151, 148, -1, "", 0, 2),
    (152, 153, -1, "", 0, 2),
    (153, 154, -1, "", 0, 2),
    (154, 155, -1, "", 0, 2),
    (155, 152, -1, "", 0, 2),
    (156, 157, -1, "", 0, 2),
    (157, 158, -1, "", 0, 2),
    (158, 159, -1, "", 0, 2),
    (159, 156, -1, "", 0, 2),
]
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()
# Дуги: угол против часовой стрелки и максимальный угол элемента в градусах.
_arcs = [
    (4, 5, 7, 10, "", 0, 0),
    (5, 6, 16, 10, "", 0, 0),
    (6, 7, 14, 10, "", 0, 0),
    (7, 8, 16, 10, "", 0, 0),
    (8, 9, 14, 10, "", 0, 0),
    (9, 10, 16, 10, "", 0, 0),
    (10, 11, 7, 10, "", 0, 0),
    (11, 12, 7, 10, "", 0, 0),
    (12, 13, 16, 10, "", 0, 0),
    (13, 14, 14, 10, "", 0, 0),
    (14, 15, 16, 10, "", 0, 0),
    (15, 16, 14, 10, "", 0, 0),
    (16, 17, 16, 10, "", 0, 0),
    (17, 18, 7, 10, "", 0, 0),
    (18, 19, 7, 10, "", 0, 0),
    (19, 20, 16, 10, "", 0, 0),
    (20, 21, 14, 10, "", 0, 0),
    (21, 22, 16, 10, "", 0, 0),
    (22, 23, 14, 10, "", 0, 0),
    (23, 24, 16, 10, "", 0, 0),
    (24, 25, 7, 10, "", 0, 0),
    (25, 26, 7, 10, "", 0, 0),
    (26, 27, 16, 10, "", 0, 0),
    (27, 28, 14, 10, "", 0, 0),
    (28, 29, 16, 10, "", 0, 0),
    (29, 30, 14, 10, "", 0, 0),
    (30, 31, 16, 10, "", 0, 0),
    (31, 4, 7, 10, "", 0, 0),
    (32, 33, 7, 10, "", 0, 0),
    (33, 34, 16, 10, "", 0, 0),
    (34, 35, 14, 10, "", 0, 0),
    (35, 36, 16, 10, "", 0, 0),
    (36, 37, 14, 10, "", 0, 0),
    (37, 38, 16, 10, "", 0, 0),
    (38, 39, 7, 10, "", 0, 0),
    (39, 40, 7, 10, "", 0, 0),
    (40, 41, 16, 10, "", 0, 0),
    (41, 42, 14, 10, "", 0, 0),
    (42, 43, 16, 10, "", 0, 0),
    (43, 44, 14, 10, "", 0, 0),
    (44, 45, 16, 10, "", 0, 0),
    (45, 46, 7, 10, "", 0, 0),
    (46, 47, 7, 10, "", 0, 0),
    (47, 48, 16, 10, "", 0, 0),
    (48, 49, 14, 10, "", 0, 0),
    (49, 50, 16, 10, "", 0, 0),
    (50, 51, 14, 10, "", 0, 0),
    (51, 52, 16, 10, "", 0, 0),
    (52, 53, 7, 10, "", 0, 0),
    (53, 54, 7, 10, "", 0, 0),
    (54, 55, 16, 10, "", 0, 0),
    (55, 56, 14, 10, "", 0, 0),
    (56, 57, 16, 10, "", 0, 0),
    (57, 58, 14, 10, "", 0, 0),
    (58, 59, 16, 10, "", 0, 0),
    (59, 32, 7, 10, "", 0, 0),
    (60, 61, 7, 10, "", 0, 0),
    (61, 62, 7, 10, "", 0, 0),
    (63, 64, 14, 10, "", 0, 0),
    (65, 66, 14, 10, "", 0, 0),
    (67, 68, 7, 10, "", 0, 0),
    (68, 69, 7, 10, "", 0, 0),
    (70, 71, 14, 10, "", 0, 0),
    (72, 73, 14, 10, "", 0, 0),
    (74, 75, 7, 10, "", 0, 0),
    (75, 76, 7, 10, "", 0, 0),
    (77, 78, 14, 10, "", 0, 0),
    (79, 80, 14, 10, "", 0, 0),
    (81, 82, 7, 10, "", 0, 0),
    (82, 83, 7, 10, "", 0, 0),
    (84, 85, 14, 10, "", 0, 0),
    (86, 87, 14, 10, "", 0, 0),
    (88, 89, 7, 10, "", 0, 2),
    (89, 90, 16, 10, "", 0, 2),
    (90, 91, 14, 10, "", 0, 2),
    (91, 92, 16, 10, "", 0, 2),
    (92, 93, 14, 10, "", 0, 2),
    (93, 94, 16, 10, "", 0, 2),
    (94, 95, 7, 10, "", 0, 2),
    (95, 96, 7, 10, "", 0, 2),
    (96, 97, 16, 10, "", 0, 2),
    (97, 98, 14, 10, "", 0, 2),
    (98, 99, 16, 10, "", 0, 2),
    (99, 100, 14, 10, "", 0, 2),
    (100, 101, 16, 10, "", 0, 2),
    (101, 102, 7, 10, "", 0, 2),
    (102, 103, 7, 10, "", 0, 2),
    (103, 104, 16, 10, "", 0, 2),
    (104, 105, 14, 10, "", 0, 2),
    (105, 106, 16, 10, "", 0, 2),
    (106, 107, 14, 10, "", 0, 2),
    (107, 108, 16, 10, "", 0, 2),
    (108, 109, 7, 10, "", 0, 2),
    (109, 110, 7, 10, "", 0, 2),
    (110, 111, 16, 10, "", 0, 2),
    (111, 112, 14, 10, "", 0, 2),
    (112, 113, 16, 10, "", 0, 2),
    (113, 114, 14, 10, "", 0, 2),
    (114, 115, 16, 10, "", 0, 2),
    (115, 88, 7, 10, "", 0, 2),
    (116, 117, 7, 10, "", 0, 2),
    (117, 118, 16, 10, "", 0, 2),
    (118, 119, 14, 10, "", 0, 2),
    (119, 120, 16, 10, "", 0, 2),
    (120, 121, 14, 10, "", 0, 2),
    (121, 122, 16, 10, "", 0, 2),
    (122, 123, 7, 10, "", 0, 2),
    (123, 124, 7, 10, "", 0, 2),
    (124, 125, 16, 10, "", 0, 2),
    (125, 126, 14, 10, "", 0, 2),
    (126, 127, 16, 10, "", 0, 2),
    (127, 128, 14, 10, "", 0, 2),
    (128, 129, 16, 10, "", 0, 2),
    (129, 130, 7, 10, "", 0, 2),
    (130, 131, 7, 10, "", 0, 2),
    (131, 132, 16, 10, "", 0, 2),
    (132, 133, 14, 10, "", 0, 2),
    (133, 134, 16, 10, "", 0, 2),
    (134, 135, 14, 10, "", 0, 2),
    (135, 136, 16, 10, "", 0, 2),
    (136, 137, 7, 10, "", 0, 2),
    (137, 138, 7, 10, "", 0, 2),
    (138, 139, 16, 10, "", 0, 2),
    (139, 140, 14, 10, "", 0, 2),
    (140, 141, 16, 10, "", 0, 2),
    (141, 142, 14, 10, "", 0, 2),
    (142, 143, 16, 10, "", 0, 2),
    (143, 116, 7, 10, "", 0, 2),
]
for a, b, angle, max_angle, boundary, hidden, group in _arcs:
    x0, y0 = _nodes[a][:2]
    x1, y1 = _nodes[b][:2]
    mi_addarc(x0, y0, x1, y1, angle, max_angle)
    half = math.radians(angle)/2
    cx = (x0+x1)/2 - (y1-y0)/(2*math.tan(half))
    cy = (y0+y1)/2 + (x1-x0)/(2*math.tan(half))
    xm = cx + (x0-cx)*math.cos(half) - (y0-cy)*math.sin(half)
    ym = cy + (x0-cx)*math.sin(half) + (y0-cy)*math.cos(half)
    mi_selectarcsegment(xm, ym)
    mi_setarcsegmentprop(max_angle, boundary, hidden, group)
    mi_clearselected()
# Метки: положение, материал, размер элемента, цепь, намагничивание, группа, витки.
_labels = [
    (144.5, 144.5, "", 0, "", 0, 0, 1),
    (0, 94, "", 0, "", 0, 0, 1),
    (73, 0, "", 0, "", 0, 0, 1),
    (63.219854476264025, 36.499999999999993, "", 0, "", 0, 0, 1),
    (36.500000000000007, 63.219854476264018, "", 0, "", 0, 0, 1),
    (4.469813191451677e-15, 73, "", 0, "", 0, 0, 1),
    (-36.499999999999986, 63.219854476264025, "", 0, "", 0, 0, 1),
    (-63.219854476264025, 36.499999999999993, "", 0, "", 0, 0, 1),
    (-73, 8.939626382903354e-15, "", 0, "", 0, 0, 1),
    (-63.219854476264018, -36.500000000000007, "", 0, "", 0, 0, 1),
    (-36.500000000000036, -63.219854476264004, "", 0, "", 0, 0, 1),
    (-1.3409439574355031e-14, -73, "", 0, "", 0, 0, 1),
    (36.500000000000007, -63.219854476264018, "", 0, "", 0, 0, 1),
    (63.219854476264004, -36.500000000000036, "", 0, "", 0, 0, 1),
    (19.798989873223331, 19.798989873223327, "", 0, "", 0, 0, 1),
    (45, 0, "", 0, "", 0, 0, 1),
    (2.7553642961003488e-15, 45, "", 0, "", 0, 0, 1),
    (-45, 5.5107285922006977e-15, "", 0, "", 0, 0, 1),
    (-8.2660928883010465e-15, -45, "", 0, "", 0, 0, 1),
    (0, 0, "", 0, "", 0, 0, 1),
    (56.421980601819094, 17.249930578641468, "", 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. Модель неполная: переходите к следующему этапу, не запускайте решение.")
