diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp index a6a2562f8..0b2fbb133 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp @@ -75,6 +75,7 @@ const bool TaskDressUpParameters::referenceSelected(const Gui::SelectionChanges& PartDesign::DressUp* pcDressUp = static_cast(DressUpView->getObject()); App::DocumentObject* base = this->getBase(); + // TODO: Must we make a copy here instead of assigning to const char* ? const char* fname = base->getNameInDocument(); if (strcmp(msg.pObjectName, fname) != 0) @@ -168,10 +169,14 @@ void TaskDressUpParameters::showObject() } } -App::DocumentObject* TaskDressUpParameters::getBase(void) const +Part::Feature* TaskDressUpParameters::getBase(void) const { PartDesign::DressUp* pcDressUp = static_cast(DressUpView->getObject()); - return pcDressUp->Base.getValue(); + // Unlikely but this may throw an exception in case we are started to edit an object which base feature + // was deleted. This exception will be likely unhandled inside the dialog and pass upper, But an error + // message inside the report view is better than a SEGFAULT. + // TODO: generally this situation should be prevented in ViewProviderDressUp + return pcDressUp->getBaseObject(); } void TaskDressUpParameters::exitSelectionMode() diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h index d689f4601..66dd3097c 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h @@ -32,6 +32,10 @@ class QListWidget; +namespace Part { + class Feature; +} + namespace PartDesignGui { class TaskDressUpParameters : public Gui::TaskView::TaskBox, public Gui::SelectionObserver @@ -43,7 +47,7 @@ public: virtual ~TaskDressUpParameters(); const std::vector getReferences(void) const; - App::DocumentObject *getBase(void) const; + Part::Feature *getBase(void) const; void hideObject(); void showObject();