Skip to content

Commit 297b191

Browse files
authored
Merge pull request #24 from OpenSEMBA/minor-add-nested-test-and-update-doc
Minor | Added complex nested cas and updated doc
2 parents 0aa8466 + b4e5483 commit 297b191

5 files changed

Lines changed: 285 additions & 5 deletions

File tree

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,26 @@ Install requirements with
1616

1717
## Usage
1818

19+
Step2gmsh requires two diferent files:
20+
- A json file where material properties are described for each geometry
21+
- A step file with all the geometry info
22+
23+
Both files must have the same label and share folder path.
24+
An example of those files can be found in [Five wires case](testData/five_wires/)
25+
1926
Launch from command line as
2027

2128
```shell
2229
python src/step2gmsh.py <-i path_to_step_file>
2330
```
2431

25-
The tested input step files have been generated with [FreeCAD](https://www.freecad.org/). The geometrical entities within the step file must be separated in layers. The operations which are performed of the different layers depend on their name.
32+
The tested input step files have been generated with [FreeCAD](https://www.freecad.org/). The geometrical entities within the step file must be separated in layers. The operations performed on the different layers depend on their material asignment registered in the json file.
2633

27-
- A layer named `Conductor_N` with `N` being an integer represents a perfect conductor. `Conductor_0` is a special case of which represents the ground and defines the global domain. For layers named `Conductor_N` with `N` different to zero their areas will be substracted from the computational domain and removed.
28-
- Layers named as `Dielectric_N` are used to identify regions which will have a material assigned.
34+
- A layer with a `PEC material`, represent a perfect conductor. In case one of the layers surrounds the rest of elements, it will be asigned as ground and defines the global domain for the rest of conductors. Internally, this will be represented as Conductor_0. The areas of the rest of conductors different to zero will be substracted from the computational domain and removed. In open cases, Conductor_0 is just another conductor and the domain is defined using the bounding box of the layers.
35+
- Layers registered as `Dielectric` are used to identify regions which will have a material assigned.
2936
- Open and semi-open problems can be defined using a single layer called `OpenBoundary`.
3037

31-
Below is shown an example of a closed case with 6 conductors and 5 dielectrics, the external boundary corresponds to `Conductor_0`. The case is modeled with FreeCAD and can be found in the `testData/five_wires` folder together with the exported as a step file. The resulting mesh after applying `step2gmsh` is shown below.
38+
Below is shown an example of a closed case with 6 conductors and 5 dielectrics, the external boundary corresponds to `Conductor_0`. The case is modeled with FreeCAD and can be found in the [testData/five_wires](testData/five_wires/) folder together with the exported as a step file. The resulting mesh after applying `step2gmsh` is shown below.
3239

3340
![Five wires example as modeled with FreeCAD](doc/fig/five_wires_freecad.png)
3441
![Five wires example meshed with gmsh](doc/fig/five_wires_gmsh.png)

test/test_mesher.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,13 +268,34 @@ def test_lansink2024_single_wire_multipolar(self):
268268
'OpenBoundary_0',
269269
'Vacuum_0', 'Vacuum_1']
270270
expectedEntities = [1, 1, 1,
271-
1,
272271
1, 1]
273272
self.assertEqual(sorted(pGNames), sorted(expectedNames))
274273

275274
for idx, name in enumerate(expectedNames):
276275
self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name)
277276

277+
def test_unshielded_nesting(self):
278+
caseName = 'UnshieldedNested'
279+
Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName)
280+
281+
#gmsh.write(caseName + '.msh')
282+
#gmsh.write(caseName + '.vtk')
283+
284+
pGs = gmsh.model.getPhysicalGroups()
285+
pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs]
286+
expectedNames = ['Conductor_0',
287+
'Conductor_1',
288+
'Conductor_2',
289+
'OpenBoundary_0',
290+
'Vacuum_0', 'Vacuum_1']
291+
expectedEntities = [2, 1, 1,
292+
1,
293+
2, 1]
294+
self.assertEqual(sorted(pGNames), sorted(expectedNames))
295+
296+
for idx, name in enumerate(expectedNames):
297+
self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name)
298+
278299

279300
if __name__ == '__main__':
280301
unittest.main()
11.7 KB
Binary file not shown.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"CrossSection":[
3+
{
4+
"name":"Conductor_2",
5+
"material":{
6+
"type":"PEC"
7+
}
8+
},
9+
{
10+
"name":"Conductor_1",
11+
"material":{
12+
"type":"PEC"
13+
}
14+
},
15+
{
16+
"name":"ExtraConductor",
17+
"material":{
18+
"type":"PEC"
19+
}
20+
}
21+
]
22+
}
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
4+
FILE_NAME('Open CASCADE Shape Model','2025-10-14T12:52:45',(''),(''),
5+
'Open CASCADE STEP processor 7.8','FreeCAD','Unknown');
6+
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
7+
ENDSEC;
8+
DATA;
9+
#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',
10+
'automotive_design',2000,#2);
11+
#2 = APPLICATION_CONTEXT(
12+
'core data for automotive mechanical design processes');
13+
#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);
14+
#4 = PRODUCT_DEFINITION_SHAPE('','',#5);
15+
#5 = PRODUCT_DEFINITION('design','',#6,#9);
16+
#6 = PRODUCT_DEFINITION_FORMATION('','',#7);
17+
#7 = PRODUCT('nested_coax','nested_coax','',(#8));
18+
#8 = PRODUCT_CONTEXT('',#2,'mechanical');
19+
#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
20+
#10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23),#27);
21+
#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);
22+
#12 = CARTESIAN_POINT('',(0.,0.,0.));
23+
#13 = DIRECTION('',(0.,0.,1.));
24+
#14 = DIRECTION('',(1.,0.,-0.));
25+
#15 = AXIS2_PLACEMENT_3D('',#16,#17,#18);
26+
#16 = CARTESIAN_POINT('',(0.,0.,0.));
27+
#17 = DIRECTION('',(0.,0.,1.));
28+
#18 = DIRECTION('',(1.,0.,0.));
29+
#19 = AXIS2_PLACEMENT_3D('',#20,#21,#22);
30+
#20 = CARTESIAN_POINT('',(0.,0.,0.));
31+
#21 = DIRECTION('',(0.,0.,1.));
32+
#22 = DIRECTION('',(1.,0.,0.));
33+
#23 = AXIS2_PLACEMENT_3D('',#24,#25,#26);
34+
#24 = CARTESIAN_POINT('',(5.,0.,0.));
35+
#25 = DIRECTION('',(0.,0.,1.));
36+
#26 = DIRECTION('',(1.,0.,0.));
37+
#27 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
38+
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#31)) GLOBAL_UNIT_ASSIGNED_CONTEXT(
39+
(#28,#29,#30)) REPRESENTATION_CONTEXT('Context #1',
40+
'3D Context with UNIT and UNCERTAINTY') );
41+
#28 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
42+
#29 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
43+
#30 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
44+
#31 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#28,
45+
'distance_accuracy_value','confusion accuracy');
46+
#32 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));
47+
#33 = SHAPE_DEFINITION_REPRESENTATION(#34,#40);
48+
#34 = PRODUCT_DEFINITION_SHAPE('','',#35);
49+
#35 = PRODUCT_DEFINITION('design','',#36,#39);
50+
#36 = PRODUCT_DEFINITION_FORMATION('','',#37);
51+
#37 = PRODUCT('Conductor_1','Conductor_1','',(#38));
52+
#38 = PRODUCT_CONTEXT('',#2,'mechanical');
53+
#39 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
54+
#40 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#41),#71);
55+
#41 = SHELL_BASED_SURFACE_MODEL('',(#42));
56+
#42 = OPEN_SHELL('',(#43));
57+
#43 = ADVANCED_FACE('',(#44,#55),#66,.T.);
58+
#44 = FACE_BOUND('',#45,.T.);
59+
#45 = EDGE_LOOP('',(#46));
60+
#46 = ORIENTED_EDGE('',*,*,#47,.T.);
61+
#47 = EDGE_CURVE('',#48,#48,#50,.T.);
62+
#48 = VERTEX_POINT('',#49);
63+
#49 = CARTESIAN_POINT('',(2.8,0.,0.));
64+
#50 = CIRCLE('',#51,2.8);
65+
#51 = AXIS2_PLACEMENT_3D('',#52,#53,#54);
66+
#52 = CARTESIAN_POINT('',(0.,0.,0.));
67+
#53 = DIRECTION('',(0.,0.,1.));
68+
#54 = DIRECTION('',(1.,0.,0.));
69+
#55 = FACE_BOUND('',#56,.T.);
70+
#56 = EDGE_LOOP('',(#57));
71+
#57 = ORIENTED_EDGE('',*,*,#58,.F.);
72+
#58 = EDGE_CURVE('',#59,#59,#61,.T.);
73+
#59 = VERTEX_POINT('',#60);
74+
#60 = CARTESIAN_POINT('',(2.4,0.,0.));
75+
#61 = CIRCLE('',#62,2.4);
76+
#62 = AXIS2_PLACEMENT_3D('',#63,#64,#65);
77+
#63 = CARTESIAN_POINT('',(0.,0.,0.));
78+
#64 = DIRECTION('',(0.,0.,1.));
79+
#65 = DIRECTION('',(1.,0.,0.));
80+
#66 = PLANE('',#67);
81+
#67 = AXIS2_PLACEMENT_3D('',#68,#69,#70);
82+
#68 = CARTESIAN_POINT('',(-2.441857379535E-16,1.29885370033E-16,0.));
83+
#69 = DIRECTION('',(0.,0.,1.));
84+
#70 = DIRECTION('',(1.,0.,0.));
85+
#71 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
86+
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#75)) GLOBAL_UNIT_ASSIGNED_CONTEXT(
87+
(#72,#73,#74)) REPRESENTATION_CONTEXT('Context #1',
88+
'3D Context with UNIT and UNCERTAINTY') );
89+
#72 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
90+
#73 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
91+
#74 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
92+
#75 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#72,
93+
'distance_accuracy_value','confusion accuracy');
94+
#76 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#77,#79);
95+
#77 = ( REPRESENTATION_RELATIONSHIP('','',#40,#10)
96+
REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#78)
97+
SHAPE_REPRESENTATION_RELATIONSHIP() );
98+
#78 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15);
99+
#79 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#80);
100+
#80 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('1','Conductor_1','',#5,#35,$);
101+
#81 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#37));
102+
#82 = SHAPE_DEFINITION_REPRESENTATION(#83,#89);
103+
#83 = PRODUCT_DEFINITION_SHAPE('','',#84);
104+
#84 = PRODUCT_DEFINITION('design','',#85,#88);
105+
#85 = PRODUCT_DEFINITION_FORMATION('','',#86);
106+
#86 = PRODUCT('Conductor_2','Conductor_2','',(#87));
107+
#87 = PRODUCT_CONTEXT('',#2,'mechanical');
108+
#88 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
109+
#89 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#90),#109);
110+
#90 = SHELL_BASED_SURFACE_MODEL('',(#91));
111+
#91 = OPEN_SHELL('',(#92));
112+
#92 = ADVANCED_FACE('',(#93),#104,.T.);
113+
#93 = FACE_BOUND('',#94,.T.);
114+
#94 = EDGE_LOOP('',(#95));
115+
#95 = ORIENTED_EDGE('',*,*,#96,.T.);
116+
#96 = EDGE_CURVE('',#97,#97,#99,.T.);
117+
#97 = VERTEX_POINT('',#98);
118+
#98 = CARTESIAN_POINT('',(1.,0.,0.));
119+
#99 = CIRCLE('',#100,1.);
120+
#100 = AXIS2_PLACEMENT_3D('',#101,#102,#103);
121+
#101 = CARTESIAN_POINT('',(0.,0.,0.));
122+
#102 = DIRECTION('',(0.,0.,1.));
123+
#103 = DIRECTION('',(1.,0.,-0.));
124+
#104 = PLANE('',#105);
125+
#105 = AXIS2_PLACEMENT_3D('',#106,#107,#108);
126+
#106 = CARTESIAN_POINT('',(-6.409875621279E-17,1.910944170279E-18,0.));
127+
#107 = DIRECTION('',(0.,0.,1.));
128+
#108 = DIRECTION('',(1.,0.,-0.));
129+
#109 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
130+
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#113)) GLOBAL_UNIT_ASSIGNED_CONTEXT
131+
((#110,#111,#112)) REPRESENTATION_CONTEXT('Context #1',
132+
'3D Context with UNIT and UNCERTAINTY') );
133+
#110 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
134+
#111 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
135+
#112 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
136+
#113 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#110,
137+
'distance_accuracy_value','confusion accuracy');
138+
#114 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#115,#117);
139+
#115 = ( REPRESENTATION_RELATIONSHIP('','',#89,#10)
140+
REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#116)
141+
SHAPE_REPRESENTATION_RELATIONSHIP() );
142+
#116 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19);
143+
#117 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#118
144+
);
145+
#118 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('2','Conductor_2','',#5,#84,$);
146+
#119 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#86));
147+
#120 = SHAPE_DEFINITION_REPRESENTATION(#121,#127);
148+
#121 = PRODUCT_DEFINITION_SHAPE('','',#122);
149+
#122 = PRODUCT_DEFINITION('design','',#123,#126);
150+
#123 = PRODUCT_DEFINITION_FORMATION('','',#124);
151+
#124 = PRODUCT('ExtraConductor','ExtraConductor','',(#125));
152+
#125 = PRODUCT_CONTEXT('',#2,'mechanical');
153+
#126 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
154+
#127 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#128),#147);
155+
#128 = SHELL_BASED_SURFACE_MODEL('',(#129));
156+
#129 = OPEN_SHELL('',(#130));
157+
#130 = ADVANCED_FACE('',(#131),#142,.T.);
158+
#131 = FACE_BOUND('',#132,.T.);
159+
#132 = EDGE_LOOP('',(#133));
160+
#133 = ORIENTED_EDGE('',*,*,#134,.T.);
161+
#134 = EDGE_CURVE('',#135,#135,#137,.T.);
162+
#135 = VERTEX_POINT('',#136);
163+
#136 = CARTESIAN_POINT('',(1.,0.,0.));
164+
#137 = CIRCLE('',#138,1.);
165+
#138 = AXIS2_PLACEMENT_3D('',#139,#140,#141);
166+
#139 = CARTESIAN_POINT('',(0.,0.,0.));
167+
#140 = DIRECTION('',(0.,0.,1.));
168+
#141 = DIRECTION('',(1.,0.,0.));
169+
#142 = PLANE('',#143);
170+
#143 = AXIS2_PLACEMENT_3D('',#144,#145,#146);
171+
#144 = CARTESIAN_POINT('',(-6.409875621279E-17,1.910944170279E-18,0.));
172+
#145 = DIRECTION('',(0.,0.,1.));
173+
#146 = DIRECTION('',(1.,0.,0.));
174+
#147 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
175+
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#151)) GLOBAL_UNIT_ASSIGNED_CONTEXT
176+
((#148,#149,#150)) REPRESENTATION_CONTEXT('Context #1',
177+
'3D Context with UNIT and UNCERTAINTY') );
178+
#148 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
179+
#149 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
180+
#150 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
181+
#151 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#148,
182+
'distance_accuracy_value','confusion accuracy');
183+
#152 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#153,#155);
184+
#153 = ( REPRESENTATION_RELATIONSHIP('','',#127,#10)
185+
REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#154)
186+
SHAPE_REPRESENTATION_RELATIONSHIP() );
187+
#154 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23);
188+
#155 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#156
189+
);
190+
#156 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('3','ExtraConductor','',#5,#122,$
191+
);
192+
#157 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#124));
193+
#158 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#159)
194+
,#109);
195+
#159 = STYLED_ITEM('color',(#160),#92);
196+
#160 = PRESENTATION_STYLE_ASSIGNMENT((#161,#167));
197+
#161 = SURFACE_STYLE_USAGE(.BOTH.,#162);
198+
#162 = SURFACE_SIDE_STYLE('',(#163));
199+
#163 = SURFACE_STYLE_FILL_AREA(#164);
200+
#164 = FILL_AREA_STYLE('',(#165));
201+
#165 = FILL_AREA_STYLE_COLOUR('',#166);
202+
#166 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877);
203+
#167 = CURVE_STYLE('',#168,POSITIVE_LENGTH_MEASURE(0.1),#169);
204+
#168 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
205+
#169 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02,
206+
9.803921802644E-02);
207+
#170 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#171)
208+
,#147);
209+
#171 = STYLED_ITEM('color',(#172),#130);
210+
#172 = PRESENTATION_STYLE_ASSIGNMENT((#173,#178));
211+
#173 = SURFACE_STYLE_USAGE(.BOTH.,#174);
212+
#174 = SURFACE_SIDE_STYLE('',(#175));
213+
#175 = SURFACE_STYLE_FILL_AREA(#176);
214+
#176 = FILL_AREA_STYLE('',(#177));
215+
#177 = FILL_AREA_STYLE_COLOUR('',#166);
216+
#178 = CURVE_STYLE('',#179,POSITIVE_LENGTH_MEASURE(0.1),#169);
217+
#179 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
218+
#180 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#181)
219+
,#71);
220+
#181 = STYLED_ITEM('color',(#182),#43);
221+
#182 = PRESENTATION_STYLE_ASSIGNMENT((#183,#188));
222+
#183 = SURFACE_STYLE_USAGE(.BOTH.,#184);
223+
#184 = SURFACE_SIDE_STYLE('',(#185));
224+
#185 = SURFACE_STYLE_FILL_AREA(#186);
225+
#186 = FILL_AREA_STYLE('',(#187));
226+
#187 = FILL_AREA_STYLE_COLOUR('',#166);
227+
#188 = CURVE_STYLE('',#189,POSITIVE_LENGTH_MEASURE(0.1),#169);
228+
#189 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
229+
ENDSEC;
230+
END-ISO-10303-21;

0 commit comments

Comments
 (0)