From 94851bc14f704324c221c9d6070b109ba2982996 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sat, 26 Sep 2015 07:40:30 +0200 Subject: [PATCH] Sketcher Bug fix: External geometry shown after reorient ======================================================================== Reported here: http://forum.freecadweb.org/viewtopic.php?f=10&t=12517&p=100388#p100429 Solution: When a sketch loses support, all external geometry is deleted right away. --- src/Mod/Sketcher/App/SketchObject.cpp | 42 +++++++++++++++++++++++++++ src/Mod/Sketcher/App/SketchObject.h | 3 ++ src/Mod/Sketcher/Gui/Command.cpp | 1 + 3 files changed, 46 insertions(+) diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 0b5431b77539..c5fc2703a7c2 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -2737,6 +2737,48 @@ int SketchObject::delExternal(int ExtGeoId) return 0; } +int SketchObject::delAllExternal() +{ + // get the actual lists of the externals + std::vector Objects = ExternalGeometry.getValues(); + std::vector SubElements = ExternalGeometry.getSubValues(); + + const std::vector originalObjects = Objects; + const std::vector originalSubElements = SubElements; + + Objects.clear(); + + SubElements.clear(); + + const std::vector< Constraint * > &constraints = Constraints.getValues(); + std::vector< Constraint * > newConstraints(0); + + for (std::vector::const_iterator it = constraints.begin(); it != constraints.end(); ++it) { + if ((*it)->First > -3 && (*it)->Second > -3 && (*it)->Third > -3) { + Constraint *copiedConstr = (*it)->clone(); + + newConstraints.push_back(copiedConstr); + } + } + + ExternalGeometry.setValues(Objects,SubElements); + try { + rebuildExternalGeometry(); + } + catch (const Base::Exception& e) { + Base::Console().Error("%s\n", e.what()); + // revert to original values + ExternalGeometry.setValues(originalObjects,originalSubElements); + return -1; + } + + solverNeedsUpdate=true; + Constraints.setValues(newConstraints); + Constraints.acceptGeometry(getCompleteGeometry()); + rebuildVertexIndex(); + return 0; +} + int SketchObject::delConstraintsToExternal() { const std::vector< Constraint * > &constraints = Constraints.getValuesForce(); diff --git a/src/Mod/Sketcher/App/SketchObject.h b/src/Mod/Sketcher/App/SketchObject.h index c060a9d9356f..e4be0eeb5ecf 100644 --- a/src/Mod/Sketcher/App/SketchObject.h +++ b/src/Mod/Sketcher/App/SketchObject.h @@ -97,6 +97,9 @@ class SketcherExport SketchObject : public Part::Part2DObject * external geometry */ int delExternal(int ExtGeoId); + + /** deletes all external geometry */ + int delAllExternal(); /** returns a pointer to a given Geometry index, possible indexes are: * id>=0 for user defined geometries, diff --git a/src/Mod/Sketcher/Gui/Command.cpp b/src/Mod/Sketcher/Gui/Command.cpp index 1f3c960da7bb..d07494049508 100644 --- a/src/Mod/Sketcher/Gui/Command.cpp +++ b/src/Mod/Sketcher/Gui/Command.cpp @@ -277,6 +277,7 @@ void CmdSketcherReorientSketch::activated(int iMsg) if (ret == QMessageBox::No) return; sketch->Support.setValue(0); + sketch->delAllExternal(); } // ask user for orientation