Skip to content

Commit

Permalink
enabled materials without XbimTexture (null)
Browse files Browse the repository at this point in the history
enabled void-material for ventilated material-layers
  • Loading branch information
WalchAndreas committed Jul 9, 2024
1 parent 064d05d commit f8dfb7f
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 8 deletions.
32 changes: 24 additions & 8 deletions src/Aardvark.Data.Ifc/IFCParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ private static (Dict<IfcGloballyUniqueId, IFCContent>, Dictionary<string, IFCMat
else
material = materialsByStyleId[styleId]; // otherwise use Default material

if (material == null || material.Name == null || material.Texture == null)
if (material == null || material.Name == null) // || material.Texture == null
Report.Line("No valid material!");

var instanceTrafo = shapeInstance.Transformation.ToTrafo3d();
Expand All @@ -171,7 +171,7 @@ private static (Dict<IfcGloballyUniqueId, IFCContent>, Dictionary<string, IFCMat
output.Add(guid, new IFCContent(ifcObject, polyMesh, instanceTrafo, material, representationType));
}
}
return (output,materialsByName);
return (output, materialsByName);
}

public static HashSet<short> DefaultExclusions(IModel model)
Expand Down Expand Up @@ -213,8 +213,18 @@ public static void GetAssociatedMaterials(IIfcMaterialSelect matSel, List<IFCMat
}
else if (matSel is IIfcMaterialLayer materialLayer)
{
var thickness = Double.Parse(materialLayer.LayerThickness.Value.ToString());
materials.Add(GetMaterial(materialLayer.Material));
double thickness = materialLayer.LayerThickness;

bool isVentilated = ((bool?)materialLayer.IsVentilated) ?? false;
if (isVentilated)
{
var voidMaterial = new IFCMaterial(materialLayer.Name.ToString(), XbimTexture.Create(128, 128, 128, 128));
materials.Add(voidMaterial);
}
else
{
materials.Add(GetMaterial(materialLayer.Material));
}
}
else if (matSel is IIfcMaterialProfile profile)
{
Expand Down Expand Up @@ -275,15 +285,21 @@ public static void GetAssociatedMaterials(IIfcMaterialSelect matSel, List<IFCMat
}
else Report.Warn("Unknown Associated Material Type!");

} catch (ArgumentException e)
}
catch (ArgumentException e)
{
Report.Error("Associated Material Creation Failed! {0}", e.Message);
if (e is ArgumentException arg)
{
materials.Add(new IFCMaterial(arg.ParamName, null)); // material name only - no visual description (Null)
}
else
Report.Error("Associated Material Creation Failed! {0}", e.Message);
}
}

public static IFCMaterial GetMaterial(IIfcMaterial mat)
{
var matDefRep = mat.HasRepresentation.FirstOrDefault() ?? throw new ArgumentException("No repesentation");
var matDefRep = mat.HasRepresentation.FirstOrDefault() ?? throw new ArgumentException("No repesentation", mat.Name.ToString());
var rep = matDefRep.Representations.First();
var repItem = (IIfcStyledItem)rep.Items.First();

Expand All @@ -298,7 +314,7 @@ public static IFCMaterial GetMaterial(IIfcMaterial mat)
surfStyle = presStyleAss.SurfaceStyles.FirstOrDefault();
}

if (surfStyle == null) throw new ArgumentException("No surfStyle");
if (surfStyle == null) throw new ArgumentException("No surfStyle", mat.Name.ToString());

var material = XbimTexture.Create(surfStyle);

Expand Down
18 changes: 18 additions & 0 deletions src/Tests/IfcTests/IfcTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,23 @@ public static void LoadPrimitive()
Assert.AreEqual(1, parsed.Materials.Count);
});
}

[Test]
public static void LoadWall()
{
LoadEmbeddedData(@"data\wall.ifc", (filePath) => {
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);
});
}
}
}
2 changes: 2 additions & 0 deletions src/Tests/IfcTests/IfcTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
<ProjectReference Include="..\..\Aardvark.Data.Ifc\Aardvark.Data.Ifc.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="data\slab.ifc" />
<EmbeddedResource Include="data\surface-model.ifc" />
<EmbeddedResource Include="data\wall.ifc" />
</ItemGroup>
<Import Project="..\..\..\.paket\Paket.Restore.targets" />
</Project>
64 changes: 64 additions & 0 deletions src/Tests/IfcTests/data/slab.ifc
Original file line number Diff line number Diff line change
@@ -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;

66 changes: 66 additions & 0 deletions src/Tests/IfcTests/data/wall.ifc
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit f8dfb7f

Please sign in to comment.