diff --git a/src/ShapesClassification.py b/src/ShapesClassification.py index be22b8a..5bf280d 100644 --- a/src/ShapesClassification.py +++ b/src/ShapesClassification.py @@ -90,6 +90,8 @@ def isOpenProblem(self) -> bool: return True if roots[0] in self.dielectrics.keys(): return True + if roots[0] in self.pecs.keys() and roots[0] not in self.nestedGraph.getParentNodes(): + return True return False def removeConductorsFromDielectrics(self): diff --git a/test/test_mesher.py b/test/test_mesher.py index 9ea4e26..39d44fc 100644 --- a/test/test_mesher.py +++ b/test/test_mesher.py @@ -149,7 +149,7 @@ def test_mesh_dielectric_unshielded_pair(self) -> None: expectedEntities = [1, 1, 1, 1, 1, 1, 1] Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - + gmsh.write(caseName + '.vtk') gmsh.write(caseName + '.msh') @@ -157,17 +157,17 @@ def test_mesh_dielectric_unshielded_pair(self) -> None: def test_mesh_dielectric_unshielded_pair_defined_boundary(self) -> None: caseName = 'DielectricUnshieldedPairDefinedBoundary' - + meshing_options = copy.deepcopy(Mesher.DEFAULT_MESHING_OPTIONS) meshing_options["Mesh.ElementOrder"] = 1 - + Mesher().meshFromStep( - self.inputFileFromCaseName(caseName), + self.inputFileFromCaseName(caseName), caseName, meshingOptions=meshing_options) gmsh.write(caseName + '.vtk') - + expectedNames = [ 'Conductor_0', 'Conductor_1', 'Dielectric_0', 'Dielectric_1', @@ -190,7 +190,7 @@ def test_mesh_from_step_with_five_wires(self): Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) gmsh.write(caseName + '.vtk') - + pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] self.assertEqual(sorted(pGNames), sorted(expectedNames)) @@ -365,16 +365,35 @@ def test_lansink2024_single_wire_multipolar(self): self.assertEqual(self.countEntitiesInPhysicalGroupWithName( name), expectedEntities[idx], name) + def test_unshielded_single_wire(self): + caseName = 'unshielded_single_wire' + Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + + expectedNames = [ + 'Conductor_0', + 'OpenBoundary_0', + 'Vacuum_0', # Inner region + 'Vacuum_1' # Outer region + ] + expectedEntities = [1, 1, 1, 1] + + # For debugging. + gmsh.write(caseName + '.vtk') + gmsh.write(caseName + '.msh') + # gmsh.fltk.run() + + self.assertPhysicalGroup(expectedNames, expectedEntities) + def test_unshielded_nesting(self): caseName = 'UnshieldedNested' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - - #gmsh.write(caseName + '.msh') - #gmsh.write(caseName + '.vtk') + + # gmsh.write(caseName + '.msh') + # gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] - expectedNames = ['Conductor_0', + expectedNames = ['Conductor_0', 'Conductor_1', 'Conductor_2', 'OpenBoundary_0', @@ -385,7 +404,8 @@ def test_unshielded_nesting(self): self.assertEqual(sorted(pGNames), sorted(expectedNames)) for idx, name in enumerate(expectedNames): - self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + self.assertEqual(self.countEntitiesInPhysicalGroupWithName( + name), expectedEntities[idx], name) if __name__ == '__main__': diff --git a/testData/unshielded_single_wire/unshielded_single_wire.FCStd b/testData/unshielded_single_wire/unshielded_single_wire.FCStd new file mode 100644 index 0000000..77f5d7e Binary files /dev/null and b/testData/unshielded_single_wire/unshielded_single_wire.FCStd differ diff --git a/testData/unshielded_single_wire/unshielded_single_wire.json b/testData/unshielded_single_wire/unshielded_single_wire.json new file mode 100644 index 0000000..e05d1c3 --- /dev/null +++ b/testData/unshielded_single_wire/unshielded_single_wire.json @@ -0,0 +1,10 @@ +{ + "CrossSection": [ + { + "name": "Conductor", + "material": { + "type": "PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/unshielded_single_wire/unshielded_single_wire.step b/testData/unshielded_single_wire/unshielded_single_wire.step new file mode 100644 index 0000000..fdf8559 --- /dev/null +++ b/testData/unshielded_single_wire/unshielded_single_wire.step @@ -0,0 +1,79 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); +FILE_NAME('Open CASCADE Shape Model','2026-03-11T12:53:42',(''),(''), + 'Open CASCADE STEP processor 7.8','FreeCAD','Unknown'); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', + 'automotive_design',2000,#2); +#2 = APPLICATION_CONTEXT( + 'core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); +#4 = PRODUCT_DEFINITION_SHAPE('','',#5); +#5 = PRODUCT_DEFINITION('design','',#6,#9); +#6 = PRODUCT_DEFINITION_FORMATION('','',#7); +#7 = PRODUCT('Conductor','Conductor','',(#8)); +#8 = PRODUCT_CONTEXT('',#2,'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#10 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#15),#42); +#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); +#12 = CARTESIAN_POINT('',(0.,0.,0.)); +#13 = DIRECTION('',(0.,0.,1.)); +#14 = DIRECTION('',(1.,0.,-0.)); +#15 = SHELL_BASED_SURFACE_MODEL('',(#16)); +#16 = OPEN_SHELL('',(#17)); +#17 = ADVANCED_FACE('',(#18),#31,.T.); +#18 = FACE_BOUND('',#19,.T.); +#19 = EDGE_LOOP('',(#20)); +#20 = ORIENTED_EDGE('',*,*,#21,.T.); +#21 = EDGE_CURVE('',#22,#22,#24,.T.); +#22 = VERTEX_POINT('',#23); +#23 = CARTESIAN_POINT('',(21.,0.,0.)); +#24 = SURFACE_CURVE('',#25,(#30),.PCURVE_S1.); +#25 = CIRCLE('',#26,1.); +#26 = AXIS2_PLACEMENT_3D('',#27,#28,#29); +#27 = CARTESIAN_POINT('',(20.,0.,0.)); +#28 = DIRECTION('',(0.,0.,1.)); +#29 = DIRECTION('',(1.,0.,0.)); +#30 = PCURVE('',#31,#36); +#31 = PLANE('',#32); +#32 = AXIS2_PLACEMENT_3D('',#33,#34,#35); +#33 = CARTESIAN_POINT('',(20.,1.910944170279E-18,0.)); +#34 = DIRECTION('',(0.,0.,1.)); +#35 = DIRECTION('',(1.,0.,0.)); +#36 = DEFINITIONAL_REPRESENTATION('',(#37),#41); +#37 = CIRCLE('',#38,1.); +#38 = AXIS2_PLACEMENT_2D('',#39,#40); +#39 = CARTESIAN_POINT('',(0.,-1.910944170279E-18)); +#40 = DIRECTION('',(1.,0.)); +#41 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#42 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#46)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#43,#44,#45)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#43 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#44 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#45 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#46 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#43, + 'distance_accuracy_value','confusion accuracy'); +#47 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#48 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#49), + #42); +#49 = STYLED_ITEM('color',(#50),#17); +#50 = PRESENTATION_STYLE_ASSIGNMENT((#51,#57)); +#51 = SURFACE_STYLE_USAGE(.BOTH.,#52); +#52 = SURFACE_SIDE_STYLE('',(#53)); +#53 = SURFACE_STYLE_FILL_AREA(#54); +#54 = FILL_AREA_STYLE('',(#55)); +#55 = FILL_AREA_STYLE_COLOUR('',#56); +#56 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); +#57 = CURVE_STYLE('',#58,POSITIVE_LENGTH_MEASURE(0.1),#59); +#58 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#59 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, + 9.803921802644E-02); +ENDSEC; +END-ISO-10303-21;