From c3f1b41860a622475a9b77bf43078df68bd07ef7 Mon Sep 17 00:00:00 2001 From: aothms Date: Mon, 15 Feb 2016 17:59:31 +0100 Subject: [PATCH] Fix https://github.com/IfcOpenShell/IfcOpenShell/issues/30 --- src/ifcgeom/IfcGeomShapes.cpp | 13 +- src/ifcgeom/IfcRepresentationShapeItem.h | 1 + test/input/mapped_item_style.ifc | 183 +++++++++++++++++++++++ 3 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 test/input/mapped_item_style.ifc diff --git a/src/ifcgeom/IfcGeomShapes.cpp b/src/ifcgeom/IfcGeomShapes.cpp index 0e1b0747cb..858ef9626c 100644 --- a/src/ifcgeom/IfcGeomShapes.cpp +++ b/src/ifcgeom/IfcGeomShapes.cpp @@ -534,11 +534,22 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcMappedItem* l, IfcRepresentati trsf = trsf_2d; } gtrsf.Multiply(trsf); + + const IfcGeom::SurfaceStyle* mapped_item_style = get_style(l); + const unsigned int previous_size = (const unsigned int) shapes.size(); - bool b = convert_shapes(map->MappedRepresentation(),shapes); + bool b = convert_shapes(map->MappedRepresentation(), shapes); + for ( unsigned int i = previous_size; i < shapes.size(); ++ i ) { shapes[i].append(gtrsf); + + // Apply styles assigned to the mapped item only if on + // a more granular level no styles have been applied + if (!shapes[i].hasStyle()) { + shapes[i].setStyle(mapped_item_style); + } } + return b; } diff --git a/src/ifcgeom/IfcRepresentationShapeItem.h b/src/ifcgeom/IfcRepresentationShapeItem.h index 88ac340214..1d2c3fa8b5 100644 --- a/src/ifcgeom/IfcRepresentationShapeItem.h +++ b/src/ifcgeom/IfcRepresentationShapeItem.h @@ -46,6 +46,7 @@ namespace IfcGeom { const gp_GTrsf& Placement() const { return placement; } bool hasStyle() const { return style != 0; } const SurfaceStyle& Style() const { return *style; } + void setStyle(const SurfaceStyle* style) { this->style = style; } }; typedef std::vector IfcRepresentationShapeItems; } diff --git a/test/input/mapped_item_style.ifc b/test/input/mapped_item_style.ifc new file mode 100644 index 0000000000..61c905545c --- /dev/null +++ b/test/input/mapped_item_style.ifc @@ -0,0 +1,183 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION (('ViewDefinition [CoordinationView_V2.0]'), '2;1'); +FILE_NAME ('GreenPipe', '2015-11-18T12:57:39', ('- -'), ('-'), 'BSProLib (15th of March 2014)', 'MagiCAD HPV 2014.4', ' '); +FILE_SCHEMA (('IFC2X3')); +ENDSEC; +DATA; +#1 = IFCOWNERHISTORY(#2, #3, $, .ADDED., $, $, $, 1447851459); +#2 = IFCPERSONANDORGANIZATION(#4, #5, $); +#3 = IFCAPPLICATION(#6, 'Not Defined', 'Not Defined', 'Not Defined'); +#4 = IFCPERSON($, $, $, $, $, $, $, $); +#5 = IFCORGANIZATION($, 'simplebim', $, $, $); +#6 = IFCORGANIZATION($, 'Datacubist', $, $, $); +#7 = IFCBUILDING('026Lkbgdr7wf6pe_Hm4pbI', #8, $, $, '', #139, $, $, .ELEMENT., $, $, $); +#8 = IFCOWNERHISTORY(#9, #12, $, .NOCHANGE., $, $, $, 1422863967); +#9 = IFCPERSONANDORGANIZATION(#10, #11, $); +#10 = IFCPERSON($, '-', '-', $, $, $, $, $); +#11 = IFCORGANIZATION($, '-', $, $, $); +#12 = IFCAPPLICATION(#11, '2012.11', 'MagiCAD HPV 2012.11', 'MagiCAD HPV'); +#13 = IFCBUILDINGSTOREY('0AhpSxd0P1QRiBUgahlB62', #8, '3. etasje', $, '', #141, $, $, .ELEMENT., 55900.); +#14 = IFCFLOWSEGMENT('0k6g4TkpX8LvcVQUYZl7mx', #15, $, $, '', #144, #17, $); +#15 = IFCOWNERHISTORY(#9, #16, $, .NOCHANGE., $, $, $, 1429106599); +#16 = IFCAPPLICATION(#11, '2014.4', 'MagiCAD HPV 2014.4', 'MagiCAD HPV'); +#17 = IFCPRODUCTDEFINITIONSHAPE($, $, (#18)); +#18 = IFCSHAPEREPRESENTATION(#19, 'Body', 'MappedRepresentation', (#27)); +#19 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body', 'Model', *, *, *, *, #20, $, .MODEL_VIEW., $); +#20 = IFCGEOMETRICREPRESENTATIONCONTEXT($, 'Model', 3, 1.E-5, #21, $); +#21 = IFCAXIS2PLACEMENT3D(#22, #23, #24); +#22 = IFCCARTESIANPOINT((0., 0., 0.)); +#23 = IFCDIRECTION((0., 0., 1.)); +#24 = IFCDIRECTION((1., 0., 0.)); +#25 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body', 'Model', *, *, *, *, #20, $, .MODEL_VIEW., $); +#26 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body', 'Model', *, *, *, *, #20, $, .MODEL_VIEW., $); +#27 = IFCMAPPEDITEM(#28, #113); +#28 = IFCREPRESENTATIONMAP(#29, #30); +#29 = IFCAXIS2PLACEMENT3D(#22, #23, #24); +#30 = IFCSHAPEREPRESENTATION(#19, 'Body', 'SurfaceModel', (#31)); +#31 = IFCSHELLBASEDSURFACEMODEL((#32)); +#32 = IFCOPENSHELL((#33, #40, #45, #50, #55, #60, #65, #70, #75, #80, #85, #90, #95, #100, #105, #110)); +#33 = IFCFACE((#34)); +#34 = IFCFACEOUTERBOUND(#35, .T.); +#35 = IFCPOLYLOOP((#36, #37, #38, #39)); +#36 = IFCCARTESIANPOINT((-725., 383.1113, -115.00318)); +#37 = IFCCARTESIANPOINT((-725., 397.9585, 40.36126)); +#38 = IFCCARTESIANPOINT((725., 397.9585, 40.36126)); +#39 = IFCCARTESIANPOINT((725., 383.1113, -115.00318)); +#40 = IFCFACE((#41)); +#41 = IFCFACEOUTERBOUND(#42, .T.); +#42 = IFCPOLYLOOP((#37, #43, #44, #38)); +#43 = IFCCARTESIANPOINT((-725., 352.22013, 189.58107)); +#44 = IFCCARTESIANPOINT((725., 352.22013, 189.58107)); +#45 = IFCFACE((#46)); +#46 = IFCFACEOUTERBOUND(#47, .T.); +#47 = IFCPOLYLOOP((#43, #48, #49, #44)); +#48 = IFCCARTESIANPOINT((-725., 252.85943, 309.93888)); +#49 = IFCCARTESIANPOINT((725., 252.85943, 309.93888)); +#50 = IFCFACE((#51)); +#51 = IFCFACEOUTERBOUND(#52, .T.); +#52 = IFCPOLYLOOP((#48, #53, #54, #49)); +#53 = IFCCARTESIANPOINT((-725., 115.00318, 383.1113)); +#54 = IFCCARTESIANPOINT((725., 115.00318, 383.1113)); +#55 = IFCFACE((#56)); +#56 = IFCFACEOUTERBOUND(#57, .T.); +#57 = IFCPOLYLOOP((#53, #58, #59, #54)); +#58 = IFCCARTESIANPOINT((-725., -40.36126, 397.9585)); +#59 = IFCCARTESIANPOINT((725., -40.36126, 397.9585)); +#60 = IFCFACE((#61)); +#61 = IFCFACEOUTERBOUND(#62, .T.); +#62 = IFCPOLYLOOP((#58, #63, #64, #59)); +#63 = IFCCARTESIANPOINT((-725., -189.58107, 352.22013)); +#64 = IFCCARTESIANPOINT((725., -189.58107, 352.22013)); +#65 = IFCFACE((#66)); +#66 = IFCFACEOUTERBOUND(#67, .T.); +#67 = IFCPOLYLOOP((#63, #68, #69, #64)); +#68 = IFCCARTESIANPOINT((-725., -309.93888, 252.85943)); +#69 = IFCCARTESIANPOINT((725., -309.93888, 252.85943)); +#70 = IFCFACE((#71)); +#71 = IFCFACEOUTERBOUND(#72, .T.); +#72 = IFCPOLYLOOP((#68, #73, #74, #69)); +#73 = IFCCARTESIANPOINT((-725., -383.1113, 115.00318)); +#74 = IFCCARTESIANPOINT((725., -383.1113, 115.00318)); +#75 = IFCFACE((#76)); +#76 = IFCFACEOUTERBOUND(#77, .T.); +#77 = IFCPOLYLOOP((#73, #78, #79, #74)); +#78 = IFCCARTESIANPOINT((-725., -397.9585, -40.36126)); +#79 = IFCCARTESIANPOINT((725., -397.9585, -40.36126)); +#80 = IFCFACE((#81)); +#81 = IFCFACEOUTERBOUND(#82, .T.); +#82 = IFCPOLYLOOP((#78, #83, #84, #79)); +#83 = IFCCARTESIANPOINT((-725., -352.22013, -189.58107)); +#84 = IFCCARTESIANPOINT((725., -352.22013, -189.58107)); +#85 = IFCFACE((#86)); +#86 = IFCFACEOUTERBOUND(#87, .T.); +#87 = IFCPOLYLOOP((#83, #88, #89, #84)); +#88 = IFCCARTESIANPOINT((-725., -252.85943, -309.93888)); +#89 = IFCCARTESIANPOINT((725., -252.85943, -309.93888)); +#90 = IFCFACE((#91)); +#91 = IFCFACEOUTERBOUND(#92, .T.); +#92 = IFCPOLYLOOP((#88, #93, #94, #89)); +#93 = IFCCARTESIANPOINT((-725., -115.00318, -383.1113)); +#94 = IFCCARTESIANPOINT((725., -115.00318, -383.1113)); +#95 = IFCFACE((#96)); +#96 = IFCFACEOUTERBOUND(#97, .T.); +#97 = IFCPOLYLOOP((#93, #98, #99, #94)); +#98 = IFCCARTESIANPOINT((-725., 40.36126, -397.9585)); +#99 = IFCCARTESIANPOINT((725., 40.36126, -397.9585)); +#100 = IFCFACE((#101)); +#101 = IFCFACEOUTERBOUND(#102, .T.); +#102 = IFCPOLYLOOP((#98, #103, #104, #99)); +#103 = IFCCARTESIANPOINT((-725., 189.58107, -352.22013)); +#104 = IFCCARTESIANPOINT((725., 189.58107, -352.22013)); +#105 = IFCFACE((#106)); +#106 = IFCFACEOUTERBOUND(#107, .T.); +#107 = IFCPOLYLOOP((#103, #108, #109, #104)); +#108 = IFCCARTESIANPOINT((-725., 309.93888, -252.85943)); +#109 = IFCCARTESIANPOINT((725., 309.93888, -252.85943)); +#110 = IFCFACE((#111)); +#111 = IFCFACEOUTERBOUND(#112, .T.); +#112 = IFCPOLYLOOP((#108, #36, #39, #109)); +#113 = IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM($, $, #22, 2.689655, $, 1., 1.); +#114 = IFCPROJECT('0EHdefYCr4XA02OBEnhWph', #8, $, $, '', $, $, (#20), #148); +#115 = IFCSITE('0yjrC3GhPFGhTAhGjFoXgU', #8, $, $, '', #137, $, $, .ELEMENT., $, $, $, $, $); +#116 = IFCDUCTSEGMENTTYPE('33ZUtxFLT3oflCfdbTV7YR', #15, 'Sirk. kanal, Forsinket st\X\E5l', '2-SIRK', $, (#119), $, $, $, .RIGIDSEGMENT.); +#117 = IFCCLASSIFICATIONREFERENCE($, 'VB2.121212', 'Not defined', #118); +#118 = IFCCLASSIFICATION('NS', '', $, 'NS3420'); +#119 = IFCPROPERTYSET('0KogclmVD8u9NLoxd55q2Z', #1, 'Pset_DuctSegmentTypeCommon', $, (#120, #121)); +#120 = IFCPROPERTYSINGLEVALUE('Length', $, IFCPOSITIVELENGTHMEASURE(3900.), $); +#121 = IFCPROPERTYLISTVALUE('NominalDiameterOrWidth', $, (IFCPOSITIVELENGTHMEASURE(800.)), $); +#122 = IFCRELDEFINESBYTYPE('2QWHtAK4v0NuXpTn$cwRcO', #1, $, $, (#14), #116); +#123 = IFCRELASSIGNSTOGROUP('2NMUbNdzv2NPmHrl0xeehB', #1, $, $, (#14), $, #124); +#124 = IFCSYSTEM('2qqMrTwlLERAeiT2j5aCl8', #125, '3601 Tilluft', '3601-1', $); +#125 = IFCOWNERHISTORY($, $, $, .NOCHANGE., $, $, $, 1429103705); +#126 = IFCRELSERVICESBUILDINGS('2k0QCS0pjDDPvlG2POE5oE', #1, $, $, #124, (#7)); +#127 = IFCPRESENTATIONLAYERASSIGNMENT('362--V-3601-T-36', $, (#18), $); +#128 = IFCCOLOURRGB($, 0., 1., 0.); +#129 = IFCSURFACESTYLERENDERING(#128, 0., $, $, $, $, $, $, .NOTDEFINED.); +#130 = IFCSURFACESTYLE($, .BOTH., (#129)); +#131 = IFCPRESENTATIONSTYLEASSIGNMENT((#130)); +#132 = IFCSTYLEDITEM(#27, (#131), $); +#133 = IFCRELCONTAINEDINSPATIALSTRUCTURE('0WOibVXVXFLQabcILOoRAW', #1, $, $, (#14), #13); +#134 = IFCRELAGGREGATES('1PBxJnWMLBlP8BcL_PXo71', #1, $, $, #7, (#13)); +#135 = IFCRELAGGREGATES('3$h1BhDfnDQfWZXBRDMGbj', #1, $, $, #115, (#7)); +#136 = IFCRELAGGREGATES('1UmwNW7crDGeh$LdqIdCWH', #1, $, $, #114, (#115)); +#137 = IFCLOCALPLACEMENT($, #138); +#138 = IFCAXIS2PLACEMENT3D(#22, #23, #24); +#139 = IFCLOCALPLACEMENT(#137, #140); +#140 = IFCAXIS2PLACEMENT3D(#22, #23, #24); +#141 = IFCLOCALPLACEMENT(#139, #142); +#142 = IFCAXIS2PLACEMENT3D(#143, #23, #24); +#143 = IFCCARTESIANPOINT((0., 0., 55900.)); +#144 = IFCLOCALPLACEMENT(#141, #145); +#145 = IFCAXIS2PLACEMENT3D(#146, #147, #23); +#146 = IFCCARTESIANPOINT((0, 0, 0)); +#147 = IFCDIRECTION((9.57778850166525E-1, 2.87505955023003E-1, 0.)); +#148 = IFCUNITASSIGNMENT((#149, #150, #151, #152, #153, #154, #155, #156, #157, #158, #159, #160, #164, #167, #172)); +#149 = IFCSIUNIT(*, .PLANEANGLEUNIT., $, .RADIAN.); +#150 = IFCSIUNIT(*, .AREAUNIT., $, .SQUARE_METRE.); +#151 = IFCSIUNIT(*, .LENGTHUNIT., .MILLI., .METRE.); +#152 = IFCSIUNIT(*, .MASSUNIT., $, .GRAM.); +#153 = IFCSIUNIT(*, .POWERUNIT., $, .WATT.); +#154 = IFCSIUNIT(*, .PRESSUREUNIT., .KILO., .PASCAL.); +#155 = IFCSIUNIT(*, .FORCEUNIT., .KILO., .NEWTON.); +#156 = IFCSIUNIT(*, .ELECTRICCURRENTUNIT., $, .AMPERE.); +#157 = IFCSIUNIT(*, .THERMODYNAMICTEMPERATUREUNIT., $, .DEGREE_CELSIUS.); +#158 = IFCSIUNIT(*, .TIMEUNIT., $, .SECOND.); +#159 = IFCSIUNIT(*, .VOLUMEUNIT., $, .CUBIC_METRE.); +#160 = IFCDERIVEDUNIT((#161, #162), .LINEARVELOCITYUNIT., $); +#161 = IFCDERIVEDUNITELEMENT(#163, 1); +#162 = IFCDERIVEDUNITELEMENT(#158, -1); +#163 = IFCSIUNIT(*, .LENGTHUNIT., $, .METRE.); +#164 = IFCDERIVEDUNIT((#165, #166), .VOLUMETRICFLOWRATEUNIT., $); +#165 = IFCDERIVEDUNITELEMENT(#159, 1); +#166 = IFCDERIVEDUNITELEMENT(#158, -1); +#167 = IFCDERIVEDUNIT((#168, #169, #170), .THERMALTRANSMITTANCEUNIT., $); +#168 = IFCDERIVEDUNITELEMENT(#153, 1); +#169 = IFCDERIVEDUNITELEMENT(#171, -1); +#170 = IFCDERIVEDUNITELEMENT(#150, -1); +#171 = IFCSIUNIT(*, .THERMODYNAMICTEMPERATUREUNIT., $, .KELVIN.); +#172 = IFCDERIVEDUNIT((#173), .SOUNDPRESSUREUNIT., $); +#173 = IFCDERIVEDUNITELEMENT(#174, 1); +#174 = IFCSIUNIT(*, .PRESSUREUNIT., $, .PASCAL.); +ENDSEC; +END-ISO-10303-21;