From f915427805074272eed9750e77b2bfca31635dc6 Mon Sep 17 00:00:00 2001 From: blobfish Date: Thu, 27 Feb 2014 15:22:09 -0500 Subject: [PATCH] Part: ModelRefine: Skip spherical edges for edge fuse. Mantis #1450 --- src/Mod/Part/App/modelRefine.cpp | 39 ++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Mod/Part/App/modelRefine.cpp b/src/Mod/Part/App/modelRefine.cpp index 1c6b0654cf..43d7e53e57 100644 --- a/src/Mod/Part/App/modelRefine.cpp +++ b/src/Mod/Part/App/modelRefine.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -566,6 +567,34 @@ FaceTypedCylinder& ModelRefine::getCylinderObject() ///////////////////////////////////////////////////////////////////////////////////////////////////////// +// TODO: change this version after occ fix. Freecad Mantis 1450 +#if OCC_VERSION_HEX <= 0x070000 +void collectSphericalEdges(const TopoDS_Shell &shell, TopTools_IndexedMapOfShape &map) +{ + TopTools_IndexedDataMapOfShapeListOfShape edgeToFaceMap; + TopExp::MapShapesAndAncestors(shell, TopAbs_EDGE, TopAbs_FACE, edgeToFaceMap); + TopTools_IndexedMapOfShape edges; + TopExp::MapShapes(shell, TopAbs_EDGE, edges); + + for (int index = 1; index <= edges.Extent(); ++index) + { + const TopoDS_Edge ¤tEdge = TopoDS::Edge(edges.FindKey(index)); + const TopTools_ListOfShape &faceList = edgeToFaceMap.FindFromKey(currentEdge); + TopTools_ListIteratorOfListOfShape faceListIt; + for (faceListIt.Initialize(faceList); faceListIt.More(); faceListIt.Next()) + { + const TopoDS_Face ¤tFace = TopoDS::Face(faceListIt.Value()); + BRepAdaptor_Surface surface(currentFace); + if (surface.GetType() == GeomAbs_Sphere) + { + map.Add(currentEdge); + break; + } + } + } +} +#endif + FaceUniter::FaceUniter(const TopoDS_Shell &shellIn) : modifiedSignal(false) { workShell = shellIn; @@ -671,8 +700,14 @@ bool FaceUniter::process() for(sewIt = facesToSew.begin(); sewIt != facesToSew.end(); ++sewIt) builder.Add(workShell, *sewIt); } - - BRepLib_FuseEdges edgeFuse(workShell, Standard_True); + + BRepLib_FuseEdges edgeFuse(workShell); +// TODO: change this version after occ fix. Freecad Mantis 1450 +#if OCC_VERSION_HEX <= 0x070000 + TopTools_IndexedMapOfShape map; + collectSphericalEdges(workShell, map); + edgeFuse.AvoidEdges(map); +#endif TopTools_DataMapOfShapeShape affectedFaces; edgeFuse.Faces(affectedFaces); TopTools_DataMapIteratorOfDataMapOfShapeShape mapIt;