From 3025c6e292216eefcd52e916a34cacae89af2db9 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 3 Mar 2013 12:24:23 +0100 Subject: [PATCH] Validate face in extrusion feature --- src/Mod/Part/App/FeatureExtrusion.cpp | 44 ++++++++++++++++++++++++++- src/Mod/Part/App/FeatureExtrusion.h | 4 +++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Mod/Part/App/FeatureExtrusion.cpp b/src/Mod/Part/App/FeatureExtrusion.cpp index dfa0325cf..6ccf14328 100644 --- a/src/Mod/Part/App/FeatureExtrusion.cpp +++ b/src/Mod/Part/App/FeatureExtrusion.cpp @@ -25,6 +25,7 @@ #ifndef _PreComp_ # include # include +# include # include # include # include @@ -34,6 +35,7 @@ # include # include # include +# include # include # include # include @@ -161,7 +163,7 @@ App::DocumentObjectExecReturn *Extrusion::execute(void) myShape = BRepBuilderAPI_Copy(myShape).Shape(); if (makeSolid && myShape.ShapeType() == TopAbs_WIRE) { BRepBuilderAPI_MakeFace mkFace(TopoDS::Wire(myShape)); - myShape = mkFace.Face(); + myShape = validateFace(mkFace.Face()); } BRepPrimAPI_MakePrism mkPrism(myShape, vec); TopoDS_Shape swept = mkPrism.Shape(); @@ -176,3 +178,43 @@ App::DocumentObjectExecReturn *Extrusion::execute(void) return new App::DocumentObjectExecReturn(e->GetMessageString()); } } + +TopoDS_Face Extrusion::validateFace(const TopoDS_Face& face) const +{ + 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(); + return TopoDS::Face(fix.Shape()); + } + return mkFace.Face(); + } + + return face; +} diff --git a/src/Mod/Part/App/FeatureExtrusion.h b/src/Mod/Part/App/FeatureExtrusion.h index 6576d0b17..4b0597f3c 100644 --- a/src/Mod/Part/App/FeatureExtrusion.h +++ b/src/Mod/Part/App/FeatureExtrusion.h @@ -27,6 +27,7 @@ #include #include #include "PartFeature.h" +#include namespace Part { @@ -53,6 +54,9 @@ public: return "PartGui::ViewProviderExtrusion"; } //@} + +private: + TopoDS_Face validateFace(const TopoDS_Face&) const; }; } //namespace Part