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);
         }
     }
 }