Add support for ellipses with SemiAxis2 > SemiAxis1

This commit is contained in:
Thomas Krijnen
2014-03-03 19:07:39 +00:00
parent 05c98de100
commit ec2ed06272
4 changed files with 556 additions and 2 deletions
+148
View File
@@ -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 <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
/********************************************************************************
* *
* Example that generates profiles of trimmed ellipses. *
* *
********************************************************************************/
#include <string>
#include <iostream>
#include <fstream>
#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<boost::none_t>(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<double> coords1(flt1, flt1 + 2);
std::vector<double> coords2(flt2, flt2 + 2);
std::vector<double> 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<Ifc2x3::IfcCartesianPoint>());
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>());
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<IfcSchema::IfcOwnerHistory>());
product->setObjectPlacement(file.addLocalPlacement(200 * i++));
IfcSchema::IfcExtrudedAreaSolid* solid = new IfcSchema::IfcExtrudedAreaSolid(profile,
file.addPlacement3d(), file.addTriplet<IfcSchema::IfcDirection>(0, 0, 1), 20.0);
file.AddEntity(solid);
IfcSchema::IfcRepresentation::list reps (new IfcTemplatedEntityList<IfcSchema::IfcRepresentation>());
IfcSchema::IfcRepresentationItem::list items (new IfcTemplatedEntityList<IfcSchema::IfcRepresentationItem>());
items->push(solid);
IfcSchema::IfcShapeRepresentation* rep = new IfcSchema::IfcShapeRepresentation(
file.getSingle<IfcSchema::IfcRepresentationContext>(), 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;
}
+14 -2
View File
@@ -23,6 +23,8 @@
* *
********************************************************************************/
#include <algorithm>
#include <gp_Pnt.hxx>
#include <gp_Vec.hxx>
#include <gp_Dir.hxx>
@@ -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;
}
+10
View File
@@ -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<IfcSchema::IfcEllipse*>(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 {
+384
View File
@@ -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;