femagtools 1.8.1__py3-none-any.whl → 1.8.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- femagtools/__init__.py +1 -1
- femagtools/dxfsl/area.py +110 -1
- femagtools/dxfsl/areabuilder.py +93 -45
- femagtools/dxfsl/conv.py +5 -0
- femagtools/dxfsl/converter.py +85 -27
- femagtools/dxfsl/fslrenderer.py +5 -4
- femagtools/dxfsl/functions.py +14 -6
- femagtools/dxfsl/geom.py +135 -149
- femagtools/dxfsl/journal.py +1 -1
- femagtools/dxfsl/machine.py +161 -9
- femagtools/dxfsl/shape.py +46 -1
- femagtools/dxfsl/svgparser.py +1 -1
- femagtools/dxfsl/symmetry.py +143 -38
- femagtools/femag.py +64 -61
- femagtools/fsl.py +15 -12
- femagtools/isa7.py +3 -2
- femagtools/machine/__init__.py +5 -4
- femagtools/machine/afpm.py +79 -33
- femagtools/machine/effloss.py +29 -18
- femagtools/machine/sizing.py +192 -13
- femagtools/machine/sm.py +34 -36
- femagtools/machine/utils.py +2 -2
- femagtools/mcv.py +58 -29
- femagtools/model.py +4 -3
- femagtools/multiproc.py +79 -80
- femagtools/parstudy.py +11 -5
- femagtools/plot/nc.py +2 -2
- femagtools/semi_fea.py +108 -0
- femagtools/templates/basic_modpar.mako +0 -3
- femagtools/templates/fe-contr.mako +18 -18
- femagtools/templates/ld_lq_fast.mako +3 -0
- femagtools/templates/mult_cal_fast.mako +3 -0
- femagtools/templates/pm_sym_f_cur.mako +4 -1
- femagtools/templates/pm_sym_fast.mako +3 -0
- femagtools/templates/pm_sym_loss.mako +3 -0
- femagtools/templates/psd_psq_fast.mako +3 -0
- femagtools/templates/torq_calc.mako +3 -0
- femagtools/tks.py +23 -20
- femagtools/zmq.py +213 -0
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/METADATA +3 -3
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/RECORD +49 -47
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/WHEEL +1 -1
- tests/test_afpm.py +15 -6
- tests/test_femag.py +1 -1
- tests/test_fsl.py +4 -4
- tests/test_mcv.py +21 -15
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/LICENSE +0 -0
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/entry_points.txt +0 -0
- {femagtools-1.8.1.dist-info → femagtools-1.8.3.dist-info}/top_level.txt +0 -0
femagtools/dxfsl/functions.py
CHANGED
@@ -85,16 +85,24 @@ def alpha_angle(startangle, endangle):
|
|
85
85
|
return angle - 2.0*np.pi
|
86
86
|
|
87
87
|
|
88
|
-
def
|
88
|
+
def less_angle(alpha1, alpha2):
|
89
89
|
angle = alpha_angle(alpha1, alpha2)
|
90
|
-
|
91
|
-
return alpha2
|
92
|
-
return alpha1
|
90
|
+
return (angle < np.pi or angle > 2.0*np.pi)
|
93
91
|
|
94
92
|
|
95
|
-
def
|
93
|
+
def greater_angle(alpha1, alpha2):
|
96
94
|
angle = alpha_angle(alpha1, alpha2)
|
97
|
-
|
95
|
+
return not (angle < np.pi or angle > 2.0*np.pi)
|
96
|
+
|
97
|
+
|
98
|
+
def max_angle(alpha1, alpha2):
|
99
|
+
if greater_angle(alpha1, alpha2):
|
100
|
+
return alpha1
|
101
|
+
return alpha2
|
102
|
+
|
103
|
+
|
104
|
+
def min_angle(alpha1, alpha2):
|
105
|
+
if less_angle(alpha1, alpha2):
|
98
106
|
return alpha1
|
99
107
|
return alpha2
|
100
108
|
|
femagtools/dxfsl/geom.py
CHANGED
@@ -235,6 +235,9 @@ def single_path(edges):
|
|
235
235
|
|
236
236
|
nodes_filecount = 0
|
237
237
|
|
238
|
+
TYPE_UNDEFINED = 0
|
239
|
+
TYPE_ROTOR = 1
|
240
|
+
TYPE_STATOR = 2
|
238
241
|
|
239
242
|
class Geometry(object):
|
240
243
|
"""collection of connected shapes"""
|
@@ -252,6 +255,7 @@ class Geometry(object):
|
|
252
255
|
delete=False,
|
253
256
|
adjust=False,
|
254
257
|
main=False,
|
258
|
+
type=TYPE_UNDEFINED,
|
255
259
|
debug=False):
|
256
260
|
self._name = ''
|
257
261
|
self.kind = ''
|
@@ -260,6 +264,7 @@ class Geometry(object):
|
|
260
264
|
self.end_corners = []
|
261
265
|
self.sym_part = 0
|
262
266
|
self.sym_counterpart = 0
|
267
|
+
self.sym_type = type
|
263
268
|
self.sym_slices = 0
|
264
269
|
self.sym_slice_angle = 0.0
|
265
270
|
self.alfa = 0.0
|
@@ -440,10 +445,12 @@ class Geometry(object):
|
|
440
445
|
is_inner=self.is_inner,
|
441
446
|
is_outer=self.is_outer,
|
442
447
|
rtol=self.rtol,
|
443
|
-
atol=self.atol
|
448
|
+
atol=self.atol,
|
449
|
+
type=self.sym_type)
|
444
450
|
geom.alfa = correct_alpha
|
445
451
|
geom.kind = self.kind
|
446
452
|
geom.sym_part = self.sym_part
|
453
|
+
geom.sym_type = self.sym_type
|
447
454
|
return geom
|
448
455
|
|
449
456
|
def log_geom(self):
|
@@ -861,6 +868,12 @@ class Geometry(object):
|
|
861
868
|
def start_max_corner(self, i):
|
862
869
|
return self.start_corners[-1][i]
|
863
870
|
|
871
|
+
def get_start_airgap_node(self):
|
872
|
+
if self.is_inner:
|
873
|
+
return self.start_corners[-1]
|
874
|
+
else:
|
875
|
+
return self.start_corners[0]
|
876
|
+
|
864
877
|
def dist_start_max_corner(self):
|
865
878
|
logger.debug("begin of dist_start_max_corner")
|
866
879
|
logger.debug("start corners: %s", self.start_corners)
|
@@ -868,16 +881,21 @@ class Geometry(object):
|
|
868
881
|
logger.debug("end of dist_start_max_corner: %s", d)
|
869
882
|
return d
|
870
883
|
|
871
|
-
def dist_end_max_corner(self):
|
884
|
+
def dist_end_max_corner(self, mirrored=True):
|
872
885
|
logger.debug("begin of dist_end_max_corner")
|
873
886
|
logger.debug("end corners: %s", self.end_corners)
|
874
887
|
|
875
|
-
if self.is_mirrored():
|
888
|
+
if self.is_mirrored() and mirrored:
|
876
889
|
return self.dist_start_max_corner()
|
877
890
|
d = distance(self.center, self.end_corners[-1])
|
878
891
|
logger.debug("end of dist_end_max_corner: %s", d)
|
879
892
|
return d
|
880
893
|
|
894
|
+
def max_corners_match(self):
|
895
|
+
d1 = self.dist_start_max_corner()
|
896
|
+
d2 = self.dist_end_max_corner(mirrored=False)
|
897
|
+
return np.isclose(d1, d2, rtol=1e-3, atol=1e-3)
|
898
|
+
|
881
899
|
def dist_start_min_corner(self):
|
882
900
|
logger.debug("begin of dist_start_min_corner")
|
883
901
|
logger.debug("start corners: %s", self.start_corners)
|
@@ -885,16 +903,24 @@ class Geometry(object):
|
|
885
903
|
logger.debug("end of dist_start_min_corner: %s", d)
|
886
904
|
return d
|
887
905
|
|
888
|
-
def dist_end_min_corner(self):
|
906
|
+
def dist_end_min_corner(self, mirrored=True):
|
889
907
|
logger.debug("begin of dist_end_min_corner")
|
890
908
|
logger.debug("end corners: %s", self.end_corners)
|
891
909
|
|
892
|
-
if self.is_mirrored():
|
910
|
+
if self.is_mirrored() and mirrored:
|
893
911
|
return self.dist_start_min_corner()
|
894
912
|
d = distance(self.center, self.end_corners[0])
|
895
913
|
logger.debug("end of dist_end_min_corner: %s", d)
|
896
914
|
return d
|
897
915
|
|
916
|
+
def min_corners_match(self):
|
917
|
+
d1 = self.dist_start_min_corner()
|
918
|
+
d2 = self.dist_end_min_corner(mirrored=False)
|
919
|
+
return np.isclose(d1, d2, rtol=1e-3, atol=1e-3)
|
920
|
+
|
921
|
+
def min_max_corners_match(self):
|
922
|
+
return self.min_corners_match() and self.max_corners_match()
|
923
|
+
|
898
924
|
def get_start_airgap_corner(self):
|
899
925
|
if self.is_inner:
|
900
926
|
p = (self.max_radius, 0.0)
|
@@ -1146,9 +1172,12 @@ class Geometry(object):
|
|
1146
1172
|
nx.set_edge_attributes(self.g, False, 1)
|
1147
1173
|
nx.set_edge_attributes(self.g, False, 2)
|
1148
1174
|
|
1149
|
-
def create_list_of_areas(self, main=False):
|
1175
|
+
def create_list_of_areas(self, main=False, delete=False):
|
1150
1176
|
""" return list of areas for each node and their neighbors
|
1151
1177
|
"""
|
1178
|
+
if delete: # clear list of areas
|
1179
|
+
self.area_list = []
|
1180
|
+
|
1152
1181
|
if len(self.area_list) > 0:
|
1153
1182
|
logger.debug("area list already available")
|
1154
1183
|
# list already available
|
@@ -1553,7 +1582,8 @@ class Geometry(object):
|
|
1553
1582
|
concatenate=concatenate,
|
1554
1583
|
connect=connect,
|
1555
1584
|
delete=delete_appendices,
|
1556
|
-
split=split
|
1585
|
+
split=split,
|
1586
|
+
type=self.sym_type)
|
1557
1587
|
geom.with_center_node = self.with_center_node
|
1558
1588
|
|
1559
1589
|
logger.debug('end copy_shape')
|
@@ -1614,7 +1644,8 @@ class Geometry(object):
|
|
1614
1644
|
split=split,
|
1615
1645
|
concatenate=concatenate,
|
1616
1646
|
connect=connect,
|
1617
|
-
adjust=adjust
|
1647
|
+
adjust=adjust,
|
1648
|
+
type=self.sym_type)
|
1618
1649
|
|
1619
1650
|
def is_new_angle(self, alpha_list, alpha):
|
1620
1651
|
for a in alpha_list:
|
@@ -1704,6 +1735,13 @@ class Geometry(object):
|
|
1704
1735
|
def symmetry_endangle(self):
|
1705
1736
|
return self.sym_area.sym_endangle
|
1706
1737
|
|
1738
|
+
def rotate_symmetry_parameters(self):
|
1739
|
+
self.sym_startangle += self.sym_slice_angle
|
1740
|
+
self.sym_endangle += self.sym_slice_angle
|
1741
|
+
if self.sym_area:
|
1742
|
+
self.sym_area.sym_startangle = self.sym_startangle
|
1743
|
+
self.sym_area.sym_endangle = self.sym_endangle
|
1744
|
+
|
1707
1745
|
def get_symmetry_copies(self):
|
1708
1746
|
if self.sym_counterpart == 0:
|
1709
1747
|
return int(self.sym_part)
|
@@ -1948,7 +1986,7 @@ class Geometry(object):
|
|
1948
1986
|
startangle=0.0,
|
1949
1987
|
endangle=np.pi/2)
|
1950
1988
|
|
1951
|
-
elif np.isclose(width, height*2,
|
1989
|
+
elif np.isclose(width, height*2, rtol=1e-2, atol=1e-2):
|
1952
1990
|
radius = width/2
|
1953
1991
|
self.set_center([mm[1]-height, mm[2]])
|
1954
1992
|
logger.info("check for half machine")
|
@@ -1967,7 +2005,7 @@ class Geometry(object):
|
|
1967
2005
|
startangle=np.pi,
|
1968
2006
|
endangle=0.0)
|
1969
2007
|
|
1970
|
-
elif np.isclose(width*2, height,
|
2008
|
+
elif np.isclose(width*2, height, rtol=1e-2, atol=1e-2):
|
1971
2009
|
radius = width
|
1972
2010
|
logger.info("check for half machine")
|
1973
2011
|
self.set_center([mm[1], mm[3]-width])
|
@@ -2371,31 +2409,31 @@ class Geometry(object):
|
|
2371
2409
|
logger.debug("end check_airgap: return %s", len(area_id_list) > 1)
|
2372
2410
|
return len(area_id_list) > 1 # bad
|
2373
2411
|
|
2374
|
-
def is_border_line(self, center, startangle, endangle, e, atol):
|
2412
|
+
def is_border_line(self, center, startangle, endangle, e, rtol=1e-3, atol=1e-3):
|
2375
2413
|
if isinstance(e, Line):
|
2376
2414
|
if np.isclose(startangle, endangle):
|
2377
2415
|
return False # full
|
2378
2416
|
|
2379
2417
|
if points_are_close(center, e.p1):
|
2380
2418
|
angle_p2 = alpha_line(center, e.p2)
|
2381
|
-
if np.isclose(startangle, angle_p2,
|
2419
|
+
if np.isclose(startangle, angle_p2, rtol=rtol, atol=atol):
|
2382
2420
|
return True
|
2383
|
-
return np.isclose(endangle, angle_p2,
|
2421
|
+
return np.isclose(endangle, angle_p2, rtol=rtol, atol=atol)
|
2384
2422
|
|
2385
2423
|
if points_are_close(center, e.p2):
|
2386
2424
|
angle_p1 = alpha_line(center, e.p1)
|
2387
|
-
if np.isclose(startangle, angle_p1,
|
2425
|
+
if np.isclose(startangle, angle_p1, rtol=rtol, atol=atol):
|
2388
2426
|
return True
|
2389
|
-
return np.isclose(endangle, angle_p1,
|
2427
|
+
return np.isclose(endangle, angle_p1, rtol=rtol, atol=atol)
|
2390
2428
|
|
2391
2429
|
angle_p1 = alpha_line(center, e.p1)
|
2392
|
-
if np.isclose(startangle, angle_p1,
|
2430
|
+
if np.isclose(startangle, angle_p1, rtol=rtol, atol=atol):
|
2393
2431
|
angle_p2 = alpha_line(center, e.p2)
|
2394
|
-
return np.isclose(startangle, angle_p2,
|
2432
|
+
return np.isclose(startangle, angle_p2, rtol=rtol, atol=atol)
|
2395
2433
|
|
2396
|
-
if np.isclose(endangle, angle_p1,
|
2434
|
+
if np.isclose(endangle, angle_p1, rtol=rtol, atol=atol):
|
2397
2435
|
angle_p2 = alpha_line(center, e.p2)
|
2398
|
-
return np.isclose(endangle, angle_p2,
|
2436
|
+
return np.isclose(endangle, angle_p2, rtol=rtol, atol=atol)
|
2399
2437
|
return False
|
2400
2438
|
|
2401
2439
|
def get_gaplist(self, center):
|
@@ -2419,7 +2457,7 @@ class Geometry(object):
|
|
2419
2457
|
"""
|
2420
2458
|
gaplist = []
|
2421
2459
|
for e in self.elements(Shape):
|
2422
|
-
if not self.is_border_line(center, startangle, endangle, e, atol):
|
2460
|
+
if not self.is_border_line(center, startangle, endangle, e, atol=atol):
|
2423
2461
|
gaplist += [e.minmax_from_center(center)]
|
2424
2462
|
else:
|
2425
2463
|
min_r, max_r = e.minmax_from_center(center)
|
@@ -2958,12 +2996,22 @@ class Geometry(object):
|
|
2958
2996
|
self.sym_counterpart = 1
|
2959
2997
|
self.sym_part = 2
|
2960
2998
|
|
2999
|
+
def force_to_be_rotor(self):
|
3000
|
+
self.sym_type = TYPE_ROTOR
|
3001
|
+
|
3002
|
+
def force_to_be_stator(self):
|
3003
|
+
self.sym_type = TYPE_STATOR
|
3004
|
+
|
2961
3005
|
def is_rotor(self):
|
3006
|
+
if self.sym_type != TYPE_UNDEFINED:
|
3007
|
+
return self.sym_type == TYPE_ROTOR
|
2962
3008
|
if self.sym_counterpart:
|
2963
3009
|
return self.sym_part < self.sym_counterpart
|
2964
3010
|
return False
|
2965
3011
|
|
2966
3012
|
def is_stator(self):
|
3013
|
+
if self.sym_type != TYPE_UNDEFINED:
|
3014
|
+
return self.sym_type == TYPE_STATOR
|
2967
3015
|
if self.sym_counterpart:
|
2968
3016
|
return self.sym_part > self.sym_counterpart
|
2969
3017
|
return False
|
@@ -3096,6 +3144,16 @@ class Geometry(object):
|
|
3096
3144
|
for e in elist:
|
3097
3145
|
e.init_attributes('lightblue', 'no_fsl')
|
3098
3146
|
|
3147
|
+
def set_subregion_parameters(self,
|
3148
|
+
startangle,
|
3149
|
+
endangle):
|
3150
|
+
for a in self.list_of_areas():
|
3151
|
+
a.set_subregion_parameters(self.is_inner,
|
3152
|
+
self.min_radius,
|
3153
|
+
self.max_radius,
|
3154
|
+
startangle,
|
3155
|
+
endangle)
|
3156
|
+
|
3099
3157
|
def search_subregions(self, startangle, endangle, EESM, single=False):
|
3100
3158
|
if self.is_stator():
|
3101
3159
|
self.search_stator_subregions(startangle,
|
@@ -3555,22 +3613,33 @@ class Geometry(object):
|
|
3555
3613
|
return
|
3556
3614
|
elements = []
|
3557
3615
|
for a in areas:
|
3558
|
-
elements += a.
|
3559
|
-
geom = Geometry(elements, center=self.center)
|
3616
|
+
elements += a.copy_of_elements()
|
3617
|
+
geom = Geometry(elements, center=self.center, type=self.sym_type)
|
3618
|
+
geom.create_list_of_areas()
|
3619
|
+
mag_areas = geom.list_of_areas()
|
3620
|
+
|
3560
3621
|
builder = AreaBuilder(geom=geom)
|
3561
|
-
if builder.create_area_groups(
|
3622
|
+
if builder.create_area_groups(mag_areas):
|
3562
3623
|
return # bad
|
3563
3624
|
group_list = builder.area_list
|
3564
|
-
|
3565
|
-
# self.areagroup_list = group_list
|
3625
|
+
|
3566
3626
|
for group in group_list:
|
3567
3627
|
if not group.is_magnet_rectangle():
|
3568
3628
|
logger.debug("Warning: group is not a rectangle")
|
3569
3629
|
group.set_type(AREA.TYPE_MAGNET_RECT)
|
3570
3630
|
phi = group.get_magnet_orientation()
|
3571
3631
|
for a in group.areas_of_group:
|
3572
|
-
logger.debug("Replace phi %s by %s", a.phi, phi)
|
3573
3632
|
a.phi = phi
|
3633
|
+
p = a.get_best_point_inside(geom)
|
3634
|
+
phi_set = False
|
3635
|
+
for area in areas:
|
3636
|
+
if area.the_point_is_inside_area(p):
|
3637
|
+
logger.debug("Replace phi %s by %s", area.phi, phi)
|
3638
|
+
area.phi = phi
|
3639
|
+
phi_set = True
|
3640
|
+
break
|
3641
|
+
if not phi_set:
|
3642
|
+
logger.warning("___MAGNET PHI NOT SET. AREA NOT FOUND IN GEOMETRY___")
|
3574
3643
|
|
3575
3644
|
def search_unknown_subregions(self):
|
3576
3645
|
logger.debug("begin of search_unknown_subregions")
|
@@ -3614,7 +3683,7 @@ class Geometry(object):
|
|
3614
3683
|
def windings_in_the_middle(self, midangle):
|
3615
3684
|
wdg_areas = [a for a in self.list_of_areas()
|
3616
3685
|
if a.is_winding()]
|
3617
|
-
logger.
|
3686
|
+
logger.debug("%s windings in geom", len(wdg_areas))
|
3618
3687
|
for a in wdg_areas:
|
3619
3688
|
if greater(a.max_angle, midangle) and \
|
3620
3689
|
less(a.min_angle, midangle):
|
@@ -3652,6 +3721,10 @@ class Geometry(object):
|
|
3652
3721
|
AREA.TYPE_YOKE,
|
3653
3722
|
AREA.TYPE_TOOTH,))
|
3654
3723
|
|
3724
|
+
def num_of_magnets(self):
|
3725
|
+
return self.num_areas_of_type((AREA.TYPE_MAGNET_AIRGAP,
|
3726
|
+
AREA.TYPE_MAGNET_RECT,))
|
3727
|
+
|
3655
3728
|
def area_close_to_endangle(self, type):
|
3656
3729
|
return len([area for area in self.list_of_areas()
|
3657
3730
|
if area.is_type(type) and area.close_to_endangle])
|
@@ -4147,61 +4220,18 @@ class Geometry(object):
|
|
4147
4220
|
return True
|
4148
4221
|
return False
|
4149
4222
|
|
4150
|
-
def get_inner_airgap_line(self):
|
4151
|
-
logger.debug("begin of get_inner_airgap_line")
|
4152
|
-
|
4153
|
-
if not self.is_inner:
|
4154
|
-
logger.debug("end of get_inner_airgap_line: not inner")
|
4155
|
-
return [], []
|
4156
|
-
for a in self.area_list:
|
4157
|
-
logger.debug("%s", a)
|
4158
|
-
area = [a for a in self.area_list if a.close_to_ag_endcorner]
|
4159
|
-
if len(area) != 1:
|
4160
|
-
logger.debug("end of get_inner_airgap_line: %s areas found", len(area))
|
4161
|
-
return [], []
|
4162
|
-
|
4163
|
-
end_corner = self.end_corners[-1]
|
4164
|
-
logger.debug("END CORNER %s", end_corner)
|
4165
|
-
nodes = [n for n in area[0].list_of_nodes()]
|
4166
|
-
if not nodes:
|
4167
|
-
logger.debug("end of get_inner_airgap_line: no nodes found")
|
4168
|
-
return [], []
|
4169
|
-
n1 = nodes[0]
|
4170
|
-
if points_are_close(end_corner, n1):
|
4171
|
-
n2 = nodes[-1]
|
4172
|
-
else:
|
4173
|
-
n2 = n1
|
4174
|
-
for n1 in nodes[1:]:
|
4175
|
-
if points_are_close(end_corner, n1):
|
4176
|
-
break
|
4177
|
-
n2 = n1
|
4178
|
-
|
4179
|
-
if not points_are_close(end_corner, n1):
|
4180
|
-
logger.debug("end of get_inner_airgap_line: not close to endcorner")
|
4181
|
-
return [], []
|
4182
|
-
|
4183
|
-
start_corner = self.start_corners[-1]
|
4184
|
-
|
4185
|
-
logger.debug("EDGE FOUND: %s - %s", n1, n2)
|
4186
|
-
nodes = [n1, n2]
|
4187
|
-
info = self.get_edge_info(n1, n2)
|
4188
|
-
elements = [info.get('element', None)]
|
4189
|
-
while not points_are_close(start_corner, n2):
|
4190
|
-
info = self.next_edge_lefthand_side(info)
|
4191
|
-
if not info:
|
4192
|
-
return []
|
4193
|
-
n2 = info['n2']
|
4194
|
-
nodes.append(n2)
|
4195
|
-
elements.append(info.get('element', None))
|
4196
|
-
|
4197
|
-
logger.debug("end of get_inner_airgap_line #%s", len(nodes))
|
4198
|
-
return nodes, elements
|
4199
|
-
|
4200
4223
|
def create_inner_corner_areas(self, startangle, endangle):
|
4201
|
-
self
|
4224
|
+
builder = AreaBuilder(geom=self)
|
4225
|
+
return builder.create_inner_corner_auxiliary_areas(startangle, endangle)
|
4226
|
+
|
4227
|
+
def close_outer_winding_areas(self):
|
4228
|
+
logger.debug("begin close_outer_winding_areas(%s areas)",
|
4229
|
+
len(self.area_list))
|
4202
4230
|
|
4203
4231
|
builder = AreaBuilder(geom=self)
|
4204
|
-
builder.
|
4232
|
+
rslt = builder.close_outer_winding_areas()
|
4233
|
+
logger.debug("end close_outer_winding_areas (%s)", rslt)
|
4234
|
+
return rslt
|
4205
4235
|
|
4206
4236
|
def repair_border_line(self, nodes):
|
4207
4237
|
logger.debug("begin repair_border_line")
|
@@ -4403,78 +4433,34 @@ class Geometry(object):
|
|
4403
4433
|
points += pts
|
4404
4434
|
return points
|
4405
4435
|
|
4406
|
-
def
|
4407
|
-
|
4408
|
-
|
4409
|
-
|
4410
|
-
return
|
4411
|
-
logger.debug("*** Corner Auxiliary Areas ***")
|
4412
|
-
airgap_line, airgap_el = self.get_inner_airgap_line()
|
4413
|
-
if not airgap_el:
|
4414
|
-
logger.debug("no airgapline found")
|
4415
|
-
return
|
4436
|
+
def mirror_all_areas(self, mirrorangle):
|
4437
|
+
axis_p = point(self.center, self.max_radius, mirrorangle)
|
4438
|
+
axis_m = line_m(self.center, axis_p)
|
4439
|
+
axis_n = line_n(self.center, axis_m)
|
4416
4440
|
|
4417
|
-
|
4418
|
-
|
4419
|
-
|
4441
|
+
def add_element(e):
|
4442
|
+
n = self.find_nodes(e.start(), e.end())
|
4443
|
+
if not self.has_edge(n[0], n[1]):
|
4444
|
+
self.add_edge(n[0], n[1], e)
|
4420
4445
|
|
4421
|
-
|
4422
|
-
|
4423
|
-
|
4424
|
-
|
4425
|
-
|
4426
|
-
|
4427
|
-
|
4428
|
-
|
4429
|
-
|
4430
|
-
|
4431
|
-
|
4432
|
-
|
4433
|
-
|
4434
|
-
|
4435
|
-
|
4436
|
-
|
4437
|
-
|
4438
|
-
|
4439
|
-
self.add_line(start_cp, n,
|
4440
|
-
color='red',
|
4441
|
-
linestyle='dotted')
|
4442
|
-
self.add_element(start_line,
|
4443
|
-
rtol=self.rtol,
|
4444
|
-
atol=self.atol)
|
4445
|
-
self.create_and_append_area(start_cp, n)
|
4446
|
-
self.start_corners = self.get_corner_nodes(self.center,
|
4447
|
-
0.0)
|
4448
|
-
break
|
4449
|
-
|
4450
|
-
if not end_exists:
|
4451
|
-
cp = self.end_corners[-1]
|
4452
|
-
logger.debug("End Corner: %s -- %s", cp, end_cp)
|
4453
|
-
end_line = Line(Element(start=cp, end=end_cp),
|
4454
|
-
color='red',
|
4455
|
-
linestyle='dotted')
|
4456
|
-
end_cp = end_line.node2(ndec)
|
4457
|
-
airgap_nodes.reverse()
|
4458
|
-
for n in airgap_nodes:
|
4459
|
-
ag_line = Line(Element(start=end_cp, end=n))
|
4460
|
-
points = self.get_intersection_points(airgap_el, ag_line, n)
|
4461
|
-
if not points: # no intersection
|
4462
|
-
d = distance(self.center, n)
|
4463
|
-
if np.isclose(d, self.max_radius):
|
4464
|
-
self.add_arc(n, end_cp, self.center, self.max_radius,
|
4465
|
-
color='red',
|
4466
|
-
linestyle='dotted')
|
4467
|
-
else:
|
4468
|
-
self.add_line(end_cp, n,
|
4469
|
-
color='red',
|
4470
|
-
linestyle='dotted')
|
4471
|
-
self.add_element(end_line,
|
4472
|
-
rtol=self.rtol,
|
4473
|
-
atol=self.atol)
|
4474
|
-
self.create_and_append_area(n, end_cp)
|
4475
|
-
self.end_corners = self.get_corner_nodes(self.center,
|
4476
|
-
self.alfa)
|
4477
|
-
break
|
4446
|
+
area_list = []
|
4447
|
+
for a in self.area_list:
|
4448
|
+
area = a.mirror_area(self.center, axis_m, axis_n)
|
4449
|
+
area_list.append(area)
|
4450
|
+
for e in area.elements():
|
4451
|
+
add_element(e)
|
4452
|
+
self.area_list += area_list
|
4453
|
+
|
4454
|
+
def check_airgap_connecting_nodes(self, geom, startangle, endangle):
|
4455
|
+
logger.info("check_airgap_connecting_nodes")
|
4456
|
+
|
4457
|
+
start_node_in = self.get_start_airgap_node()
|
4458
|
+
start_node_out = geom.get_start_airgap_node()
|
4459
|
+
angle_in = alpha_line(self.center, start_node_in)
|
4460
|
+
angle_out = alpha_line(self.center, start_node_out)
|
4461
|
+
if np.isclose(angle_in, angle_out):
|
4462
|
+
return
|
4463
|
+
logger.warning("WARNING: airgap connecting nodes do not aline")
|
4478
4464
|
|
4479
4465
|
def print_nodes(self):
|
4480
4466
|
print("=== List of Nodes ({}) ===".format(self.number_of_nodes()))
|