public void TransformSolidRectangularProfileDef() { using (var m = new MemoryModel(new Xbim.Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("Test")) { var profile = IfcModelBuilder.MakeRectangleHollowProfileDef(m, 20, 10, 1); var extrude = IfcModelBuilder.MakeExtrudedAreaSolid(m, profile, 40); var solid = _geomEngine.CreateSolid(extrude); var transform = new XbimMatrix3D(); //test first with identity var solid2 = (IXbimSolid)solid.Transform(transform); var s1Verts = solid.Vertices.ToList(); var s2Verts = solid2.Vertices.ToList(); for (int i = 0; i < s1Verts.Count; i++) { XbimVector3D v = s1Verts[i].VertexGeometry - s2Verts[i].VertexGeometry; Assert.IsTrue(v.Length < m.ModelFactors.Precision, "vertices not the same"); } transform.RotateAroundXAxis(Math.PI / 2); transform.RotateAroundYAxis(Math.PI / 4); transform.RotateAroundZAxis(Math.PI); transform.OffsetX += 100; transform.OffsetY += 200; transform.OffsetZ += 300; solid2 = (IXbimSolid)solid.Transform(transform); Assert.IsTrue(Math.Abs(solid.Volume - solid2.Volume) < 0.001, "Volume differs"); transform.Invert(); solid2 = (IXbimSolid)solid2.Transform(transform); s1Verts = solid.Vertices.ToList(); s2Verts = solid2.Vertices.ToList(); for (int i = 0; i < s1Verts.Count; i++) { XbimVector3D v = s1Verts[i].VertexGeometry - s2Verts[i].VertexGeometry; Assert.IsTrue(v.Length < m.ModelFactors.Precision, "vertices not the same"); } txn.Commit(); } } }
public void IfcHalfspace_Test() { using (var m = new MemoryModel(new Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("")) { var halfSpace = m.Instances.New <IfcHalfSpaceSolid>(); halfSpace.AgreementFlag = false; var baseSurface = m.Instances.New <IfcPlane>(); baseSurface.Position = m.Instances.New <IfcAxis2Placement3D>(); baseSurface.Position.Location = m.Instances.New <IfcCartesianPoint>(); baseSurface.Position.Location.X = 0; baseSurface.Position.Location.Y = 0; baseSurface.Position.Location.Z = 10; halfSpace.BaseSurface = baseSurface; //make an extrusion var profile = IfcModelBuilder.MakeRectangleHollowProfileDef(m, 20, 10, 1); var extrude = IfcModelBuilder.MakeExtrudedAreaSolid(m, profile, 40); var solid = geomEngine.CreateSolid(extrude, logger); var halfSpaceSolid = geomEngine.CreateSolid(halfSpace, logger); var cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(cut.Count > 0); Assert.IsTrue(Math.Abs((solid.Volume * .25) - cut.First.Volume) < 1e-5); //move the halfspace plane up baseSurface.Position.Location.Z = 30; halfSpaceSolid = geomEngine.CreateSolid(halfSpace, logger); cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(Math.Abs((solid.Volume * .75) - cut.First.Volume) < 1e-5); //reverse halfspace agreement halfSpace.AgreementFlag = true; halfSpaceSolid = geomEngine.CreateSolid(halfSpace, logger); cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(Math.Abs((solid.Volume * .25) - cut.First.Volume) < 1e-5); } } }