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