From 5648b8d8bc2f964affbb6d2f3fa51208b39d4e08 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 19 Jul 2014 10:30:13 +0000 Subject: [PATCH] Correct an invalid default value for IfcCartesianTransformationOperator3D.Axis3. Thanks Stefan. --- src/ifcgeom/IfcGeomHelpers.cpp | 6 +- test/input/mapped_circle.ifc | 128 +++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 test/input/mapped_circle.ifc diff --git a/src/ifcgeom/IfcGeomHelpers.cpp b/src/ifcgeom/IfcGeomHelpers.cpp index 2c3856f015..4c1c37fe3f 100644 --- a/src/ifcgeom/IfcGeomHelpers.cpp +++ b/src/ifcgeom/IfcGeomHelpers.cpp @@ -151,11 +151,10 @@ bool IfcGeom::convert(const IfcSchema::IfcCartesianTransformationOperator3D* l, IfcGeom::convert(l->LocalOrigin(),origin); gp_Dir axis1 (1.,0.,0.); gp_Dir axis2 (0.,1.,0.); - gp_Dir axis3; + gp_Dir axis3 (0.,0.,1.); if ( l->hasAxis1() ) IfcGeom::convert(l->Axis1(),axis1); if ( l->hasAxis2() ) IfcGeom::convert(l->Axis2(),axis2); if ( l->hasAxis3() ) IfcGeom::convert(l->Axis3(),axis3); - else axis3 = axis1.Crossed(axis2); gp_Ax3 ax3 (origin,axis3,axis1); if ( axis2.Dot(ax3.YDirection()) < 0 ) ax3.YReverse(); trsf.SetTransformation(ax3); @@ -206,11 +205,10 @@ bool IfcGeom::convert(const IfcSchema::IfcCartesianTransformationOperator3DnonUn IfcGeom::convert(l->LocalOrigin(),origin); gp_Dir axis1 (1.,0.,0.); gp_Dir axis2 (0.,1.,0.); - gp_Dir axis3; + gp_Dir axis3 (0.,0.,1.); if ( l->hasAxis1() ) IfcGeom::convert(l->Axis1(),axis1); if ( l->hasAxis2() ) IfcGeom::convert(l->Axis2(),axis2); if ( l->hasAxis3() ) IfcGeom::convert(l->Axis3(),axis3); - else axis3 = axis1.Crossed(axis2); gp_Ax3 ax3 (origin,axis3,axis1); if ( axis2.Dot(ax3.YDirection()) < 0 ) ax3.YReverse(); trsf.SetTransformation(ax3); diff --git a/test/input/mapped_circle.ifc b/test/input/mapped_circle.ifc new file mode 100644 index 0000000000..895a3087a8 --- /dev/null +++ b/test/input/mapped_circle.ifc @@ -0,0 +1,128 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('mapped_circle.ifc','2014-07-19T12:07:38',(''),('',''),'IfcOpenShell 0.5.0-dev','IfcOpenShell 0.5.0-dev',''); +FILE_SCHEMA(('IFC2X3')); +ENDSEC; +DATA; +#1=IFCCARTESIANPOINT((1.,101.)); +#2=IFCCARTESIANPOINT((1.,1.)); +#3=IFCCARTESIANPOINT((101.,1.)); +#4=IFCDIRECTION((1.,0.)); +#5=IFCCARTESIANPOINT((1.,1.)); +#6=IFCAXIS2PLACEMENT2D(#5,#4); +#7=IFCCIRCLE(#6,100.); +#8=IFCTRIMMEDCURVE(#7,(IFCPARAMETERVALUE(0.)),(IFCPARAMETERVALUE(90.)),.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=IFCDIRECTION((0.,0.,1.)); +#15=IFCDIRECTION((1.,0.,0.)); +#16=IFCDIRECTION((0.,0.,1.)); +#17=IFCCARTESIANPOINT((0.,0.,0.)); +#18=IFCAXIS2PLACEMENT3D(#17,#16,#15); +#19=IFCEXTRUDEDAREASOLID(#13,#18,#14,20.); +#20=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#21=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#22=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#23=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453293),#22); +#24=IFCCONVERSIONBASEDUNIT(#20,.PLANEANGLEUNIT.,'Degrees',#23); +#25=IFCUNITASSIGNMENT((#21,#24)); +#26=IFCPROJECT('2K5TPkrgLCsRWUjW3rhDze',$,'Mapped Circle',$,$,$,$,(#32),#25); +#27=IFCDIRECTION((0.,1.)); +#28=IFCDIRECTION((1.,0.,0.)); +#29=IFCDIRECTION((0.,0.,1.)); +#30=IFCCARTESIANPOINT((0.,0.,0.)); +#31=IFCAXIS2PLACEMENT3D(#30,#29,#28); +#32=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-005,#31,#27); +#33=IFCSHAPEREPRESENTATION(#32,'Body','SweptSolid',(#19)); +#34=IFCDIRECTION((0.,0.,1.)); +#35=IFCCARTESIANPOINT((0.,0.,0.)); +#36=IFCDIRECTION((0.,1.,0.)); +#37=IFCDIRECTION((-1.,0.,0.)); +#38=IFCCARTESIANPOINT((0.,0.,0.)); +#39=IFCDIRECTION((0.,-1.,0.)); +#40=IFCDIRECTION((0.,0.,-1.)); +#41=IFCCARTESIANPOINT((0.,0.,0.)); +#42=IFCDIRECTION((0.,-1.,0.)); +#43=IFCDIRECTION((-1.,0.,0.)); +#44=IFCCARTESIANTRANSFORMATIONOPERATOR3D(#37,#36,#35,1.,#34); +#45=IFCCARTESIANTRANSFORMATIONOPERATOR3D($,#39,#38,2.,$); +#46=IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM(#43,#42,#41,1.,#40,2.,1.); +#47=IFCPERSON($,$,'',$,$,$,$,$); +#48=IFCORGANIZATION($,'IfcOpenShell',$,$,$); +#49=IFCPERSONANDORGANIZATION(#47,#48,$); +#50=IFCAPPLICATION(#48,'0.5.0-dev','IfcOpenShell','IfcOpenShell'); +#51=IFCOWNERHISTORY(#49,#50,$,.ADDED.,1405764458,#49,#50,1405764458); +#52=IFCDIRECTION((1.,0.,0.)); +#53=IFCDIRECTION((0.,0.,1.)); +#54=IFCCARTESIANPOINT((0.,0.,0.)); +#55=IFCAXIS2PLACEMENT3D(#54,#53,#52); +#56=IFCLOCALPLACEMENT($,#55); +#57=IFCSITE('3u$Iq5iSX3P9jhN1Q_lPxT',#51,$,$,$,#56,$,$,.ELEMENT.,$,$,$,$,$); +#58=IFCRELAGGREGATES('1TmKB7NwL028i0hHYAwAjj',#51,$,$,#26,(#57)); +#59=IFCDIRECTION((1.,0.,0.)); +#60=IFCDIRECTION((0.,0.,1.)); +#61=IFCCARTESIANPOINT((0.,0.,0.)); +#62=IFCAXIS2PLACEMENT3D(#61,#60,#59); +#63=IFCLOCALPLACEMENT(#56,#62); +#64=IFCBUILDING('39bLeNfwTCY833MagsKCV1',#51,$,$,$,#63,$,$,.ELEMENT.,$,$,$); +#65=IFCRELAGGREGATES('1ha$aSPJLBYhTXfX7MhR9c',#51,$,$,#57,(#64)); +#66=IFCDIRECTION((1.,0.,0.)); +#67=IFCDIRECTION((0.,0.,1.)); +#68=IFCCARTESIANPOINT((0.,0.,0.)); +#69=IFCAXIS2PLACEMENT3D(#68,#67,#66); +#70=IFCLOCALPLACEMENT(#63,#69); +#71=IFCBUILDINGSTOREY('3aSgXeuc92jOM3z9OU8ClT',#51,$,$,$,#70,$,$,.ELEMENT.,$); +#72=IFCRELAGGREGATES('1YZWa7xGH2BPIRWCbE5US2',#51,$,$,#64,(#71)); +#73=IFCBUILDINGELEMENTPROXY('0g1GtoNWD6ZAgI102NzlDj',#51,'circle part',$,$,#79,#89,$,$); +#74=IFCRELCONTAINEDINSPATIALSTRUCTURE('1Qj$yHymbDJfTYNV52DaEV',#51,$,$,(#73),#71); +#75=IFCDIRECTION((1.,0.,0.)); +#76=IFCDIRECTION((0.,0.,1.)); +#77=IFCCARTESIANPOINT((0.,0.,0.)); +#78=IFCAXIS2PLACEMENT3D(#77,#76,#75); +#79=IFCLOCALPLACEMENT($,#78); +#80=IFCDIRECTION((1.,0.,0.)); +#81=IFCDIRECTION((0.,0.,1.)); +#82=IFCCARTESIANPOINT((0.,0.,0.)); +#83=IFCAXIS2PLACEMENT3D(#82,#81,#80); +#84=IFCREPRESENTATIONMAP(#83,#33); +#85=IFCCARTESIANPOINT((0.,0.,0.)); +#86=IFCCARTESIANTRANSFORMATIONOPERATOR3D($,$,#85,$,$); +#87=IFCMAPPEDITEM(#84,#86); +#88=IFCSHAPEREPRESENTATION(#32,'Body','MappedRepresentation',(#87)); +#89=IFCPRODUCTDEFINITIONSHAPE($,$,(#88)); +#90=IFCBUILDINGELEMENTPROXY('33VVacqUTC7g2JqGu4YGqy',#51,'circle part',$,$,#96,#99,$,$); +#91=IFCRELCONTAINEDINSPATIALSTRUCTURE('2MPViYfDfAXAM_FcY51t6p',#51,$,$,(#90),#71); +#92=IFCDIRECTION((1.,0.,0.)); +#93=IFCDIRECTION((0.,0.,1.)); +#94=IFCCARTESIANPOINT((0.,0.,0.)); +#95=IFCAXIS2PLACEMENT3D(#94,#93,#92); +#96=IFCLOCALPLACEMENT($,#95); +#97=IFCMAPPEDITEM(#84,#44); +#98=IFCSHAPEREPRESENTATION(#32,'Body','MappedRepresentation',(#97)); +#99=IFCPRODUCTDEFINITIONSHAPE($,$,(#98)); +#100=IFCBUILDINGELEMENTPROXY('2gwDydYu94QwwML3zAP4RY',#51,'circle part',$,$,#106,#109,$,$); +#101=IFCRELCONTAINEDINSPATIALSTRUCTURE('0h7lymY5b4MgtEgsvkwOE_',#51,$,$,(#100),#71); +#102=IFCDIRECTION((1.,0.,0.)); +#103=IFCDIRECTION((0.,0.,1.)); +#104=IFCCARTESIANPOINT((-1.,1.,-20.)); +#105=IFCAXIS2PLACEMENT3D(#104,#103,#102); +#106=IFCLOCALPLACEMENT($,#105); +#107=IFCMAPPEDITEM(#84,#45); +#108=IFCSHAPEREPRESENTATION(#32,'Body','MappedRepresentation',(#107)); +#109=IFCPRODUCTDEFINITIONSHAPE($,$,(#108)); +#110=IFCBUILDINGELEMENTPROXY('032bRHMEnB1Q1uvgalj5t8',#51,'circle part',$,$,#116,#119,$,$); +#111=IFCRELCONTAINEDINSPATIALSTRUCTURE('1tArpusuTBtxScHZvILvxW',#51,$,$,(#110),#71); +#112=IFCDIRECTION((1.,0.,0.)); +#113=IFCDIRECTION((0.,0.,1.)); +#114=IFCCARTESIANPOINT((0.,1.,20.)); +#115=IFCAXIS2PLACEMENT3D(#114,#113,#112); +#116=IFCLOCALPLACEMENT($,#115); +#117=IFCMAPPEDITEM(#84,#46); +#118=IFCSHAPEREPRESENTATION(#32,'Body','MappedRepresentation',(#117)); +#119=IFCPRODUCTDEFINITIONSHAPE($,$,(#118)); +ENDSEC; +END-ISO-10303-21;