PyObject* TopoShapeFacePy::validate(PyObject *args) { if (!PyArg_ParseTuple(args, "")) return 0; try { const TopoDS_Face& face = TopoDS::Face(getTopoShapePtr()->getShape()); BRepCheck_Analyzer aChecker(face); if (!aChecker.IsValid()) { TopoDS_Wire outerwire = ShapeAnalysis::OuterWire(face); TopTools_IndexedMapOfShape myMap; myMap.Add(outerwire); TopExp_Explorer xp(face,TopAbs_WIRE); ShapeFix_Wire fix; fix.SetFace(face); fix.Load(outerwire); fix.Perform(); BRepBuilderAPI_MakeFace mkFace(fix.WireAPIMake()); while (xp.More()) { if (!myMap.Contains(xp.Current())) { fix.Load(TopoDS::Wire(xp.Current())); fix.Perform(); mkFace.Add(fix.WireAPIMake()); } xp.Next(); } aChecker.Init(mkFace.Face()); if (!aChecker.IsValid()) { ShapeFix_Shape fix(mkFace.Face()); fix.SetPrecision(Precision::Confusion()); fix.SetMaxTolerance(Precision::Confusion()); fix.SetMaxTolerance(Precision::Confusion()); fix.Perform(); fix.FixWireTool()->Perform(); fix.FixFaceTool()->Perform(); getTopoShapePtr()->setShape(fix.Shape()); } else { getTopoShapePtr()->setShape(mkFace.Face()); } } Py_Return; } catch (Standard_Failure) { Handle_Standard_Failure e = Standard_Failure::Caught(); PyErr_SetString(PartExceptionOCCError, e->GetMessageString()); return 0; } }
TopoDS_Face FaceMakerCheese::validateFace(const TopoDS_Face& face) { BRepCheck_Analyzer aChecker(face); if (!aChecker.IsValid()) { TopoDS_Wire outerwire = ShapeAnalysis::OuterWire(face); TopTools_IndexedMapOfShape myMap; myMap.Add(outerwire); TopExp_Explorer xp(face,TopAbs_WIRE); ShapeFix_Wire fix; fix.SetFace(face); fix.Load(outerwire); fix.Perform(); BRepBuilderAPI_MakeFace mkFace(fix.WireAPIMake()); while (xp.More()) { if (!myMap.Contains(xp.Current())) { fix.Load(TopoDS::Wire(xp.Current())); fix.Perform(); mkFace.Add(fix.WireAPIMake()); } xp.Next(); } aChecker.Init(mkFace.Face()); if (!aChecker.IsValid()) { ShapeFix_Shape fix(mkFace.Face()); fix.SetPrecision(Precision::Confusion()); fix.SetMaxTolerance(Precision::Confusion()); fix.SetMaxTolerance(Precision::Confusion()); fix.Perform(); fix.FixWireTool()->Perform(); fix.FixFaceTool()->Perform(); TopoDS_Face fixedFace = TopoDS::Face(fix.Shape()); aChecker.Init(fixedFace); if (!aChecker.IsValid()) Standard_Failure::Raise("Failed to validate broken face"); return fixedFace; } return mkFace.Face(); } return face; }
void Run() { std::list<HeeksObj*>::const_iterator It; for(It = wxGetApp().m_marked_list->list().begin(); It != wxGetApp().m_marked_list->list().end(); It++) { HeeksObj* obj = (HeeksObj*)*It; if(obj->GetType() == SketchType) { CSketch* sketch = (CSketch*)obj; std::list<TopoDS_Shape> wires; if (! ConvertSketchToFaceOrWire( sketch, wires, false)) { wxMessageBox(_("Failed to convert sketch to wire")); } // End if - then else { try { // For all wires in this sketch... for(std::list<TopoDS_Shape>::iterator It2 = wires.begin(); It2 != wires.end(); It2++) { TopoDS_Shape& wire_to_fix = *It2; ShapeFix_Wire fix; fix.Load( TopoDS::Wire(wire_to_fix) ); // fix.ClearModes(); fix.ModifyTopologyMode() = sketch_tool_options.m_modify_topology; fix.ModifyGeometryMode() = sketch_tool_options.m_modify_geometry; fix.ClosedWireMode() = sketch_tool_options.m_closed_wire; fix.PreferencePCurveMode() = sketch_tool_options.m_preference_pcurve; fix.FixGapsByRangesMode() = sketch_tool_options.m_fix_gaps_by_ranges; fix.FixSelfIntersectionMode() = sketch_tool_options.m_fix_self_intersection; fix.FixReorderMode() = sketch_tool_options.m_reorder; fix.FixDegeneratedMode() = sketch_tool_options.m_fix_degenerated; if (sketch_tool_options.m_fix_small) { fix.FixSmallMode() = true; fix.FixSmall( false, sketch_tool_options.m_fix_small_precision ); } if (sketch_tool_options.m_fix_lacking) { fix.FixLackingMode() = sketch_tool_options.m_fix_lacking; fix.FixLacking(false); } if (! fix.Perform()) { wxMessageBox(_("Wire fix failed")); } else { TopoDS_Shape wire = fix.Wire(); HeeksObj *new_sketch = heekscad_interface.NewSketch(); double deviation = 0.001; if (! ConvertWireToSketch(TopoDS::Wire(wire), new_sketch, deviation)) { wxMessageBox(_("Failed to convert wire to sketch")); } else { if (sketch != NULL) { heekscad_interface.Remove( sketch ); sketch = NULL; } heekscad_interface.Add(new_sketch, NULL); } } } } // End try catch (Standard_Failure & error) { (void) error; // Avoid the compiler warning. Handle_Standard_Failure e = Standard_Failure::Caught(); wxMessageBox(_("Failed to fix wire")); } // End catch } } } }