@@ -15,9 +15,9 @@ class ShapesClassification:
1515 _ROUND_VALUE :int = 6
1616
1717 isOpenCase :bool
18- crossSectionData : Dict
19- pecs : Dict
20- dielectrics : Dict
18+ crossSectionData : Dict [ str , List [ Dict [ str , any ]]]
19+ pecs : Dict [ str , List [ Tuple [ int , int ]]]
20+ dielectrics : Dict [ str , List [ Tuple [ int , int ]]]
2121 nestedGraph : Graph
2222
2323 def __init__ (self , shapes , jsonFile :str ):
@@ -29,12 +29,11 @@ def __init__(self, shapes, jsonFile:str):
2929 self .crossSectionData = jsonData ['CrossSection' ]
3030 self .pecs = self .get_pecs (shapes )
3131 self .dielectrics = self .get_dielectrics (shapes )
32- self .shieldReference = dict ()
3332 self .vacuum = dict ()
33+ self .open = dict ()
3434 self .nestedGraph = self .__getNestedGraph ()
3535 self .isOpenCase = self .isOpenProblem ()
3636
37-
3837 @staticmethod
3938 def getNumberFromName (entity_name : str , label : str ):
4039 ini = entity_name .rindex (label ) + len (label )
@@ -72,67 +71,51 @@ def __getGeometryNamesByMaterialType(self, materialType:str) -> List[str]:
7271 return names
7372
7473 def isOpenProblem (self ) -> None :
75- if len (self .nestedGraph .roots ) > 1 :
74+ roots = self .nestedGraph .roots
75+ if len (roots ) > 1 : #Más de un componente pec/pec pec/dielectric dielectric/dielectric etc da al exterior
76+ return True
77+ if roots [0 ] in self .dielectrics .keys (): #El único root es un dielectrico
7678 return True
7779 return False
7880
7981 def removeConductorsFromDielectrics (self ):
8082 for num , diel in self .dielectrics .items ():
8183 pec_surfs = []
8284 for num2 , pec_surf in self .pecs .items ():
83- if num2 == 0 and not self .isOpenCase :
85+ if ( num2 in self . nestedGraph . roots ) and ( not self .isOpenCase ) :
8486 continue
8587 pec_surfs .extend (pec_surf )
8688 self .dielectrics [num ] = gmsh .model .occ .cut (diel , pec_surfs , removeTool = False )[0 ]
8789
8890 gmsh .model .occ .synchronize ()
8991
9092 def ensureDielectricsDoNotOverlap (self ):
91- for n1 , diel1 in self .dielectrics .items ():
92- others = list (
93- chain (
94- * [x [1 ] for x in self .dielectrics .items () if x [0 ] != n1 ]
95- )
96- )
93+ for currentKey in self .dielectrics .keys ():
94+
95+ others = list (chain (* [tag for key , tag in self .dielectrics .items () if currentKey != key ]))
9796
9897 if len (others ) == 0 :
9998 continue
10099
101- self .dielectrics [n1 ] = gmsh .model .occ .cut (
102- self .dielectrics [n1 ], others , removeObject = True , removeTool = False )[0 ]
100+ self .dielectrics [currentKey ] = gmsh .model .occ .cut (
101+ self .dielectrics [currentKey ], others , removeObject = True , removeTool = False
102+ )[0 ]
103103
104104 gmsh .model .occ .synchronize ()
105105
106106 def buildVacuumDomain (self ):
107- if self .isOpenCase and len ( self . open ) == 0 :
107+ if self .isOpenCase :
108108 self .vacuum = self ._buildDefaultVacuumDomain ()
109- elif self .isOpenCase and len (self .open ) > 0 :
110- self .vacuum = self ._buildVacuumDomainFromOpenBoundary ()
111109 else :
112110 self .vacuum = self ._buildClosedVacuumDomain ()
113111 return self .vacuum
114112
115- def _buildVacuumDomainFromOpenBoundary (self ) -> Dict [int , List [int ]]:
116- dom = self .open [0 ]
117-
118- surfsToRemove = []
119- for num , surf in self .pecs .items ():
120- surfsToRemove .extend (surf )
121-
122- for _ , surf in self .dielectrics .items ():
123- surfsToRemove .extend (surf )
124-
125- dom = gmsh .model .occ .cut (
126- dom , surfsToRemove , removeObject = False , removeTool = False )[0 ]
127- gmsh .model .occ .synchronize ()
128-
129- return dict ([[0 , dom ]])
130-
131113 def _buildClosedVacuumDomain (self ) -> Tuple [int , int ]:
132- dom = self .pecs [0 ]
114+ root = self .nestedGraph .roots [0 ]
115+ dom = self .pecs [root ]
133116 surfsToRemove = []
134117 for num , surf in self .pecs .items ():
135- if num == 0 :
118+ if num == root :
136119 continue
137120 surfsToRemove .extend (surf )
138121
@@ -141,7 +124,7 @@ def _buildClosedVacuumDomain(self) -> Tuple[int, int]:
141124 dom = gmsh .model .occ .cut (
142125 dom , surfsToRemove , removeObject = False , removeTool = False )[0 ]
143126 gmsh .model .occ .synchronize ()
144- return dict ([[0 , dom ]])
127+ return dict ([['Vacuum_0' , dom ]])
145128
146129 def _buildDefaultVacuumDomain (self ):
147130 NEAR_REGION_BOUNDING_BOX_SCALING_FACTOR = 1.25
@@ -170,7 +153,7 @@ def _buildDefaultVacuumDomain(self):
170153 farVacuumDiameter , farVacuumDiameter ))]
171154
172155 gmsh .model .occ .synchronize ()
173- self .open = dict ([[0 , gmsh .model .getBoundary (farVacuum )]])
156+ self .open = dict ([['OpenBoundary_0' , gmsh .model .getBoundary (farVacuum )]])
174157
175158 farVacuum = gmsh .model .occ .cut (
176159 farVacuum , nearVacuum , removeObject = True , removeTool = False )[0 ]
@@ -189,32 +172,47 @@ def _buildDefaultVacuumDomain(self):
189172 innerRegion = gmsh .model .getBoundary (nearVacuum , recursive = True )
190173 gmsh .model .mesh .setSize (innerRegion , minSide / 20 )
191174
192-
193-
194175 gmsh .model .occ .synchronize ()
195176
196- return dict ([[0 , nearVacuum ], [1 , farVacuum ]])
177+ return dict ([['Vacuum_0' , nearVacuum ], ['Vacuum_1' , farVacuum ]])
197178
198179 def __getNestedGraph (self ):
199180 gmsh .model .occ .synchronize ()
200181 graph = Graph ()
201- for key in self .pecs .keys ():
182+ elements :Dict = {}
183+ elements = {** self .pecs , ** self .dielectrics }
184+ for key in elements :
202185 graph .add_node (key )
203- for i , keyA in enumerate (self . pecs . keys () ):
204- for j , keyB in enumerate (self . pecs . keys () ):
186+ for i , keyA in enumerate (elements ):
187+ for j , keyB in enumerate (elements ):
205188 if i < j :
206189 inter = gmsh .model .occ .intersect (
207- self . pecs [keyA ],
208- self . pecs [keyB ],
190+ elements [keyA ],
191+ elements [keyB ],
209192 removeObject = False ,
210193 removeTool = False
211194 )
212195 if len (inter [1 ][0 ]) == 0 : #comprueba las intersecciones en las que interfiere el objeto
213196 continue
214197 else :
215- if inter [1 ][0 ] == self . pecs [keyA ]:
198+ if inter [1 ][0 ] == elements [keyA ]:
216199 graph .add_edge (keyB , keyA )
217- elif inter [1 ][0 ] == self . pecs [keyB ]:
200+ elif inter [1 ][0 ] == elements [keyB ]:
218201 graph .add_edge (keyA , keyB )
219202 graph .prune_to_longest_paths ()
220- return graph
203+ graph ._reorderData ()
204+ return graph
205+
206+ def getComponentsMappedByLevel (self ) -> Dict [str ,str ]:
207+ sortedNodes = self .nestedGraph .getNodesByLevels ()
208+ mappedElements = []
209+ conductors = []
210+ dielectrics = []
211+ for node in sortedNodes :
212+ if node in self .pecs .keys ():
213+ conductors .append ((node , 'Conductor_{}' .format (len (conductors ))))
214+ if node in self .dielectrics .keys ():
215+ dielectrics .append ((node , 'Dielectric_{}' .format (len (dielectrics ))))
216+ mappedElements .extend (conductors )
217+ mappedElements .extend (dielectrics )
218+ return {element [0 ]:element [1 ] for element in mappedElements }
0 commit comments