diff --git a/IFC_roundtrip_specifications.md b/IFC_roundtrip_specifications.md index 5551749..2d182a4 100644 --- a/IFC_roundtrip_specifications.md +++ b/IFC_roundtrip_specifications.md @@ -1,6 +1,10 @@ +# IFC roundtripping specifications + This file lists "exercises" to be performed by a BIM application to achieve adequate round-tripping with IFC files. The application should successfully complete all the steps. + + ## 1. importing and exporting a simple extrusion The application should be able to export and import an IFC file containing one IfcBuildingElementProxy @@ -23,19 +27,64 @@ made of an IfcPolyline, like the example below: #### Import criteria +* The profile position and extrusion direction are correct * The extrusion can be changed after import * The base polyline can be edited after import #### Export criteria -* The exported IFC file contains an IfcBuildingElementProxy, with an IfcExtrudedAreaSolid as its representation -and an IfcArbitraryClosedProfileDef made of an IfcPolyline as its profile +* The exported IFC file contains an IfcBuildingElementProxy, with an IfcExtrudedAreaSolid as its representation and an IfcArbitraryClosedProfileDef made of an IfcPolyline as its profile +* The position and extrusion direction are correct when the IFC file is viewed with [ifc++](http://ifcquery.com) #### Results | | BlenderBIM | FreeCAD | Revit | ArchiCAD | BricsCAD | | -------------- | ---------- | ------------------------------------------------------------ | ----- | -------- | -------- | | passed? | | yes | | | | -| exported file: | | [result 1.FCStd](Specifications%20test%20files/Roundtrip%20Results/Roundtrip%201%20FreeCAD.FCStd) | | | | -| imported file: | | [result 1.ifc](Specifications%20test%20files/Roundtrip%20Results/Roundtrip%201%20FreeCAD.ifc) | | | | +| exported file: | | [simple extrusion.ifc](Specification%20test%20files/Roundtrip%20Results/simple%20extrusion.ifc) | | | | +| imported file: | | [simple extrusion.FCStd](Specification%20test%20files/Roundtrip%20Results/simple%20extrusion.FCStd) | | | | + + + +## 2. importing and exporting non-vertical extrusions + +The application should be able to export and import an IFC file containing three IfcBuildingElementProxy entities, each with one representation, which is an IfcExtrudedAreaSolid, each based on IfcArbitraryClosedProfileDef made of an IfcPolyline, like the example below. One profile should lie on the XY plane, one in the YZ plane, and a third on a plane made of one of the former rotated 45° along the Y axis. Extrusion directions should be normal to the profiles. + +``` + #20= IFCBUILDINGELEMENTPROXY('0ohBfsArr3ruXYxacT4yl5',#1,'NOTDEFINED',$,$,#2,#21,$,.NOTDEFINED.); + #21= IFCPRODUCTDEFINITIONSHAPE($,$,(#22)); + #22= IFCSHAPEREPRESENTATION(#9,'Body','SweptSolid',(#23)); + #23= IFCEXTRUDEDAREASOLID(#24,#31,#25,2000.); + #24 = IFCARBITRARYCLOSEDPROFILEDEF(.AREA., $, #26); + #26 = IFCPOLYLINE((#27, #28, #29, #30)); + #27 = IFCCARTESIANPOINT((0., 0.)); + #28 = IFCCARTESIANPOINT((1000., 0.)); + #29 = IFCCARTESIANPOINT((1000., 1000.)); + #30 = IFCCARTESIANPOINT((0., 1000.)); + #25= IFCDIRECTION((0.,0.,1.)); + #31= IFCAXIS2PLACEMENT3D(#32,#33,#34); + #32= IFCDIRECTION((0.7071,0.,-0.7071)); + #33= IFCDIRECTION((0.7071,0.,0.7071)); + #34= IFCCARTESIANPOINT((1000.,0.,2000.)); +``` + +#### Import criteria + +* The extrusion directions and profile positions are correct +* The extrusions can be changed after import +* The base polylines can be edited after import + +#### Export criteria + +* The exported IFC file contains three IfcBuildingElementProxy, each with an IfcExtrudedAreaSolid as its representation and an IfcArbitraryClosedProfileDef made of an IfcPolyline as its profile. +* The positions and extrusion directions are correct when the IFC file is viewed with [ifc++](http://ifcquery.com) + +#### Results + +| | BlenderBIM | FreeCAD | Revit | ArchiCAD | BricsCAD | +| -------------- | ---------- | ------------------------------------------------------------ | ----- | -------- | -------- | +| passed? | | yes | | | | +| exported file: | | [multipl extrusions.ifc](Specification%20test%20files/Roundtrip%20Results/multiple%20extrusions.ifc) | | | | +| imported file: | | [multiple extrusions.FCStd](Specification%20test%20files/Roundtrip%20Results/multiple%20extrusions.FCStd) | | | | + diff --git a/Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.FCStd b/Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.FCStd deleted file mode 100644 index d9e23a6..0000000 Binary files a/Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.FCStd and /dev/null differ diff --git a/Specifications test files/Roundtrip Results/multiple extrusions.FCStd b/Specifications test files/Roundtrip Results/multiple extrusions.FCStd new file mode 100644 index 0000000..872688b Binary files /dev/null and b/Specifications test files/Roundtrip Results/multiple extrusions.FCStd differ diff --git a/Specifications test files/Roundtrip Results/multiple extrusions.ifc b/Specifications test files/Roundtrip Results/multiple extrusions.ifc new file mode 100644 index 0000000..88bd3d7 --- /dev/null +++ b/Specifications test files/Roundtrip Results/multiple extrusions.ifc @@ -0,0 +1,77 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('multiple.ifc','2020-05-13T12:10:58',('Yorik van Havre','yorik@uncreated.net'),('uncreated.net'),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,'Yorik van Havre',$,$,$,$,$); +#2=IFCORGANIZATION($,'uncreated.net',$,$,$); +#3=IFCPERSONANDORGANIZATION(#1,#2,$); +#4=IFCAPPLICATION(#2,'0.19 build 21059 (Git)','FreeCAD','118df2cf_ed21_438e_a41'); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,1589371858,#3,#4,1589371858); +#6=IFCDIRECTION((1.,0.,0.)); +#7=IFCDIRECTION((0.,0.,1.)); +#8=IFCCARTESIANPOINT((0.,0.,0.)); +#9=IFCAXIS2PLACEMENT3D(#8,#7,#6); +#10=IFCDIRECTION((0.,1.,0.)); +#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16); +#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17); +#19=IFCUNITASSIGNMENT((#13,#14,#15,#18)); +#20=IFCDIRECTION((0.,1.)); +#21=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#20); +#22=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#21,$,.MODEL_VIEW.,$); +#23=IFCPROJECT('03biTKmWH94Au6pQcFXMDQ',#5,'multiple',$,$,$,$,(#21),#19); +#24=IFCCARTESIANPOINT((-0.9,-0.4)); +#25=IFCCARTESIANPOINT((0.9,-0.4)); +#26=IFCCARTESIANPOINT((0.9,0.4)); +#27=IFCCARTESIANPOINT((-0.9,0.4)); +#28=IFCPOLYLINE((#24,#25,#26,#27,#24)); +#29=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#28); +#30=IFCCARTESIANPOINT((1.,-0.5,0.)); +#31=IFCAXIS2PLACEMENT3D(#30,#7,#6); +#32=IFCEXTRUDEDAREASOLID(#29,#31,#7,2.); +#33=IFCCOLOURRGB($,0.800000011920929,0.800000011920929,0.800000011920929); +#34=IFCSURFACESTYLERENDERING(#33,$,$,$,$,$,$,$,.FLAT.); +#35=IFCSURFACESTYLE($,.BOTH.,(#34)); +#36=IFCPRESENTATIONSTYLEASSIGNMENT((#35)); +#37=IFCSTYLEDITEM(#32,(#36),$); +#38=IFCLOCALPLACEMENT($,#9); +#39=IFCSHAPEREPRESENTATION(#22,'Body','SweptSolid',(#32)); +#40=IFCPRODUCTDEFINITIONSHAPE($,$,(#39)); +#41=IFCBUILDINGELEMENTPROXY('0iRwTtZ1vDVg4QoKF$wB$X',#5,'Extrude','',$,#38,#40,$,$); +#42=IFCCARTESIANPOINT((0.9,-0.4)); +#43=IFCCARTESIANPOINT((0.9,0.4)); +#44=IFCPOLYLINE((#24,#42,#43,#27,#24)); +#45=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#44); +#46=IFCDIRECTION((0.707106781186547,0.,-0.707106781186548)); +#47=IFCDIRECTION((0.707106781186548,0.,0.707106781186547)); +#48=IFCCARTESIANPOINT((-0.736396103067893,-0.499999998127686,2.63639610288445)); +#49=IFCAXIS2PLACEMENT3D(#48,#47,#46); +#50=IFCDIRECTION((-5.9211894646675E-16,0.,1.)); +#51=IFCEXTRUDEDAREASOLID(#45,#49,#50,3.); +#52=IFCSTYLEDITEM(#51,(#36),$); +#53=IFCSHAPEREPRESENTATION(#22,'Body','SweptSolid',(#51)); +#54=IFCPRODUCTDEFINITIONSHAPE($,$,(#53)); +#55=IFCBUILDINGELEMENTPROXY('2vghw0Vaf489N2O8RV4mLV',#5,'Extrude001','',$,#38,#54,$,$); +#56=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#28); +#57=IFCDIRECTION((2.22044604925031E-16,0.,-1.)); +#58=IFCDIRECTION((1.,0.,2.22044604925031E-16)); +#59=IFCCARTESIANPOINT((0.,-0.49999964237211,6.99999999999999)); +#60=IFCAXIS2PLACEMENT3D(#59,#58,#57); +#61=IFCDIRECTION((4.22044604925031E-16,0.,1.)); +#62=IFCEXTRUDEDAREASOLID(#56,#60,#61,4.); +#63=IFCSTYLEDITEM(#62,(#36),$); +#64=IFCSHAPEREPRESENTATION(#22,'Body','SweptSolid',(#62)); +#65=IFCPRODUCTDEFINITIONSHAPE($,$,(#64)); +#66=IFCBUILDINGELEMENTPROXY('2GBoYAn8514wJYrda0FRVd',#5,'Extrude002','',$,#38,#65,$,$); +#67=IFCBUILDING('3vCTfBNwr06RC435WkcWzH',#5,'Default Building','',$,$,$,$,.ELEMENT.,$,$,$); +#68=IFCRELAGGREGATES('1XJ7237LnFRBGAAyHPPeXv',#5,'ProjectLink','',#23,(#67)); +#69=IFCRELCONTAINEDINSPATIALSTRUCTURE('0tFdoxcCv2DBSaVbW1CUk$',#5,'UnassignedObjectsLink','',(#41,#55,#66),#67); +ENDSEC; +END-ISO-10303-21; diff --git a/Specifications test files/Roundtrip Results/simple extrusion.FCStd b/Specifications test files/Roundtrip Results/simple extrusion.FCStd new file mode 100644 index 0000000..5458133 Binary files /dev/null and b/Specifications test files/Roundtrip Results/simple extrusion.FCStd differ diff --git a/Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.ifc b/Specifications test files/Roundtrip Results/simple extrusion.ifc similarity index 73% rename from Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.ifc rename to Specifications test files/Roundtrip Results/simple extrusion.ifc index bfdd629..aafaa2b 100644 --- a/Specifications test files/Roundtrip Results/Roundtrip 1 FreeCAD.ifc +++ b/Specifications test files/Roundtrip Results/simple extrusion.ifc @@ -1,15 +1,15 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('Roundtrip 1 FreeCAD.ifc','2020-05-12T09:14:56',('Yorik van Havre','yorik@uncreated.net'),('uncreated.net'),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0',''); +FILE_NAME('Roundtrip 1 FreeCAD.ifc','2020-05-12T14:33:17',('Yorik van Havre','yorik@uncreated.net'),('uncreated.net'),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; #1=IFCPERSON($,$,'Yorik van Havre',$,$,$,$,$); #2=IFCORGANIZATION($,'uncreated.net',$,$,$); #3=IFCPERSONANDORGANIZATION(#1,#2,$); -#4=IFCAPPLICATION(#2,'0.19 build 21031 (Git)','FreeCAD','118df2cf_ed21_438e_a41'); -#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,1589274896,#3,#4,1589274896); +#4=IFCAPPLICATION(#2,'0.19 build 21037 (Git)','FreeCAD','118df2cf_ed21_438e_a41'); +#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,1589293997,#3,#4,1589293997); #6=IFCDIRECTION((1.,0.,0.)); #7=IFCDIRECTION((0.,0.,1.)); #8=IFCCARTESIANPOINT((0.,0.,0.)); @@ -26,11 +26,11 @@ DATA; #20=IFCDIRECTION((0.,1.)); #21=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#20); #22=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#21,$,.MODEL_VIEW.,$); -#23=IFCPROJECT('1K2xYCBpz8y87tDwWzJsPw',#5,'Roundtrip_1_FreeCAD',$,$,$,$,(#21),#19); -#24=IFCCARTESIANPOINT((0.,0.)); -#25=IFCCARTESIANPOINT((1.,0.)); -#26=IFCCARTESIANPOINT((1.,1.)); -#27=IFCCARTESIANPOINT((0.,1.)); +#23=IFCPROJECT('3ltNA1mHP9zgbu3TvKgPyU',#5,'Roundtrip_1_FreeCAD',$,$,$,$,(#21),#19); +#24=IFCCARTESIANPOINT((-0.5,-0.5)); +#25=IFCCARTESIANPOINT((0.5,-0.5)); +#26=IFCCARTESIANPOINT((0.5,0.5)); +#27=IFCCARTESIANPOINT((-0.5,0.5)); #28=IFCPOLYLINE((#24,#25,#26,#27,#24)); #29=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#28); #30=IFCCARTESIANPOINT((0.5,0.5,0.)); @@ -44,9 +44,9 @@ DATA; #38=IFCLOCALPLACEMENT($,#9); #39=IFCSHAPEREPRESENTATION(#22,'Body','SweptSolid',(#32)); #40=IFCPRODUCTDEFINITIONSHAPE($,$,(#39)); -#41=IFCBUILDINGELEMENTPROXY('3y8yjHmoj7i8DD_OroWdOV',#5,'Extrude','',$,#38,#40,$,$); -#42=IFCBUILDING('1FrEBU1fL92wMs5ElgGseN',#5,'Default Building','',$,$,$,$,.ELEMENT.,$,$,$); -#43=IFCRELAGGREGATES('3MOFXVItb6CPui8Ug4CY_v',#5,'ProjectLink','',#23,(#42)); -#44=IFCRELCONTAINEDINSPATIALSTRUCTURE('3FHP$lA3L11QsR8zQO4IBj',#5,'UnassignedObjectsLink','',(#41),#42); +#41=IFCBUILDINGELEMENTPROXY('1XW1Z55iD4$APiBt2cTMkk',#5,'Extrude','',$,#38,#40,$,$); +#42=IFCBUILDING('2uvHtdWM92VhLMt9mwINS2',#5,'Default Building','',$,$,$,$,.ELEMENT.,$,$,$); +#43=IFCRELAGGREGATES('2t_v229DH6IQuULMAvUyMw',#5,'ProjectLink','',#23,(#42)); +#44=IFCRELCONTAINEDINSPATIALSTRUCTURE('2dVuI5I79578O7tDwslWNg',#5,'UnassignedObjectsLink','',(#41),#42); ENDSEC; END-ISO-10303-21;