public void CuttingOpeningInCompositeProfileDefTest()
        {
            using (var repos = new EntityRepository <IIfcRelVoidsElement>("CuttingOpeningInCompositeProfileDefTest"))
            {
                var relVoids       = repos.Entity;
                var oneMilli       = relVoids.Model.ModelFactors.OneMilliMetre;
                var precision      = relVoids.Model.ModelFactors.Precision + (oneMilli * 2e-6);
                var wall           = relVoids.RelatingBuildingElement;
                var wallPlacement  = wall.ObjectPlacement as IIfcLocalPlacement;
                var wallTransform  = wallPlacement.ToMatrix3D();
                var wallTransform2 = geomEngine.ToMatrix3D(wallPlacement);
                Assert.AreEqual(wallTransform, wallTransform2);
                var wallGeom         = wall.Representation.Representations.FirstOrDefault().Items.FirstOrDefault() as IIfcExtrudedAreaSolid;
                var opening          = relVoids.RelatedOpeningElement;
                var openingPlacement = opening.ObjectPlacement as IIfcLocalPlacement;
                var openingGeoms     = opening.Representation.Representations.FirstOrDefault().Items.OfType <IIfcExtrudedAreaSolid>().ToList();
                var openingTransform = openingPlacement.ToMatrix3D();;
                var wallBrep         = geomEngine.CreateSolidSet(wallGeom);
                var wallBrepPlaced   = wallBrep.Transform(wallTransform) as IXbimSolidSet;

                var openingBReps = geomEngine.CreateSolidSet();
                foreach (var og in openingGeoms)
                {
                    var brep = geomEngine.CreateSolid(og);
                    openingBReps.Add(brep.Transform(openingTransform) as IXbimSolid);
                }
                int uncut     = 0;
                var singleCut = wallBrepPlaced.Cut(openingBReps, precision);
                var vol       = 0.0;
                foreach (var uncutItem in wallBrepPlaced)
                {
                    var result = uncutItem.Cut(openingBReps, precision);
                    Assert.IsTrue(result.Count == 1);
                    var cutSolid = result.First as IXbimSolid;
                    Assert.IsNotNull(cutSolid);
                    Assert.IsTrue(cutSolid.IsValid);
                    if (uncutItem.Volume <= cutSolid.Volume)
                    {
                        uncut++;
                    }
                    Assert.IsTrue(uncut <= 3, "More than two solids are uncut, there should only be two");
                    vol += cutSolid.Volume;
                }
                Assert.IsTrue(uncut == 2);
                var scutVol = singleCut.Sum(s => s.Volume);
                Assert.IsTrue(Math.Abs(vol - scutVol) < 1e-5);
            }
        }
 public void CuttingOpeningInIfcFaceBasedSurfaceModelTest()
 {
     using (var bodyEntity = new EntityRepository <IIfcFaceBasedSurfaceModel>("CuttingOpeningInIfcFaceBasedSurfaceModelBodyTest"))
     {
         using (var holeEntity = new EntityRepository <IIfcExtrudedAreaSolid>("CuttingOpeningInIfcFaceBasedSurfaceModelVoidTest"))
         {
             var body   = geomEngine.CreateSolidSet(bodyEntity.Entity, logger);
             var hole   = geomEngine.CreateSolid(holeEntity.Entity, logger);
             var result = body.Cut(hole, bodyEntity.Entity.Model.ModelFactors.Precision);
             Assert.IsTrue(result.Count == 2, "Two solids should be returned");
             foreach (var solid in result)
             {
                 IsSolidTest(solid);
             }
         }
     }
 }
 public void CoordinationTest()
 {
     using (var erArch = new EntityRepository <IIfcSpace>("CoordinationTestArchitectureSpace"))
     {
         using (var erElec = new EntityRepository <IIfcSpace>("CoordinationTestElectricalSpace"))
         {
             var archMatrix  = erArch.Entity.ObjectPlacement.ToMatrix3D();
             var elecMatrix  = erElec.Entity.ObjectPlacement.ToMatrix3D();
             var archRepItem = erArch.Entity.Representation.Representations.FirstOrDefault()?.Items.FirstOrDefault() as IIfcExtrudedAreaSolid;
             var elecRepItem = erElec.Entity.Representation.Representations.FirstOrDefault()?.Items.FirstOrDefault() as IIfcExtrudedAreaSolid;
             Assert.IsNotNull(archRepItem); Assert.IsNotNull(elecRepItem);
             var archGeom = geomEngine.CreateSolid(archRepItem).Transform(archMatrix);
             var elecGeom = geomEngine.CreateSolid(elecRepItem).Transform(elecMatrix);
             var archBB   = archGeom.BoundingBox;
             var elecBB   = elecGeom.BoundingBox;
             var diff     = archBB.Centroid() - elecBB.Centroid();
             Assert.IsTrue(diff.Length < 1e-5);
         }
     }
 }