Measure: Fix crash when removing referenced element

Also improve error messages
Fixes #16183
This commit is contained in:
hlorus
2024-09-02 11:20:21 +02:00
committed by WandererFan
parent 6ef51daec1
commit b07b257542
9 changed files with 27 additions and 36 deletions

View File

@@ -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);

View File

@@ -53,7 +53,6 @@ public:
App::PropertyArea Area;
App::DocumentObjectExecReturn* execute() override;
void recalculateArea();
const char* getViewProviderName() const override
{

View File

@@ -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);

View File

@@ -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);

View File

@@ -50,7 +50,6 @@ public:
App::PropertyDistance Length;
App::DocumentObjectExecReturn* execute() override;
void recalculateLength();
const char* getViewProviderName() const override
{

View File

@@ -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);
}

View File

@@ -54,7 +54,6 @@ public:
App::PropertyPosition Position;
App::DocumentObjectExecReturn* execute() override;
void recalculatePosition();
const char* getViewProviderName() const override
{

View File

@@ -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);

View File

@@ -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;