public override bool Execute() { var edge1 = new BRepBuilderAPIMakeEdge(Dependency[0].TransformedPoint3D.GpPnt, Dependency[1].TransformedPoint3D.GpPnt).Edge; var edge2 = new BRepBuilderAPIMakeEdge(Dependency[1].TransformedPoint3D.GpPnt, Dependency[2].TransformedPoint3D.GpPnt).Edge; var edge3 = new BRepBuilderAPIMakeEdge(Dependency[2].TransformedPoint3D.GpPnt, Dependency[3].TransformedPoint3D.GpPnt).Edge; var edge4 = new BRepBuilderAPIMakeEdge(Dependency[3].TransformedPoint3D.GpPnt, Dependency[0].TransformedPoint3D.GpPnt).Edge; var mkWire = new BRepBuilderAPIMakeWire(); mkWire.Add(edge1); mkWire.Add(edge2); mkWire.Add(edge3); mkWire.Add(edge4); TopoDSFace faceProfile = null; if (mkWire.IsDone) { var wireProfile = mkWire.Wire; if (!wireProfile.IsNull) { faceProfile = new BRepBuilderAPIMakeFace(wireProfile, false).Face; } } Shape = faceProfile; return(true); }
public static TopoDSFace ComposeWires(List <SceneSelectedEntity> cutShapes, bool skipFaceValidityCheck) { if (cutShapes.Count > 0) { alreadyDone.Add(cutShapes[0].Node); var mkWire = new BRepBuilderAPIMakeWire(); foreach (var cutShape in cutShapes) { var node = cutShape.Node; var shape = node.Get <TopoDsShapeInterpreter>().Shape; if (shape == null) { break; } if (shape.ShapeType != TopAbsShapeEnum.TopAbs_WIRE) { continue; } var wire = TopoDS.Wire(shape); mkWire.Add(wire); } if (mkWire.IsDone) { // If the wire generation succeeded generate a Face from it var wireProfile = mkWire.Wire; if (!wireProfile.IsNull) { var faceProfile = new BRepBuilderAPIMakeFace(wireProfile, true).Face; if (!faceProfile.IsNull) { // The face is generated not checking if it is a valid face if (skipFaceValidityCheck) { return(faceProfile); } // Check if it is a valid shape var analyzer = new BRepCheckAnalyzer(faceProfile, true); if (analyzer.IsValid()) { return(faceProfile); } } } } } return(null); }
/// <summary> /// Apply fillet on a list of wires. The common endpoints of wires are considered the fillet vertexes. /// </summary> private static TopoDSWire ApplyFilletOnWires(IEnumerable <SceneSelectedEntity> filletNodes, double radius, int filletChamferType) { // This method processes only fillet2D and chamfer2D operations if ((filletChamferType != (int)FilletChamferTypes.SimpleFillet2D) && (filletChamferType != (int)FilletChamferTypes.SimpleChamfer2D)) { return(null); } try { // Make a face fom the wires var wires = new List <SceneSelectedEntity>(); foreach (var node in filletNodes) { wires.Add(node); } var face = MakeFaceFunction.ComposeWires(wires, true); if ((face == null) || (face.IsNull)) { return(null); } var fillet = new BRepFilletAPIMakeFillet2d(); // Initialize a fillet with the face made from the 2 wires fillet.Init(face); // Fillet the common vertexes Node previousNode = null; foreach (var node in filletNodes) { if (previousNode != null) { var wire1 = previousNode.Get <NamedShapeInterpreter>().Shape; var wire2 = node.Node.Get <NamedShapeInterpreter>().Shape; var listOfCommonVertex = GeomUtils.CommonVertexes(wire1, wire2); if (listOfCommonVertex.Count >= 1) { foreach (var vertex in listOfCommonVertex) { if (filletChamferType == (int)FilletChamferTypes.SimpleFillet2D) { // If the operation is a fillet fillet.AddFillet(vertex, radius); } else { // Map all edges to faces var map = new TopToolsIndexedDataMapOfShapeListOfShape(1); TopExp.MapShapesAndAncestors(wire1, TopAbsShapeEnum.TopAbs_VERTEX, TopAbsShapeEnum.TopAbs_EDGE, map); // Locate an ancestor face for (var i = 1; i <= map.Extent; i++) { var localVertex = TopoDS.Vertex(map.FindKey(i)); if (!vertex.IsSame(localVertex)) { continue; } // We found an ancestor edge var edge = TopoDS.Edge(map.FindFromIndex(i).First); // Add the vertex and edge on the chamfer algorithm //fillet.AddChamfer(TopoDS.Edge(edge), TopoDS.Edge(edge2), radius, radius); fillet.AddChamfer(TopoDS.Edge(edge), vertex, radius, GeomUtils.DegreesToRadians(45)); } } } } else { return(null); } } previousNode = node.Node; } // Test if the operation succeeded if (fillet.Status != ChFi2dConstructionError.ChFi2d_IsDone) { return(null); } var shape = fillet.Shape; if ((shape == null) || (shape.IsNull)) { return(null); } var aMap = new TopToolsIndexedMapOfShape(1); TopExp.MapShapes(fillet.Shape, TopAbsShapeEnum.TopAbs_WIRE, aMap); if (aMap.Extent != 1) { return(null); } var newWire = new BRepBuilderAPIMakeWire(); var ex = new BRepToolsWireExplorer(TopoDS.Wire(aMap.FindKey(1))); for (; ex.More; ex.Next()) { newWire.Add(ex.Current); } return(newWire.Wire); } catch (Exception ex) { Log.Error("Apply Fillet2D error: " + ex.Message); } return(null); }
public override bool Execute() { var wireToTrim = Dependency[1].ReferenceData; //if (wireToTrim.ShapeType() != OCTopAbs_ShapeEnum.TopAbs_WIRE) // return false; var trimmingWires = Dependency[0].ReferenceList; gpPnt clickPoint; try { clickPoint = Dependency[2].ReferenceBuilder[1].TransformedPoint3D.GpPnt; } catch (Exception) { // trim action is called when other shapes are updated return(false); } var profileLocation = wireToTrim.TargetShape().Location(); var profileTranslation = new gpTrsf(); var profileTranslationVector = profileLocation.Transformation.TranslationPart.Reversed; profileTranslation.TranslationPart = (profileTranslationVector); var newProfileLocation = new TopLocLocation(profileTranslation); foreach (var wire in trimmingWires) { wire.Node.Get <TopoDsShapeInterpreter>().Shape.Move(newProfileLocation); } wireToTrim.Node.Get <TopoDsShapeInterpreter>().Shape.Move(newProfileLocation); clickPoint.Translate(profileTranslationVector); var trimmingEdges = new List <TopoDSEdge>(); foreach (var trimming in trimmingWires) { //if (trimming.ShapeType != OCTopAbs_ShapeEnum.TopAbs_WIRE) // return false; var trimmingE = GeomUtils.ExtractEdges(trimming.TargetShape()); if (trimmingE.Count > 0) { trimmingEdges.AddRange(trimmingE); } } if (trimmingEdges.Count <= 0) { return(false); } var edgesToTrim = GeomUtils.ExtractEdges(wireToTrim.TargetShape()); if (edgesToTrim.Count <= 0) { return(false); } var resultShapes = GeomUtils.TrimGenericShape(trimmingEdges, edgesToTrim[0], new Point3D(clickPoint)); if (resultShapes.Count <= 0) { return(false); } var finalWire = new BRepBuilderAPIMakeWire(); foreach (var edge in resultShapes) { finalWire.Add(edge); } /* * foreach (var wire in trimmingWires) * { * wire.Node.Get<TopoDsShapeInterpreter>().Shape.Move(newProfileLocation.Inverted); * } * wireToTrim.Node.Get<TopoDsShapeInterpreter>().Shape.Move(newProfileLocation.Inverted); * clickPoint.Translate(profileTranslationVector.Reversed); */ Shape = finalWire.Wire; return(true); }