Measure: Fix crash when removing referenced element
Also improve error messages Fixes #16183
This commit is contained in:
@@ -95,12 +95,6 @@ void MeasureArea::parseSelection(const App::MeasureSelection& selection)
|
||||
|
||||
|
||||
App::DocumentObjectExecReturn* MeasureArea::execute()
|
||||
{
|
||||
recalculateArea();
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
void MeasureArea::recalculateArea()
|
||||
{
|
||||
const std::vector<App::DocumentObject*>& objects = Elements.getValues();
|
||||
const std::vector<std::string>& subElements = Elements.getSubValues();
|
||||
@@ -113,15 +107,17 @@ void MeasureArea::recalculateArea()
|
||||
|
||||
auto info = getMeasureInfo(subject);
|
||||
if (!info || !info->valid) {
|
||||
continue;
|
||||
return new App::DocumentObjectExecReturn("Cannot calculate area");
|
||||
}
|
||||
auto areaInfo = std::dynamic_pointer_cast<Part::MeasureAreaInfo>(info);
|
||||
result += areaInfo->area;
|
||||
}
|
||||
|
||||
Area.setValue(result);
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
|
||||
void MeasureArea::onChanged(const App::Property* prop)
|
||||
{
|
||||
if (isRestoring() || isRemoving()) {
|
||||
@@ -129,7 +125,8 @@ void MeasureArea::onChanged(const App::Property* prop)
|
||||
}
|
||||
|
||||
if (prop == &Elements) {
|
||||
recalculateArea();
|
||||
auto ret = recompute();
|
||||
delete ret;
|
||||
}
|
||||
|
||||
MeasureBase::onChanged(prop);
|
||||
|
||||
@@ -53,7 +53,6 @@ public:
|
||||
App::PropertyArea Area;
|
||||
|
||||
App::DocumentObjectExecReturn* execute() override;
|
||||
void recalculateArea();
|
||||
|
||||
const char* getViewProviderName() const override
|
||||
{
|
||||
|
||||
@@ -116,6 +116,10 @@ public:
|
||||
|
||||
// Resolve App::Link
|
||||
App::DocumentObject* sub = subObjT.getSubObject();
|
||||
if (!sub) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (sub->isDerivedFrom<App::Link>()) {
|
||||
auto link = static_cast<App::Link*>(sub);
|
||||
sub = link->getLinkedObject(true);
|
||||
|
||||
@@ -97,12 +97,6 @@ void MeasureLength::parseSelection(const App::MeasureSelection& selection)
|
||||
|
||||
|
||||
App::DocumentObjectExecReturn* MeasureLength::execute()
|
||||
{
|
||||
recalculateLength();
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
void MeasureLength::recalculateLength()
|
||||
{
|
||||
const std::vector<App::DocumentObject*>& objects = Elements.getValues();
|
||||
const std::vector<std::string>& subElements = Elements.getSubValues();
|
||||
@@ -115,7 +109,7 @@ void MeasureLength::recalculateLength()
|
||||
App::SubObjectT subject {objects.at(i), subElements.at(i).c_str()};
|
||||
auto info = getMeasureInfo(subject);
|
||||
if (!info || !info->valid) {
|
||||
continue;
|
||||
return new App::DocumentObjectExecReturn("Cannot calculate length");
|
||||
}
|
||||
|
||||
auto lengthInfo = std::dynamic_pointer_cast<Part::MeasureLengthInfo>(info);
|
||||
@@ -123,8 +117,10 @@ void MeasureLength::recalculateLength()
|
||||
}
|
||||
|
||||
Length.setValue(result);
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
|
||||
void MeasureLength::onChanged(const App::Property* prop)
|
||||
{
|
||||
if (isRestoring() || isRemoving()) {
|
||||
@@ -132,7 +128,8 @@ void MeasureLength::onChanged(const App::Property* prop)
|
||||
}
|
||||
|
||||
if (prop == &Elements) {
|
||||
recalculateLength();
|
||||
auto ret = recompute();
|
||||
delete ret;
|
||||
}
|
||||
|
||||
MeasureBase::onChanged(prop);
|
||||
|
||||
@@ -50,7 +50,6 @@ public:
|
||||
App::PropertyDistance Length;
|
||||
|
||||
App::DocumentObjectExecReturn* execute() override;
|
||||
void recalculateLength();
|
||||
|
||||
const char* getViewProviderName() const override
|
||||
{
|
||||
|
||||
@@ -92,12 +92,6 @@ void MeasurePosition::parseSelection(const App::MeasureSelection& selection)
|
||||
|
||||
|
||||
App::DocumentObjectExecReturn* MeasurePosition::execute()
|
||||
{
|
||||
recalculatePosition();
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
void MeasurePosition::recalculatePosition()
|
||||
{
|
||||
const App::DocumentObject* object = Element.getValue();
|
||||
const std::vector<std::string>& subElements = Element.getSubValues();
|
||||
@@ -106,13 +100,15 @@ void MeasurePosition::recalculatePosition()
|
||||
auto info = getMeasureInfo(subject);
|
||||
|
||||
if (!info || !info->valid) {
|
||||
return;
|
||||
return new App::DocumentObjectExecReturn("Cannot calculate position");
|
||||
}
|
||||
|
||||
auto positionInfo = std::dynamic_pointer_cast<Part::MeasurePositionInfo>(info);
|
||||
Position.setValue(positionInfo->position);
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
|
||||
void MeasurePosition::onChanged(const App::Property* prop)
|
||||
{
|
||||
if (isRestoring() || isRemoving()) {
|
||||
@@ -120,7 +116,8 @@ void MeasurePosition::onChanged(const App::Property* prop)
|
||||
}
|
||||
|
||||
if (prop == &Element) {
|
||||
recalculatePosition();
|
||||
auto ret = recompute();
|
||||
delete ret;
|
||||
}
|
||||
DocumentObject::onChanged(prop);
|
||||
}
|
||||
|
||||
@@ -54,7 +54,6 @@ public:
|
||||
App::PropertyPosition Position;
|
||||
|
||||
App::DocumentObjectExecReturn* execute() override;
|
||||
void recalculatePosition();
|
||||
|
||||
const char* getViewProviderName() const override
|
||||
{
|
||||
|
||||
@@ -119,16 +119,16 @@ void MeasureRadius::parseSelection(const App::MeasureSelection& selection)
|
||||
|
||||
App::DocumentObjectExecReturn* MeasureRadius::execute()
|
||||
{
|
||||
recalculateRadius();
|
||||
auto info = getMeasureInfoFirst();
|
||||
if (!info || !info->valid) {
|
||||
return new App::DocumentObjectExecReturn("Cannot calculate radius");
|
||||
}
|
||||
|
||||
Radius.setValue(info->radius);
|
||||
return DocumentObject::StdReturn;
|
||||
}
|
||||
|
||||
|
||||
void MeasureRadius::recalculateRadius()
|
||||
{
|
||||
Radius.setValue(getMeasureInfoFirst()->radius);
|
||||
}
|
||||
|
||||
void MeasureRadius::onChanged(const App::Property* prop)
|
||||
{
|
||||
if (isRestoring() || isRemoving()) {
|
||||
@@ -136,7 +136,8 @@ void MeasureRadius::onChanged(const App::Property* prop)
|
||||
}
|
||||
|
||||
if (prop == &Element) {
|
||||
recalculateRadius();
|
||||
auto ret = recompute();
|
||||
delete ret;
|
||||
}
|
||||
|
||||
MeasureBase::onChanged(prop);
|
||||
|
||||
@@ -58,8 +58,6 @@ public:
|
||||
return "MeasureGui::ViewProviderMeasureRadius";
|
||||
}
|
||||
|
||||
void recalculateRadius();
|
||||
|
||||
static bool isValidSelection(const App::MeasureSelection& selection);
|
||||
static bool isPrioritizedSelection(const App::MeasureSelection& selection);
|
||||
void parseSelection(const App::MeasureSelection& selection) override;
|
||||
|
||||
Reference in New Issue
Block a user