From d88d4d5951415b7127ff3c83f13c908f832cdef0 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 26 Nov 2014 14:01:31 +0000 Subject: [PATCH] Add support for IfcAsymmetricIShapeProfileDef --- src/examples/profiles.cpp | 33 +++--- src/ifcgeom/IfcGeomFaces.cpp | 36 +++++-- src/ifcgeom/IfcRegister.h | 1 + test/input/IfcIShapeProfileDef.ifc | 161 ++++++++++++++++------------- 4 files changed, 132 insertions(+), 99 deletions(-) diff --git a/src/examples/profiles.cpp b/src/examples/profiles.cpp index 3092648a49..2e3cd5449e 100644 --- a/src/examples/profiles.cpp +++ b/src/examples/profiles.cpp @@ -35,7 +35,7 @@ typedef std::string S; typedef IfcWrite::IfcGuidHelper guid; boost::none_t const null = (static_cast(0)); -void create_testcase_for(IfcSchema::IfcProfileDef::list profiles) { +void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) { IfcSchema::IfcProfileDef* profile = *profiles->begin(); const std::string profile_type = IfcSchema::Type::ToString(profile->type()); const std::string filename = profile_type + ".ifc"; @@ -44,7 +44,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list profiles) { file.filename(filename); int i = 0; - for (IfcSchema::IfcProfileDef::it it = profiles->begin(); it != profiles->end(); ++it, ++i) { + for (IfcSchema::IfcProfileDef::list::it it = profiles->begin(); it != profiles->end(); ++it, ++i) { IfcSchema::IfcProfileDef* profile = *it; IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( guid(), 0, S("profile"), null, null, 0, 0, null, null); @@ -52,7 +52,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list profiles) { file.getSingle()->setName(profile_type); product->setOwnerHistory(file.getSingle()); - product->setObjectPlacement(file.addLocalPlacement(100 * i)); + product->setObjectPlacement(file.addLocalPlacement(0, 100. * i)); if (profile->is(IfcSchema::Type::IfcParameterizedProfileDef)) { ((IfcSchema::IfcParameterizedProfileDef*) profile)->setPosition(file.addPlacement2d()); @@ -64,8 +64,8 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list profiles) { file.AddEntity(profile); file.AddEntity(solid); - IfcSchema::IfcRepresentation::list reps (new IfcTemplatedEntityList()); - IfcSchema::IfcRepresentationItem::list items (new IfcTemplatedEntityList()); + IfcSchema::IfcRepresentation::list::ptr reps (new IfcSchema::IfcRepresentation::list); + IfcSchema::IfcRepresentationItem::list::ptr items (new IfcSchema::IfcRepresentationItem::list); items->push(solid); IfcSchema::IfcShapeRepresentation* rep = new IfcSchema::IfcShapeRepresentation( @@ -84,7 +84,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list profiles) { } int main(int argc, char** argv) { - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null)); @@ -99,7 +99,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 5.0, 1.0, 3.0, 6.0, null)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null, null, null)); @@ -114,7 +114,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 5.0, 3.0, 2.0, 1.0, 2.0, 2.0, null)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcZShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 5.0, null, null)); @@ -123,7 +123,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcEllipseProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 15.0)); @@ -132,16 +132,19 @@ int main(int argc, char** argv) { null, 0, 15.0, 25.0)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 50.0, 5.0, 5.0, null)); profiles->push(new Ifc2x3::IfcIShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0, 50.0, 5.0, 5.0, 2.0)); + profiles->push(new Ifc2x3::IfcAsymmetricIShapeProfileDef( + IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, + null, 0, 25.0, 50.0, 5.0, 5.0, 2.0, 20.0, 10.0, 5.0, null)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, null, null, null, null, null)); @@ -156,7 +159,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 1.0, 2.0, 2.0, null, null)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcCShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0, 5.0, 10.0, null, null)); @@ -165,7 +168,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 10.0, 2.0, null)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcCircleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 25.0)); @@ -174,7 +177,7 @@ int main(int argc, char** argv) { null, 0, 25.0, 5.0)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcRectangleProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 25.0)); @@ -189,7 +192,7 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 2.0, 4.0)); create_testcase_for(profiles); } - { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); + { IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list); profiles->push(new Ifc2x3::IfcTrapeziumProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, 0, 50.0, 30.0, 25.0, 0.0)); diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index 5db0e2b46d..910586a02f 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -331,17 +331,33 @@ bool IfcGeom::convert(const IfcSchema::IfcTrapeziumProfileDef* l, TopoDS_Shape& } bool IfcGeom::convert(const IfcSchema::IfcIShapeProfileDef* l, TopoDS_Shape& face) { - const double x = l->OverallWidth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double x1 = l->OverallWidth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); const double y = l->OverallDepth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); const double d1 = l->WebThickness() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); - const double d2 = l->FlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); - bool doFillet = l->hasFilletRadius(); - double f = 0.; - if ( doFillet ) { - f = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double dy1 = l->FlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + + bool doFillet1 = l->hasFilletRadius(); + double f1 = 0.; + if ( doFillet1 ) { + f1 = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); } - if ( x == 0.0f || y == 0.0f || d1 == 0.0f || d2 == 0.0f ) { + bool doFillet2 = doFillet1; + double x2 = x1, dy2 = dy1, f2 = f1; + + if (l->is(IfcSchema::Type::IfcAsymmetricIShapeProfileDef)) { + IfcSchema::IfcAsymmetricIShapeProfileDef* assym = (IfcSchema::IfcAsymmetricIShapeProfileDef*) l; + x2 = assym->TopFlangeWidth() / 2. * IfcGeom::GetValue(GV_LENGTH_UNIT); + doFillet2 = assym->hasTopFlangeFilletRadius(); + if (doFillet2) { + f2 = assym->TopFlangeFilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + if (assym->hasTopFlangeThickness()) { + dy2 = assym->TopFlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + } + + if ( x1 < ALMOST_ZERO || x2 < ALMOST_ZERO || y < ALMOST_ZERO || d1 < ALMOST_ZERO || dy1 < ALMOST_ZERO || dy2 < ALMOST_ZERO ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } @@ -349,10 +365,10 @@ bool IfcGeom::convert(const IfcSchema::IfcIShapeProfileDef* l, TopoDS_Shape& fac gp_Trsf2d trsf2d; IfcGeom::convert(l->Position(),trsf2d); - double coords[24] = {-x,-y,x,-y,x,-y+d2,d1,-y+d2,d1,y-d2,x,y-d2,x,y,-x,y,-x,y-d2,-d1,y-d2,-d1,-y+d2,-x,-y+d2}; + double coords[24] = {-x1,-y, x1,-y, x1,-y+dy1, d1,-y+dy1, d1,y-dy2, x2,y-dy2, x2,y, -x2,y, -x2,y-dy2, -d1,y-dy2, -d1,-y+dy1, -x1,-y+dy1}; int fillets[4] = {3,4,9,10}; - double radii[4] = {f,f,f,f}; - return IfcGeom::profile_helper(12,coords,doFillet ? 4 : 0,fillets,radii,trsf2d,face); + double radii[4] = {f1,f1,f2,f2}; + return IfcGeom::profile_helper(12,coords,(doFillet1||doFillet2) ? 4 : 0,fillets,radii,trsf2d,face); } bool IfcGeom::convert(const IfcSchema::IfcZShapeProfileDef* l, TopoDS_Shape& face) { diff --git a/src/ifcgeom/IfcRegister.h b/src/ifcgeom/IfcRegister.h index 0ea1dba78c..76eb966269 100644 --- a/src/ifcgeom/IfcRegister.h +++ b/src/ifcgeom/IfcRegister.h @@ -83,6 +83,7 @@ FACE(IfcRectangleHollowProfileDef); FACE(IfcRectangleProfileDef); FACE(IfcTrapeziumProfileDef) FACE(IfcCShapeProfileDef); +// IfcAsymmetricIShapeProfileDef included FACE(IfcIShapeProfileDef); FACE(IfcLShapeProfileDef); FACE(IfcTShapeProfileDef); diff --git a/test/input/IfcIShapeProfileDef.ifc b/test/input/IfcIShapeProfileDef.ifc index e7663e6fe0..30369e5f97 100644 --- a/test/input/IfcIShapeProfileDef.ifc +++ b/test/input/IfcIShapeProfileDef.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('IfcIShapeProfileDef.ifc','2014-02-23T12:17:26',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_NAME('IfcIShapeProfileDef.ifc','2014-11-26T14:27:17',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; @@ -9,78 +9,91 @@ DATA; #2=IFCORGANIZATION($,'IfcOpenShell',$,$,$); #3=IFCPERSONANDORGANIZATION(#1,#2,$); #4=IFCAPPLICATION(#2,'0.5.0-dev','IfcOpenShell','IfcOpenShell'); -#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1393154246); -#6=IFCDIRECTION((0.,1.,0.)); -#7=IFCDIRECTION((1.,0.,0.)); -#8=IFCDIRECTION((0.,0.,1.)); -#9=IFCCARTESIANPOINT((0.,0.,0.)); -#10=IFCAXIS2PLACEMENT3D(#9,#8,#7); -#11=IFCGEOMETRICREPRESENTATIONCONTEXT('Plan','Model',3,1.E-005,#10,#6); -#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); -#13=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); -#14=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); -#15=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#14); -#16=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'Degrees',#15); -#17=IFCUNITASSIGNMENT((#13,#16)); -#18=IFCPROJECT('2KOHs4nSD9uuIi7enj9fr0',#5,'IfcIShapeProfileDef',$,$,$,$,(#11),#17); -#19=IFCDIRECTION((1.,0.,0.)); -#20=IFCDIRECTION((0.,0.,1.)); -#21=IFCCARTESIANPOINT((0.,0.,0.)); -#22=IFCAXIS2PLACEMENT3D(#21,#20,#19); -#23=IFCLOCALPLACEMENT($,#22); -#24=IFCSITE('1lruVjkubEmBeYjtZqCZu2',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); -#25=IFCRELAGGREGATES('3OPScms790MwrpNEEp6Pme',#5,$,$,#18,(#24)); -#26=IFCDIRECTION((1.,0.,0.)); -#27=IFCDIRECTION((0.,0.,1.)); -#28=IFCCARTESIANPOINT((0.,0.,0.)); -#29=IFCAXIS2PLACEMENT3D(#28,#27,#26); -#30=IFCLOCALPLACEMENT(#23,#29); -#31=IFCBUILDING('06eFSA_tHCPvcQhhGyujw8',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); -#32=IFCRELAGGREGATES('3piPcRpsj4kufJS6uIUYEX',#5,$,$,#24,(#31)); -#33=IFCDIRECTION((1.,0.,0.)); -#34=IFCDIRECTION((0.,0.,1.)); -#35=IFCCARTESIANPOINT((0.,0.,0.)); -#36=IFCAXIS2PLACEMENT3D(#35,#34,#33); -#37=IFCLOCALPLACEMENT(#30,#36); -#38=IFCBUILDINGSTOREY('3wk8ZJ1Zf1LecGq5wib$UM',#5,$,$,$,#37,$,$,.ELEMENT.,$); -#39=IFCRELAGGREGATES('26SvotDGb7Fe8d$wvMyX3W',#5,$,$,#31,(#38)); -#40=IFCBUILDINGELEMENTPROXY('3Y4tF1eJnEBwlGlOJt151k',#5,'profile',$,$,#46,#58,$,$); -#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('2IMXhEgbn6jP_MmewiOwkc',#5,$,$,(#40),#38); -#42=IFCDIRECTION((1.,0.,0.)); -#43=IFCDIRECTION((0.,0.,1.)); -#44=IFCCARTESIANPOINT((0.,0.,0.)); -#45=IFCAXIS2PLACEMENT3D(#44,#43,#42); -#46=IFCLOCALPLACEMENT($,#45); -#47=IFCDIRECTION((1.,0.)); -#48=IFCCARTESIANPOINT((0.,0.)); -#49=IFCAXIS2PLACEMENT2D(#48,#47); -#50=IFCDIRECTION((0.,0.,1.)); -#51=IFCDIRECTION((1.,0.,0.)); -#52=IFCDIRECTION((0.,0.,1.)); -#53=IFCCARTESIANPOINT((0.,0.,0.)); -#54=IFCAXIS2PLACEMENT3D(#53,#52,#51); -#55=IFCISHAPEPROFILEDEF(.AREA.,$,#49,25.,50.,5.,5.,$); -#56=IFCEXTRUDEDAREASOLID(#55,#54,#50,20.); -#57=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#56)); -#58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57)); -#59=IFCBUILDINGELEMENTPROXY('1MUiX0$sbEwxx8E0uTLtPY',#5,'profile',$,$,#65,#77,$,$); -#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('3QRrMzj0bCK8iRu0Ec3$Ft',#5,$,$,(#59),#38); -#61=IFCDIRECTION((1.,0.,0.)); -#62=IFCDIRECTION((0.,0.,1.)); -#63=IFCCARTESIANPOINT((100.,0.,0.)); -#64=IFCAXIS2PLACEMENT3D(#63,#62,#61); -#65=IFCLOCALPLACEMENT($,#64); -#66=IFCDIRECTION((1.,0.)); -#67=IFCCARTESIANPOINT((0.,0.)); -#68=IFCAXIS2PLACEMENT2D(#67,#66); -#69=IFCDIRECTION((0.,0.,1.)); -#70=IFCDIRECTION((1.,0.,0.)); -#71=IFCDIRECTION((0.,0.,1.)); -#72=IFCCARTESIANPOINT((0.,0.,0.)); -#73=IFCAXIS2PLACEMENT3D(#72,#71,#70); -#74=IFCISHAPEPROFILEDEF(.AREA.,$,#68,25.,50.,5.,5.,2.); -#75=IFCEXTRUDEDAREASOLID(#74,#73,#69,20.); -#76=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#75)); -#77=IFCPRODUCTDEFINITIONSHAPE($,$,(#76)); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,1417008437,#3,#4,1417008437); +#6=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#7=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#8=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#9=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453293),#8); +#10=IFCCONVERSIONBASEDUNIT(#6,.PLANEANGLEUNIT.,'Degrees',#9); +#11=IFCUNITASSIGNMENT((#7,#10)); +#12=IFCPROJECT('3m4yn5_O962PjTcijfzks3',#5,'IfcIShapeProfileDef',$,$,$,$,(),#11); +#13=IFCDIRECTION((1.,0.,0.)); +#14=IFCDIRECTION((0.,0.,1.)); +#15=IFCCARTESIANPOINT((0.,0.,0.)); +#16=IFCAXIS2PLACEMENT3D(#15,#14,#13); +#17=IFCLOCALPLACEMENT($,#16); +#18=IFCSITE('24$986K_926AmY4iydFtGH',#5,$,$,$,#17,$,$,.ELEMENT.,$,$,$,$,$); +#19=IFCRELAGGREGATES('1yoPiTUUb9xfZLREFmq4Z$',#5,$,$,#12,(#18)); +#20=IFCDIRECTION((1.,0.,0.)); +#21=IFCDIRECTION((0.,0.,1.)); +#22=IFCCARTESIANPOINT((0.,0.,0.)); +#23=IFCAXIS2PLACEMENT3D(#22,#21,#20); +#24=IFCLOCALPLACEMENT(#17,#23); +#25=IFCBUILDING('0ea_c1tET2ahOErGgHglqm',#5,$,$,$,#24,$,$,.ELEMENT.,$,$,$); +#26=IFCRELAGGREGATES('3V7Akfyjr30heVaFOS8XR5',#5,$,$,#18,(#25)); +#27=IFCDIRECTION((1.,0.,0.)); +#28=IFCDIRECTION((0.,0.,1.)); +#29=IFCCARTESIANPOINT((0.,0.,0.)); +#30=IFCAXIS2PLACEMENT3D(#29,#28,#27); +#31=IFCLOCALPLACEMENT(#24,#30); +#32=IFCBUILDINGSTOREY('2MQ$o6sLD6hQTkVd4N5O$N',#5,$,$,$,#31,$,$,.ELEMENT.,$); +#33=IFCRELAGGREGATES('28wPobaAHEn9E70QY2qB8Z',#5,$,$,#25,(#32)); +#34=IFCBUILDINGELEMENTPROXY('25O9yPEmn6yRVqMHMWnLzO',#5,'profile',$,$,#40,#52,$,$); +#35=IFCRELCONTAINEDINSPATIALSTRUCTURE('20MhO8tBn67RjJNbxaBp0O',#5,$,$,(#34),#32); +#36=IFCDIRECTION((1.,0.,0.)); +#37=IFCDIRECTION((0.,0.,1.)); +#38=IFCCARTESIANPOINT((0.,0.,0.)); +#39=IFCAXIS2PLACEMENT3D(#38,#37,#36); +#40=IFCLOCALPLACEMENT($,#39); +#41=IFCDIRECTION((1.,0.)); +#42=IFCCARTESIANPOINT((0.,0.)); +#43=IFCAXIS2PLACEMENT2D(#42,#41); +#44=IFCDIRECTION((0.,0.,1.)); +#45=IFCDIRECTION((1.,0.,0.)); +#46=IFCDIRECTION((0.,0.,1.)); +#47=IFCCARTESIANPOINT((0.,0.,0.)); +#48=IFCAXIS2PLACEMENT3D(#47,#46,#45); +#49=IFCISHAPEPROFILEDEF(.AREA.,$,#43,25.,50.,5.,5.,$); +#50=IFCEXTRUDEDAREASOLID(#49,#48,#44,20.); +#51=IFCSHAPEREPRESENTATION($,'Body','SweptSolid',(#50)); +#52=IFCPRODUCTDEFINITIONSHAPE($,$,(#51)); +#53=IFCBUILDINGELEMENTPROXY('2loPfmiir3EQ4GkWdTZtUT',#5,'profile',$,$,#59,#71,$,$); +#54=IFCRELCONTAINEDINSPATIALSTRUCTURE('00o_PIW_fCYBRtHNmvHPuC',#5,$,$,(#53),#32); +#55=IFCDIRECTION((1.,0.,0.)); +#56=IFCDIRECTION((0.,0.,1.)); +#57=IFCCARTESIANPOINT((100.,0.,0.)); +#58=IFCAXIS2PLACEMENT3D(#57,#56,#55); +#59=IFCLOCALPLACEMENT($,#58); +#60=IFCDIRECTION((1.,0.)); +#61=IFCCARTESIANPOINT((0.,0.)); +#62=IFCAXIS2PLACEMENT2D(#61,#60); +#63=IFCDIRECTION((0.,0.,1.)); +#64=IFCDIRECTION((1.,0.,0.)); +#65=IFCDIRECTION((0.,0.,1.)); +#66=IFCCARTESIANPOINT((0.,0.,0.)); +#67=IFCAXIS2PLACEMENT3D(#66,#65,#64); +#68=IFCISHAPEPROFILEDEF(.AREA.,$,#62,25.,50.,5.,5.,2.); +#69=IFCEXTRUDEDAREASOLID(#68,#67,#63,20.); +#70=IFCSHAPEREPRESENTATION($,'Body','SweptSolid',(#69)); +#71=IFCPRODUCTDEFINITIONSHAPE($,$,(#70)); +#72=IFCBUILDINGELEMENTPROXY('2UNbwWn6HDU9y9qy2HK0BH',#5,'profile',$,$,#78,#90,$,$); +#73=IFCRELCONTAINEDINSPATIALSTRUCTURE('0epcVcwyXCFelG9nIXNUA0',#5,$,$,(#72),#32); +#74=IFCDIRECTION((1.,0.,0.)); +#75=IFCDIRECTION((0.,0.,1.)); +#76=IFCCARTESIANPOINT((200.,0.,0.)); +#77=IFCAXIS2PLACEMENT3D(#76,#75,#74); +#78=IFCLOCALPLACEMENT($,#77); +#79=IFCDIRECTION((1.,0.)); +#80=IFCCARTESIANPOINT((0.,0.)); +#81=IFCAXIS2PLACEMENT2D(#80,#79); +#82=IFCDIRECTION((0.,0.,1.)); +#83=IFCDIRECTION((1.,0.,0.)); +#84=IFCDIRECTION((0.,0.,1.)); +#85=IFCCARTESIANPOINT((0.,0.,0.)); +#86=IFCAXIS2PLACEMENT3D(#85,#84,#83); +#87=IFCASYMMETRICISHAPEPROFILEDEF(.AREA.,$,#81,25.,50.,5.,5.,2.,20.,10.,5.,$); +#88=IFCEXTRUDEDAREASOLID(#87,#86,#82,20.); +#89=IFCSHAPEREPRESENTATION($,'Body','SweptSolid',(#88)); +#90=IFCPRODUCTDEFINITIONSHAPE($,$,(#89)); ENDSEC; END-ISO-10303-21;