From 6f2f3f2e6e9d9a403f2ed92712cda11515d81678 Mon Sep 17 00:00:00 2001 From: Peter Lama Date: Sat, 9 Sep 2017 23:31:42 -0400 Subject: [PATCH] Fix Shape Binder crash when nothing selected first Partially resolves issue #2517 --- src/Mod/PartDesign/Gui/TaskShapeBinder.cpp | 28 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp b/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp index 5937b0881e..9c548cefdd 100644 --- a/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp +++ b/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp @@ -226,18 +226,34 @@ bool TaskShapeBinder::referenceSelected(const SelectionChanges& msg) const { //change the references std::string subName(msg.pSubName); + Part::Feature* selectedObj = nullptr; Part::Feature* obj = nullptr; std::vector refs; PartDesign::ShapeBinder::getFilteredReferences(&static_cast(vp->getObject())->Support, obj, refs); - - //if we already have a object we need to ensure th new selected subref belongs to it - if(obj && strcmp(msg.pObjectName, obj->getNameInDocument()) != 0) + + // get selected object + auto docObj = vp->getObject()->getDocument()->getObject(msg.pObjectName); + if (docObj && docObj->isDerivedFrom(Part::Feature::getClassTypeId())) { + selectedObj = static_cast(docObj); + } + + // ensure we have a valid object + if (!selectedObj) { return false; - - std::vector::iterator f = std::find(refs.begin(), refs.end(), subName); + } + if (!obj) { + // Support has not been set before + obj = selectedObj; + } if(selectionMode != refObjAdd) { + // ensure the new selected subref belongs to the same object + if (strcmp(msg.pObjectName, obj->getNameInDocument()) != 0) + return false; + + std::vector::iterator f = std::find(refs.begin(), refs.end(), subName); + if (selectionMode == refAdd) { if (f == refs.end()) refs.push_back(subName); @@ -251,7 +267,9 @@ bool TaskShapeBinder::referenceSelected(const SelectionChanges& msg) const { } } else { + // change object refs.clear(); + obj = selectedObj; } static_cast(vp->getObject())->Support.setValue(obj, refs);