diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 6bef61a1a..278f6f866 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -54,7 +54,6 @@ Transformed::Transformed() { ADD_PROPERTY(Originals,(0)); Originals.setSize(0); - ADD_PROPERTY(InsideMultiTransform,(0)); } void Transformed::positionBySupport(void) @@ -81,12 +80,9 @@ short Transformed::mustExecute() const App::DocumentObjectExecReturn *Transformed::execute(void) { - if (InsideMultiTransform.getValue()) - return App::DocumentObject::StdReturn; - std::vector originals = Originals.getValues(); - if (originals.empty()) - return new App::DocumentObjectExecReturn("No originals defined"); + if (originals.empty()) // typically InsideMultiTransform + return App::DocumentObject::StdReturn; this->positionBySupport(); @@ -99,7 +95,7 @@ App::DocumentObjectExecReturn *Transformed::execute(void) } if (transformations.empty()) - return new App::DocumentObjectExecReturn("No transformations defined"); + return App::DocumentObject::StdReturn; // No transformations defined, exit silently // Get the support // NOTE: Because of the way we define the support, FeatureTransformed can only work on diff --git a/src/Mod/PartDesign/App/FeatureTransformed.h b/src/Mod/PartDesign/App/FeatureTransformed.h index bd07d7bd8..099e6dd29 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.h +++ b/src/Mod/PartDesign/App/FeatureTransformed.h @@ -44,10 +44,9 @@ class PartDesignExport Transformed : public PartDesign::Feature public: Transformed(); - /// The shapes to be transformed + /** The shapes to be transformed + if Originals is empty the instance is just a container for storing transformation data */ App::PropertyLinkList Originals; - /// Flag indicating that the associated FeatureTransformed instance is just a container for storing transformation data - App::PropertyBool InsideMultiTransform; /// Return first original, which serves as "Support" until Body feature becomes functional App::DocumentObject* getOriginalObject() const; @@ -64,7 +63,7 @@ public: * Gets the transformations from the virtual getTransformations() method of the sub class * and applies them to every member of Originals. The total number of copies including * the untransformed Originals will be sizeof(Originals) times sizeof(getTransformations()) - * If InsideMultiTransform is true, execute() returns immediately without doing anything as + * If Originals is empty, execute() returns immediately without doing anything as * the actual processing will happen in the MultiTransform feature */ App::DocumentObjectExecReturn *execute(void); diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index 6f2ea98c5..8c07337c5 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -221,6 +221,9 @@ void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges if (!insideMultiTransform) featureSelectionMode = true; // Jump back to selection of originals + + showObject(); + hideOriginals(); updateUI(); } } @@ -293,6 +296,8 @@ void TaskLinearPatternParameters::onButtonReference() PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->StdDirection.setValue(""); featureSelectionMode = false; + hideObject(); + showOriginals(); updateUI(); } diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index 0ed762e55..51834b7ca 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -200,6 +200,9 @@ void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg if (!insideMultiTransform) featureSelectionMode = true; // Jump back to selection of originals + + showObject(); + hideOriginals(); updateUI(); } } @@ -242,6 +245,8 @@ void TaskMirroredParameters::onButtonReference() PartDesign::Mirrored* pcMirrored = static_cast(getObject()); pcMirrored->StdMirrorPlane.setValue(""); featureSelectionMode = false; + hideObject(); + showOriginals(); updateUI(); } diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 0f6e6a667..c39504dd1 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -214,24 +214,20 @@ void TaskMultiTransformParameters::onTransformEdit() int row = ui->listTransformFeatures->currentIndex().row(); PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); - App::DocumentObject* transformObject = *(transformFeatures.begin() + row); - subFeature = static_cast(transformObject); - if (transformObject->getTypeId() == PartDesign::Mirrored::getClassTypeId()) + subFeature = static_cast(transformFeatures[row]); + if (transformFeatures[row]->getTypeId() == PartDesign::Mirrored::getClassTypeId()) subTask = new TaskMirroredParameters(ui->widgetFeature, this); - else if (transformObject->getTypeId() == PartDesign::LinearPattern::getClassTypeId()) + else if (transformFeatures[row]->getTypeId() == PartDesign::LinearPattern::getClassTypeId()) subTask = new TaskLinearPatternParameters(ui->widgetFeature, this); - else if (transformObject->getTypeId() == PartDesign::PolarPattern::getClassTypeId()) + else if (transformFeatures[row]->getTypeId() == PartDesign::PolarPattern::getClassTypeId()) subTask = new TaskPolarPatternParameters(ui->widgetFeature, this); - else if (transformObject->getTypeId() == PartDesign::Scaled::getClassTypeId()) + else if (transformFeatures[row]->getTypeId() == PartDesign::Scaled::getClassTypeId()) subTask = new TaskScaledParameters(ui->widgetFeature, this); else return; // TODO: Show an error? ui->widgetFeature->show(); - - transformFeatures[row] = subFeature; - pcMultiTransform->Transformations.setValues(transformFeatures); } void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index) { @@ -241,89 +237,66 @@ void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index void TaskMultiTransformParameters::onTransformAddMirrored() { closeSubTask(); - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); + std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Mirrored"); - App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::Mirrored"); - if (newFeature == NULL) - return; - PartDesign::Mirrored* newMirrored = static_cast(newFeature); - newMirrored->StdMirrorPlane.setValue("XY"); - newMirrored->InsideMultiTransform.setValue(true); - newMirrored->Label.setValue("Mirrored"); // To avoid things like PartDesign__Mirrored001 + Gui::Command::openCommand("Mirrored"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Mirrored\",\"%s\")",newFeatName.c_str()); + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdMirrorPlane = \"XY\"", newFeatName.c_str()); - subFeature = newMirrored; - subTask = new TaskMirroredParameters(ui->widgetFeature, this); - ui->widgetFeature->show(); - - finishAdd(newFeature); + finishAdd(newFeatName); } void TaskMultiTransformParameters::onTransformAddLinearPattern() { closeSubTask(); - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); + std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("LinearPattern"); - App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::LinearPattern"); - if (newFeature == NULL) - return; - PartDesign::LinearPattern* newLinearPattern = static_cast(newFeature); - newLinearPattern->StdDirection.setValue("X"); - newLinearPattern->Length.setValue(100); - newLinearPattern->Occurrences.setValue(2); - newLinearPattern->InsideMultiTransform.setValue(true); - newLinearPattern->Label.setValue("LinearPattern"); + Gui::Command::openCommand("LinearPattern"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::LinearPattern\",\"%s\")",newFeatName.c_str()); + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdDirection = \"X\"", newFeatName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Length = 100", newFeatName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str()); - subFeature = newLinearPattern; - subTask = new TaskLinearPatternParameters(ui->widgetFeature, this); - ui->widgetFeature->show(); - - finishAdd(newFeature); + finishAdd(newFeatName); } void TaskMultiTransformParameters::onTransformAddPolarPattern() { closeSubTask(); - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); + std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("PolarPattern"); - App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::PolarPattern"); - if (newFeature == NULL) - return; - PartDesign::PolarPattern* newPolarPattern = static_cast(newFeature); - newPolarPattern->StdAxis.setValue("Z"); - newPolarPattern->Angle.setValue(360); - newPolarPattern->Occurrences.setValue(2); - newPolarPattern->InsideMultiTransform.setValue(true); - newPolarPattern->Label.setValue("PolarPattern"); + Gui::Command::openCommand("PolarPattern"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::PolarPattern\",\"%s\")",newFeatName.c_str()); + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdAxis = \"X\"", newFeatName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Angle = 360", newFeatName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str()); - subFeature = newPolarPattern; - subTask = new TaskPolarPatternParameters(ui->widgetFeature, this); - ui->widgetFeature->show(); - - finishAdd(newFeature); + finishAdd(newFeatName); } void TaskMultiTransformParameters::onTransformAddScaled() { closeSubTask(); - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); + std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Scaled"); - App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::Scaled"); - if (newFeature == NULL) - return; - PartDesign::Scaled* newScaled = static_cast(newFeature); - newScaled->Occurrences.setValue(2); - newScaled->InsideMultiTransform.setValue(true); - newScaled->Label.setValue("Scaled"); // To avoid things like PartDesign__Mirrored001 + Gui::Command::openCommand("Scaled"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Scaled\",\"%s\")",newFeatName.c_str()); + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Factor = 2", newFeatName.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str()); - subFeature = newScaled; - subTask = new TaskScaledParameters(ui->widgetFeature, this); - ui->widgetFeature->show(); - - finishAdd(newFeature); + finishAdd(newFeatName); } -void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature) +void TaskMultiTransformParameters::finishAdd(std::string &newFeatName) { + //Gui::Command::updateActive(); + //Gui::Command::copyVisual(newFeatName.c_str(), "ShapeColor", getOriginals().front()->getNameInDocument().c_str()); + //Gui::Command::copyVisual(newFeatName.c_str(), "DisplayMode", getOriginals().front()->getNameInDocument().c_str()); + PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); if (editHint) { // Remove hint, first feature is being added @@ -334,13 +307,11 @@ void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature) // Happens when first row (first transformation) is created row = 0; // Hide all the originals now (hiding them in Command.cpp presents the user with an empty screen!) - std::vector originals = pcMultiTransform->getOriginals(); - for (std::vector::iterator it = originals.begin(); it != originals.end(); ++it) - Gui::Command::doCommand( - Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False",(*it)->getNameInDocument()); + hideOriginals(); } - std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); + App::DocumentObject* newFeature = pcMultiTransform->getDocument()->getObject(newFeatName.c_str()); + std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); if (row == ui->listTransformFeatures->model()->rowCount() - 1) { // Note: Inserts always happen before the specified iterator so in order to append at the // end we need to use push_back() and append() @@ -353,13 +324,16 @@ void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature) ui->listTransformFeatures->setCurrentRow(row, QItemSelectionModel::ClearAndSelect); } pcMultiTransform->Transformations.setValues(transformFeatures); + if (ui->checkBoxUpdateView->isChecked()) pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform); // Set state to hidden - only the MultiTransform should be visible Gui::Command::doCommand( - Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False", newFeature->getNameInDocument()); + Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False", newFeatName.c_str()); editHint = false; + + onTransformEdit(); } void TaskMultiTransformParameters::moveTransformFeature(const int increment) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h index eb3d1a417..0aa7883af 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h @@ -93,7 +93,7 @@ private: void updateUI(); void closeSubTask(); void moveTransformFeature(const int increment); - void finishAdd(App::DocumentObject *newFeature); + void finishAdd(std::string &newFeatName); private: Ui_TaskMultiTransformParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index a01179893..1cc636074 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -224,6 +224,9 @@ void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& if (!insideMultiTransform) featureSelectionMode = true; // Jump back to selection of originals + + showObject(); + hideOriginals(); updateUI(); } } @@ -296,6 +299,8 @@ void TaskPolarPatternParameters::onButtonReference() PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->StdAxis.setValue(""); featureSelectionMode = false; + hideObject(); + showOriginals(); updateUI(); } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 57da956d6..754c3f9a4 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -106,14 +106,6 @@ void TaskTransformedParameters::onOriginalDeleted(const int row) pcTransformed->getDocument()->recomputeFeature(pcTransformed); } -const std::vector TaskTransformedParameters::getOriginals(void) const -{ - PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); - std::vector originals = pcTransformed->Originals.getValues(); - - return originals; -} - PartDesign::Transformed *TaskTransformedParameters::getObject() const { @@ -133,6 +125,18 @@ void TaskTransformedParameters::recomputeFeature() } } +const std::vector TaskTransformedParameters::getOriginals(void) const +{ + if (insideMultiTransform) { + return parentTask->getOriginals(); + } else { + PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); + std::vector originals = pcTransformed->Originals.getValues(); + + return originals; + } +} + App::DocumentObject* TaskTransformedParameters::getOriginalObject() const { if (insideMultiTransform) { @@ -143,6 +147,48 @@ App::DocumentObject* TaskTransformedParameters::getOriginalObject() const } } +void TaskTransformedParameters::hideObject() +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (doc) + if (insideMultiTransform) { + doc->setHide(parentTask->TransformedView->getObject()->getNameInDocument()); + } else { + doc->setHide(TransformedView->getObject()->getNameInDocument()); + } +} + +void TaskTransformedParameters::showObject() +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (doc) + if (insideMultiTransform) { + doc->setShow(parentTask->TransformedView->getObject()->getNameInDocument()); + } else { + doc->setShow(TransformedView->getObject()->getNameInDocument()); + } +} + +void TaskTransformedParameters::hideOriginals() +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (doc) { + std::vector originals = getOriginals(); + for (std::vector::iterator it = originals.begin(); it != originals.end(); ++it) + doc->setHide((*it)->getNameInDocument()); + } +} + +void TaskTransformedParameters::showOriginals() +{ + Gui::Document* doc = Gui::Application::Instance->activeDocument(); + if (doc) { + std::vector originals = getOriginals(); + for (std::vector::iterator it = originals.begin(); it != originals.end(); ++it) + doc->setShow((*it)->getNameInDocument()); + } +} + //************************************************************************** //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index 7e8921f6b..c4d566773 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -81,6 +81,11 @@ protected: /// Get the original object either of the object associated with this feature or with the parent feature (MultiTransform mode) App::DocumentObject* getOriginalObject() const; + void hideObject(); + void showObject(); + void hideOriginals(); + void showOriginals(); + protected: virtual void changeEvent(QEvent *e) = 0; virtual void onSelectionChanged(const Gui::SelectionChanges& msg) = 0;