diff --git a/src/examples/ellipse_pies.cpp b/src/examples/ellipse_pies.cpp new file mode 100644 index 0000000000..967eb2cd12 --- /dev/null +++ b/src/examples/ellipse_pies.cpp @@ -0,0 +1,148 @@ +/******************************************************************************** + * * + * This file is part of IfcOpenShell. * + * * + * IfcOpenShell is free software: you can redistribute it and/or modify * + * it under the terms of the Lesser GNU General Public License as published by * + * the Free Software Foundation, either version 3.0 of the License, or * + * (at your option) any later version. * + * * + * IfcOpenShell is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * Lesser GNU General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see . * + * * + ********************************************************************************/ + +/******************************************************************************** + * * + * Example that generates profiles of trimmed ellipses. * + * * + ********************************************************************************/ + +#include +#include +#include + +#include "../ifcparse/Ifc2x3.h" +#include "../ifcparse/IfcUtil.h" +#include "../ifcparse/IfcHierarchyHelper.h" + +typedef std::string S; +typedef IfcWrite::IfcGuidHelper guid; +boost::none_t const null = (static_cast(0)); + +typedef struct { + double r1; + double r2; + double t1; + double t2; +} EllipsePie; + +static int i = 0; + +void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference pref) { + const double deg = 1. / 180. * 3.141592653; + double flt1[] = {0. , 0. }; + double flt2[] = {pie.r1 * cos(pie.t1*deg), pie.r2 * sin(pie.t1*deg)}; + double flt3[] = {pie.r1 * cos(pie.t2*deg), pie.r2 * sin(pie.t2*deg)}; + + std::vector coords1(flt1, flt1 + 2); + std::vector coords2(flt2, flt2 + 2); + std::vector coords3(flt3, flt3 + 2); + + Ifc2x3::IfcCartesianPoint* p1 = new Ifc2x3::IfcCartesianPoint(coords1); + Ifc2x3::IfcCartesianPoint* p2 = new Ifc2x3::IfcCartesianPoint(coords2); + Ifc2x3::IfcCartesianPoint* p3 = new Ifc2x3::IfcCartesianPoint(coords3); + + Ifc2x3::IfcCartesianPoint::list points(new IfcTemplatedEntityList()); + points->push(p3); + points->push(p1); + points->push(p2); + file.AddEntities(points->generalize()); + + + Ifc2x3::IfcEllipse* ellipse = new Ifc2x3::IfcEllipse(file.addPlacement2d(), pie.r1, pie.r2); + file.AddEntity(ellipse); + IfcEntities trim1(new IfcEntityList()); + IfcEntities trim2(new IfcEntityList()); + if (pref == Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER) { + trim1->push(new IfcWrite::IfcSelectHelper(pie.t1, Ifc2x3::Type::IfcParameterValue)); + trim2->push(new IfcWrite::IfcSelectHelper(pie.t2, Ifc2x3::Type::IfcParameterValue)); + } else { + trim1->push(p2); + trim2->push(p3); + } + Ifc2x3::IfcTrimmedCurve* trim = new Ifc2x3::IfcTrimmedCurve(ellipse, trim1, trim2, true, pref); + file.AddEntity(trim); + + Ifc2x3::IfcCompositeCurveSegment::list segments(new IfcTemplatedEntityList()); + Ifc2x3::IfcCompositeCurveSegment* s2 = new Ifc2x3::IfcCompositeCurveSegment(Ifc2x3::IfcTransitionCode::IfcTransitionCode_CONTINUOUS, true, trim); + + Ifc2x3::IfcPolyline* poly = new Ifc2x3::IfcPolyline(points); + file.AddEntity(poly); + Ifc2x3::IfcCompositeCurveSegment* s1 = new Ifc2x3::IfcCompositeCurveSegment(Ifc2x3::IfcTransitionCode::IfcTransitionCode_CONTINUOUS, true, poly); + segments->push(s1); + + segments->push(s2); + file.AddEntities(segments->generalize()); + + Ifc2x3::IfcCompositeCurve* ccurve = new Ifc2x3::IfcCompositeCurve(segments, false); + Ifc2x3::IfcArbitraryClosedProfileDef* profile = new Ifc2x3::IfcArbitraryClosedProfileDef(Ifc2x3::IfcProfileTypeEnum::IfcProfileType_AREA, null, ccurve); + file.AddEntity(ccurve); + file.AddEntity(profile); + + IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy( + guid(), 0, S("profile"), null, null, 0, 0, null, null); + file.addBuildingProduct(product); + product->setOwnerHistory(file.getSingle()); + + product->setObjectPlacement(file.addLocalPlacement(200 * i++)); + + IfcSchema::IfcExtrudedAreaSolid* solid = new IfcSchema::IfcExtrudedAreaSolid(profile, + file.addPlacement3d(), file.addTriplet(0, 0, 1), 20.0); + + file.AddEntity(solid); + + IfcSchema::IfcRepresentation::list reps (new IfcTemplatedEntityList()); + IfcSchema::IfcRepresentationItem::list items (new IfcTemplatedEntityList()); + + items->push(solid); + IfcSchema::IfcShapeRepresentation* rep = new IfcSchema::IfcShapeRepresentation( + file.getSingle(), S("Body"), S("SweptSolid"), items); + reps->push(rep); + + IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps); + file.AddEntity(rep); + file.AddEntity(shape); + + product->setRepresentation(shape); +} + +int main(int argc, char** argv) { + const std::string filename = "ellipse_pies.ifc"; + IfcHierarchyHelper file; + { EllipsePie pie = {80., 50., 0., 150.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + { EllipsePie pie = {80, 50., 30., 300.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + { EllipsePie pie = {80, 50., 300., 30.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + { EllipsePie pie = {50., 80., 0., 150.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + { EllipsePie pie = {50, 80., 30., 300.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + { EllipsePie pie = {50, 80., 300., 30.}; + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER); + create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);} + std::ofstream f(filename.c_str()); + f << file; +} diff --git a/src/ifcgeom/IfcGeomCurves.cpp b/src/ifcgeom/IfcGeomCurves.cpp index 1a89b74da3..0c5580be06 100644 --- a/src/ifcgeom/IfcGeomCurves.cpp +++ b/src/ifcgeom/IfcGeomCurves.cpp @@ -23,6 +23,8 @@ * * ********************************************************************************/ +#include + #include #include #include @@ -96,7 +98,12 @@ bool IfcGeom::convert(const IfcSchema::IfcCircle::ptr l, Handle(Geom_Curve)& cur bool IfcGeom::convert(const IfcSchema::IfcEllipse::ptr l, Handle(Geom_Curve)& curve) { double x = l->SemiAxis1() * IfcGeom::GetValue(GV_LENGTH_UNIT); double y = l->SemiAxis2() * IfcGeom::GetValue(GV_LENGTH_UNIT); - if ( x == 0.0f || y == 0.0f || y > x ) { return false; } + if (x < ALMOST_ZERO || y < ALMOST_ZERO) { return false; } + // Open Cascade does not allow ellipses of which the minor radius + // is greater than the major radius. Hence, in this case, the + // ellipse is rotated. Note that special care needs to be taken + // when creating a trimmed curve off of an ellipse like this. + const bool rotated = y > x; gp_Trsf trsf; IfcSchema::IfcAxis2Placement placement = l->Position(); if (placement->is(IfcSchema::Type::IfcAxis2Placement3D)) { @@ -106,7 +113,12 @@ bool IfcGeom::convert(const IfcSchema::IfcEllipse::ptr l, Handle(Geom_Curve)& cu IfcGeom::convert((IfcSchema::IfcAxis2Placement2D*)placement,trsf2d); trsf = trsf2d; } - gp_Ax2 ax = gp_Ax2().Transformed(trsf); + gp_Ax2 ax = gp_Ax2(); + if (rotated) { + ax.Rotate(ax.Axis(), M_PI / 2.); + std::swap(x, y); + } + ax.Transform(trsf); curve = new Geom_Ellipse(ax, x, y); return true; } diff --git a/src/ifcgeom/IfcGeomWires.cpp b/src/ifcgeom/IfcGeomWires.cpp index 9e17cd73ca..5bf8740739 100644 --- a/src/ifcgeom/IfcGeomWires.cpp +++ b/src/ifcgeom/IfcGeomWires.cpp @@ -243,6 +243,16 @@ bool IfcGeom::convert(const IfcSchema::IfcTrimmedCurve::ptr l, TopoDS_Wire& wire const double magnitude = line->Dir()->Magnitude(); flts[0] *= magnitude; flts[1] *= magnitude; } + if ( basis_curve->is(IfcSchema::Type::IfcEllipse) ) { + IfcSchema::IfcEllipse* ellipse = static_cast(basis_curve); + double x = ellipse->SemiAxis1() * IfcGeom::GetValue(GV_LENGTH_UNIT); + double y = ellipse->SemiAxis2() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const bool rotated = y > x; + if (rotated) { + flts[0] -= M_PI / 2.; + flts[1] -= M_PI / 2.; + } + } if ( isConic && ALMOST_THE_SAME(fmod(flts[1]-flts[0],(double)(M_PI*2.0)),0.0f) ) { w.Add(BRepBuilderAPI_MakeEdge(curve)); } else { diff --git a/test/input/ellipse_pies.ifc b/test/input/ellipse_pies.ifc new file mode 100644 index 0000000000..73ba8233b1 --- /dev/null +++ b/test/input/ellipse_pies.ifc @@ -0,0 +1,384 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2014-03-01T19:22:28',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_SCHEMA(('IFC2X3')); +ENDSEC; +DATA; +#1=IFCCARTESIANPOINT((-69.282,25.)); +#2=IFCCARTESIANPOINT((0.,0.)); +#3=IFCCARTESIANPOINT((80.,0.)); +#4=IFCDIRECTION((1.,0.)); +#5=IFCCARTESIANPOINT((0.,0.)); +#6=IFCAXIS2PLACEMENT2D(#5,#4); +#7=IFCELLIPSE(#6,80.,50.); +#8=IFCTRIMMEDCURVE(#7,(IFCPARAMETERVALUE(0.)),(IFCPARAMETERVALUE(150.)),.T.,.PARAMETER.); +#9=IFCPOLYLINE((#1,#2,#3)); +#10=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#9); +#11=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#8); +#12=IFCCOMPOSITECURVE((#10,#11),.F.); +#13=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#12); +#14=IFCPERSON($,$,'',$,$,$,$,$); +#15=IFCORGANIZATION($,'IfcOpenShell',$,$,$); +#16=IFCPERSONANDORGANIZATION(#14,#15,$); +#17=IFCAPPLICATION(#15,'0.5.0-dev','IfcOpenShell','IfcOpenShell'); +#18=IFCOWNERHISTORY(#16,#17,$,.ADDED.,$,#16,#17,1393698148); +#19=IFCDIRECTION((0.,1.,0.)); +#20=IFCDIRECTION((1.,0.,0.)); +#21=IFCDIRECTION((0.,0.,1.)); +#22=IFCCARTESIANPOINT((0.,0.,0.)); +#23=IFCAXIS2PLACEMENT3D(#22,#21,#20); +#24=IFCGEOMETRICREPRESENTATIONCONTEXT('Plan','Model',3,1.E-005,#23,#19); +#25=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#26=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#27=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#28=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#27); +#29=IFCCONVERSIONBASEDUNIT(#25,.PLANEANGLEUNIT.,'Degrees',#28); +#30=IFCUNITASSIGNMENT((#26,#29)); +#31=IFCPROJECT('3dCDOYw4n5Y8eJ_0KefHrD',#18,$,$,$,$,$,(#24),#30); +#32=IFCDIRECTION((1.,0.,0.)); +#33=IFCDIRECTION((0.,0.,1.)); +#34=IFCCARTESIANPOINT((0.,0.,0.)); +#35=IFCAXIS2PLACEMENT3D(#34,#33,#32); +#36=IFCLOCALPLACEMENT($,#35); +#37=IFCSITE('0ol03OK$nDUvCKpih6_bvZ',#18,$,$,$,#36,$,$,.ELEMENT.,$,$,$,$,$); +#38=IFCRELAGGREGATES('3yCAEqUIb0BPJHU96H8gC2',#18,$,$,#31,(#37)); +#39=IFCDIRECTION((1.,0.,0.)); +#40=IFCDIRECTION((0.,0.,1.)); +#41=IFCCARTESIANPOINT((0.,0.,0.)); +#42=IFCAXIS2PLACEMENT3D(#41,#40,#39); +#43=IFCLOCALPLACEMENT(#36,#42); +#44=IFCBUILDING('0R1s4OXGbEtg49f5zLhJ3g',#18,$,$,$,#43,$,$,.ELEMENT.,$,$,$); +#45=IFCRELAGGREGATES('0sxw3WgU1Coev9zSyYzWO9',#18,$,$,#37,(#44)); +#46=IFCDIRECTION((1.,0.,0.)); +#47=IFCDIRECTION((0.,0.,1.)); +#48=IFCCARTESIANPOINT((0.,0.,0.)); +#49=IFCAXIS2PLACEMENT3D(#48,#47,#46); +#50=IFCLOCALPLACEMENT(#43,#49); +#51=IFCBUILDINGSTOREY('1HvrpjaUD0mAy9OYzypHxq',#18,$,$,$,#50,$,$,.ELEMENT.,$); +#52=IFCRELAGGREGATES('2DM$wvbjr0wR$W7fs780rK',#18,$,$,#44,(#51)); +#53=IFCBUILDINGELEMENTPROXY('30PQ1kM756iReDeYWo3djN',#18,'profile',$,$,#59,#67,$,$); +#54=IFCRELCONTAINEDINSPATIALSTRUCTURE('3X4LOUUP1BmBGTSuGACijT',#18,$,$,(#53),#51); +#55=IFCDIRECTION((1.,0.,0.)); +#56=IFCDIRECTION((0.,0.,1.)); +#57=IFCCARTESIANPOINT((0.,0.,0.)); +#58=IFCAXIS2PLACEMENT3D(#57,#56,#55); +#59=IFCLOCALPLACEMENT($,#58); +#60=IFCDIRECTION((0.,0.,1.)); +#61=IFCDIRECTION((1.,0.,0.)); +#62=IFCDIRECTION((0.,0.,1.)); +#63=IFCCARTESIANPOINT((0.,0.,0.)); +#64=IFCAXIS2PLACEMENT3D(#63,#62,#61); +#65=IFCEXTRUDEDAREASOLID(#13,#64,#60,20.); +#66=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#65)); +#67=IFCPRODUCTDEFINITIONSHAPE($,$,(#66)); +#68=IFCCARTESIANPOINT((-69.282,25.)); +#69=IFCCARTESIANPOINT((0.,0.)); +#70=IFCCARTESIANPOINT((80.,0.)); +#71=IFCDIRECTION((1.,0.)); +#72=IFCCARTESIANPOINT((0.,0.)); +#73=IFCAXIS2PLACEMENT2D(#72,#71); +#74=IFCELLIPSE(#73,80.,50.); +#75=IFCTRIMMEDCURVE(#74,(#70),(#68),.T.,.CARTESIAN.); +#76=IFCPOLYLINE((#68,#69,#70)); +#77=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#76); +#78=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#75); +#79=IFCCOMPOSITECURVE((#77,#78),.F.); +#80=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#79); +#81=IFCBUILDINGELEMENTPROXY('1tTkxkpn5CrRC_KrdxI7cs',#18,'profile',$,$,#87,#95,$,$); +#82=IFCRELCONTAINEDINSPATIALSTRUCTURE('3jSIc1$rHB1hhu49tyDp0m',#18,$,$,(#81),#51); +#83=IFCDIRECTION((1.,0.,0.)); +#84=IFCDIRECTION((0.,0.,1.)); +#85=IFCCARTESIANPOINT((200.,0.,0.)); +#86=IFCAXIS2PLACEMENT3D(#85,#84,#83); +#87=IFCLOCALPLACEMENT($,#86); +#88=IFCDIRECTION((0.,0.,1.)); +#89=IFCDIRECTION((1.,0.,0.)); +#90=IFCDIRECTION((0.,0.,1.)); +#91=IFCCARTESIANPOINT((0.,0.,0.)); +#92=IFCAXIS2PLACEMENT3D(#91,#90,#89); +#93=IFCEXTRUDEDAREASOLID(#80,#92,#88,20.); +#94=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#93)); +#95=IFCPRODUCTDEFINITIONSHAPE($,$,(#94)); +#96=IFCCARTESIANPOINT((40.,-43.3013)); +#97=IFCCARTESIANPOINT((0.,0.)); +#98=IFCCARTESIANPOINT((69.282,25.)); +#99=IFCDIRECTION((1.,0.)); +#100=IFCCARTESIANPOINT((0.,0.)); +#101=IFCAXIS2PLACEMENT2D(#100,#99); +#102=IFCELLIPSE(#101,80.,50.); +#103=IFCTRIMMEDCURVE(#102,(IFCPARAMETERVALUE(30.)),(IFCPARAMETERVALUE(300.)),.T.,.PARAMETER.); +#104=IFCPOLYLINE((#96,#97,#98)); +#105=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#104); +#106=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#103); +#107=IFCCOMPOSITECURVE((#105,#106),.F.); +#108=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#107); +#109=IFCBUILDINGELEMENTPROXY('2NRk9uETP8nPw_R0$dnPSi',#18,'profile',$,$,#115,#123,$,$); +#110=IFCRELCONTAINEDINSPATIALSTRUCTURE('1CkBKQ1DD5HO3W4GCoUn3k',#18,$,$,(#109),#51); +#111=IFCDIRECTION((1.,0.,0.)); +#112=IFCDIRECTION((0.,0.,1.)); +#113=IFCCARTESIANPOINT((400.,0.,0.)); +#114=IFCAXIS2PLACEMENT3D(#113,#112,#111); +#115=IFCLOCALPLACEMENT($,#114); +#116=IFCDIRECTION((0.,0.,1.)); +#117=IFCDIRECTION((1.,0.,0.)); +#118=IFCDIRECTION((0.,0.,1.)); +#119=IFCCARTESIANPOINT((0.,0.,0.)); +#120=IFCAXIS2PLACEMENT3D(#119,#118,#117); +#121=IFCEXTRUDEDAREASOLID(#108,#120,#116,20.); +#122=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#121)); +#123=IFCPRODUCTDEFINITIONSHAPE($,$,(#122)); +#124=IFCCARTESIANPOINT((40.,-43.3013)); +#125=IFCCARTESIANPOINT((0.,0.)); +#126=IFCCARTESIANPOINT((69.282,25.)); +#127=IFCDIRECTION((1.,0.)); +#128=IFCCARTESIANPOINT((0.,0.)); +#129=IFCAXIS2PLACEMENT2D(#128,#127); +#130=IFCELLIPSE(#129,80.,50.); +#131=IFCTRIMMEDCURVE(#130,(#126),(#124),.T.,.CARTESIAN.); +#132=IFCPOLYLINE((#124,#125,#126)); +#133=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#132); +#134=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#131); +#135=IFCCOMPOSITECURVE((#133,#134),.F.); +#136=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#135); +#137=IFCBUILDINGELEMENTPROXY('3ywxxkz8XBKeZa9KdjkKdq',#18,'profile',$,$,#143,#151,$,$); +#138=IFCRELCONTAINEDINSPATIALSTRUCTURE('37ivoeNT12jusPi97ysI7W',#18,$,$,(#137),#51); +#139=IFCDIRECTION((1.,0.,0.)); +#140=IFCDIRECTION((0.,0.,1.)); +#141=IFCCARTESIANPOINT((600.,0.,0.)); +#142=IFCAXIS2PLACEMENT3D(#141,#140,#139); +#143=IFCLOCALPLACEMENT($,#142); +#144=IFCDIRECTION((0.,0.,1.)); +#145=IFCDIRECTION((1.,0.,0.)); +#146=IFCDIRECTION((0.,0.,1.)); +#147=IFCCARTESIANPOINT((0.,0.,0.)); +#148=IFCAXIS2PLACEMENT3D(#147,#146,#145); +#149=IFCEXTRUDEDAREASOLID(#136,#148,#144,20.); +#150=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#149)); +#151=IFCPRODUCTDEFINITIONSHAPE($,$,(#150)); +#152=IFCCARTESIANPOINT((69.282,25.)); +#153=IFCCARTESIANPOINT((0.,0.)); +#154=IFCCARTESIANPOINT((40.,-43.3013)); +#155=IFCDIRECTION((1.,0.)); +#156=IFCCARTESIANPOINT((0.,0.)); +#157=IFCAXIS2PLACEMENT2D(#156,#155); +#158=IFCELLIPSE(#157,80.,50.); +#159=IFCTRIMMEDCURVE(#158,(IFCPARAMETERVALUE(300.)),(IFCPARAMETERVALUE(30.)),.T.,.PARAMETER.); +#160=IFCPOLYLINE((#152,#153,#154)); +#161=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#160); +#162=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#159); +#163=IFCCOMPOSITECURVE((#161,#162),.F.); +#164=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#163); +#165=IFCBUILDINGELEMENTPROXY('3S6Y3VY112dxY0tStVXkwt',#18,'profile',$,$,#171,#179,$,$); +#166=IFCRELCONTAINEDINSPATIALSTRUCTURE('0FjzxDlhr3dOeY4ayxHlPS',#18,$,$,(#165),#51); +#167=IFCDIRECTION((1.,0.,0.)); +#168=IFCDIRECTION((0.,0.,1.)); +#169=IFCCARTESIANPOINT((800.,0.,0.)); +#170=IFCAXIS2PLACEMENT3D(#169,#168,#167); +#171=IFCLOCALPLACEMENT($,#170); +#172=IFCDIRECTION((0.,0.,1.)); +#173=IFCDIRECTION((1.,0.,0.)); +#174=IFCDIRECTION((0.,0.,1.)); +#175=IFCCARTESIANPOINT((0.,0.,0.)); +#176=IFCAXIS2PLACEMENT3D(#175,#174,#173); +#177=IFCEXTRUDEDAREASOLID(#164,#176,#172,20.); +#178=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#177)); +#179=IFCPRODUCTDEFINITIONSHAPE($,$,(#178)); +#180=IFCCARTESIANPOINT((69.282,25.)); +#181=IFCCARTESIANPOINT((0.,0.)); +#182=IFCCARTESIANPOINT((40.,-43.3013)); +#183=IFCDIRECTION((1.,0.)); +#184=IFCCARTESIANPOINT((0.,0.)); +#185=IFCAXIS2PLACEMENT2D(#184,#183); +#186=IFCELLIPSE(#185,80.,50.); +#187=IFCTRIMMEDCURVE(#186,(#182),(#180),.T.,.CARTESIAN.); +#188=IFCPOLYLINE((#180,#181,#182)); +#189=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#188); +#190=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#187); +#191=IFCCOMPOSITECURVE((#189,#190),.F.); +#192=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#191); +#193=IFCBUILDINGELEMENTPROXY('1thkI63prF1OqBtP3bSL$d',#18,'profile',$,$,#199,#207,$,$); +#194=IFCRELCONTAINEDINSPATIALSTRUCTURE('2P$8V2X5XECfS47AXjHiF1',#18,$,$,(#193),#51); +#195=IFCDIRECTION((1.,0.,0.)); +#196=IFCDIRECTION((0.,0.,1.)); +#197=IFCCARTESIANPOINT((1000.,0.,0.)); +#198=IFCAXIS2PLACEMENT3D(#197,#196,#195); +#199=IFCLOCALPLACEMENT($,#198); +#200=IFCDIRECTION((0.,0.,1.)); +#201=IFCDIRECTION((1.,0.,0.)); +#202=IFCDIRECTION((0.,0.,1.)); +#203=IFCCARTESIANPOINT((0.,0.,0.)); +#204=IFCAXIS2PLACEMENT3D(#203,#202,#201); +#205=IFCEXTRUDEDAREASOLID(#192,#204,#200,20.); +#206=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#205)); +#207=IFCPRODUCTDEFINITIONSHAPE($,$,(#206)); +#208=IFCCARTESIANPOINT((-43.3013,40.)); +#209=IFCCARTESIANPOINT((0.,0.)); +#210=IFCCARTESIANPOINT((50.,0.)); +#211=IFCDIRECTION((1.,0.)); +#212=IFCCARTESIANPOINT((0.,0.)); +#213=IFCAXIS2PLACEMENT2D(#212,#211); +#214=IFCELLIPSE(#213,50.,80.); +#215=IFCTRIMMEDCURVE(#214,(IFCPARAMETERVALUE(0.)),(IFCPARAMETERVALUE(150.)),.T.,.PARAMETER.); +#216=IFCPOLYLINE((#208,#209,#210)); +#217=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#216); +#218=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#215); +#219=IFCCOMPOSITECURVE((#217,#218),.F.); +#220=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#219); +#221=IFCBUILDINGELEMENTPROXY('1AX3z4fQj8SBzr9DMlGdSp',#18,'profile',$,$,#227,#235,$,$); +#222=IFCRELCONTAINEDINSPATIALSTRUCTURE('1rtDgHYQrEIRwCdKj3BvDs',#18,$,$,(#221),#51); +#223=IFCDIRECTION((1.,0.,0.)); +#224=IFCDIRECTION((0.,0.,1.)); +#225=IFCCARTESIANPOINT((1200.,0.,0.)); +#226=IFCAXIS2PLACEMENT3D(#225,#224,#223); +#227=IFCLOCALPLACEMENT($,#226); +#228=IFCDIRECTION((0.,0.,1.)); +#229=IFCDIRECTION((1.,0.,0.)); +#230=IFCDIRECTION((0.,0.,1.)); +#231=IFCCARTESIANPOINT((0.,0.,0.)); +#232=IFCAXIS2PLACEMENT3D(#231,#230,#229); +#233=IFCEXTRUDEDAREASOLID(#220,#232,#228,20.); +#234=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#233)); +#235=IFCPRODUCTDEFINITIONSHAPE($,$,(#234)); +#236=IFCCARTESIANPOINT((-43.3013,40.)); +#237=IFCCARTESIANPOINT((0.,0.)); +#238=IFCCARTESIANPOINT((50.,0.)); +#239=IFCDIRECTION((1.,0.)); +#240=IFCCARTESIANPOINT((0.,0.)); +#241=IFCAXIS2PLACEMENT2D(#240,#239); +#242=IFCELLIPSE(#241,50.,80.); +#243=IFCTRIMMEDCURVE(#242,(#238),(#236),.T.,.CARTESIAN.); +#244=IFCPOLYLINE((#236,#237,#238)); +#245=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#244); +#246=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#243); +#247=IFCCOMPOSITECURVE((#245,#246),.F.); +#248=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#247); +#249=IFCBUILDINGELEMENTPROXY('0ykGmzZ498eBXWBzoCG67N',#18,'profile',$,$,#255,#263,$,$); +#250=IFCRELCONTAINEDINSPATIALSTRUCTURE('3e8$xNZO56mQTEOHJ2UKC8',#18,$,$,(#249),#51); +#251=IFCDIRECTION((1.,0.,0.)); +#252=IFCDIRECTION((0.,0.,1.)); +#253=IFCCARTESIANPOINT((1400.,0.,0.)); +#254=IFCAXIS2PLACEMENT3D(#253,#252,#251); +#255=IFCLOCALPLACEMENT($,#254); +#256=IFCDIRECTION((0.,0.,1.)); +#257=IFCDIRECTION((1.,0.,0.)); +#258=IFCDIRECTION((0.,0.,1.)); +#259=IFCCARTESIANPOINT((0.,0.,0.)); +#260=IFCAXIS2PLACEMENT3D(#259,#258,#257); +#261=IFCEXTRUDEDAREASOLID(#248,#260,#256,20.); +#262=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#261)); +#263=IFCPRODUCTDEFINITIONSHAPE($,$,(#262)); +#264=IFCCARTESIANPOINT((25.,-69.282)); +#265=IFCCARTESIANPOINT((0.,0.)); +#266=IFCCARTESIANPOINT((43.3013,40.)); +#267=IFCDIRECTION((1.,0.)); +#268=IFCCARTESIANPOINT((0.,0.)); +#269=IFCAXIS2PLACEMENT2D(#268,#267); +#270=IFCELLIPSE(#269,50.,80.); +#271=IFCTRIMMEDCURVE(#270,(IFCPARAMETERVALUE(30.)),(IFCPARAMETERVALUE(300.)),.T.,.PARAMETER.); +#272=IFCPOLYLINE((#264,#265,#266)); +#273=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#272); +#274=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#271); +#275=IFCCOMPOSITECURVE((#273,#274),.F.); +#276=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#275); +#277=IFCBUILDINGELEMENTPROXY('3Yv68bQsf3pfiGsNMB4bcb',#18,'profile',$,$,#283,#291,$,$); +#278=IFCRELCONTAINEDINSPATIALSTRUCTURE('0J_NVsO4H8hfbG5IlS7ZVW',#18,$,$,(#277),#51); +#279=IFCDIRECTION((1.,0.,0.)); +#280=IFCDIRECTION((0.,0.,1.)); +#281=IFCCARTESIANPOINT((1600.,0.,0.)); +#282=IFCAXIS2PLACEMENT3D(#281,#280,#279); +#283=IFCLOCALPLACEMENT($,#282); +#284=IFCDIRECTION((0.,0.,1.)); +#285=IFCDIRECTION((1.,0.,0.)); +#286=IFCDIRECTION((0.,0.,1.)); +#287=IFCCARTESIANPOINT((0.,0.,0.)); +#288=IFCAXIS2PLACEMENT3D(#287,#286,#285); +#289=IFCEXTRUDEDAREASOLID(#276,#288,#284,20.); +#290=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#289)); +#291=IFCPRODUCTDEFINITIONSHAPE($,$,(#290)); +#292=IFCCARTESIANPOINT((25.,-69.282)); +#293=IFCCARTESIANPOINT((0.,0.)); +#294=IFCCARTESIANPOINT((43.3013,40.)); +#295=IFCDIRECTION((1.,0.)); +#296=IFCCARTESIANPOINT((0.,0.)); +#297=IFCAXIS2PLACEMENT2D(#296,#295); +#298=IFCELLIPSE(#297,50.,80.); +#299=IFCTRIMMEDCURVE(#298,(#294),(#292),.T.,.CARTESIAN.); +#300=IFCPOLYLINE((#292,#293,#294)); +#301=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#300); +#302=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#299); +#303=IFCCOMPOSITECURVE((#301,#302),.F.); +#304=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#303); +#305=IFCBUILDINGELEMENTPROXY('0jeK5u9hv3weg2QiWppkHa',#18,'profile',$,$,#311,#319,$,$); +#306=IFCRELCONTAINEDINSPATIALSTRUCTURE('1NPKNrJLHA3978HBP7HqY5',#18,$,$,(#305),#51); +#307=IFCDIRECTION((1.,0.,0.)); +#308=IFCDIRECTION((0.,0.,1.)); +#309=IFCCARTESIANPOINT((1800.,0.,0.)); +#310=IFCAXIS2PLACEMENT3D(#309,#308,#307); +#311=IFCLOCALPLACEMENT($,#310); +#312=IFCDIRECTION((0.,0.,1.)); +#313=IFCDIRECTION((1.,0.,0.)); +#314=IFCDIRECTION((0.,0.,1.)); +#315=IFCCARTESIANPOINT((0.,0.,0.)); +#316=IFCAXIS2PLACEMENT3D(#315,#314,#313); +#317=IFCEXTRUDEDAREASOLID(#304,#316,#312,20.); +#318=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#317)); +#319=IFCPRODUCTDEFINITIONSHAPE($,$,(#318)); +#320=IFCCARTESIANPOINT((43.3013,40.)); +#321=IFCCARTESIANPOINT((0.,0.)); +#322=IFCCARTESIANPOINT((25.,-69.282)); +#323=IFCDIRECTION((1.,0.)); +#324=IFCCARTESIANPOINT((0.,0.)); +#325=IFCAXIS2PLACEMENT2D(#324,#323); +#326=IFCELLIPSE(#325,50.,80.); +#327=IFCTRIMMEDCURVE(#326,(IFCPARAMETERVALUE(300.)),(IFCPARAMETERVALUE(30.)),.T.,.PARAMETER.); +#328=IFCPOLYLINE((#320,#321,#322)); +#329=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#328); +#330=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#327); +#331=IFCCOMPOSITECURVE((#329,#330),.F.); +#332=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#331); +#333=IFCBUILDINGELEMENTPROXY('2lsWCBXwrDFBgKu7CQXEqX',#18,'profile',$,$,#339,#347,$,$); +#334=IFCRELCONTAINEDINSPATIALSTRUCTURE('3fSDbMu$n37xOik9QDF6lB',#18,$,$,(#333),#51); +#335=IFCDIRECTION((1.,0.,0.)); +#336=IFCDIRECTION((0.,0.,1.)); +#337=IFCCARTESIANPOINT((2000.,0.,0.)); +#338=IFCAXIS2PLACEMENT3D(#337,#336,#335); +#339=IFCLOCALPLACEMENT($,#338); +#340=IFCDIRECTION((0.,0.,1.)); +#341=IFCDIRECTION((1.,0.,0.)); +#342=IFCDIRECTION((0.,0.,1.)); +#343=IFCCARTESIANPOINT((0.,0.,0.)); +#344=IFCAXIS2PLACEMENT3D(#343,#342,#341); +#345=IFCEXTRUDEDAREASOLID(#332,#344,#340,20.); +#346=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#345)); +#347=IFCPRODUCTDEFINITIONSHAPE($,$,(#346)); +#348=IFCCARTESIANPOINT((43.3013,40.)); +#349=IFCCARTESIANPOINT((0.,0.)); +#350=IFCCARTESIANPOINT((25.,-69.282)); +#351=IFCDIRECTION((1.,0.)); +#352=IFCCARTESIANPOINT((0.,0.)); +#353=IFCAXIS2PLACEMENT2D(#352,#351); +#354=IFCELLIPSE(#353,50.,80.); +#355=IFCTRIMMEDCURVE(#354,(#350),(#348),.T.,.CARTESIAN.); +#356=IFCPOLYLINE((#348,#349,#350)); +#357=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#356); +#358=IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,#355); +#359=IFCCOMPOSITECURVE((#357,#358),.F.); +#360=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#359); +#361=IFCBUILDINGELEMENTPROXY('10MMN93$P59Ak3_qhH2141',#18,'profile',$,$,#367,#375,$,$); +#362=IFCRELCONTAINEDINSPATIALSTRUCTURE('1qdtvGqIrEoBlOfpqJ0hf4',#18,$,$,(#361),#51); +#363=IFCDIRECTION((1.,0.,0.)); +#364=IFCDIRECTION((0.,0.,1.)); +#365=IFCCARTESIANPOINT((2200.,0.,0.)); +#366=IFCAXIS2PLACEMENT3D(#365,#364,#363); +#367=IFCLOCALPLACEMENT($,#366); +#368=IFCDIRECTION((0.,0.,1.)); +#369=IFCDIRECTION((1.,0.,0.)); +#370=IFCDIRECTION((0.,0.,1.)); +#371=IFCCARTESIANPOINT((0.,0.,0.)); +#372=IFCAXIS2PLACEMENT3D(#371,#370,#369); +#373=IFCEXTRUDEDAREASOLID(#360,#372,#368,20.); +#374=IFCSHAPEREPRESENTATION(#24,'Body','SweptSolid',(#373)); +#375=IFCPRODUCTDEFINITIONSHAPE($,$,(#374)); +ENDSEC; +END-ISO-10303-21;