public void Test_Large_Coordinates_Reduction() { XbimGeometryType tp = Xbim.Common.Geometry.XbimGeometryType.PolyhedronBinary; using (var model = IfcStore.Open("TestFiles\\LargeTriangulatedCoordinates.ifc")) { var xbimTessellator = new XbimTessellator(model, tp); var representation = model.Instances.FirstOrDefault <IIfcFacetedBrep>(); var shape = xbimTessellator.Mesh(representation); // geometry should have a local displacement Assert.IsTrue(shape.LocalShapeDisplacement.HasValue); // it should be more than 6 200 000 var distance = shape.LocalShapeDisplacement.Value.Length; Assert.IsTrue(distance > 6200000); var ms = new MemoryStream(((IXbimShapeGeometryData)shape).ShapeData); var br = new BinaryReader(ms); var geometry = br.ReadShapeTriangulation(); // vertex geometry should be small var vertex = geometry.Vertices.First(); Assert.IsTrue(vertex.X < 1000); Assert.IsTrue(vertex.Y < 1000); Assert.IsTrue(vertex.Z < 1000); // bounding box should be at [0,0,0] position var bb = shape.BoundingBox; var pos = bb.Location; var test = Math.Abs(pos.X + pos.Y + pos.Z); Assert.IsTrue(test < 0.1) ; } }
public void Test_Large_Coordinates_Reduction() { XbimGeometryType tp = Xbim.Common.Geometry.XbimGeometryType.PolyhedronBinary; using (var model = IfcStore.Open("LargeTriangulatedCoordinates.ifc")) { var xbimTessellator = new XbimTessellator(model, tp); var shape = model.Instances.FirstOrDefault <IIfcFacetedBrep>(); var shapeGeom = xbimTessellator.Mesh(shape); Assert.IsTrue(shapeGeom.LocalShapeDisplacement.HasValue); } }
public void IfcTriangulatedFaceSetWithColoursTest() { using (var store = IfcStore.Open("tessellation-with-individual-colors.ifc")) { var triangulatedFaceSet = store.Instances.OfType <IfcTriangulatedFaceSet>().FirstOrDefault(); var tessellator = new XbimTessellator(store, XbimGeometryType.PolyhedronBinary); Assert.IsNotNull(triangulatedFaceSet); Assert.IsTrue(tessellator.CanMesh(triangulatedFaceSet)); var geom = tessellator.Mesh(triangulatedFaceSet); Assert.IsTrue((int)(geom.BoundingBox.Volume) == 2000000000); } }
public void IfcTriangulatedFaceSetWithNormalsTest() { using (var store = IfcStore.Open("column-straight-rectangle-tessellation.ifc")) { var columnTess = store.Instances[288] as IIfcTriangulatedFaceSet; var tessellator = new XbimTessellator(store, XbimGeometryType.PolyhedronBinary); Assert.IsNotNull(columnTess); Assert.IsTrue(tessellator.CanMesh(columnTess)); var geom = tessellator.Mesh(columnTess); Assert.IsTrue((int)(geom.BoundingBox.Volume) == 7680); } }
public void IfcTriangulatedFaceSetTest() { using (var store = IfcStore.Open("BasinTessellation.ifc")) { var basinTess = store.Instances[501] as IIfcTriangulatedFaceSet; var tessellator = new XbimTessellator(store, XbimGeometryType.PolyhedronBinary); Assert.IsNotNull(basinTess); Assert.IsTrue(tessellator.CanMesh(basinTess)); var geom = tessellator.Mesh(basinTess); Assert.IsTrue((int)(geom.BoundingBox.Volume) == 23913892); } }
public void TestBoundingBoxSize() { XbimGeometryType tp = Xbim.Common.Geometry.XbimGeometryType.PolyhedronBinary; using (var model = IfcStore.Open("Roof-01_BCAD.ifc")) { var xbimTessellator = new XbimTessellator(model, tp); XbimShapeGeometry shapeGeom = null; var shape = model.Instances[1192] as IIfcGeometricRepresentationItem; shapeGeom = xbimTessellator.Mesh(shape); Debug.WriteLine(shapeGeom.BoundingBox); } }
public void TestPnSize_Add2_Support() { XbimGeometryType tp = Xbim.Common.Geometry.XbimGeometryType.PolyhedronBinary; using (var model = IfcStore.Open("TestFiles\\IfcTriangulatedFaceSet.ifc")) { var xbimTessellator = new XbimTessellator(model, tp); XbimShapeGeometry shapeGeom = null; var shape = model.Instances[48] as IIfcGeometricRepresentationItem; shapeGeom = xbimTessellator.Mesh(shape); Debug.WriteLine(shapeGeom.BoundingBox); } }
public void Test_PolygonalFaceSet_Tessellation() { XbimGeometryType tp = Xbim.Common.Geometry.XbimGeometryType.PolyhedronBinary; using (var model = IfcStore.Open("TestFiles\\polygonal-face-tessellation.ifc")) { var xbimTessellator = new XbimTessellator(model, tp); XbimShapeGeometry shapeGeom = null; var shape = model.Instances.FirstOrDefault <IIfcPolygonalFaceSet>(); shapeGeom = xbimTessellator.Mesh(shape); Assert.AreEqual(8000000000000, shapeGeom.BoundingBox.Volume); } }
public void IfcTriangulatedFaceSetComplexBinaryTest() { using (var store = IfcStore.Open("IFC4TessellationComplex.ifc")) { var triangulatedFaceSet = store.Instances[4373] as IIfcTriangulatedFaceSet; var tessellator = new XbimTessellator(store, XbimGeometryType.PolyhedronBinary); Assert.IsNotNull(triangulatedFaceSet); Assert.IsTrue(tessellator.CanMesh(triangulatedFaceSet)); var geom = tessellator.Mesh(triangulatedFaceSet); using (var ms = new MemoryStream(((IXbimShapeGeometryData)geom).ShapeData)) { using (var br = new BinaryReader(ms)) { XbimShapeTriangulation myShapeTriangulation = br.ReadShapeTriangulation(); Assert.IsTrue(myShapeTriangulation.Faces.Sum(t => t.TriangleCount) == triangulatedFaceSet.NumberOfTriangles); } } } }
public void ReadAndWriteWexBimFile() { using (var m = IfcStore.Open("SampleHouse4.ifc")) { var wall = m.Instances[1229] as IIfcWall; Assert.IsNotNull(wall, "No IfcWall found in file"); var brep = m.Instances[1213] as IIfcFacetedBrep; Assert.IsNotNull(brep, "No IfcFacetedBrep found in file"); var styledItem = brep.StyledByItem.FirstOrDefault(); //this is not fast do not do on large models Assert.IsNotNull(styledItem, "No StyledItem found in file"); var repContext = m.Instances[100] as IIfcGeometricRepresentationContext; Assert.IsNotNull(repContext, "No context found in file"); var geomStore = m.GeometryStore; using (var txn = geomStore.BeginInit()) { var tessellator = new XbimTessellator(m, XbimGeometryType.PolyhedronBinary); var geom = tessellator.Mesh(brep); var geomId = txn.AddShapeGeometry(geom); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { BoundingBox = geom.BoundingBox, IfcProductLabel = wall.EntityLabel, IfcTypeId = m.Metadata.ExpressTypeId("IFCWALL"), StyleLabel = m.Metadata.ExpressTypeId("IFCWALL") * -1, RepresentationType = XbimGeometryRepresentationType.OpeningsAndAdditionsIncluded, ShapeGeometryLabel = geomId, Transformation = XbimMatrix3D.Identity, RepresentationContext = repContext.EntityLabel }; txn.AddShapeInstance(shapeInstance, geomId); txn.Commit(); } using (var bw = new BinaryWriter(new FileStream("test.wexBIM", FileMode.Create))) { m.SaveAsWexBim(bw); bw.Close(); } } using (var fs = new FileStream(@"test.wexBIM", FileMode.Open, FileAccess.Read)) { using (var br = new BinaryReader(fs)) { var magicNumber = br.ReadInt32(); Assert.IsTrue(magicNumber == IfcStoreGeometryExtensions.WexBimId); var version = br.ReadByte(); var shapeCount = br.ReadInt32(); var vertexCount = br.ReadInt32(); var triangleCount = br.ReadInt32(); var matrixCount = br.ReadInt32(); var productCount = br.ReadInt32(); var styleCount = br.ReadInt32(); var meter = br.ReadSingle(); Assert.IsTrue(meter > 0); var regionCount = br.ReadInt16(); for (int i = 0; i < regionCount; i++) { var population = br.ReadInt32(); var centreX = br.ReadSingle(); var centreY = br.ReadSingle(); var centreZ = br.ReadSingle(); var boundsBytes = br.ReadBytes(6 * sizeof(float)); var modelBounds = XbimRect3D.FromArray(boundsBytes); } for (int i = 0; i < styleCount; i++) { var styleId = br.ReadInt32(); var red = br.ReadSingle(); var green = br.ReadSingle(); var blue = br.ReadSingle(); var alpha = br.ReadSingle(); } for (int i = 0; i < productCount; i++) { var productLabel = br.ReadInt32(); var productType = br.ReadInt16(); var boxBytes = br.ReadBytes(6 * sizeof(float)); XbimRect3D bb = XbimRect3D.FromArray(boxBytes); } for (int i = 0; i < shapeCount; i++) { var shapeRepetition = br.ReadInt32(); Assert.IsTrue(shapeRepetition > 0); if (shapeRepetition > 1) { for (int j = 0; j < shapeRepetition; j++) { var ifcProductLabel = br.ReadInt32(); var instanceTypeId = br.ReadInt16(); var instanceLabel = br.ReadInt32(); var styleId = br.ReadInt32(); var transform = XbimMatrix3D.FromArray(br.ReadBytes(sizeof(double) * 16)); } var triangulation = br.ReadShapeTriangulation(); Assert.IsTrue(triangulation.Vertices.Count > 0, "Number of vertices should be greater than zero"); } else if (shapeRepetition == 1) { var ifcProductLabel = br.ReadInt32(); var instanceTypeId = br.ReadInt16(); var instanceLabel = br.ReadInt32(); var styleId = br.ReadInt32(); var triangulation = br.ReadShapeTriangulation(); Assert.IsTrue(triangulation.Vertices.Count > 0, "Number of vertices should be greater than zero"); } } } } }