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;