From f8dfb7fe101cf10795319199fd6966de92e62ac9 Mon Sep 17 00:00:00 2001 From: walch Date: Tue, 9 Jul 2024 15:16:13 +0200 Subject: [PATCH] enabled materials without XbimTexture (null) enabled void-material for ventilated material-layers --- src/Aardvark.Data.Ifc/IFCParser.cs | 32 +++++++++++---- src/Tests/IfcTests/IfcTests.cs | 18 ++++++++ src/Tests/IfcTests/IfcTests.csproj | 2 + src/Tests/IfcTests/data/slab.ifc | 64 +++++++++++++++++++++++++++++ src/Tests/IfcTests/data/wall.ifc | 66 ++++++++++++++++++++++++++++++ 5 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 src/Tests/IfcTests/data/slab.ifc create mode 100644 src/Tests/IfcTests/data/wall.ifc diff --git a/src/Aardvark.Data.Ifc/IFCParser.cs b/src/Aardvark.Data.Ifc/IFCParser.cs index 8511e3f..744a897 100644 --- a/src/Aardvark.Data.Ifc/IFCParser.cs +++ b/src/Aardvark.Data.Ifc/IFCParser.cs @@ -162,7 +162,7 @@ private static (Dict, Dictionary, Dictionary DefaultExclusions(IModel model) @@ -213,8 +213,18 @@ public static void GetAssociatedMaterials(IIfcMaterialSelect matSel, List { + var parsed = IFCParser.PreprocessIFC(filePath); + Assert.AreEqual(4, parsed.Materials.Count); + }); + } + + [Test] + public static void LoadSlab() + { + LoadEmbeddedData(@"data\slab.ifc", (filePath) => { + var parsed = IFCParser.PreprocessIFC(filePath); + Assert.AreEqual(2, parsed.Materials.Count); + }); + } } } \ No newline at end of file diff --git a/src/Tests/IfcTests/IfcTests.csproj b/src/Tests/IfcTests/IfcTests.csproj index 70e19a8..202a9e4 100644 --- a/src/Tests/IfcTests/IfcTests.csproj +++ b/src/Tests/IfcTests/IfcTests.csproj @@ -15,7 +15,9 @@ + + \ No newline at end of file diff --git a/src/Tests/IfcTests/data/slab.ifc b/src/Tests/IfcTests/data/slab.ifc new file mode 100644 index 0000000..1f06237 --- /dev/null +++ b/src/Tests/IfcTests/data/slab.ifc @@ -0,0 +1,64 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [DesignTransferView_V1]'),'2;1'); +FILE_NAME( +/* name */ 'C:\\My Work\\Geometry Gym\\documents\\building smart\\github\\ifcscript\\examples\\Slab.ifc', +/* time_stamp */ '2017-06-27T13:32:39', +/* author */ ('jonm'), +/* organization */ ('Geometry Gym'), +/* preprocessor_version */ 'GeometryGymIFC v0.0.15.0 by Geometry Gym Pty Ltd built 2017-06-27T02:48:24', +/* originating_system */ 'IFCExamples v0.0.1.0', +/* authorization */ 'None'); + +FILE_SCHEMA (('IFC4')); +ENDSEC; + +DATA; +#10= IFCCARTESIANPOINT((0.0,0.0,0.0)); +#11= IFCAXIS2PLACEMENT3D(#10,$,$); +#12= IFCLOCALPLACEMENT($,#11); +/* defines the default building (as required as the minimum spatial element) */ +#13= IFCBUILDING('39t4Pu3nTC4ekXYRIHJB9W',$,'IfcBuilding',$,$,#12,$,$,$,$,$,#18); +#14= IFCRELCONTAINEDINSPATIALSTRUCTURE('3Sa3dTJGn0H8TQIGiuGQd5',$,'Building','Building Container for Elements',(#311),#13); +#15= IFCCARTESIANPOINT((0.0,0.0,0.0)); +#16= IFCAXIS2PLACEMENT3D(#15,$,$); +#18= IFCPOSTALADDRESS($,$,$,$,('Unknown'),$,'Unknown',$,'Unknown','Unknown'); +/* general entities required for all IFC sets, defining the context for the exchange */ +#20= IFCPROJECT('0$WU4A9R19$vKWO$AdOnKA',$,'IfcProject',$,$,$,$,(#28),#21); +#21= IFCUNITASSIGNMENT((#22,#23,#24,#25,#26)); +#22= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#23= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#24= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#25= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#26= IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#27= IFCRELAGGREGATES('091a6ewbvCMQ2Vyiqspa7a',$,'Project Container','Project Container for Buildings',#20,(#13)); +#28= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.0001,#30,#31); +#29= IFCCARTESIANPOINT((0.0,0.0,0.0)); +#30= IFCAXIS2PLACEMENT3D(#29,$,$); +#31= IFCDIRECTION((0.0,1.0)); +#32= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#28,$,.MODEL_VIEW.,$); +/* Example data for Slab */ +#50= IFCMATERIAL('Concrete','Concrete',$); +#52= IFCMATERIALLAYER(#50,200.0,.F.,'Core',$,$,$); +#54= IFCMATERIALLAYERSET((#52),'200mm Concrete',$); +#55= IFCRELASSOCIATESMATERIAL('2l_enLhI93reVwnim9gXUq',$,'MatAssoc','Material Associates',(#300),#54); +#300= IFCSLABTYPE('0RSW$KKbzCZ9QaSm3GoEan',$,'200mm Concrete',$,$,$,$,$,$,.FLOOR.); +#301= IFCRELDEFINESBYTYPE('3wwDcmW5T3HfafURQewdD0',$,'NameNotAssigned',$,(#311),#300); +#302= IFCRELDECLARES('1Cjr05W9T0fx0M3_mdVqMd',$,$,$,#20,(#300)); +#303= IFCCARTESIANPOINTLIST2D(((0.0,0.0),(1000.0,0.0),(1400.0,2000.0),(1000.0,4000.0),(0.0,4000.0),(-400.0,2000.0))); +#304= IFCINDEXEDPOLYCURVE(#303,(IFCLINEINDEX((1,2)),IFCARCINDEX((2,3,4)),IFCLINEINDEX((4,5)),IFCARCINDEX((5,6,1))),$); +#305= IFCMATERIALLAYERSETUSAGE(#54,.AXIS3.,.NEGATIVE.,0.0,$); +#306= IFCRELASSOCIATESMATERIAL('3ESAzibgr9BvK9M75iV84w',$,'MatAssoc','Material Associates',(#311),#305); +#307= IFCCARTESIANPOINT((0.0,0.0,0.0)); +#308= IFCAXIS2PLACEMENT3D(#307,$,$); +#309= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'Slab Perimeter',#304); +#310= IFCLOCALPLACEMENT(#12,#308); +#311= IFCSLABSTANDARDCASE('1wAj$J2Az2V8wnBiVYd3bU',$,$,$,$,#310,#315,$,$); +#312= IFCDIRECTION((0.0,0.0,-1.0)); +#313= IFCEXTRUDEDAREASOLID(#309,$,#312,200.0); +#314= IFCSHAPEREPRESENTATION(#32,'Body','SweptSolid',(#313)); +#315= IFCPRODUCTDEFINITIONSHAPE($,$,(#314)); +ENDSEC; + +END-ISO-10303-21; + diff --git a/src/Tests/IfcTests/data/wall.ifc b/src/Tests/IfcTests/data/wall.ifc new file mode 100644 index 0000000..37c6b4f --- /dev/null +++ b/src/Tests/IfcTests/data/wall.ifc @@ -0,0 +1,66 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION((''),'2;1'); +FILE_NAME('','2019-03-20T15:56:45',(''),(''),'BuildingSmart IfcKit by Constructivity','IfcDoc 12.0.0.0',''); +FILE_SCHEMA(('IFC4x1')); +ENDSEC; + +DATA; + +#1= IFCBUILDING('39t4Pu3nTC4ekXYRIHJB9W',#2,'IfcBuilding',$,$,$,$,$,$,$,$,$); +#2= IFCOWNERHISTORY(#5,#6,$,.ADDED.,1454575675,$,$,1454575675); +#5= IFCPERSONANDORGANIZATION(#7,#8,$); +#6= IFCAPPLICATION(#9,'0.0.1.0','ggRhinoIFC - Geometry Gym Plug-in for Rhino3d','ggRhinoIFC'); +#7= IFCPERSON('Jon','Jon',$,$,$,$,$,$); +#8= IFCORGANIZATION($,'Geometry Gym Pty Ltd',$,$,$); +#9= IFCORGANIZATION($,'Geometry Gym Pty Ltd',$,$,$); + +#3= IFCRELAGGREGATES('091a6ewbvCMQ2Vyiqspa7a',#2,'Project Container','Project Container for Buildings',#10,(#1)); + +#4= IFCRELCONTAINEDINSPATIALSTRUCTURE('3Sa3dTJGn0H8TQIGiuGQd5',#2,'Building','Building Container for Elements',(#11),#1); + +#10= IFCPROJECT('0$WU4A9R19$vKWO$AdOnKA',#2,'IfcProject',$,$,$,$,(#12),#13); +#12= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.0001,#15,$); +#13= IFCUNITASSIGNMENT((#18,#19,#20)); +#15= IFCAXIS2PLACEMENT3D(#21,$,$); +#16= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',0,$,$,$,#12,$,.MODEL_VIEW.,$); +#17= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',0,$,$,$,#12,$,.MODEL_VIEW.,$); +#18= IFCSIUNIT($,.LENGTHUNIT.,.MILLI.,.METRE.); +#19= IFCSIUNIT($,.PLANEANGLEUNIT.,$,.RADIAN.); +#20= IFCSIUNIT($,.TIMEUNIT.,$,.SECOND.); +#21= IFCCARTESIANPOINT((0.,0.,0.)); +#22= IFCSHAPEREPRESENTATION(#17,'Axis','Curve2D',(#24)); +#23= IFCSHAPEREPRESENTATION(#17,'Body','SweptSolid',(#26)); +#24= IFCPOLYLINE((#27,#28)); +#25= IFCPRODUCTDEFINITIONSHAPE($,$,(#22,#23)); +#26= IFCEXTRUDEDAREASOLID(#29,$,#30,2000.); +#27= IFCCARTESIANPOINT((0.,0.)); +#28= IFCCARTESIANPOINT((5000.,0.)); +#29= IFCRECTANGLEPROFILEDEF(.AREA.,'Wall Perim',#31,5000.,270.); +#30= IFCDIRECTION((0.,0.,1.)); +#31= IFCAXIS2PLACEMENT2D(#32,$); +#32= IFCCARTESIANPOINT((2500.,135.)); + +#11= IFCWALL('0DWgwt6o1FOx7466fPk$jl',#2,$,$,$,#33,#25,$,$); +#33= IFCLOCALPLACEMENT($,#36); +#36= IFCAXIS2PLACEMENT3D(#21,$,$); + +#14= IFCRELDECLARES('1lEof85zvB$O57GEVffll1',#2,$,$,#10,(#37)); + +#34= IFCRELASSOCIATESMATERIAL('1BYoVhjtLADPUZYzipA826',#2,'MatAssoc','Material Associates',(#11),#38); +#38= IFCMATERIALLAYERSETUSAGE(#39,.AXIS2.,.POSITIVE.,0.,$); +#39= IFCMATERIALLAYERSET((#40,#41,#42),'Double Brick - 270',$); +#40= IFCMATERIALLAYER(#44,110.,.F.,'Finish',$,$,$); +#41= IFCMATERIALLAYER($,50.,.T.,'Air Infiltration Barrier',$,$,$); +#42= IFCMATERIALLAYER(#45,110.,.F.,'Core',$,$,$); +#44= IFCMATERIAL('Masonry - Brick - Brown',$,$); +#45= IFCMATERIAL('Masonry',$,$); + +#35= IFCRELDEFINESBYTYPE('1$EkFElNT8TB_VUVG1FtMe',#2,$,$,(#11),#37); + +#37= IFCWALLTYPE('2aG1gZj7PD2PztLOx2$IVX',#2,'Double Brick - 270',$,$,$,$,$,$,.NOTDEFINED.); + +#43= IFCRELASSOCIATESMATERIAL('36U74BIPDD89cYkx9bkV$Y',#2,'MatAssoc','Material Associates',(#37),#39); +ENDSEC; + +END-ISO-10303-21; \ No newline at end of file