diff --git a/src/Mod/Part/Gui/DlgFilletEdges.cpp b/src/Mod/Part/Gui/DlgFilletEdges.cpp index 0b11ad13ce..e8b2bb468d 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.cpp +++ b/src/Mod/Part/Gui/DlgFilletEdges.cpp @@ -211,6 +211,19 @@ namespace PartGui { typedef boost::signals::connection Connection; Connection connectApplicationDeletedObject; Connection connectApplicationDeletedDocument; + + class SelectionObjectCompare + { + public: + App::DocumentObject* obj; + SelectionObjectCompare(App::DocumentObject* obj) : obj(obj) + { + } + bool operator()(const Gui::SelectionObject& sel) const + { + return (sel.getObject() == obj); + } + }; }; }; @@ -491,7 +504,7 @@ void DlgFilletEdges::toggleCheckState(const QModelIndex& index) QString name = QString::fromLatin1("Edge%1").arg(id); Qt::CheckState checkState = static_cast(check.toInt()); - bool block = this->blockConnection(false); + bool block = this->blockConnection(true); // is item checked if (checkState & Qt::Checked) { @@ -597,9 +610,30 @@ void DlgFilletEdges::setupFillet(const std::vector& objs) ui->filletEndRadius->blockSignals(false); App::Document* doc = d->object->getDocument(); - Gui::Selection().addSelection(doc->getName(), - d->object->getNameInDocument(), - subElements); + // get current selection and their sub-elements + std::vector selObj = Gui::Selection().getSelectionEx(doc->getName()); + std::vector::iterator selIt = std::find_if(selObj.begin(), selObj.end(), + Private::SelectionObjectCompare(d->object)); + + // If sub-objects are already selected then only add the un-selected parts. + // This is impotant to avoid recursive calls of rmvSelection() which + // invalidates the internal iterator (#0002200). + if (selIt != selObj.end()) { + std::vector selElements = selIt->getSubNames(); + std::sort(selElements.begin(), selElements.end()); + std::sort(subElements.begin(), subElements.end()); + + std::vector complementary; + std::back_insert_iterator > biit(complementary); + std::set_difference(subElements.begin(), subElements.end(), selElements.begin(), selElements.end(), biit); + subElements = complementary; + } + + if (!subElements.empty()) { + Gui::Selection().addSelection(doc->getName(), + d->object->getNameInDocument(), + subElements); + } } }