public void IfcSphereTest() { using (var m = new MemoryModel(new Xbim.Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("Test")) { const double r = 0.5; var sphere = IfcModelBuilder.MakeSphere(m, r); var solid = geomEngine.CreateSolid(sphere); Assert.IsTrue(solid.Faces.Count == 1, "1 face is required of a sphere"); Assert.IsTrue(solid.Vertices.Count == 2, "2 vertices are required of a sphere"); var meshRec = new MeshHelper(); meshRec.BeginUpdate(); geomEngine.Mesh(meshRec, solid, m.ModelFactors.Precision, m.ModelFactors.DeflectionTolerance * 10); meshRec.EndUpdate(); Assert.IsTrue(meshRec.FaceCount == 1, "1 mesh face is required of a sphere"); Assert.IsTrue(meshRec.PointCount == 168, "168 mesh points are required of a sphere"); Assert.IsTrue(meshRec.TriangleCount == 306, "306 triangles are required of a sphere"); Assert.IsTrue(meshRec.TriangleCount * 3 == meshRec.TriangleIndicesCount, "Incorrect triangulation"); txn.Commit(); } } }
public void BooleanIntersectSolidTest() { using (var m = new MemoryModel(new Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("")) { var cylinder = IfcModelBuilder.MakeRightCircularCylinder(m, 10, 20); var sphere = IfcModelBuilder.MakeSphere(m, 15); var a = geomEngine.CreateSolid(sphere, logger); var b = geomEngine.CreateSolid(cylinder, logger); var solidSet = a.Intersection(b, m.ModelFactors.PrecisionBoolean); Assert.IsTrue(solidSet.Count == 1, "intersecting these two solids should return a single solid"); IsSolidTest(solidSet.First); } } }
public void BooleanCutSolidWithVoidNonPlanarTest() { using (var m = new MemoryModel(new Xbim.Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("Populate")) { var block1 = IfcModelBuilder.MakeSphere(m, 20); var block2 = IfcModelBuilder.MakeSphere(m, 5); var b1 = geomEngine.CreateSolid(block1); var b2 = geomEngine.CreateSolid(block2); var result = b1.Cut(b2, m.ModelFactors.PrecisionBoolean); Assert.IsTrue(result.Count == 1, "Cutting of these two solids should return two solids"); const double vOuter = (4.0 / 3.0) * Math.PI * 20.0 * 20.0 * 20.0; const double vInner = (4.0 / 3.0) * Math.PI * 5.0 * 5.0 * 5.0; const double volume = vOuter - vInner; Assert.IsTrue(result.First.Volume - volume <= m.ModelFactors.Precision, "Volume is incorrect"); txn.Commit(); } } }
public void IfcCsgIntersectionTest() { using (var m = new MemoryModel(new Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("")) { var csgTree = m.Instances.New <IfcCsgSolid>(); var bresult = m.Instances.New <IfcBooleanResult>(); var cylinder = IfcModelBuilder.MakeRightCircularCylinder(m, 10, 20); var sphere = IfcModelBuilder.MakeSphere(m, 15); bresult.FirstOperand = cylinder; bresult.SecondOperand = sphere; bresult.Operator = IfcBooleanOperator.INTERSECTION; csgTree.TreeRootExpression = bresult; var solid = geomEngine.CreateSolidSet(csgTree, logger).FirstOrDefault(); Assert.IsTrue(solid.Faces.Count == 3, "3 faces are required of this csg solid"); Assert.IsTrue(solid.Vertices.Count == 3, "3 vertices are required of this csg solid"); } } }