From f481c471239a1330e4df3c6e6f597a17d753f65a Mon Sep 17 00:00:00 2001 From: donovaly Date: Mon, 1 Mar 2021 02:20:18 +0100 Subject: [PATCH] [PD] fix multi-transform View - fixes bug 4581 See the first issue reported here: https://forum.freecadweb.org/viewtopic.php?f=3&t=56093#p482553 - also fix issue that one could set 1 occurrence for polar patterns despite 2 are required at least - also fix potential dereferencing null pointer (reported by MSVC) --- .../Gui/TaskMultiTransformParameters.cpp | 64 +++++++++++++------ .../Gui/TaskPolarPatternParameters.cpp | 1 + 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 2f51a28483..b0b1d87ee2 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -229,7 +229,8 @@ void TaskMultiTransformParameters::closeSubTask() void TaskMultiTransformParameters::onTransformDelete() { - if (editHint) return; // Can't delete the hint... + if (editHint) + return; // Can't delete the hint... int row = ui->listTransformFeatures->currentIndex().row(); PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); @@ -254,7 +255,8 @@ void TaskMultiTransformParameters::onTransformDelete() void TaskMultiTransformParameters::onTransformEdit() { - if (editHint) return; // Can't edit the hint... + if (editHint) + return; // Can't edit the hint... closeSubTask(); // For example if user is editing one subTask and then double-clicks on another without OK'ing first ui->listTransformFeatures->currentItem()->setSelected(true); int row = ui->listTransformFeatures->currentIndex().row(); @@ -288,17 +290,23 @@ void TaskMultiTransformParameters::onTransformAddMirrored() closeSubTask(); std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Mirrored"); auto pcActiveBody = PartDesignGui::getBody(false); - if(!pcActiveBody) return; + if (!pcActiveBody) + return; Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Mirrored")); - FCMD_OBJ_CMD(pcActiveBody,"newObject('PartDesign::Mirrored','"<getDocument()->getObject(newFeatName.c_str()); + if (!Feat) + return; //Gui::Command::updateActive(); App::DocumentObject* sketch = getSketchObject(); if (sketch) - FCMD_OBJ_CMD(Feat,"MirrorPlane = ("<isError()) + TransformedView->getObject()->Visibility.setValue(true); } void TaskMultiTransformParameters::onTransformAddLinearPattern() @@ -308,29 +316,35 @@ void TaskMultiTransformParameters::onTransformAddLinearPattern() closeSubTask(); std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("LinearPattern"); auto pcActiveBody = PartDesignGui::getBody(false); - if(!pcActiveBody) return; + if (!pcActiveBody) + return; Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make LinearPattern")); - FCMD_OBJ_CMD(pcActiveBody,"newObject('PartDesign::LinearPattern','"<getDocument()->getObject(newFeatName.c_str()); + if (!Feat) + return; //Gui::Command::updateActive(); App::DocumentObject* sketch = getSketchObject(); if (sketch) { - FCMD_OBJ_CMD(Feat,"Direction = ("<(Part::BodyBase::findBodyOf(getObject())); if (body) { - FCMD_OBJ_CMD(Feat,"Direction = ("<getOrigin()->getX())<<",[''])"); + FCMD_OBJ_CMD(Feat, "Direction = ("<getOrigin()->getX())<<",[''])"); } } - FCMD_OBJ_CMD(Feat,"Length = 100"); - FCMD_OBJ_CMD(Feat,"Occurrences = 2"); + FCMD_OBJ_CMD(Feat, "Length = 100"); + FCMD_OBJ_CMD(Feat, "Occurrences = 2"); finishAdd(newFeatName); + // show the new view when no error + if (!Feat->isError()) + TransformedView->getObject()->Visibility.setValue(true); } void TaskMultiTransformParameters::onTransformAddPolarPattern() @@ -338,19 +352,25 @@ void TaskMultiTransformParameters::onTransformAddPolarPattern() closeSubTask(); std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("PolarPattern"); auto pcActiveBody = PartDesignGui::getBody(false); - if(!pcActiveBody) return; + if (!pcActiveBody) + return; Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "PolarPattern")); - FCMD_OBJ_CMD(pcActiveBody,"newObject('PartDesign::PolarPattern','"<getDocument()->getObject(newFeatName.c_str()); + if (!Feat) + return; //Gui::Command::updateActive(); App::DocumentObject* sketch = getSketchObject(); if (sketch) FCMD_OBJ_CMD(Feat, "Axis = ("<isError()) + TransformedView->getObject()->Visibility.setValue(true); } void TaskMultiTransformParameters::onTransformAddScaled() @@ -358,16 +378,22 @@ void TaskMultiTransformParameters::onTransformAddScaled() closeSubTask(); std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Scaled"); auto pcActiveBody = PartDesignGui::getBody(false); - if(!pcActiveBody) return; + if (!pcActiveBody) + return; Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Scaled")); - FCMD_OBJ_CMD(pcActiveBody,"newObject('PartDesign::Scaled','"<getDocument()->getObject(newFeatName.c_str()); + if (!Feat) + return; //Gui::Command::updateActive(); - FCMD_OBJ_CMD(Feat,"Factor = 2"); - FCMD_OBJ_CMD(Feat,"Occurrences = 2"); + FCMD_OBJ_CMD(Feat, "Factor = 2"); + FCMD_OBJ_CMD(Feat, "Occurrences = 2"); finishAdd(newFeatName); + // show the new view when no error + if (!Feat->isError()) + TransformedView->getObject()->Visibility.setValue(true); } void TaskMultiTransformParameters::finishAdd(std::string &newFeatName) diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index 2e4272d389..6acfd34d7f 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -156,6 +156,7 @@ void TaskPolarPatternParameters::setupUI() ui->polarAngle->bind(pcPolarPattern->Angle); ui->spinOccurrences->setMaximum(INT_MAX); + ui->spinOccurrences->setMinimum(2); ui->spinOccurrences->bind(pcPolarPattern->Occurrences); ui->comboAxis->setEnabled(true);