public void BooleanCutModifications() { // Make Box var box = new Box() { DimensionX = 10, DimensionY = 10, DimensionZ = 10, }; var tsBox = box.GetTransformedBRep(); var edgesBox = tsBox.Edges(); var facesBox = tsBox.Faces(); Assert.AreEqual(12, edgesBox.Count); // Make Cylinder var cyl = new Cylinder() { Height = 10, Radius = 2, }; var cylBody = TestGeomGenerator.CreateBody(cyl, new Pnt(5, 5, 0)); var tsCyl = cyl.GetTransformedBRep(); var edgesCyl = tsCyl.Edges(); var facesCyl = tsCyl.Faces(); Assert.AreEqual(3, edgesCyl.Count); // Boolean Op var cut = new BRepAlgoAPI_Cut(tsBox, tsCyl); var tsBool = cut.Shape(); var edgesBool = tsBool.Edges(); var facesBool = tsBool.Faces(); Assert.AreEqual(15, edgesBool.Count); Assert.False(cut.HasGenerated()); Assert.True(cut.HasDeleted()); Assert.True(cut.HasModified()); // All edges of box and cyl are in boolop Assert.AreEqual(12, edgesBox.Count(e => edgesBool.Any(edgeBool => edgeBool.IsSame(e)))); Assert.AreEqual(3, edgesCyl.Count(e => edgesBool.Any(edgeBool => edgeBool.IsSame(e)))); // Deleted no edges Assert.AreEqual(0, edgesBox.Count(e => cut.IsDeleted(e))); Assert.AreEqual(0, edgesCyl.Count(e => cut.IsDeleted(e))); // 4 faces from box and none from cylinder are in boolop Assert.AreEqual(4, facesBox.Count(f => facesBool.Any(faceBool => faceBool.IsSame(f)))); Assert.AreEqual(1, facesCyl.Count(f => facesBool.Any(faceBool => faceBool.IsSame(f)))); // Deleted no faces from box, 2 faces from cylinder Assert.AreEqual(0, facesBox.Count(f => cut.IsDeleted(f))); Assert.AreEqual(2, facesCyl.Count(f => cut.IsDeleted(f))); // Modified 2 faces from box, 0 face from cylinder Assert.AreEqual(2, facesBox.Count(f => cut.Modified(f).Size() > 0)); Assert.AreEqual(0, facesCyl.Count(f => cut.Modified(f).Size() > 0)); }
//-------------------------------------------------------------------------------------------------- bool _DoCutoutBoxes(MakeContext context) { var listOfTools = new TopTools_ListOfShape(); foreach (var boxes in context.Boxes) { for (int boxIndex = _ReverseOrder == _IsFirst ? 0 : 1; boxIndex < boxes.Count; boxIndex += 2) { listOfTools.Append(boxes[boxIndex]); } } var listOfArguments = new TopTools_ListOfShape(); listOfArguments.Append(context.OwnBrep); var cutter = new BRepAlgoAPI_Cut(); cutter.SetArguments(listOfArguments); cutter.SetTools(listOfTools); cutter.Build(); if (!cutter.IsDone()) { Messages.Error("Cannot cut boxes out of shape."); return(false); } context.Result = cutter.Shape(); UpdateModifiedSubshapes(context.OwnBrep, cutter); return(true); }
//-------------------------------------------------------------------------------------------------- bool _DoCutoffExcess(MakeContext context) { var listOfArguments = new TopTools_ListOfShape(); listOfArguments.Append(context.OwnBrep); // Cutout Commons var listOfTools = new TopTools_ListOfShape(); foreach (var commonSolid in context.Common) { listOfTools.Append(commonSolid); } var cutter = new BRepAlgoAPI_Cut(); cutter.SetArguments(listOfArguments); cutter.SetTools(listOfTools); cutter.Build(); if (!cutter.IsDone()) { Messages.Error("Cannot determine excess of instrusion."); return(false); } // Check if we have more solids than before var originalSolidCount = context.OwnBrep.Solids().Count; var solids = cutter.Shape().Solids(); var excessCount = solids.Count - originalSolidCount; if (excessCount <= 0) { return(true); // No excess found } // Cutout additional solids listOfTools = new TopTools_ListOfShape(); var orderedSolids = solids.OrderBy(solid => solid.Volume()).Take(excessCount); foreach (var solid in orderedSolids) { listOfTools.Append(solid); } cutter = new BRepAlgoAPI_Cut(); cutter.SetArguments(listOfArguments); cutter.SetTools(listOfTools); cutter.Build(); if (!cutter.IsDone()) { Messages.Error("Cannot remove excess of instrusion from shape."); return(false); } UpdateModifiedSubshapes(context.OwnBrep, cutter); context.OwnBrep = cutter.Shape(); return(true); }