From 7597f25db0810db3962b76df55ba91f548573e2a Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 8 Mar 2014 17:21:39 +0000 Subject: [PATCH] Implementations for more parameterized profile definitions --- src/examples/profiles.cpp | 16 +- src/ifcgeom/IfcGeomFaces.cpp | 332 ++++++++++++++++++++++++++-- src/ifcgeom/IfcGeomFunctions.cpp | 2 +- src/ifcgeom/IfcRegister.h | 9 +- test/input/IfcEllipseProfileDef.ifc | 30 +-- test/input/IfcLShapeProfileDef.ifc | 38 ++-- test/input/IfcTShapeProfileDef.ifc | 38 ++-- test/input/IfcUShapeProfileDef.ifc | 38 ++-- 8 files changed, 406 insertions(+), 97 deletions(-) diff --git a/src/examples/profiles.cpp b/src/examples/profiles.cpp index e0c2a992d5..3092648a49 100644 --- a/src/examples/profiles.cpp +++ b/src/examples/profiles.cpp @@ -93,10 +93,10 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, null, null)); profiles->push(new Ifc2x3::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, 5.0, null, null, 0.1, null)); + null, 0, 50.0, 25.0, 5.0, 5.0, null, null, 4.0, null)); profiles->push(new Ifc2x3::IfcUShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, 5.0, 1.0, 3.0, 0.1, null)); + 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()); @@ -108,10 +108,10 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, 2.0, null, null, null)); profiles->push(new Ifc2x3::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, 0.1, 0.1, null)); + null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, 2.0, 2.0, null)); profiles->push(new Ifc2x3::IfcTShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, 5.0, 1.0, 2.0, 3.0, 0.1, 0.2, null)); + 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()); @@ -126,10 +126,10 @@ int main(int argc, char** argv) { { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); profiles->push(new Ifc2x3::IfcEllipseProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0)); + null, 0, 25.0, 15.0)); profiles->push(new Ifc2x3::IfcEllipseProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 25.0, 50.0)); + null, 0, 15.0, 25.0)); create_testcase_for(profiles); } { IfcSchema::IfcProfileDef::list profiles (new IfcTemplatedEntityList()); @@ -150,10 +150,10 @@ int main(int argc, char** argv) { null, 0, 50.0, 25.0, 5.0, 2.0, 2.0, null, null, null)); profiles->push(new Ifc2x3::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, null, null, 0.1, null, null)); + null, 0, 50.0, 25.0, 5.0, null, null, 2.0, null, null)); profiles->push(new Ifc2x3::IfcLShapeProfileDef( IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, - null, 0, 50.0, 25.0, 5.0, 1.0, 2.0, 0.3, null, null)); + 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()); diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index d75a052dd8..9532a53151 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -208,7 +208,7 @@ bool IfcGeom::convert(const IfcSchema::IfcRectangleProfileDef::ptr l, TopoDS_Fac const double x = l->XDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); const double y = l->YDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); - if ( x == 0.0f || y == 0.0f ) { + if ( x < ALMOST_ZERO || y < ALMOST_ZERO ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } @@ -218,13 +218,92 @@ bool IfcGeom::convert(const IfcSchema::IfcRectangleProfileDef::ptr l, TopoDS_Fac double coords[8] = {-x,-y,x,-y,x,y,-x,y}; return IfcGeom::profile_helper(4,coords,0,0,0,trsf2d,face); } +bool IfcGeom::convert(const IfcSchema::IfcRoundedRectangleProfileDef::ptr l, TopoDS_Face& face) { + const double x = l->XDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double y = l->YDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double r = l->RoundingRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + + if ( x < ALMOST_ZERO || y < ALMOST_ZERO || r < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + double coords[8] = {-x,-y, x,-y, x,y, -x,y}; + int fillets[4] = {0,1,2,3}; + double radii[4] = {r,r,r,r}; + return IfcGeom::profile_helper(4,coords,4,fillets,radii,trsf2d,face); +} +bool IfcGeom::convert(const IfcSchema::IfcRectangleHollowProfileDef::ptr l, TopoDS_Face& face) { + const double x = l->XDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double y = l->YDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double d = l->WallThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + + const bool fr1 = l->hasInnerFilletRadius(); + const bool fr2 = l->hasInnerFilletRadius(); + + const double r1 = fr2 ? l->OuterFilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT) : 0.; + const double r2 = fr1 ? l->InnerFilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT) : 0.; + + if ( x < ALMOST_ZERO || y < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + TopoDS_Face f1; + TopoDS_Face f2; + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + double coords1[8] = {-x ,-y, x ,-y, x, y, -x, y }; + double coords2[8] = {-x+d,-y+d, x-d,-y+d, x-d,y-d, -x+d,y-d}; + double radii1[4] = {r1,r1,r1,r1}; + double radii2[4] = {r2,r2,r2,r2}; + int fillets[4] = {0,1,2,3}; + + bool s1 = IfcGeom::profile_helper(4,coords1,fr1 ? 4 : 0,fillets,radii1,trsf2d,f1); + bool s2 = IfcGeom::profile_helper(4,coords2,fr2 ? 4 : 0,fillets,radii2,trsf2d,f2); + + if (!s1 || !s2) return false; + + TopExp_Explorer exp1(f1, TopAbs_WIRE); + TopExp_Explorer exp2(f2, TopAbs_WIRE); + + TopoDS_Wire w1 = TopoDS::Wire(exp1.Current()); + TopoDS_Wire w2 = TopoDS::Wire(exp2.Current()); + + BRepBuilderAPI_MakeFace mf(w1, false); + mf.Add(w2); + + ShapeFix_Shape sfs(mf.Face()); + sfs.Perform(); + face = TopoDS::Face(sfs.Shape()); + return true; +} +bool IfcGeom::convert(const IfcSchema::IfcTrapeziumProfileDef::ptr l, TopoDS_Face& face) { + const double x1 = l->BottomXDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double w = l->TopXDim() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double dx = l->TopXOffset() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double y = l->YDim() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + + if ( x1 < ALMOST_ZERO || w < ALMOST_ZERO || y < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + double coords[8] = {-x1,-y, x1,-y, dx+w-x1,y, dx-x1,y}; + return IfcGeom::profile_helper(4,coords,0,0,0,trsf2d,face); +} bool IfcGeom::convert(const IfcSchema::IfcIShapeProfileDef::ptr l, TopoDS_Face& face) { const double x = 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; + double f = 0.; if ( doFillet ) { f = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); } @@ -242,19 +321,52 @@ bool IfcGeom::convert(const IfcSchema::IfcIShapeProfileDef::ptr l, TopoDS_Face& double radii[4] = {f,f,f,f}; return IfcGeom::profile_helper(12,coords,doFillet ? 4 : 0,fillets,radii,trsf2d,face); } +bool IfcGeom::convert(const IfcSchema::IfcZShapeProfileDef::ptr l, TopoDS_Face& face) { + const double x = l->FlangeWidth() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double y = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double dx = l->WebThickness() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double dy = l->FlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + + bool doFillet = l->hasFilletRadius(); + bool doEdgeFillet = l->hasEdgeRadius(); + + double f1 = 0.; + double f2 = 0.; + + if ( doFillet ) { + f1 = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + if ( doEdgeFillet ) { + f2 = l->EdgeRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + + if ( x == 0.0f || y == 0.0f || dx == 0.0f || dy == 0.0f ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + + double coords[16] = {-dx,-y, x,-y, x,-y+dy, dx,-y+dy, dx,y, -x,y, -x,y-dy, -dx,y-dy}; + int fillets[4] = {2,3,6,7}; + double radii[4] = {f2,f1,f2,f1}; + return IfcGeom::profile_helper(8,coords,(doFillet || doEdgeFillet) ? 4 : 0,fillets,radii,trsf2d,face); +} bool IfcGeom::convert(const IfcSchema::IfcCShapeProfileDef::ptr l, TopoDS_Face& face) { - const double x = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); - const double y = l->Width() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double y = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double x = l->Width() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); const double d1 = l->WallThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); const double d2 = l->Girth() * IfcGeom::GetValue(GV_LENGTH_UNIT); bool doFillet = l->hasInternalFilletRadius(); - double f1,f2; + double f1 = 0; + double f2 = 0; if ( doFillet ) { f1 = l->InternalFilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); f2 = f1 + d1; } - if ( x == 0.0f || y == 0.0f || d1 == 0.0f || d2 == 0.0f ) { + if ( x < ALMOST_ZERO || y < ALMOST_ZERO || d1 < ALMOST_ZERO || d2 < ALMOST_ZERO ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } @@ -268,11 +380,15 @@ bool IfcGeom::convert(const IfcSchema::IfcCShapeProfileDef::ptr l, TopoDS_Face& return IfcGeom::profile_helper(12,coords,doFillet ? 8 : 0,fillets,radii,trsf2d,face); } bool IfcGeom::convert(const IfcSchema::IfcLShapeProfileDef::ptr l, TopoDS_Face& face) { + const bool hasSlope = l->hasLegSlope(); + const bool doEdgeFillet = l->hasEdgeRadius(); + const bool doFillet = l->hasFilletRadius(); + const double y = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); - const double x = l->Width() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double x = (l->hasWidth() ? l->Width() : l->Depth()) / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); const double d = l->Thickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); - bool doEdgeFillet = l->hasEdgeRadius(); - bool doFillet = l->hasFilletRadius(); + const double slope = hasSlope ? (l->LegSlope() * IfcGeom::GetValue(GV_PLANEANGLE_UNIT)) : 0.; + double f1 = 0.0f; double f2 = 0.0f; if (doFillet) { @@ -281,7 +397,85 @@ bool IfcGeom::convert(const IfcSchema::IfcLShapeProfileDef::ptr l, TopoDS_Face& if ( doEdgeFillet) { f2 = l->EdgeRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); } - if ( x == 0.0f || y == 0.0f || d == 0.0f ) { + + if ( x < ALMOST_ZERO || y < ALMOST_ZERO || d < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + double xx = -x+d; + double xy = -y+d; + double dy1 = 0.; + double dy2 = 0.; + double dx1 = 0.; + double dx2 = 0.; + if (hasSlope) { + dy1 = tan(slope) * x; + dy2 = tan(slope) * (x - d); + dx1 = tan(slope) * y; + dx2 = tan(slope) * (y - d); + + const double x1s = x; const double y1s = -y + d - dy1; + const double x1e = -x + d; const double y1e = -y + d + dy2; + const double x2s = -x + d - dx1; const double y2s = y; + const double x2e = -x + d + dx2; const double y2e = -y + d; + + const double a1 = y1e - y1s; + const double b1 = x1s - x1e; + const double c1 = a1*x1s + b1*y1s; + + const double a2 = y2e - y2s; + const double b2 = x2s - x2e; + const double c2 = a2*x2s + b2*y2s; + + const double det = a1*b2 - a2*b1; + + if (ALMOST_THE_SAME(det, 0.)) { + Logger::Message(Logger::LOG_NOTICE, "Legs do not intersect for:",l->entity); + return false; + } + + xx = (b2*c1 - b1*c2) / det; + xy = (a1*c2 - a2*c1) / det; + } + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + + double coords[12] = {-x,-y, x,-y, x,-y+d-dy1, xx, xy, -x+d-dx1,y, -x,y}; + int fillets[3] = {2,3,4}; + double radii[3] = {f2,f1,f2}; + return IfcGeom::profile_helper(6,coords,doFillet ? 3 : 0,fillets,radii,trsf2d,face); +} +bool IfcGeom::convert(const IfcSchema::IfcUShapeProfileDef::ptr l, TopoDS_Face& face) { + const bool doEdgeFillet = l->hasEdgeRadius(); + const bool doFillet = l->hasFilletRadius(); + const bool hasSlope = l->hasFlangeSlope(); + + const double y = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double x = l->FlangeWidth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double d1 = l->WebThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double d2 = l->FlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double slope = hasSlope ? (l->FlangeSlope() * IfcGeom::GetValue(GV_PLANEANGLE_UNIT)) : 0.; + + double dy1 = 0.0f; + double dy2 = 0.0f; + double f1 = 0.0f; + double f2 = 0.0f; + + if (doFillet) { + f1 = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + if (doEdgeFillet) { + f2 = l->EdgeRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + + if (hasSlope) { + dy1 = (x - d1) * tan(slope); + dy2 = x * tan(slope); + } + + if ( x < ALMOST_ZERO || y < ALMOST_ZERO || d1 < ALMOST_ZERO || d2 < ALMOST_ZERO ) { Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); return false; } @@ -289,10 +483,92 @@ bool IfcGeom::convert(const IfcSchema::IfcLShapeProfileDef::ptr l, TopoDS_Face& gp_Trsf2d trsf2d; IfcGeom::convert(l->Position(),trsf2d); - double coords[12] = {-x,-y,x,-y,x,-y+d,-x+d,-y+d,-x+d,y,-x,y}; - int fillets[3] = {2,3,4}; - double radii[3] = {f2,f1,f2}; - return IfcGeom::profile_helper(6,coords,doFillet ? 3 : 0,fillets,radii,trsf2d,face); + double coords[16] = {-x,-y, x,-y, x,-y+d2-dy2, -x+d1,-y+d2+dy1, -x+d1,y-d2-dy1, x,y-d2+dy2, x,y, -x,y}; + int fillets[4] = {2,3,4,5}; + double radii[4] = {f2,f1,f1,f2}; + return IfcGeom::profile_helper(8, coords, (doFillet || doEdgeFillet) ? 4 : 0, fillets, radii, trsf2d, face); +} +bool IfcGeom::convert(const IfcSchema::IfcTShapeProfileDef::ptr l, TopoDS_Face& face) { + const bool doFlangeEdgeFillet = l->hasFlangeEdgeRadius(); + const bool doWebEdgeFillet = l->hasWebEdgeRadius(); + const bool doFillet = l->hasFilletRadius(); + const bool hasFlangeSlope = l->hasFlangeSlope(); + const bool hasWebSlope = l->hasWebSlope(); + + const double y = l->Depth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double x = l->FlangeWidth() / 2.0f * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double d1 = l->WebThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double d2 = l->FlangeThickness() * IfcGeom::GetValue(GV_LENGTH_UNIT); + const double flangeSlope = hasFlangeSlope ? (l->FlangeSlope() * IfcGeom::GetValue(GV_PLANEANGLE_UNIT)) : 0.; + const double webSlope = hasWebSlope ? (l->WebSlope() * IfcGeom::GetValue(GV_PLANEANGLE_UNIT)) : 0.; + + if ( x < ALMOST_ZERO || y < ALMOST_ZERO || d1 < ALMOST_ZERO || d2 < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + double dy1 = 0.0f; + double dy2 = 0.0f; + double dx1 = 0.0f; + double dx2 = 0.0f; + double f1 = 0.0f; + double f2 = 0.0f; + double f3 = 0.0f; + + if (doFillet) { + f1 = l->FilletRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + if (doWebEdgeFillet) { + f2 = l->WebEdgeRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + if (doFlangeEdgeFillet) { + f3 = l->FlangeEdgeRadius() * IfcGeom::GetValue(GV_LENGTH_UNIT); + } + + double xx, xy; + if (hasFlangeSlope) { + dy1 = (x / 2. - d1) * tan(flangeSlope); + dy2 = x / 2. * tan(flangeSlope); + } + if (hasWebSlope) { + dx1 = (y - d2) * tan(webSlope); + dx2 = y * tan(webSlope); + } + if (hasWebSlope || hasFlangeSlope) { + const double x1s = d1/2. - dx2; const double y1s = -y; + const double x1e = d1/2. + dx1; const double y1e = y - d2; + const double x2s = x; const double y2s = y - d2 + dy2; + const double x2e = d1/2.; const double y2e = y - d2 - dy1; + + const double a1 = y1e - y1s; + const double b1 = x1s - x1e; + const double c1 = a1*x1s + b1*y1s; + + const double a2 = y2e - y2s; + const double b2 = x2s - x2e; + const double c2 = a2*x2s + b2*y2s; + + const double det = a1*b2 - a2*b1; + + if (ALMOST_THE_SAME(det, 0.)) { + Logger::Message(Logger::LOG_NOTICE, "Web and flange do not intersect for:",l->entity); + return false; + } + + xx = (b2*c1 - b1*c2) / det; + xy = (a1*c2 - a2*c1) / det; + } else { + xx = d1 / 2; + xy = y - d2; + } + + gp_Trsf2d trsf2d; + IfcGeom::convert(l->Position(),trsf2d); + + double coords[16] = {d1/2.-dx2,-y, xx,xy, x,y-d2+dy2, x,y, -x,y, -x,y-d2+dy2, -xx,xy, -d1/2.+dx2,-y}; + int fillets[6] = {0,1,2,5,6,7}; + double radii[6] = {f2,f1,f3,f3,f1,f2}; + return IfcGeom::profile_helper(8, coords, (doFillet || doWebEdgeFillet || doFlangeEdgeFillet) ? 6 : 0, fillets, radii, trsf2d, face); } bool IfcGeom::convert(const IfcSchema::IfcCircleProfileDef::ptr l, TopoDS_Face& face) { const double r = l->Radius() * IfcGeom::GetValue(GV_LENGTH_UNIT); @@ -338,4 +614,30 @@ bool IfcGeom::convert(const IfcSchema::IfcCircleHollowProfileDef::ptr l, TopoDS_ sfs.Perform(); face = TopoDS::Face(sfs.Shape()); return true; -} \ No newline at end of file +} +bool IfcGeom::convert(const IfcSchema::IfcEllipseProfileDef::ptr l, TopoDS_Face& face) { + double rx = l->SemiAxis1() * IfcGeom::GetValue(GV_LENGTH_UNIT); + double ry = l->SemiAxis2() * IfcGeom::GetValue(GV_LENGTH_UNIT); + + if ( rx < ALMOST_ZERO || ry < ALMOST_ZERO ) { + Logger::Message(Logger::LOG_NOTICE,"Skipping zero sized profile:",l->entity); + return false; + } + + const bool rotated = ry > rx; + gp_Trsf2d trsf; + IfcGeom::convert(l->Position(),trsf); + + gp_Ax2 ax = gp_Ax2(); + if (rotated) { + ax.Rotate(ax.Axis(), M_PI / 2.); + std::swap(rx, ry); + } + ax.Transform(trsf); + + BRepBuilderAPI_MakeWire w; + Handle(Geom_Ellipse) ellipse = new Geom_Ellipse(ax, rx, ry); + TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(ellipse); + w.Add(edge); + return IfcGeom::convert_wire_to_face(w, face); +} \ No newline at end of file diff --git a/src/ifcgeom/IfcGeomFunctions.cpp b/src/ifcgeom/IfcGeomFunctions.cpp index d49786ddf2..3f0293350b 100644 --- a/src/ifcgeom/IfcGeomFunctions.cpp +++ b/src/ifcgeom/IfcGeomFunctions.cpp @@ -334,7 +334,7 @@ bool IfcGeom::profile_helper(int numVerts, double* verts, int numFillets, int* f BRepFilletAPI_MakeFillet2d fillet (face); for ( int i = 0; i < numFillets; i ++ ) { const double radius = filletRadii[i]; - if ( radius < 1e-7 ) continue; + if ( radius < ALMOST_ZERO ) continue; fillet.AddFillet(vertices[filletIndices[i]],radius); } fillet.Build(); diff --git a/src/ifcgeom/IfcRegister.h b/src/ifcgeom/IfcRegister.h index 7bb265827c..0055947b14 100644 --- a/src/ifcgeom/IfcRegister.h +++ b/src/ifcgeom/IfcRegister.h @@ -57,12 +57,19 @@ SHAPE(IfcHalfSpaceSolid); FACE(IfcArbitraryProfileDefWithVoids); FACE(IfcArbitraryClosedProfileDef); +FACE(IfcRoundedRectangleProfileDef); +FACE(IfcRectangleHollowProfileDef); FACE(IfcRectangleProfileDef); -FACE(IfcIShapeProfileDef); +FACE(IfcTrapeziumProfileDef) FACE(IfcCShapeProfileDef); +FACE(IfcIShapeProfileDef); FACE(IfcLShapeProfileDef); +FACE(IfcTShapeProfileDef); +FACE(IfcUShapeProfileDef); +FACE(IfcZShapeProfileDef); FACE(IfcCircleHollowProfileDef); FACE(IfcCircleProfileDef); +FACE(IfcEllipseProfileDef); FACE(IfcFace); WIRE(IfcPolyline); diff --git a/test/input/IfcEllipseProfileDef.ifc b/test/input/IfcEllipseProfileDef.ifc index 66749ae188..cd4cb24974 100644 --- a/test/input/IfcEllipseProfileDef.ifc +++ b/test/input/IfcEllipseProfileDef.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('IfcEllipseProfileDef.ifc','2014-02-23T12:17:26',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_NAME('IfcEllipseProfileDef.ifc','2014-03-08T17:03:55',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; @@ -9,7 +9,7 @@ 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); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1394294635); #6=IFCDIRECTION((0.,1.,0.)); #7=IFCDIRECTION((1.,0.,0.)); #8=IFCDIRECTION((0.,0.,1.)); @@ -22,30 +22,30 @@ DATA; #15=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#14); #16=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'Degrees',#15); #17=IFCUNITASSIGNMENT((#13,#16)); -#18=IFCPROJECT('0_vdRtIqnEixeorQe7fhsb',#5,'IfcEllipseProfileDef',$,$,$,$,(#11),#17); +#18=IFCPROJECT('3zPj9qt6b9uuqkZQigbIUL',#5,'IfcEllipseProfileDef',$,$,$,$,(#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('2hlMQd9xTAmA3QL4$jEBzU',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); -#25=IFCRELAGGREGATES('2QzrjG1EfA3u6qQm0y_iXI',#5,$,$,#18,(#24)); +#24=IFCSITE('0fzyNsjdH8vOcUjt8$PuFb',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); +#25=IFCRELAGGREGATES('3b6NTLFl90y9B9mkk3Apl7',#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('24TAoH745FCvE7NMBw7_ld',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); -#32=IFCRELAGGREGATES('0vCitOI012jxCaQvNTyoQd',#5,$,$,#24,(#31)); +#31=IFCBUILDING('2sB5jIogHAcufB_vBdB8z$',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); +#32=IFCRELAGGREGATES('3r5mQcTMjAWPCUBO3584B8',#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('3b0h0XhlPAwBbP1wukkTAD',#5,$,$,$,#37,$,$,.ELEMENT.,$); -#39=IFCRELAGGREGATES('0z2w6ibun3NP4uKoW3EOAr',#5,$,$,#31,(#38)); -#40=IFCBUILDINGELEMENTPROXY('0$nf4txxD5cg_t$BQXwyiP',#5,'profile',$,$,#46,#58,$,$); -#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('3SFElqODLBmgUGSugeEc2K',#5,$,$,(#40),#38); +#38=IFCBUILDINGSTOREY('21OPnmQjPC7fB2hCmAGxl2',#5,$,$,$,#37,$,$,.ELEMENT.,$); +#39=IFCRELAGGREGATES('0FyTJUr$b0Vx0H9qUG_MEf',#5,$,$,#31,(#38)); +#40=IFCBUILDINGELEMENTPROXY('2Obawd97P7S8UAzLkXlrkZ',#5,'profile',$,$,#46,#58,$,$); +#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('0TJZk7Mo95f8zg0_jQmfrn',#5,$,$,(#40),#38); #42=IFCDIRECTION((1.,0.,0.)); #43=IFCDIRECTION((0.,0.,1.)); #44=IFCCARTESIANPOINT((0.,0.,0.)); @@ -59,12 +59,12 @@ DATA; #52=IFCDIRECTION((0.,0.,1.)); #53=IFCCARTESIANPOINT((0.,0.,0.)); #54=IFCAXIS2PLACEMENT3D(#53,#52,#51); -#55=IFCELLIPSEPROFILEDEF(.AREA.,$,#49,50.,25.); +#55=IFCELLIPSEPROFILEDEF(.AREA.,$,#49,25.,15.); #56=IFCEXTRUDEDAREASOLID(#55,#54,#50,20.); #57=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#56)); #58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57)); -#59=IFCBUILDINGELEMENTPROXY('3TIvzP5ij0rR_rajiqvlyC',#5,'profile',$,$,#65,#77,$,$); -#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('0wGwRa4e9AVx9SKA1_NRA3',#5,$,$,(#59),#38); +#59=IFCBUILDINGELEMENTPROXY('0NBhbTBuH8WhOr_fE1ET$R',#5,'profile',$,$,#65,#77,$,$); +#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('0_wTPh_ELEcAwL3MN1Xjzj',#5,$,$,(#59),#38); #61=IFCDIRECTION((1.,0.,0.)); #62=IFCDIRECTION((0.,0.,1.)); #63=IFCCARTESIANPOINT((100.,0.,0.)); @@ -78,7 +78,7 @@ DATA; #71=IFCDIRECTION((0.,0.,1.)); #72=IFCCARTESIANPOINT((0.,0.,0.)); #73=IFCAXIS2PLACEMENT3D(#72,#71,#70); -#74=IFCELLIPSEPROFILEDEF(.AREA.,$,#68,25.,50.); +#74=IFCELLIPSEPROFILEDEF(.AREA.,$,#68,15.,25.); #75=IFCEXTRUDEDAREASOLID(#74,#73,#69,20.); #76=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#75)); #77=IFCPRODUCTDEFINITIONSHAPE($,$,(#76)); diff --git a/test/input/IfcLShapeProfileDef.ifc b/test/input/IfcLShapeProfileDef.ifc index 96121ac322..4c786bd1d4 100644 --- a/test/input/IfcLShapeProfileDef.ifc +++ b/test/input/IfcLShapeProfileDef.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('IfcLShapeProfileDef.ifc','2014-02-23T12:17:26',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_NAME('IfcLShapeProfileDef.ifc','2014-03-08T16:02:03',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; @@ -9,7 +9,7 @@ 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); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1394290923); #6=IFCDIRECTION((0.,1.,0.)); #7=IFCDIRECTION((1.,0.,0.)); #8=IFCDIRECTION((0.,0.,1.)); @@ -22,30 +22,30 @@ DATA; #15=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#14); #16=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'Degrees',#15); #17=IFCUNITASSIGNMENT((#13,#16)); -#18=IFCPROJECT('0BRiATKPH3Hwm$t_VULP9z',#5,'IfcLShapeProfileDef',$,$,$,$,(#11),#17); +#18=IFCPROJECT('2F6o6chXDCGf8IWtqYLcn3',#5,'IfcLShapeProfileDef',$,$,$,$,(#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('2_q1ZjXAfA3hDcEWiqQcP8',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); -#25=IFCRELAGGREGATES('2jwFJRTrHA4uIEO78BJ7vf',#5,$,$,#18,(#24)); +#24=IFCSITE('1r$PNIWHTDfgdFJV2EfVjI',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); +#25=IFCRELAGGREGATES('3Do_7Shg9CJeA4QWOXR4Ph',#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('203C0jfr53Zvum3lxePGZF',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); -#32=IFCRELAGGREGATES('3tfFA1BpnFvfYJXuzkaGw7',#5,$,$,#24,(#31)); +#31=IFCBUILDING('2ovX2wxcDF68PBVoIFchfo',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); +#32=IFCRELAGGREGATES('2LC9sDH0vCcxGJvN0U3yzz',#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('3YsAmJCTTEuxGf$fQUTq24',#5,$,$,$,#37,$,$,.ELEMENT.,$); -#39=IFCRELAGGREGATES('0yU5eGeC545O7vsSI5o87s',#5,$,$,#31,(#38)); -#40=IFCBUILDINGELEMENTPROXY('2k7U$sXB1Fl91zm$hgdUKw',#5,'profile',$,$,#46,#58,$,$); -#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('1nz7J2BqzChRnBLpLBqkDT',#5,$,$,(#40),#38); +#38=IFCBUILDINGSTOREY('0qGsHVrvL798oCPruY7pW1',#5,$,$,$,#37,$,$,.ELEMENT.,$); +#39=IFCRELAGGREGATES('1bd1NxdaT4DxiyalO0UMYQ',#5,$,$,#31,(#38)); +#40=IFCBUILDINGELEMENTPROXY('3bwg5itXT1GxeIpCTEe09k',#5,'profile',$,$,#46,#58,$,$); +#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('1UlUmdMDv7sPYSCUlFhaaD',#5,$,$,(#40),#38); #42=IFCDIRECTION((1.,0.,0.)); #43=IFCDIRECTION((0.,0.,1.)); #44=IFCCARTESIANPOINT((0.,0.,0.)); @@ -63,8 +63,8 @@ DATA; #56=IFCEXTRUDEDAREASOLID(#55,#54,#50,20.); #57=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#56)); #58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57)); -#59=IFCBUILDINGELEMENTPROXY('0vmXwjt5P7eO2gaREV4Dg0',#5,'profile',$,$,#65,#77,$,$); -#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('1p6TiiVTf1Yfpzfzjb94HM',#5,$,$,(#59),#38); +#59=IFCBUILDINGELEMENTPROXY('3mXvFxL85FoOVKx$hsxICc',#5,'profile',$,$,#65,#77,$,$); +#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('2dAQ2Fu9P8pv53e7CgigoT',#5,$,$,(#59),#38); #61=IFCDIRECTION((1.,0.,0.)); #62=IFCDIRECTION((0.,0.,1.)); #63=IFCCARTESIANPOINT((100.,0.,0.)); @@ -82,8 +82,8 @@ DATA; #75=IFCEXTRUDEDAREASOLID(#74,#73,#69,20.); #76=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#75)); #77=IFCPRODUCTDEFINITIONSHAPE($,$,(#76)); -#78=IFCBUILDINGELEMENTPROXY('0I7UAAt6f2je106FVaK1ni',#5,'profile',$,$,#84,#96,$,$); -#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('0ufoBajmXCRO5z3d6cPuSA',#5,$,$,(#78),#38); +#78=IFCBUILDINGELEMENTPROXY('2S9sXjK_n7mQYd8yd$UL$9',#5,'profile',$,$,#84,#96,$,$); +#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('0xWxza9zr5Ch$OeoRWg23b',#5,$,$,(#78),#38); #80=IFCDIRECTION((1.,0.,0.)); #81=IFCDIRECTION((0.,0.,1.)); #82=IFCCARTESIANPOINT((200.,0.,0.)); @@ -97,12 +97,12 @@ DATA; #90=IFCDIRECTION((0.,0.,1.)); #91=IFCCARTESIANPOINT((0.,0.,0.)); #92=IFCAXIS2PLACEMENT3D(#91,#90,#89); -#93=IFCLSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,$,$,0.1,$,$); +#93=IFCLSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,$,$,2.,$,$); #94=IFCEXTRUDEDAREASOLID(#93,#92,#88,20.); #95=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#94)); #96=IFCPRODUCTDEFINITIONSHAPE($,$,(#95)); -#97=IFCBUILDINGELEMENTPROXY('2CON0nfuX5Eezhkkl7bUUh',#5,'profile',$,$,#103,#115,$,$); -#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('1j$lyjn0b22g9hJG6$comd',#5,$,$,(#97),#38); +#97=IFCBUILDINGELEMENTPROXY('0OGT8RR7b68wQXNF2jeePW',#5,'profile',$,$,#103,#115,$,$); +#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('3kQYgJFkv06wIcavG1q8vT',#5,$,$,(#97),#38); #99=IFCDIRECTION((1.,0.,0.)); #100=IFCDIRECTION((0.,0.,1.)); #101=IFCCARTESIANPOINT((300.,0.,0.)); @@ -116,7 +116,7 @@ DATA; #109=IFCDIRECTION((0.,0.,1.)); #110=IFCCARTESIANPOINT((0.,0.,0.)); #111=IFCAXIS2PLACEMENT3D(#110,#109,#108); -#112=IFCLSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,1.,2.,0.3,$,$); +#112=IFCLSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,1.,2.,2.,$,$); #113=IFCEXTRUDEDAREASOLID(#112,#111,#107,20.); #114=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#113)); #115=IFCPRODUCTDEFINITIONSHAPE($,$,(#114)); diff --git a/test/input/IfcTShapeProfileDef.ifc b/test/input/IfcTShapeProfileDef.ifc index 3503a51fd7..597be28825 100644 --- a/test/input/IfcTShapeProfileDef.ifc +++ b/test/input/IfcTShapeProfileDef.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('IfcTShapeProfileDef.ifc','2014-02-23T12:17:26',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_NAME('IfcTShapeProfileDef.ifc','2014-03-08T15:17:03',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; @@ -9,7 +9,7 @@ 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); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1394288223); #6=IFCDIRECTION((0.,1.,0.)); #7=IFCDIRECTION((1.,0.,0.)); #8=IFCDIRECTION((0.,0.,1.)); @@ -22,30 +22,30 @@ DATA; #15=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#14); #16=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'Degrees',#15); #17=IFCUNITASSIGNMENT((#13,#16)); -#18=IFCPROJECT('0sXMoyZUb7p9ej64Kh8SIU',#5,'IfcTShapeProfileDef',$,$,$,$,(#11),#17); +#18=IFCPROJECT('3GQ0CKeETFJhiCTOTxPkRY',#5,'IfcTShapeProfileDef',$,$,$,$,(#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('2_68uBtwTEOfNUeWU42Bgs',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); -#25=IFCRELAGGREGATES('1pHM3hhMX3OeoaeCn_CrvQ',#5,$,$,#18,(#24)); +#24=IFCSITE('0QoFcGkrr1zBVTtXLlcNRc',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); +#25=IFCRELAGGREGATES('3r1zhJ5TXFK99qcOAYSz67',#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('0UR50UmxXDpu3hRegxtxD$',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); -#32=IFCRELAGGREGATES('1_EqpMq_LFjgar6Pv$Ka9U',#5,$,$,#24,(#31)); +#31=IFCBUILDING('30x1rIlzf4F9xko$kKqjQ0',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); +#32=IFCRELAGGREGATES('3CwaTiqpf8vAHzV32iK$J$',#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('0cV$wdoL98hhsXYLIUhtBi',#5,$,$,$,#37,$,$,.ELEMENT.,$); -#39=IFCRELAGGREGATES('0niyQzLdbC_PsZL32R0Pcm',#5,$,$,#31,(#38)); -#40=IFCBUILDINGELEMENTPROXY('0aBmfX_X53HeqLVNd5MDTb',#5,'profile',$,$,#46,#58,$,$); -#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('09qOBj73r6zxlSK7anG1hn',#5,$,$,(#40),#38); +#38=IFCBUILDINGSTOREY('09EJPxg09BPvRfDPBSBaFo',#5,$,$,$,#37,$,$,.ELEMENT.,$); +#39=IFCRELAGGREGATES('3IXv7NqdLBgOHjJHFjzkOT',#5,$,$,#31,(#38)); +#40=IFCBUILDINGELEMENTPROXY('2jzoaqoe1D3gJKZOASw7Og',#5,'profile',$,$,#46,#58,$,$); +#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('0vDeh$ZKT50wdNwatAiaH4',#5,$,$,(#40),#38); #42=IFCDIRECTION((1.,0.,0.)); #43=IFCDIRECTION((0.,0.,1.)); #44=IFCCARTESIANPOINT((0.,0.,0.)); @@ -63,8 +63,8 @@ DATA; #56=IFCEXTRUDEDAREASOLID(#55,#54,#50,20.); #57=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#56)); #58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57)); -#59=IFCBUILDINGELEMENTPROXY('1R1GSa08z0DOeFKVAIF9T7',#5,'profile',$,$,#65,#77,$,$); -#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('1B2HLdg$56KAHVBsshFOLs',#5,$,$,(#59),#38); +#59=IFCBUILDINGELEMENTPROXY('0sjPK8eAPDHvd61lWjciR3',#5,'profile',$,$,#65,#77,$,$); +#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('0qyuHP5WDC1wuTOhGubwI1',#5,$,$,(#59),#38); #61=IFCDIRECTION((1.,0.,0.)); #62=IFCDIRECTION((0.,0.,1.)); #63=IFCCARTESIANPOINT((100.,0.,0.)); @@ -82,8 +82,8 @@ DATA; #75=IFCEXTRUDEDAREASOLID(#74,#73,#69,20.); #76=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#75)); #77=IFCPRODUCTDEFINITIONSHAPE($,$,(#76)); -#78=IFCBUILDINGELEMENTPROXY('1m_T8J$TD1ZPCLsF6EyPWw',#5,'profile',$,$,#84,#96,$,$); -#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('1bPtP0CODChB0wHWE0Q7fT',#5,$,$,(#78),#38); +#78=IFCBUILDINGELEMENTPROXY('0NYshUfy11pAca6$7WPjbp',#5,'profile',$,$,#84,#96,$,$); +#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('37m4cs48173RRm9nKJO4a$',#5,$,$,(#78),#38); #80=IFCDIRECTION((1.,0.,0.)); #81=IFCDIRECTION((0.,0.,1.)); #82=IFCCARTESIANPOINT((200.,0.,0.)); @@ -97,12 +97,12 @@ DATA; #90=IFCDIRECTION((0.,0.,1.)); #91=IFCCARTESIANPOINT((0.,0.,0.)); #92=IFCAXIS2PLACEMENT3D(#91,#90,#89); -#93=IFCTSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,5.,$,$,$,0.1,0.1,$); +#93=IFCTSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,5.,$,$,$,2.,2.,$); #94=IFCEXTRUDEDAREASOLID(#93,#92,#88,20.); #95=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#94)); #96=IFCPRODUCTDEFINITIONSHAPE($,$,(#95)); -#97=IFCBUILDINGELEMENTPROXY('2MuEabtWr3QQt7zbdBSOd1',#5,'profile',$,$,#103,#115,$,$); -#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('3eAewjVcT07h$ZiBofIjIk',#5,$,$,(#97),#38); +#97=IFCBUILDINGELEMENTPROXY('28s6wTPxLFChkMWj8CgCRm',#5,'profile',$,$,#103,#115,$,$); +#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('3CiE2aQ$P1kO_V7be02$rV',#5,$,$,(#97),#38); #99=IFCDIRECTION((1.,0.,0.)); #100=IFCDIRECTION((0.,0.,1.)); #101=IFCCARTESIANPOINT((300.,0.,0.)); @@ -116,7 +116,7 @@ DATA; #109=IFCDIRECTION((0.,0.,1.)); #110=IFCCARTESIANPOINT((0.,0.,0.)); #111=IFCAXIS2PLACEMENT3D(#110,#109,#108); -#112=IFCTSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,5.,1.,2.,3.,0.1,0.2,$); +#112=IFCTSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,5.,3.,2.,1.,2.,2.,$); #113=IFCEXTRUDEDAREASOLID(#112,#111,#107,20.); #114=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#113)); #115=IFCPRODUCTDEFINITIONSHAPE($,$,(#114)); diff --git a/test/input/IfcUShapeProfileDef.ifc b/test/input/IfcUShapeProfileDef.ifc index 23e64ce040..91686d28e1 100644 --- a/test/input/IfcUShapeProfileDef.ifc +++ b/test/input/IfcUShapeProfileDef.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('IfcUShapeProfileDef.ifc','2014-02-23T12:17:26',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_NAME('IfcUShapeProfileDef.ifc','2014-03-04T11:56:19',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; @@ -9,7 +9,7 @@ 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); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1393930579); #6=IFCDIRECTION((0.,1.,0.)); #7=IFCDIRECTION((1.,0.,0.)); #8=IFCDIRECTION((0.,0.,1.)); @@ -22,30 +22,30 @@ DATA; #15=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.0174533),#14); #16=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'Degrees',#15); #17=IFCUNITASSIGNMENT((#13,#16)); -#18=IFCPROJECT('2s9Efx9Lz7lOQm_nBx5b1H',#5,'IfcUShapeProfileDef',$,$,$,$,(#11),#17); +#18=IFCPROJECT('0uHzDPQFjANu3TK$t3cSV5',#5,'IfcUShapeProfileDef',$,$,$,$,(#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('3CVG6y8MX4LxRoO0tnWAxv',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); -#25=IFCRELAGGREGATES('2UrdZWFB92MA7ahGq4J5TY',#5,$,$,#18,(#24)); +#24=IFCSITE('2RwzmdTBnFXh36TYsBzXcE',#5,$,$,$,#23,$,$,.ELEMENT.,$,$,$,$,$); +#25=IFCRELAGGREGATES('39yqXxIEP93Ofct_$8$$lk',#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('145cRBbjTC3wXrNsmW_UZ2',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); -#32=IFCRELAGGREGATES('2WCriLMc17_f$jD$ISN6ZK',#5,$,$,#24,(#31)); +#31=IFCBUILDING('1PgubQUm9BWOAMRPMjZMSt',#5,$,$,$,#30,$,$,.ELEMENT.,$,$,$); +#32=IFCRELAGGREGATES('3kbmL8P7X9pP9ZfY20W_LJ',#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('35eug6$u94IPdu9dimQveQ',#5,$,$,$,#37,$,$,.ELEMENT.,$); -#39=IFCRELAGGREGATES('1YhsCLTfzD3AhaVt6InRAK',#5,$,$,#31,(#38)); -#40=IFCBUILDINGELEMENTPROXY('0EV_6T_rrD3gf5earRSKyg',#5,'profile',$,$,#46,#58,$,$); -#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('0jkkdReIn9xRbOV9DPIxju',#5,$,$,(#40),#38); +#38=IFCBUILDINGSTOREY('1ts4Upk5j6ZB9N4NYxIbjG',#5,$,$,$,#37,$,$,.ELEMENT.,$); +#39=IFCRELAGGREGATES('0$ZPjzGkv2rB1qOczl4Hlt',#5,$,$,#31,(#38)); +#40=IFCBUILDINGELEMENTPROXY('2GxyqAgor3bw$9ZGEr8Q0m',#5,'profile',$,$,#46,#58,$,$); +#41=IFCRELCONTAINEDINSPATIALSTRUCTURE('3pGW$F4sD229C3jnvZIUgD',#5,$,$,(#40),#38); #42=IFCDIRECTION((1.,0.,0.)); #43=IFCDIRECTION((0.,0.,1.)); #44=IFCCARTESIANPOINT((0.,0.,0.)); @@ -63,8 +63,8 @@ DATA; #56=IFCEXTRUDEDAREASOLID(#55,#54,#50,20.); #57=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#56)); #58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57)); -#59=IFCBUILDINGELEMENTPROXY('1EqK0oFd58kPrk10CJ6WOm',#5,'profile',$,$,#65,#77,$,$); -#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('3SEUJn8Qr2zulxMMF5F5rg',#5,$,$,(#59),#38); +#59=IFCBUILDINGELEMENTPROXY('35BCmn_Sb4qx8DPio6CZf5',#5,'profile',$,$,#65,#77,$,$); +#60=IFCRELCONTAINEDINSPATIALSTRUCTURE('1TTGu172r7nOO_Yh5wT$3w',#5,$,$,(#59),#38); #61=IFCDIRECTION((1.,0.,0.)); #62=IFCDIRECTION((0.,0.,1.)); #63=IFCCARTESIANPOINT((100.,0.,0.)); @@ -82,8 +82,8 @@ DATA; #75=IFCEXTRUDEDAREASOLID(#74,#73,#69,20.); #76=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#75)); #77=IFCPRODUCTDEFINITIONSHAPE($,$,(#76)); -#78=IFCBUILDINGELEMENTPROXY('2VmrYAU3v8_vuK$ZHwVxqv',#5,'profile',$,$,#84,#96,$,$); -#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('08dIjaN3X0bgzJT12yIqFd',#5,$,$,(#78),#38); +#78=IFCBUILDINGELEMENTPROXY('2gF8OFrLLACgwqeVt_sSfH',#5,'profile',$,$,#84,#96,$,$); +#79=IFCRELCONTAINEDINSPATIALSTRUCTURE('28U1vNt0z3xA2hqhT8skDB',#5,$,$,(#78),#38); #80=IFCDIRECTION((1.,0.,0.)); #81=IFCDIRECTION((0.,0.,1.)); #82=IFCCARTESIANPOINT((200.,0.,0.)); @@ -97,12 +97,12 @@ DATA; #90=IFCDIRECTION((0.,0.,1.)); #91=IFCCARTESIANPOINT((0.,0.,0.)); #92=IFCAXIS2PLACEMENT3D(#91,#90,#89); -#93=IFCUSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,5.,$,$,0.1,$); +#93=IFCUSHAPEPROFILEDEF(.AREA.,$,#87,50.,25.,5.,5.,$,$,4.,$); #94=IFCEXTRUDEDAREASOLID(#93,#92,#88,20.); #95=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#94)); #96=IFCPRODUCTDEFINITIONSHAPE($,$,(#95)); -#97=IFCBUILDINGELEMENTPROXY('11N9hVDYfCOgr$pD_60KDV',#5,'profile',$,$,#103,#115,$,$); -#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('2ZPuncd1b5SOfhXw4iQ24j',#5,$,$,(#97),#38); +#97=IFCBUILDINGELEMENTPROXY('0wi$BN8K1BCQuwL0tSUFos',#5,'profile',$,$,#103,#115,$,$); +#98=IFCRELCONTAINEDINSPATIALSTRUCTURE('3vfSBEVQT32gKsh6Im2KXu',#5,$,$,(#97),#38); #99=IFCDIRECTION((1.,0.,0.)); #100=IFCDIRECTION((0.,0.,1.)); #101=IFCCARTESIANPOINT((300.,0.,0.)); @@ -116,7 +116,7 @@ DATA; #109=IFCDIRECTION((0.,0.,1.)); #110=IFCCARTESIANPOINT((0.,0.,0.)); #111=IFCAXIS2PLACEMENT3D(#110,#109,#108); -#112=IFCUSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,5.,1.,3.,0.1,$); +#112=IFCUSHAPEPROFILEDEF(.AREA.,$,#106,50.,25.,5.,5.,1.,3.,6.,$); #113=IFCEXTRUDEDAREASOLID(#112,#111,#107,20.); #114=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#113)); #115=IFCPRODUCTDEFINITIONSHAPE($,$,(#114));