diff --git a/triangulate/src/triangulate.rs b/triangulate/src/triangulate.rs index ad4ba6e..726089e 100644 --- a/triangulate/src/triangulate.rs +++ b/triangulate/src/triangulate.rs @@ -124,6 +124,13 @@ pub fn triangulate(s: &StepFile) -> (Mesh, Stats) { Entity::AdvancedBrepShapeRepresentation(b) => &b.items, Entity::ShapeRepresentation(b) => &b.items, Entity::ManifoldSurfaceShapeRepresentation(b) => &b.items, + Entity::GeometricallyBoundedSurfaceShapeRepresentation(_) => { + warn!( + "Skipping unsupported GeometricallyBoundedSurfaceShapeRepresentation #{}", + id.0 + ); + continue; + } e => panic!("Could not get shape from {:?}", e), }; diff --git a/triangulate/tests/fixtures/unsupported_geometrically_bounded_surface.step b/triangulate/tests/fixtures/unsupported_geometrically_bounded_surface.step new file mode 100644 index 0000000..b63b623 --- /dev/null +++ b/triangulate/tests/fixtures/unsupported_geometrically_bounded_surface.step @@ -0,0 +1,441 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('Open CASCADE Model'),'2;1'); +FILE_NAME('Open CASCADE Shape Model','2021-05-17T18:28:03',('Author'),( + 'Open CASCADE'),'Open CASCADE STEP processor 6.8','Open CASCADE 6.8' + ,'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('PCB','PCB','',(#8)); +#8 = PRODUCT_CONTEXT('',#2,'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#10 = SHAPE_REPRESENTATION('',(#11,#15,#19),#23); +#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); +#12 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#13 = DIRECTION('',(0.E+000,0.E+000,1.)); +#14 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#15 = AXIS2_PLACEMENT_3D('',#16,#17,#18); +#16 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#17 = DIRECTION('',(0.E+000,0.E+000,1.)); +#18 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#19 = AXIS2_PLACEMENT_3D('',#20,#21,#22); +#20 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#21 = DIRECTION('',(0.E+000,0.E+000,1.)); +#22 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#23 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#27)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#24,#25,#26)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#24 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#25 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#26 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#27 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#24, + 'distance_accuracy_value','confusion accuracy'); +#28 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#29 = SHAPE_DEFINITION_REPRESENTATION(#30,#36); +#30 = PRODUCT_DEFINITION_SHAPE('','',#31); +#31 = PRODUCT_DEFINITION('design','',#32,#35); +#32 = PRODUCT_DEFINITION_FORMATION('','',#33); +#33 = PRODUCT('Board','Board','',(#34)); +#34 = PRODUCT_CONTEXT('',#2,'mechanical'); +#35 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#36 = SHAPE_REPRESENTATION('',(#11,#37),#41); +#37 = AXIS2_PLACEMENT_3D('',#38,#39,#40); +#38 = CARTESIAN_POINT('',(0.E+000,0.E+000,-0.41148)); +#39 = DIRECTION('',(0.E+000,0.E+000,1.)); +#40 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#41 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#45)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#42,#43,#44)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#42 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#43 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#44 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#45 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#42, + 'distance_accuracy_value','confusion accuracy'); +#46 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#47),#197); +#47 = MANIFOLD_SOLID_BREP('',#48); +#48 = CLOSED_SHELL('',(#49,#89,#120,#151,#173,#185)); +#49 = ADVANCED_FACE('',(#50),#84,.F.); +#50 = FACE_BOUND('',#51,.F.); +#51 = EDGE_LOOP('',(#52,#62,#70,#78)); +#52 = ORIENTED_EDGE('',*,*,#53,.T.); +#53 = EDGE_CURVE('',#54,#56,#58,.T.); +#54 = VERTEX_POINT('',#55); +#55 = CARTESIAN_POINT('',(90.,60.,0.E+000)); +#56 = VERTEX_POINT('',#57); +#57 = CARTESIAN_POINT('',(90.,60.,0.41148)); +#58 = LINE('',#59,#60); +#59 = CARTESIAN_POINT('',(90.,60.,0.E+000)); +#60 = VECTOR('',#61,1.); +#61 = DIRECTION('',(0.E+000,0.E+000,1.)); +#62 = ORIENTED_EDGE('',*,*,#63,.T.); +#63 = EDGE_CURVE('',#56,#64,#66,.T.); +#64 = VERTEX_POINT('',#65); +#65 = CARTESIAN_POINT('',(135.,60.,0.41148)); +#66 = LINE('',#67,#68); +#67 = CARTESIAN_POINT('',(90.,60.,0.41148)); +#68 = VECTOR('',#69,1.); +#69 = DIRECTION('',(1.,0.E+000,0.E+000)); +#70 = ORIENTED_EDGE('',*,*,#71,.F.); +#71 = EDGE_CURVE('',#72,#64,#74,.T.); +#72 = VERTEX_POINT('',#73); +#73 = CARTESIAN_POINT('',(135.,60.,0.E+000)); +#74 = LINE('',#75,#76); +#75 = CARTESIAN_POINT('',(135.,60.,0.E+000)); +#76 = VECTOR('',#77,1.); +#77 = DIRECTION('',(0.E+000,0.E+000,1.)); +#78 = ORIENTED_EDGE('',*,*,#79,.F.); +#79 = EDGE_CURVE('',#54,#72,#80,.T.); +#80 = LINE('',#81,#82); +#81 = CARTESIAN_POINT('',(90.,60.,0.E+000)); +#82 = VECTOR('',#83,1.); +#83 = DIRECTION('',(1.,0.E+000,0.E+000)); +#84 = PLANE('',#85); +#85 = AXIS2_PLACEMENT_3D('',#86,#87,#88); +#86 = CARTESIAN_POINT('',(90.,60.,0.E+000)); +#87 = DIRECTION('',(0.E+000,1.,0.E+000)); +#88 = DIRECTION('',(1.,0.E+000,0.E+000)); +#89 = ADVANCED_FACE('',(#90),#115,.F.); +#90 = FACE_BOUND('',#91,.F.); +#91 = EDGE_LOOP('',(#92,#93,#101,#109)); +#92 = ORIENTED_EDGE('',*,*,#71,.T.); +#93 = ORIENTED_EDGE('',*,*,#94,.T.); +#94 = EDGE_CURVE('',#64,#95,#97,.T.); +#95 = VERTEX_POINT('',#96); +#96 = CARTESIAN_POINT('',(135.,85.,0.41148)); +#97 = LINE('',#98,#99); +#98 = CARTESIAN_POINT('',(135.,60.,0.41148)); +#99 = VECTOR('',#100,1.); +#100 = DIRECTION('',(0.E+000,1.,0.E+000)); +#101 = ORIENTED_EDGE('',*,*,#102,.F.); +#102 = EDGE_CURVE('',#103,#95,#105,.T.); +#103 = VERTEX_POINT('',#104); +#104 = CARTESIAN_POINT('',(135.,85.,0.E+000)); +#105 = LINE('',#106,#107); +#106 = CARTESIAN_POINT('',(135.,85.,0.E+000)); +#107 = VECTOR('',#108,1.); +#108 = DIRECTION('',(0.E+000,0.E+000,1.)); +#109 = ORIENTED_EDGE('',*,*,#110,.F.); +#110 = EDGE_CURVE('',#72,#103,#111,.T.); +#111 = LINE('',#112,#113); +#112 = CARTESIAN_POINT('',(135.,60.,0.E+000)); +#113 = VECTOR('',#114,1.); +#114 = DIRECTION('',(0.E+000,1.,0.E+000)); +#115 = PLANE('',#116); +#116 = AXIS2_PLACEMENT_3D('',#117,#118,#119); +#117 = CARTESIAN_POINT('',(135.,60.,0.E+000)); +#118 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#119 = DIRECTION('',(0.E+000,1.,0.E+000)); +#120 = ADVANCED_FACE('',(#121),#146,.F.); +#121 = FACE_BOUND('',#122,.F.); +#122 = EDGE_LOOP('',(#123,#124,#132,#140)); +#123 = ORIENTED_EDGE('',*,*,#102,.T.); +#124 = ORIENTED_EDGE('',*,*,#125,.T.); +#125 = EDGE_CURVE('',#95,#126,#128,.T.); +#126 = VERTEX_POINT('',#127); +#127 = CARTESIAN_POINT('',(90.,85.,0.41148)); +#128 = LINE('',#129,#130); +#129 = CARTESIAN_POINT('',(135.,85.,0.41148)); +#130 = VECTOR('',#131,1.); +#131 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#132 = ORIENTED_EDGE('',*,*,#133,.F.); +#133 = EDGE_CURVE('',#134,#126,#136,.T.); +#134 = VERTEX_POINT('',#135); +#135 = CARTESIAN_POINT('',(90.,85.,0.E+000)); +#136 = LINE('',#137,#138); +#137 = CARTESIAN_POINT('',(90.,85.,0.E+000)); +#138 = VECTOR('',#139,1.); +#139 = DIRECTION('',(0.E+000,0.E+000,1.)); +#140 = ORIENTED_EDGE('',*,*,#141,.F.); +#141 = EDGE_CURVE('',#103,#134,#142,.T.); +#142 = LINE('',#143,#144); +#143 = CARTESIAN_POINT('',(135.,85.,0.E+000)); +#144 = VECTOR('',#145,1.); +#145 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#146 = PLANE('',#147); +#147 = AXIS2_PLACEMENT_3D('',#148,#149,#150); +#148 = CARTESIAN_POINT('',(135.,85.,0.E+000)); +#149 = DIRECTION('',(0.E+000,-1.,0.E+000)); +#150 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#151 = ADVANCED_FACE('',(#152),#168,.F.); +#152 = FACE_BOUND('',#153,.F.); +#153 = EDGE_LOOP('',(#154,#155,#161,#162)); +#154 = ORIENTED_EDGE('',*,*,#133,.T.); +#155 = ORIENTED_EDGE('',*,*,#156,.T.); +#156 = EDGE_CURVE('',#126,#56,#157,.T.); +#157 = LINE('',#158,#159); +#158 = CARTESIAN_POINT('',(90.,85.,0.41148)); +#159 = VECTOR('',#160,1.); +#160 = DIRECTION('',(0.E+000,-1.,0.E+000)); +#161 = ORIENTED_EDGE('',*,*,#53,.F.); +#162 = ORIENTED_EDGE('',*,*,#163,.F.); +#163 = EDGE_CURVE('',#134,#54,#164,.T.); +#164 = LINE('',#165,#166); +#165 = CARTESIAN_POINT('',(90.,85.,0.E+000)); +#166 = VECTOR('',#167,1.); +#167 = DIRECTION('',(0.E+000,-1.,0.E+000)); +#168 = PLANE('',#169); +#169 = AXIS2_PLACEMENT_3D('',#170,#171,#172); +#170 = CARTESIAN_POINT('',(90.,85.,0.E+000)); +#171 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#172 = DIRECTION('',(0.E+000,-1.,0.E+000)); +#173 = ADVANCED_FACE('',(#174),#180,.T.); +#174 = FACE_BOUND('',#175,.F.); +#175 = EDGE_LOOP('',(#176,#177,#178,#179)); +#176 = ORIENTED_EDGE('',*,*,#79,.T.); +#177 = ORIENTED_EDGE('',*,*,#110,.T.); +#178 = ORIENTED_EDGE('',*,*,#141,.T.); +#179 = ORIENTED_EDGE('',*,*,#163,.T.); +#180 = PLANE('',#181); +#181 = AXIS2_PLACEMENT_3D('',#182,#183,#184); +#182 = CARTESIAN_POINT('',(90.,60.,0.E+000)); +#183 = DIRECTION('',(0.E+000,0.E+000,-1.)); +#184 = DIRECTION('',(-1.,0.E+000,-0.E+000)); +#185 = ADVANCED_FACE('',(#186),#192,.F.); +#186 = FACE_BOUND('',#187,.T.); +#187 = EDGE_LOOP('',(#188,#189,#190,#191)); +#188 = ORIENTED_EDGE('',*,*,#63,.T.); +#189 = ORIENTED_EDGE('',*,*,#94,.T.); +#190 = ORIENTED_EDGE('',*,*,#125,.T.); +#191 = ORIENTED_EDGE('',*,*,#156,.T.); +#192 = PLANE('',#193); +#193 = AXIS2_PLACEMENT_3D('',#194,#195,#196); +#194 = CARTESIAN_POINT('',(90.,60.,0.41148)); +#195 = DIRECTION('',(0.E+000,0.E+000,-1.)); +#196 = DIRECTION('',(-1.,0.E+000,-0.E+000)); +#197 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#201)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#198,#199,#200)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#198 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#199 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#200 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#201 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#198, + 'distance_accuracy_value','confusion accuracy'); +#202 = SHAPE_DEFINITION_REPRESENTATION(#203,#46); +#203 = PRODUCT_DEFINITION_SHAPE('','',#204); +#204 = PRODUCT_DEFINITION('design','',#205,#208); +#205 = PRODUCT_DEFINITION_FORMATION('','',#206); +#206 = PRODUCT('Open CASCADE STEP translator 6.8 1.1.1', + 'Open CASCADE STEP translator 6.8 1.1.1','',(#207)); +#207 = PRODUCT_CONTEXT('',#2,'mechanical'); +#208 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#209 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#210,#212); +#210 = ( REPRESENTATION_RELATIONSHIP('','',#46,#36) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#211) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#211 = ITEM_DEFINED_TRANSFORMATION('','',#11,#37); +#212 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#213 + ); +#213 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('1','','',#31,#204,$); +#214 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#206)); +#215 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#216,#218); +#216 = ( REPRESENTATION_RELATIONSHIP('','',#36,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#217) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#217 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); +#218 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#219 + ); +#219 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('2','','',#5,#31,$); +#220 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#33)); +#221 = SHAPE_DEFINITION_REPRESENTATION(#222,#228); +#222 = PRODUCT_DEFINITION_SHAPE('','',#223); +#223 = PRODUCT_DEFINITION('design','',#224,#227); +#224 = PRODUCT_DEFINITION_FORMATION('','',#225); +#225 = PRODUCT('Free-Models','Free-Models','',(#226)); +#226 = PRODUCT_CONTEXT('',#2,'mechanical'); +#227 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#228 = SHAPE_REPRESENTATION('',(#11,#229),#233); +#229 = AXIS2_PLACEMENT_3D('',#230,#231,#232); +#230 = CARTESIAN_POINT('',(126.,76.,0.E+000)); +#231 = DIRECTION('',(0.E+000,0.E+000,1.)); +#232 = DIRECTION('',(1.,0.E+000,0.E+000)); +#233 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#237)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#234,#235,#236)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#234 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#235 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#236 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#237 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#234, + 'distance_accuracy_value','confusion accuracy'); +#238 = SHAPE_DEFINITION_REPRESENTATION(#239,#245); +#239 = PRODUCT_DEFINITION_SHAPE('','',#240); +#240 = PRODUCT_DEFINITION('design','',#241,#244); +#241 = PRODUCT_DEFINITION_FORMATION('','',#242); +#242 = PRODUCT('9084755200','9084755200','',(#243)); +#243 = PRODUCT_CONTEXT('',#2,'mechanical'); +#244 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#245 = SHAPE_REPRESENTATION('',(#11,#246),#250); +#246 = AXIS2_PLACEMENT_3D('',#247,#248,#249); +#247 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#248 = DIRECTION('',(0.E+000,0.E+000,1.)); +#249 = DIRECTION('',(1.,0.E+000,0.E+000)); +#250 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#254)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#251,#252,#253)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#251 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#252 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#253 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#254 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#251, + 'distance_accuracy_value','confusion accuracy'); +#255 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#256),#309); +#256 = MANIFOLD_SOLID_BREP('',#257); +#257 = CLOSED_SHELL('',(#258,#291,#300)); +#258 = ADVANCED_FACE('',(#259),#286,.T.); +#259 = FACE_BOUND('',#260,.T.); +#260 = EDGE_LOOP('',(#261,#270,#278,#285)); +#261 = ORIENTED_EDGE('',*,*,#262,.T.); +#262 = EDGE_CURVE('',#263,#263,#265,.T.); +#263 = VERTEX_POINT('',#264); +#264 = CARTESIAN_POINT('',(3.99999962,0.E+000,0.E+000)); +#265 = CIRCLE('',#266,3.99999962); +#266 = AXIS2_PLACEMENT_3D('',#267,#268,#269); +#267 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#268 = DIRECTION('',(0.E+000,0.E+000,1.)); +#269 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#270 = ORIENTED_EDGE('',*,*,#271,.T.); +#271 = EDGE_CURVE('',#263,#272,#274,.T.); +#272 = VERTEX_POINT('',#273); +#273 = CARTESIAN_POINT('',(3.99999962,0.E+000,2.00000108)); +#274 = LINE('',#275,#276); +#275 = CARTESIAN_POINT('',(3.99999962,0.E+000,0.E+000)); +#276 = VECTOR('',#277,1.); +#277 = DIRECTION('',(0.E+000,0.E+000,1.)); +#278 = ORIENTED_EDGE('',*,*,#279,.F.); +#279 = EDGE_CURVE('',#272,#272,#280,.T.); +#280 = CIRCLE('',#281,3.99999962); +#281 = AXIS2_PLACEMENT_3D('',#282,#283,#284); +#282 = CARTESIAN_POINT('',(0.E+000,0.E+000,2.00000108)); +#283 = DIRECTION('',(0.E+000,0.E+000,1.)); +#284 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#285 = ORIENTED_EDGE('',*,*,#271,.F.); +#286 = CYLINDRICAL_SURFACE('',#287,3.99999962); +#287 = AXIS2_PLACEMENT_3D('',#288,#289,#290); +#288 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#289 = DIRECTION('',(-0.E+000,-0.E+000,-1.)); +#290 = DIRECTION('',(1.,0.E+000,-0.E+000)); +#291 = ADVANCED_FACE('',(#292),#295,.T.); +#292 = FACE_BOUND('',#293,.F.); +#293 = EDGE_LOOP('',(#294)); +#294 = ORIENTED_EDGE('',*,*,#262,.T.); +#295 = PLANE('',#296); +#296 = AXIS2_PLACEMENT_3D('',#297,#298,#299); +#297 = CARTESIAN_POINT('',(3.99999962,0.E+000,0.E+000)); +#298 = DIRECTION('',(-0.E+000,0.E+000,-1.)); +#299 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#300 = ADVANCED_FACE('',(#301),#304,.F.); +#301 = FACE_BOUND('',#302,.T.); +#302 = EDGE_LOOP('',(#303)); +#303 = ORIENTED_EDGE('',*,*,#279,.T.); +#304 = PLANE('',#305); +#305 = AXIS2_PLACEMENT_3D('',#306,#307,#308); +#306 = CARTESIAN_POINT('',(3.99999962,0.E+000,2.00000108)); +#307 = DIRECTION('',(-0.E+000,0.E+000,-1.)); +#308 = DIRECTION('',(-1.,0.E+000,0.E+000)); +#309 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#313)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#310,#311,#312)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#310 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#311 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#312 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#313 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-007),#310, + 'distance_accuracy_value','confusion accuracy'); +#314 = SHAPE_DEFINITION_REPRESENTATION(#315,#255); +#315 = PRODUCT_DEFINITION_SHAPE('','',#316); +#316 = PRODUCT_DEFINITION('design','',#317,#320); +#317 = PRODUCT_DEFINITION_FORMATION('','',#318); +#318 = PRODUCT('Cylinder','Cylinder','',(#319)); +#319 = PRODUCT_CONTEXT('',#2,'mechanical'); +#320 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#321 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#322,#324); +#322 = ( REPRESENTATION_RELATIONSHIP('','',#255,#245) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#323) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#323 = ITEM_DEFINED_TRANSFORMATION('','',#11,#246); +#324 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#325 + ); +#325 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('3','3','',#240,#316,$); +#326 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#318)); +#327 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#328,#330); +#328 = ( REPRESENTATION_RELATIONSHIP('','',#245,#228) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#329) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#329 = ITEM_DEFINED_TRANSFORMATION('','',#11,#229); +#330 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#331 + ); +#331 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('4','','',#223,#240,$); +#332 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#242)); +#333 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#334,#336); +#334 = ( REPRESENTATION_RELATIONSHIP('','',#228,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#335) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#335 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); +#336 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#337 + ); +#337 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('5','','',#5,#223,$); +#338 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#225)); +#339 = SHAPE_DEFINITION_REPRESENTATION(#324,#340); +#340 = SHAPE_REPRESENTATION('',(#246),#309); +#341 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#342, + #352),#309); +#342 = STYLED_ITEM('color',(#343),#256); +#343 = PRESENTATION_STYLE_ASSIGNMENT((#344,#350)); +#344 = SURFACE_STYLE_USAGE(.BOTH.,#345); +#345 = SURFACE_SIDE_STYLE('',(#346)); +#346 = SURFACE_STYLE_FILL_AREA(#347); +#347 = FILL_AREA_STYLE('',(#348)); +#348 = FILL_AREA_STYLE_COLOUR('',#349); +#349 = COLOUR_RGB('',0.501960813999,0.501960813999,0.501960813999); +#350 = CURVE_STYLE('',#351,POSITIVE_LENGTH_MEASURE(0.1),#349); +#351 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#352 = OVER_RIDING_STYLED_ITEM('overriding color',(#353),#256,#342); +#353 = PRESENTATION_STYLE_BY_CONTEXT((#354,#360),#340); +#354 = SURFACE_STYLE_USAGE(.BOTH.,#355); +#355 = SURFACE_SIDE_STYLE('',(#356)); +#356 = SURFACE_STYLE_FILL_AREA(#357); +#357 = FILL_AREA_STYLE('',(#358)); +#358 = FILL_AREA_STYLE_COLOUR('',#359); +#359 = COLOUR_RGB('',0.501960813999,0.501960813999,0.501960813999); +#360 = CURVE_STYLE('',#361,POSITIVE_LENGTH_MEASURE(0.1),#359); +#361 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#362 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#363) + ,#197); +#363 = STYLED_ITEM('color',(#364),#47); +#364 = PRESENTATION_STYLE_ASSIGNMENT((#365,#371)); +#365 = SURFACE_STYLE_USAGE(.BOTH.,#366); +#366 = SURFACE_SIDE_STYLE('',(#367)); +#367 = SURFACE_STYLE_FILL_AREA(#368); +#368 = FILL_AREA_STYLE('',(#369)); +#369 = FILL_AREA_STYLE_COLOUR('',#370); +#370 = COLOUR_RGB('',0.141176477075,0.470588237047,0.196078434587); +#371 = CURVE_STYLE('',#372,POSITIVE_LENGTH_MEASURE(0.1),#370); +#372 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#373 = SHAPE_REPRESENTATION_RELATIONSHIP('','',#10,#384); +#374 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#375 = DIRECTION('',(0.E+000,0.E+000,1.)); +#376 = DIRECTION('',(1.,0.E+000,0.E+000)); +#377 = AXIS2_PLACEMENT_3D('',#374,#375,#376); +#378 = DIRECTION('',(0.E+000,1.,0.E+000)); +#379 = VECTOR('',#378,1.); +#380 = CARTESIAN_POINT('',(0.E+000,0.E+000,0.E+000)); +#381 = LINE('',#380,#379); +#382 = TRIMMED_CURVE('',#381,(PARAMETER_VALUE(0.)), + (PARAMETER_VALUE(1.)),.T.,.UNSPECIFIED.); +#383 = GEOMETRIC_SET('',(#382)); +#384 = GEOMETRICALLY_BOUNDED_SURFACE_SHAPE_REPRESENTATION('', + (#377,#383),#23); +ENDSEC; +END-ISO-10303-21; diff --git a/triangulate/tests/representation_fallback.rs b/triangulate/tests/representation_fallback.rs new file mode 100644 index 0000000..a943f2f --- /dev/null +++ b/triangulate/tests/representation_fallback.rs @@ -0,0 +1,33 @@ +use step::{ap214::Entity, step_file::StepFile}; +use triangulate::triangulate::triangulate; + +fn mesh_counts(data: &[u8]) -> (usize, usize) { + let flat = StepFile::strip_flatten(data); + let entities = StepFile::parse(&flat); + assert!(entities.0.iter().any(|entity| matches!( + entity, + Entity::GeometricallyBoundedSurfaceShapeRepresentation(_) + ))); + let (mesh, _) = triangulate(&entities); + (mesh.verts.len(), mesh.triangles.len()) +} + +#[test] +fn skips_unsupported_geometrically_bounded_surface_representation() { + let baseline_data = include_bytes!("../../examples/abstract_pca.step"); + let flat = StepFile::strip_flatten(baseline_data); + let baseline_entities = StepFile::parse(&flat); + assert!(!baseline_entities.0.iter().any(|entity| matches!( + entity, + Entity::GeometricallyBoundedSurfaceShapeRepresentation(_) + ))); + let (baseline_mesh, _) = triangulate(&baseline_entities); + let baseline = (baseline_mesh.verts.len(), baseline_mesh.triangles.len()); + + let with_auxiliary_geometry = mesh_counts(include_bytes!( + "fixtures/unsupported_geometrically_bounded_surface.step" + )); + + assert_ne!(baseline, (0, 0)); + assert_eq!(with_auxiliary_geometry, baseline); +}