From cba163a803624d9454a6e7690dd578db9d895c38 Mon Sep 17 00:00:00 2001 From: logari81 Date: Tue, 11 Sep 2012 16:54:45 +0200 Subject: [PATCH 01/11] PartDesign: restrict patterns to only one original and improve selection of references --- src/Mod/PartDesign/Gui/Command.cpp | 105 +++++----- .../Gui/TaskLinearPatternParameters.cpp | 187 +++++++++--------- .../Gui/TaskLinearPatternParameters.h | 13 +- .../Gui/TaskLinearPatternParameters.ui | 29 ++- .../PartDesign/Gui/TaskMirroredParameters.cpp | 147 +++++++------- .../PartDesign/Gui/TaskMirroredParameters.h | 11 +- .../PartDesign/Gui/TaskMirroredParameters.ui | 29 ++- .../Gui/TaskMultiTransformParameters.cpp | 57 ++---- .../Gui/TaskMultiTransformParameters.h | 2 - .../Gui/TaskMultiTransformParameters.ui | 33 +++- .../Gui/TaskPolarPatternParameters.cpp | 178 ++++++++--------- .../Gui/TaskPolarPatternParameters.h | 9 +- .../Gui/TaskPolarPatternParameters.ui | 29 ++- .../PartDesign/Gui/TaskScaledParameters.cpp | 56 ++---- src/Mod/PartDesign/Gui/TaskScaledParameters.h | 5 +- .../PartDesign/Gui/TaskScaledParameters.ui | 26 ++- .../Gui/TaskTransformedParameters.cpp | 27 +-- .../Gui/TaskTransformedParameters.h | 11 +- 18 files changed, 512 insertions(+), 442 deletions(-) diff --git a/src/Mod/PartDesign/Gui/Command.cpp b/src/Mod/PartDesign/Gui/Command.cpp index 8fd3b9e673..292b44a63b 100644 --- a/src/Mod/PartDesign/Gui/Command.cpp +++ b/src/Mod/PartDesign/Gui/Command.cpp @@ -716,23 +716,24 @@ CmdPartDesignMirrored::CmdPartDesignMirrored() void CmdPartDesignMirrored::activated(int iMsg) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - if (n < 1) { + std::vector selection = getSelection().getSelectionEx(); + + if (selection.size() != 1 || + (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && + !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select one or more additive/subtractive features, please.")); + QObject::tr("Select only one additive or subtractive feature, please.")); return; } std::string FeatName = getUniqueObjectName("Mirrored"); - std::vector Sel = getSelection().getSelection(); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ + str << "App.activeDocument()." << it->getFeatName() << ","; + tempSelNames.push_back(it->getFeatName()); } str << "]"; @@ -755,9 +756,7 @@ void CmdPartDesignMirrored::activated(int iMsg) bool CmdPartDesignMirrored::isActive(void) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - return n >= 1; + return hasActiveDocument(); } //=========================================================================== @@ -779,23 +778,24 @@ CmdPartDesignLinearPattern::CmdPartDesignLinearPattern() void CmdPartDesignLinearPattern::activated(int iMsg) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - if (n < 1) { + std::vector selection = getSelection().getSelectionEx(); + + if (selection.size() != 1 || + (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && + !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select one or more additive/subtractive features, please.")); + QObject::tr("Select only one additive or subtractive feature, please.")); return; } std::string FeatName = getUniqueObjectName("LinearPattern"); - std::vector Sel = getSelection().getSelection(); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ + str << "App.activeDocument()." << it->getFeatName() << ","; + tempSelNames.push_back(it->getFeatName()); } str << "]"; @@ -818,9 +818,7 @@ void CmdPartDesignLinearPattern::activated(int iMsg) bool CmdPartDesignLinearPattern::isActive(void) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - return n >= 1; + return hasActiveDocument(); } //=========================================================================== @@ -842,23 +840,24 @@ CmdPartDesignPolarPattern::CmdPartDesignPolarPattern() void CmdPartDesignPolarPattern::activated(int iMsg) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - if (n < 1) { + std::vector selection = getSelection().getSelectionEx(); + + if (selection.size() != 1 || + (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && + !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select one or more additive/subtractive features, please.")); + QObject::tr("Select only one additive or subtractive feature, please.")); return; } std::string FeatName = getUniqueObjectName("PolarPattern"); - std::vector Sel = getSelection().getSelection(); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ + str << "App.activeDocument()." << it->getFeatName() << ","; + tempSelNames.push_back(it->getFeatName()); } str << "]"; @@ -881,9 +880,7 @@ void CmdPartDesignPolarPattern::activated(int iMsg) bool CmdPartDesignPolarPattern::isActive(void) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - return n >= 1; + return hasActiveDocument(); } //=========================================================================== @@ -905,23 +902,24 @@ CmdPartDesignScaled::CmdPartDesignScaled() void CmdPartDesignScaled::activated(int iMsg) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - if (n < 1) { + std::vector selection = getSelection().getSelectionEx(); + + if (selection.size() != 1 || + (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && + !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select one or more additive/subtractive features, please.")); + QObject::tr("Select only one additive or subtractive feature, please.")); return; } std::string FeatName = getUniqueObjectName("Scaled"); - std::vector Sel = getSelection().getSelection(); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ + str << "App.activeDocument()." << it->getFeatName() << ","; + tempSelNames.push_back(it->getFeatName()); } str << "]"; @@ -943,9 +941,7 @@ void CmdPartDesignScaled::activated(int iMsg) bool CmdPartDesignScaled::isActive(void) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - return n >= 1; + return hasActiveDocument(); } //=========================================================================== @@ -967,23 +963,24 @@ CmdPartDesignMultiTransform::CmdPartDesignMultiTransform() void CmdPartDesignMultiTransform::activated(int iMsg) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - if (n < 1) { + std::vector selection = getSelection().getSelectionEx(); + + if (selection.size() != 1 || + (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && + !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select one or more additive/subtractive features, please.")); + QObject::tr("Select only one additive or subtractive feature, please.")); return; } std::string FeatName = getUniqueObjectName("MultiTransform"); - std::vector Sel = getSelection().getSelection(); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ + str << "App.activeDocument()." << it->getFeatName() << ","; + tempSelNames.push_back(it->getFeatName()); } str << "]"; @@ -1001,9 +998,7 @@ void CmdPartDesignMultiTransform::activated(int iMsg) bool CmdPartDesignMultiTransform::isActive(void) { - unsigned n = getSelection().countObjectsOfType(PartDesign::Additive::getClassTypeId()) + - getSelection().countObjectsOfType(PartDesign::Subtractive::getClassTypeId()); - return n >= 1; + return hasActiveDocument(); } diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index 54f6dd1d5f..b5a9a9ba23 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -62,6 +62,8 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(ViewProviderTransformed ui->buttonOK->hide(); ui->checkBoxUpdateView->setEnabled(true); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -79,9 +81,12 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(TaskMultiTransformParam layout->addWidget(proxy); ui->buttonOK->setEnabled(true); - ui->listFeatures->hide(); + ui->labelOriginal->hide(); + ui->lineOriginal->hide(); ui->checkBoxUpdateView->hide(); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -100,35 +105,24 @@ void TaskLinearPatternParameters::setupUI() this, SLOT(onLength(double))); connect(ui->spinOccurrences, SIGNAL(valueChanged(int)), this, SLOT(onOccurrences(int))); - connect(ui->buttonReference, SIGNAL(pressed()), - this, SLOT(onButtonReference())); + connect(ui->buttonReference, SIGNAL(toggled(bool)), + this, SLOT(onButtonReference(bool))); connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), this, SLOT(onUpdateView(bool))); - // TODO: The following code could be generic in TaskTransformedParameters - // if it were possible to make ui_TaskLinearPatternParameters a subclass of - // ui_TaskTransformedParameters - // --------------------- - // Add a context menu to the listview of the originals to delete items - QAction* action = new QAction(tr("Delete"), ui->listFeatures); - action->connect(action, SIGNAL(triggered()), - this, SLOT(onOriginalDeleted())); - ui->listFeatures->addAction(action); - ui->listFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - // Get the feature data PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); std::vector originals = pcLinearPattern->Originals.getValues(); // Fill data into dialog elements - ui->listFeatures->setEnabled(true); - ui->listFeatures->clear(); + ui->lineOriginal->setEnabled(false); for (std::vector::const_iterator i = originals.begin(); i != originals.end(); i++) { - if ((*i) != NULL) - ui->listFeatures->addItem(QString::fromAscii((*i)->getNameInDocument())); + if ((*i) != NULL) { // find the first valid original + ui->lineOriginal->setText(QString::fromAscii((*i)->getNameInDocument())); + break; + } } - QMetaObject::invokeMethod(ui->listFeatures, "setFocus", Qt::QueuedConnection); // --------------------- ui->buttonX->setEnabled(true); @@ -144,8 +138,10 @@ void TaskLinearPatternParameters::setupUI() void TaskLinearPatternParameters::updateUI() { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; updateUIinProgress = true; + PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); App::DocumentObject* directionFeature = pcLinearPattern->Direction.getValue(); @@ -155,9 +151,9 @@ void TaskLinearPatternParameters::updateUI() double length = pcLinearPattern->Length.getValue(); unsigned occurrences = pcLinearPattern->Occurrences.getValue(); - if ((featureSelectionMode || insideMultiTransform) && !stdDirection.empty()) + ui->buttonReference->setChecked(referenceSelectionMode); + if (!stdDirection.empty()) { - ui->buttonReference->setDown(false); ui->buttonX->setAutoExclusive(true); ui->buttonY->setAutoExclusive(true); ui->buttonZ->setAutoExclusive(true); @@ -165,19 +161,20 @@ void TaskLinearPatternParameters::updateUI() ui->buttonY->setChecked(stdDirection == "Y"); ui->buttonZ->setChecked(stdDirection == "Z"); ui->lineReference->setText(tr("")); - } else if ((directionFeature != NULL) && !directions.empty()) { + } else if (directionFeature != NULL && !directions.empty()) { ui->buttonX->setAutoExclusive(false); ui->buttonY->setAutoExclusive(false); ui->buttonZ->setAutoExclusive(false); ui->buttonX->setChecked(false); ui->buttonY->setChecked(false); ui->buttonZ->setChecked(false); - ui->buttonReference->setDown(!featureSelectionMode); ui->lineReference->setText(QString::fromAscii(directions.front().c_str())); } else { // Error message? ui->lineReference->setText(tr("")); } + if (referenceSelectionMode) + ui->lineReference->setText(tr("Select an edge or a face")); // Note: These three lines would trigger onLength(), on Occurrences() and another updateUI() if we // didn't check for updateUIinProgress @@ -190,55 +187,33 @@ void TaskLinearPatternParameters::updateUI() void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { - PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); - App::DocumentObject* selectedObject = pcLinearPattern->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - - if (featureSelectionMode) { - if (originalSelected(msg)) - ui->listFeatures->addItem(QString::fromAscii(selectedObject->getNameInDocument())); - } else { - if (!msg.pSubName || msg.pSubName[0] == '\0') - return; - - std::string element(msg.pSubName); - - if (msg.Type == Gui::SelectionChanges::AddSelection) { - // TODO -// if (originalElementName == "") { -// Base::Console().Error("Element created by this pattern cannot be used for direction\n"); -// return; -// } + if (msg.Type == Gui::SelectionChanges::AddSelection) { + std::string subName(msg.pSubName); + PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); + if (originalSelectionMode) { + App::DocumentObject* selectedObject = pcLinearPattern->getDocument()->getActiveObject(); + if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) + return; + if (originalSelected(msg)) + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + } else if (referenceSelectionMode && + ((subName.size() > 4 && subName.substr(0,4) == "Edge") || + (subName.size() > 4 && subName.substr(0,4) == "Face"))) { std::vector directions; - directions.push_back(element.c_str()); + directions.push_back(subName.c_str()); pcLinearPattern->Direction.setValue(getOriginalObject(), directions); + pcLinearPattern->StdDirection.setValue(""); - if (insideMultiTransform) { - if (parentTask->updateView()) - recomputeFeature(); - } else - if (ui->checkBoxUpdateView->isChecked()) - recomputeFeature(); + if (updateView()) + recomputeFeature(); - if (!insideMultiTransform) - featureSelectionMode = true; // Jump back to selection of originals - - showObject(); - hideOriginals(); + exitSelectionMode(); updateUI(); } } } -void TaskLinearPatternParameters::onOriginalDeleted() -{ - int row = ui->listFeatures->currentIndex().row(); - TaskTransformedParameters::onOriginalDeleted(row); - ui->listFeatures->model()->removeRow(row); -} - void TaskLinearPatternParameters::onButtonX() { onStdDirection("X"); } @@ -252,55 +227,66 @@ void TaskLinearPatternParameters::onButtonZ() { } void TaskLinearPatternParameters::onCheckReverse(const bool on) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Reversed.setValue(on); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskLinearPatternParameters::onLength(const double l) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Length.setValue(l); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskLinearPatternParameters::onOccurrences(const int n) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Occurrences.setValue(n); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskLinearPatternParameters::onStdDirection(const std::string& dir) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->StdDirection.setValue(dir.c_str()); pcLinearPattern->Direction.setValue(NULL); - if (!insideMultiTransform) - featureSelectionMode = true; + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } -void TaskLinearPatternParameters::onButtonReference() +void TaskLinearPatternParameters::onButtonReference(bool checked) { - PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); - pcLinearPattern->StdDirection.setValue(""); - featureSelectionMode = false; - hideObject(); - showOriginals(); + if (updateUIinProgress) + return; + if (checked ) { + hideObject(); + showOriginals(); + referenceSelectionMode = true; + Gui::Selection().clearSelection(); + } else { + exitSelectionMode(); + } updateUI(); } @@ -309,7 +295,6 @@ void TaskLinearPatternParameters::onUpdateView(bool on) ui->buttonX->blockSignals(!on); ui->buttonY->blockSignals(!on); ui->buttonZ->blockSignals(!on); - ui->listFeatures->blockSignals(!on); ui->checkReverse->blockSignals(!on); ui->spinLength->blockSignals(!on); ui->spinOccurrences->blockSignals(!on); @@ -352,18 +337,38 @@ const QString TaskLinearPatternParameters::getDirection(void) const return buf; } -const bool TaskLinearPatternParameters::getReverse(void) const { +const bool TaskLinearPatternParameters::getReverse(void) const +{ return ui->checkReverse->isChecked(); } -const double TaskLinearPatternParameters::getLength(void) const { +const double TaskLinearPatternParameters::getLength(void) const +{ return ui->spinLength->value(); } -const unsigned TaskLinearPatternParameters::getOccurrences(void) const { +const unsigned TaskLinearPatternParameters::getOccurrences(void) const +{ return ui->spinOccurrences->value(); } +const bool TaskLinearPatternParameters::updateView() const +{ + if (insideMultiTransform) + return parentTask->updateView(); + else + return ui->checkBoxUpdateView->isChecked(); +} + +void TaskLinearPatternParameters::exitSelectionMode() +{ + originalSelectionMode = false; + referenceSelectionMode = false; + showObject(); + hideOriginals(); +} + + TaskLinearPatternParameters::~TaskLinearPatternParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h index 3e220c6dc1..07e5f435e7 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h @@ -41,7 +41,7 @@ namespace Gui { class ViewProvider; } -namespace PartDesignGui { +namespace PartDesignGui { class TaskMultiTransformParameters; @@ -61,6 +61,7 @@ public: const bool getReverse(void) const; const double getLength(void) const; const unsigned getOccurrences(void) const; + const bool updateView() const; private Q_SLOTS: void onStdDirection(const std::string& dir); @@ -70,17 +71,19 @@ private Q_SLOTS: void onCheckReverse(const bool on); void onLength(const double l); void onOccurrences(const int n); - virtual void onButtonReference(); - virtual void onOriginalDeleted(); + void onButtonReference(const bool checked); virtual void onUpdateView(bool); -protected: +protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); + bool referenceSelectionMode; + private: - void updateUI(); void setupUI(); + void updateUI(); + void exitSelectionMode(); private: Ui_TaskLinearPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui index c5a06ce89e..4ed390924d 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui @@ -15,7 +15,18 @@ - + + + + + Original feature + + + + + + + @@ -52,6 +63,9 @@ Direction + + true + @@ -132,6 +146,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index 9a67a4b14d..eb082eb1d3 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -57,11 +57,14 @@ TaskMirroredParameters::TaskMirroredParameters(ViewProviderTransformed *Transfor ui = new Ui_TaskMirroredParameters(); ui->setupUi(proxy); QMetaObject::connectSlotsByName(this); + this->groupLayout()->addWidget(proxy); ui->buttonOK->hide(); ui->checkBoxUpdateView->setEnabled(true); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -79,9 +82,12 @@ TaskMirroredParameters::TaskMirroredParameters(TaskMultiTransformParameters *par layout->addWidget(proxy); ui->buttonOK->setEnabled(true); - ui->listFeatures->hide(); + ui->labelOriginal->hide(); + ui->lineOriginal->hide(); ui->checkBoxUpdateView->hide(); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -94,35 +100,24 @@ void TaskMirroredParameters::setupUI() this, SLOT(onButtonXZ())); connect(ui->buttonYZ, SIGNAL(pressed()), this, SLOT(onButtonYZ())); - connect(ui->buttonReference, SIGNAL(pressed()), - this, SLOT(onButtonReference())); + connect(ui->buttonReference, SIGNAL(toggled(bool)), + this, SLOT(onButtonReference(bool))); connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), this, SLOT(onUpdateView(bool))); - // TODO: The following code could be generic in TaskTransformedParameters - // if it were possible to make ui_TaskMirroredParameters a subclass of - // ui_TaskTransformedParameters - // --------------------- - // Add a context menu to the listview of the originals to delete items - QAction* action = new QAction(tr("Delete"), ui->listFeatures); - action->connect(action, SIGNAL(triggered()), - this, SLOT(onOriginalDeleted())); - ui->listFeatures->addAction(action); - ui->listFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - // Get the feature data PartDesign::Mirrored* pcMirrored = static_cast(getObject()); std::vector originals = pcMirrored->Originals.getValues(); // Fill data into dialog elements - ui->listFeatures->setEnabled(true); - ui->listFeatures->clear(); + ui->lineOriginal->setEnabled(false); for (std::vector::const_iterator i = originals.begin(); i != originals.end(); i++) { - if ((*i) != NULL) - ui->listFeatures->addItem(QString::fromAscii((*i)->getNameInDocument())); + if ((*i) != NULL) { // find the first valid original + ui->lineOriginal->setText(QString::fromAscii((*i)->getNameInDocument())); + break; + } } - QMetaObject::invokeMethod(ui->listFeatures, "setFocus", Qt::QueuedConnection); // --------------------- ui->buttonXY->setEnabled(true); @@ -130,22 +125,22 @@ void TaskMirroredParameters::setupUI() ui->buttonYZ->setEnabled(true); ui->buttonReference->setEnabled(true); ui->lineReference->setEnabled(false); // This is never enabled since it is for optical feed-back only - updateUI(); } void TaskMirroredParameters::updateUI() { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; updateUIinProgress = true; PartDesign::Mirrored* pcMirrored = static_cast(getObject()); App::DocumentObject* mirrorPlaneFeature = pcMirrored->MirrorPlane.getValue(); std::vector mirrorPlanes = pcMirrored->MirrorPlane.getSubValues(); std::string stdMirrorPlane = pcMirrored->StdMirrorPlane.getValue(); - if ((featureSelectionMode || insideMultiTransform) && !stdMirrorPlane.empty()) + ui->buttonReference->setChecked(referenceSelectionMode); + if (!stdMirrorPlane.empty()) { - ui->buttonReference->setDown(false); ui->buttonXY->setAutoExclusive(true); ui->buttonXZ->setAutoExclusive(true); ui->buttonYZ->setAutoExclusive(true); @@ -153,82 +148,63 @@ void TaskMirroredParameters::updateUI() ui->buttonXZ->setChecked(stdMirrorPlane == "XZ"); ui->buttonYZ->setChecked(stdMirrorPlane == "YZ"); ui->lineReference->setText(tr("")); - } else if ((mirrorPlaneFeature != NULL) && !mirrorPlanes.empty()) { + } else if (mirrorPlaneFeature != NULL && !mirrorPlanes.empty()) { ui->buttonXY->setAutoExclusive(false); ui->buttonXZ->setAutoExclusive(false); ui->buttonYZ->setAutoExclusive(false); ui->buttonXY->setChecked(false); ui->buttonXZ->setChecked(false); ui->buttonYZ->setChecked(false); - ui->buttonReference->setDown(!featureSelectionMode); ui->lineReference->setText(QString::fromAscii(mirrorPlanes.front().c_str())); } else { // Error message? ui->lineReference->setText(tr("")); } + if (referenceSelectionMode) + ui->lineReference->setText(tr("Select a plane")); updateUIinProgress = false; } void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { - PartDesign::Mirrored* pcMirrored = static_cast(getObject()); - App::DocumentObject* selectedObject = pcMirrored->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - - if (featureSelectionMode) { - if (originalSelected(msg)) - ui->listFeatures->addItem(QString::fromAscii(selectedObject->getNameInDocument())); - } else { - if (!msg.pSubName || msg.pSubName[0] == '\0') - return; - - std::string element(msg.pSubName); - - if (element.substr(0,4) != "Face") - return; - - if (msg.Type == Gui::SelectionChanges::AddSelection) { + if (msg.Type == Gui::SelectionChanges::AddSelection) { + std::string subName(msg.pSubName); + PartDesign::Mirrored* pcMirrored = static_cast(getObject()); + if (originalSelectionMode) { + App::DocumentObject* selectedObject = pcMirrored->getDocument()->getActiveObject(); + if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) + return; + if (originalSelected(msg)) + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + } else if (referenceSelectionMode && + (subName.size() > 4 && subName.substr(0,4) == "Face")) { + std::vector mirrorPlanes; - mirrorPlanes.push_back(element.c_str()); + mirrorPlanes.push_back(subName.c_str()); pcMirrored->MirrorPlane.setValue(getOriginalObject(), mirrorPlanes); + pcMirrored->StdMirrorPlane.setValue(""); - if (insideMultiTransform) { - if (parentTask->updateView()) - recomputeFeature(); - } else - if (ui->checkBoxUpdateView->isChecked()) - recomputeFeature(); + if (updateView()) + recomputeFeature(); - if (!insideMultiTransform) - featureSelectionMode = true; // Jump back to selection of originals - - showObject(); - hideOriginals(); + exitSelectionMode(); updateUI(); } } } -void TaskMirroredParameters::onOriginalDeleted() -{ - int row = ui->listFeatures->currentIndex().row(); - TaskTransformedParameters::onOriginalDeleted(row); - ui->listFeatures->model()->removeRow(row); -} - void TaskMirroredParameters::onStdMirrorPlane(const std::string &plane) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::Mirrored* pcMirrored = static_cast(getObject()); pcMirrored->StdMirrorPlane.setValue(plane.c_str()); pcMirrored->MirrorPlane.setValue(NULL); - if (!insideMultiTransform) - featureSelectionMode = true; + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskMirroredParameters::onButtonXY() { @@ -243,13 +219,18 @@ void TaskMirroredParameters::onButtonYZ() { onStdMirrorPlane("YZ"); } -void TaskMirroredParameters::onButtonReference() +void TaskMirroredParameters::onButtonReference(bool checked) { - PartDesign::Mirrored* pcMirrored = static_cast(getObject()); - pcMirrored->StdMirrorPlane.setValue(""); - featureSelectionMode = false; - hideObject(); - showOriginals(); + if (updateUIinProgress) + return; + if (checked ) { + hideObject(); + showOriginals(); + referenceSelectionMode = true; + Gui::Selection().clearSelection(); + } else { + exitSelectionMode(); + } updateUI(); } @@ -258,7 +239,6 @@ void TaskMirroredParameters::onUpdateView(bool on) ui->buttonXY->blockSignals(!on); ui->buttonYZ->blockSignals(!on); ui->buttonXZ->blockSignals(!on); - ui->listFeatures->blockSignals(!on); } const std::string TaskMirroredParameters::getStdMirrorPlane(void) const @@ -298,6 +278,23 @@ const QString TaskMirroredParameters::getMirrorPlane(void) const return buf; } +const bool TaskMirroredParameters::updateView() const +{ + if (insideMultiTransform) + return parentTask->updateView(); + else + return ui->checkBoxUpdateView->isChecked(); +} + +void TaskMirroredParameters::exitSelectionMode() +{ + originalSelectionMode = false; + referenceSelectionMode = false; + showObject(); + hideOriginals(); +} + + TaskMirroredParameters::~TaskMirroredParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h index a204bb6389..e8f8a0ec2d 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h @@ -41,7 +41,7 @@ namespace Gui { class ViewProvider; } -namespace PartDesignGui { +namespace PartDesignGui { class TaskMultiTransformParameters; @@ -59,23 +59,26 @@ public: const QString getMirrorPlane(void) const; const std::string getStdMirrorPlane(void) const; + const bool updateView() const; private Q_SLOTS: void onButtonXY(); void onButtonXZ(); void onButtonYZ(); - virtual void onButtonReference(); - virtual void onOriginalDeleted(); + void onButtonReference(const bool checked); virtual void onUpdateView(bool); -protected: +protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); + bool referenceSelectionMode; + private: void onStdMirrorPlane(const std::string& plane); void setupUI(); void updateUI(); + void exitSelectionMode(); private: Ui_TaskMirroredParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.ui b/src/Mod/PartDesign/Gui/TaskMirroredParameters.ui index b5f58835c3..c34a29d170 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.ui @@ -15,7 +15,18 @@ - + + + + + Original feature + + + + + + + @@ -52,6 +63,9 @@ Plane + + true + @@ -80,6 +94,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 3f71c42a93..cd23c45da1 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -68,35 +68,35 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform this->groupLayout()->addWidget(proxy); // Create a context menu for the listview of transformation features - QAction* action = new QAction(tr("Edit"), ui->listFeatures); + QAction* action = new QAction(tr("Edit"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformEdit())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Delete"), ui->listFeatures); + action = new QAction(tr("Delete"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformDelete())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Add mirrored transformation"), ui->listFeatures); + action = new QAction(tr("Add mirrored transformation"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformAddMirrored())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Add linear pattern"), ui->listFeatures); + action = new QAction(tr("Add linear pattern"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformAddLinearPattern())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Add polar pattern"), ui->listFeatures); + action = new QAction(tr("Add polar pattern"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformAddPolarPattern())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Add scaled transformation"), ui->listFeatures); + action = new QAction(tr("Add scaled transformation"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onTransformAddScaled())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Move up"), ui->listFeatures); + action = new QAction(tr("Move up"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onMoveUp())); ui->listTransformFeatures->addAction(action); - action = new QAction(tr("Move down"), ui->listFeatures); + action = new QAction(tr("Move down"), ui->listTransformFeatures); action->connect(action, SIGNAL(triggered()), this, SLOT(onMoveDown())); ui->listTransformFeatures->addAction(action); @@ -127,29 +127,18 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform editHint = true; } - // TODO: The following code could be generic in TaskTransformedParameters - // if it were possible to make ui_TaskMultiTransformParameters a subclass of - // ui_TaskTransformedParameters - // --------------------- - // Add a context menu to the listview of the originals to delete items - action = new QAction(tr("Delete"), ui->listFeatures); - action->connect(action, SIGNAL(triggered()), - this, SLOT(onOriginalDeleted())); - ui->listFeatures->addAction(action); - ui->listFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - // Get the Originals data std::vector originals = pcMultiTransform->Originals.getValues(); // Fill data into dialog elements - ui->listFeatures->setEnabled(true); - ui->listFeatures->clear(); + ui->lineOriginal->setEnabled(false); // This is never enabled since it is for optical feed-back only for (std::vector::const_iterator i = originals.begin(); i != originals.end(); i++) { - if ((*i) != NULL) - ui->listFeatures->addItem(QString::fromAscii((*i)->getNameInDocument())); + if ((*i) != NULL) { // find the first valid original + ui->lineOriginal->setText(QString::fromAscii((*i)->getNameInDocument())); + break; + } } - QMetaObject::invokeMethod(ui->listFeatures, "setFocus", Qt::QueuedConnection); // --------------------- } @@ -160,12 +149,9 @@ void TaskMultiTransformParameters::onSelectionChanged(const Gui::SelectionChange if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) return; - if (featureSelectionMode) { + if (originalSelectionMode) { if (originalSelected(msg)) - ui->listFeatures->addItem(QString::fromAscii(selectedObject->getNameInDocument())); - } else { - // There is no reference that could be selected... must be an error to arrive here at all! - featureSelectionMode = true; + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); } } @@ -184,7 +170,7 @@ void TaskMultiTransformParameters::onTransformDelete() PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); - App::DocumentObject* feature = *(transformFeatures.begin() + row); + App::DocumentObject* feature = transformFeatures[row]; pcMultiTransform->getDocument()->remObject(feature->getNameInDocument()); closeSubTask(); @@ -331,7 +317,7 @@ void TaskMultiTransformParameters::moveTransformFeature(const int increment) PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); - App::DocumentObject* feature = *(transformFeatures.begin() + row); + App::DocumentObject* feature = transformFeatures[row]; transformFeatures.erase(transformFeatures.begin() + row); QListWidgetItem* item = new QListWidgetItem(*(ui->listTransformFeatures->item(row))); ui->listTransformFeatures->model()->removeRow(row); @@ -373,19 +359,10 @@ void TaskMultiTransformParameters::onSubTaskButtonOK() { closeSubTask(); } -void TaskMultiTransformParameters::onOriginalDeleted() -{ - int row = ui->listFeatures->currentIndex().row(); - TaskTransformedParameters::onOriginalDeleted(row); - ui->listFeatures->model()->removeRow(row); -} - void TaskMultiTransformParameters::onUpdateView(bool on) { - ui->listFeatures->blockSignals(!on); } - const std::vector TaskMultiTransformParameters::getTransformFeatures(void) const { PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h index 0aa7883af0..2ffca3c204 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h @@ -77,8 +77,6 @@ private Q_SLOTS: void onTransformAddScaled(); void onMoveUp(); void onMoveDown(); - virtual void onButtonReference() {} - virtual void onOriginalDeleted(); virtual void onUpdateView(bool); /// User finished editing a subFeature virtual void onSubTaskButtonOK(); diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui index 5c664f74b3..d8d2ced3f5 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui @@ -15,14 +15,18 @@ - - - Originals - - - - - + + + + + Original feature + + + + + + + @@ -44,6 +48,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index 16b7a14f54..f6b5ee3939 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -62,6 +62,8 @@ TaskPolarPatternParameters::TaskPolarPatternParameters(ViewProviderTransformed * ui->buttonOK->hide(); ui->checkBoxUpdateView->setEnabled(true); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -79,9 +81,12 @@ TaskPolarPatternParameters::TaskPolarPatternParameters(TaskMultiTransformParamet layout->addWidget(proxy); ui->buttonOK->setEnabled(true); - ui->listFeatures->hide(); + ui->labelOriginal->hide(); + ui->lineOriginal->hide(); ui->checkBoxUpdateView->hide(); + referenceSelectionMode = false; + updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -100,35 +105,24 @@ void TaskPolarPatternParameters::setupUI() this, SLOT(onAngle(double))); connect(ui->spinOccurrences, SIGNAL(valueChanged(int)), this, SLOT(onOccurrences(int))); - connect(ui->buttonReference, SIGNAL(pressed()), - this, SLOT(onButtonReference())); + connect(ui->buttonReference, SIGNAL(toggled(bool)), + this, SLOT(onButtonReference(bool))); connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), this, SLOT(onUpdateView(bool))); - // TODO: The following code could be generic in TaskTransformedParameters - // if it were possible to make ui_TaskPolarPatternParameters a subclass of - // ui_TaskTransformedParameters - // --------------------- - // Add a context menu to the listview of the originals to delete items - QAction* action = new QAction(tr("Delete"), ui->listFeatures); - action->connect(action, SIGNAL(triggered()), - this, SLOT(onOriginalDeleted())); - ui->listFeatures->addAction(action); - ui->listFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - // Get the feature data PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); std::vector originals = pcPolarPattern->Originals.getValues(); // Fill data into dialog elements - ui->listFeatures->setEnabled(true); - ui->listFeatures->clear(); + ui->lineOriginal->setEnabled(false); for (std::vector::const_iterator i = originals.begin(); i != originals.end(); i++) { - if ((*i) != NULL) - ui->listFeatures->addItem(QString::fromAscii((*i)->getNameInDocument())); + if ((*i) != NULL) { // find the first valid original + ui->lineOriginal->setText(QString::fromAscii((*i)->getNameInDocument())); + break; + } } - QMetaObject::invokeMethod(ui->listFeatures, "setFocus", Qt::QueuedConnection); // --------------------- ui->buttonX->setEnabled(true); @@ -144,7 +138,8 @@ void TaskPolarPatternParameters::setupUI() void TaskPolarPatternParameters::updateUI() { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; updateUIinProgress = true; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); @@ -156,9 +151,9 @@ void TaskPolarPatternParameters::updateUI() double angle = pcPolarPattern->Angle.getValue(); unsigned occurrences = pcPolarPattern->Occurrences.getValue(); - if ((featureSelectionMode || insideMultiTransform) && !stdAxis.empty()) + ui->buttonReference->setChecked(referenceSelectionMode); + if (!stdAxis.empty()) { - ui->buttonReference->setDown(false); ui->buttonX->setAutoExclusive(true); ui->buttonY->setAutoExclusive(true); ui->buttonZ->setAutoExclusive(true); @@ -166,19 +161,20 @@ void TaskPolarPatternParameters::updateUI() ui->buttonY->setChecked(stdAxis == "Y"); ui->buttonZ->setChecked(stdAxis == "Z"); ui->lineReference->setText(tr("")); - } else if ((axisFeature != NULL) && !axes.empty()) { + } else if (axisFeature != NULL && !axes.empty()) { ui->buttonX->setAutoExclusive(false); ui->buttonY->setAutoExclusive(false); ui->buttonZ->setAutoExclusive(false); ui->buttonX->setChecked(false); ui->buttonY->setChecked(false); ui->buttonZ->setChecked(false); - ui->buttonReference->setDown(!featureSelectionMode); ui->lineReference->setText(QString::fromAscii(axes.front().c_str())); } else { // Error message? ui->lineReference->setText(tr("")); } + if (referenceSelectionMode) + ui->lineReference->setText(tr("Select an edge")); ui->checkReverse->setChecked(reverse); ui->spinAngle->setValue(angle); @@ -189,59 +185,32 @@ void TaskPolarPatternParameters::updateUI() void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { - PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); - App::DocumentObject* selectedObject = pcPolarPattern->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - - if (featureSelectionMode) { - if (originalSelected(msg)) - ui->listFeatures->addItem(QString::fromAscii(selectedObject->getNameInDocument())); - } else { - if (!msg.pSubName || msg.pSubName[0] == '\0') - return; - - std::string element(msg.pSubName); - - if (msg.Type == Gui::SelectionChanges::AddSelection) { - - if (element.substr(0,4) != "Edge") + if (msg.Type == Gui::SelectionChanges::AddSelection) { + std::string subName(msg.pSubName); + PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); + if (originalSelectionMode) { + App::DocumentObject* selectedObject = pcPolarPattern->getDocument()->getActiveObject(); + if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) return; - - // TODO -// if (originalElementName == "") { -// Base::Console().Error("Element created by this pattern cannot be used for axis\n"); -// return; -// } + if (originalSelected(msg)) + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + } else if (referenceSelectionMode && + (subName.size() > 4 && subName.substr(0,4) == "Edge")) { std::vector axes; - axes.push_back(element.c_str()); + axes.push_back(subName.c_str()); pcPolarPattern->Axis.setValue(getOriginalObject(), axes); + pcPolarPattern->StdAxis.setValue(""); - if (insideMultiTransform) { - if (parentTask->updateView()) - recomputeFeature(); - } else - if (ui->checkBoxUpdateView->isChecked()) - recomputeFeature(); + if (updateView()) + recomputeFeature(); - if (!insideMultiTransform) - featureSelectionMode = true; // Jump back to selection of originals - - showObject(); - hideOriginals(); + exitSelectionMode(); updateUI(); } } } -void TaskPolarPatternParameters::onOriginalDeleted() -{ - int row = ui->listFeatures->currentIndex().row(); - TaskTransformedParameters::onOriginalDeleted(row); - ui->listFeatures->model()->removeRow(row); -} - void TaskPolarPatternParameters::onButtonX() { onStdAxis("X"); } @@ -255,55 +224,66 @@ void TaskPolarPatternParameters::onButtonZ() { } void TaskPolarPatternParameters::onCheckReverse(const bool on) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Reversed.setValue(on); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskPolarPatternParameters::onAngle(const double a) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Angle.setValue(a); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskPolarPatternParameters::onOccurrences(const int n) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Occurrences.setValue(n); + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskPolarPatternParameters::onStdAxis(const std::string& axis) { - if (updateUIinProgress) return; + if (updateUIinProgress) + return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->StdAxis.setValue(axis.c_str()); pcPolarPattern->Axis.setValue(NULL); - if (!insideMultiTransform) - featureSelectionMode = true; + + exitSelectionMode(); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } -void TaskPolarPatternParameters::onButtonReference() +void TaskPolarPatternParameters::onButtonReference(bool checked) { - PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); - pcPolarPattern->StdAxis.setValue(""); - featureSelectionMode = false; - hideObject(); - showOriginals(); + if (updateUIinProgress) + return; + if (checked ) { + hideObject(); + showOriginals(); + referenceSelectionMode = true; + Gui::Selection().clearSelection(); + } else { + exitSelectionMode(); + } updateUI(); } @@ -312,7 +292,6 @@ void TaskPolarPatternParameters::onUpdateView(bool on) ui->buttonX->blockSignals(!on); ui->buttonY->blockSignals(!on); ui->buttonZ->blockSignals(!on); - ui->listFeatures->blockSignals(!on); ui->checkReverse->blockSignals(!on); ui->spinAngle->blockSignals(!on); ui->spinOccurrences->blockSignals(!on); @@ -370,6 +349,23 @@ const unsigned TaskPolarPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } +const bool TaskPolarPatternParameters::updateView() const +{ + if (insideMultiTransform) + return parentTask->updateView(); + else + return ui->checkBoxUpdateView->isChecked(); +} + +void TaskPolarPatternParameters::exitSelectionMode() +{ + originalSelectionMode = false; + referenceSelectionMode = false; + showObject(); + hideOriginals(); +} + + TaskPolarPatternParameters::~TaskPolarPatternParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h index 6a33a56050..19fadb9090 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h @@ -61,6 +61,7 @@ public: const bool getReverse(void) const; const double getAngle(void) const; const unsigned getOccurrences(void) const; + const bool updateView() const; private Q_SLOTS: void onStdAxis(const std::string& axis); @@ -70,17 +71,19 @@ private Q_SLOTS: void onCheckReverse(const bool on); void onAngle(const double a); void onOccurrences(const int n); - virtual void onButtonReference(); - virtual void onOriginalDeleted(); + void onButtonReference(const bool checked); virtual void onUpdateView(bool); protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); + bool referenceSelectionMode; + private: - void updateUI(); void setupUI(); + void updateUI(); + void exitSelectionMode(); private: Ui_TaskPolarPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.ui b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.ui index c7dd82965e..a5ad73322d 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.ui @@ -15,7 +15,18 @@ - + + + + + Original feature + + + + + + + @@ -52,6 +63,9 @@ Direction + + true + @@ -132,6 +146,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp index 8bec400f9c..c26a731079 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp @@ -79,7 +79,8 @@ TaskScaledParameters::TaskScaledParameters(TaskMultiTransformParameters *parentT layout->addWidget(proxy); ui->buttonOK->setEnabled(true); - ui->listFeatures->hide(); + ui->labelOriginal->hide(); + ui->lineOriginal->hide(); ui->checkBoxUpdateView->hide(); updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! @@ -95,30 +96,19 @@ void TaskScaledParameters::setupUI() connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), this, SLOT(onUpdateView(bool))); - // TODO: The following code could be generic in TaskTransformedParameters - // if it were possible to make ui_TaskScaledParameters a subclass of - // ui_TaskTransformedParameters - // --------------------- - // Add a context menu to the listview of the originals to delete items - QAction* action = new QAction(tr("Delete"), ui->listFeatures); - action->connect(action, SIGNAL(triggered()), - this, SLOT(onOriginalDeleted())); - ui->listFeatures->addAction(action); - ui->listFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - // Get the feature data PartDesign::Scaled* pcScaled = static_cast(getObject()); std::vector originals = pcScaled->Originals.getValues(); // Fill data into dialog elements - ui->listFeatures->setEnabled(true); - ui->listFeatures->clear(); + ui->lineOriginal->setEnabled(false); for (std::vector::const_iterator i = originals.begin(); i != originals.end(); i++) { - if ((*i) != NULL) - ui->listFeatures->addItem(QString::fromAscii((*i)->getNameInDocument())); + if ((*i) != NULL) { // find the first valid original + ui->lineOriginal->setText(QString::fromAscii((*i)->getNameInDocument())); + break; + } } - QMetaObject::invokeMethod(ui->listFeatures, "setFocus", Qt::QueuedConnection); // --------------------- ui->spinFactor->setEnabled(true); @@ -150,29 +140,19 @@ void TaskScaledParameters::onSelectionChanged(const Gui::SelectionChanges& msg) if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) return; - if (featureSelectionMode) { + if (originalSelectionMode) { if (originalSelected(msg)) - ui->listFeatures->addItem(QString::fromAscii(selectedObject->getNameInDocument())); - } else { - return; + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); } } -void TaskScaledParameters::onOriginalDeleted() -{ - int row = ui->listFeatures->currentIndex().row(); - TaskTransformedParameters::onOriginalDeleted(row); - ui->listFeatures->model()->removeRow(row); -} - void TaskScaledParameters::onFactor(const double f) { if (updateUIinProgress) return; PartDesign::Scaled* pcScaled = static_cast(getObject()); pcScaled->Factor.setValue(f); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskScaledParameters::onOccurrences(const int n) { @@ -180,14 +160,12 @@ void TaskScaledParameters::onOccurrences(const int n) { PartDesign::Scaled* pcScaled = static_cast(getObject()); pcScaled->Occurrences.setValue(n); updateUI(); - if (insideMultiTransform && !parentTask->updateView()) - return; - recomputeFeature(); + if (updateView()) + recomputeFeature(); } void TaskScaledParameters::onUpdateView(bool on) { - ui->listFeatures->blockSignals(!on); ui->spinFactor->blockSignals(!on); ui->spinOccurrences->blockSignals(!on); } @@ -202,6 +180,14 @@ const unsigned TaskScaledParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } +const bool TaskScaledParameters::updateView() const +{ + if (insideMultiTransform) + return parentTask->updateView(); + else + return ui->checkBoxUpdateView->isChecked(); +} + TaskScaledParameters::~TaskScaledParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.h b/src/Mod/PartDesign/Gui/TaskScaledParameters.h index b1d42d5899..a93d2ce828 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.h +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.h @@ -58,12 +58,11 @@ public: const double getFactor(void) const; const unsigned getOccurrences(void) const; + const bool updateView() const; private Q_SLOTS: void onFactor(const double f); void onOccurrences(const int n); - virtual void onButtonReference() {} - virtual void onOriginalDeleted(); virtual void onUpdateView(bool); protected: @@ -71,8 +70,8 @@ protected: virtual void onSelectionChanged(const Gui::SelectionChanges& msg); private: - void updateUI(); void setupUI(); + void updateUI(); private: Ui_TaskScaledParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.ui b/src/Mod/PartDesign/Gui/TaskScaledParameters.ui index c1e336b995..562d476073 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.ui @@ -15,7 +15,18 @@ - + + + + + Original feature + + + + + + + @@ -86,6 +97,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index fb9b46e457..8d0e141da9 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -57,8 +57,7 @@ TaskTransformedParameters::TaskTransformedParameters(ViewProviderTransformed *Tr insideMultiTransform(false), updateUIinProgress(false) { - // Start in feature selection mode - featureSelectionMode = true; + originalSelectionMode = false; } TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameters *parentTask) @@ -68,14 +67,13 @@ TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameter insideMultiTransform(true), updateUIinProgress(false) { - // Start in reference selection mode and stay there! Feature selection makes - // no sense inside a MultiTransform - featureSelectionMode = false; + // Original feature selection makes no sense inside a MultiTransform + originalSelectionMode = false; } const bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& msg) { - if (featureSelectionMode && (msg.Type == Gui::SelectionChanges::AddSelection)) { + if (originalSelectionMode && (msg.Type == Gui::SelectionChanges::AddSelection)) { PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); App::DocumentObject* selectedObject = pcTransformed->getDocument()->getActiveObject(); if (!selectedObject->isDerivedFrom(PartDesign::Additive::getClassTypeId()) && @@ -87,9 +85,11 @@ const bool TaskTransformedParameters::originalSelected(const Gui::SelectionChang std::vector originals = pcTransformed->Originals.getValues(); if (std::find(originals.begin(), originals.end(), selectedObject) == originals.end()) { - originals.push_back(selectedObject); - pcTransformed->Originals.setValues(originals); - pcTransformed->getDocument()->recomputeFeature(pcTransformed); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.Originals = [App.activeDocument().%s]", + getObject()->getNameInDocument(), + selectedObject->getNameInDocument() ); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); + originalSelectionMode = false; return true; } } @@ -97,15 +97,6 @@ const bool TaskTransformedParameters::originalSelected(const Gui::SelectionChang return false; } -void TaskTransformedParameters::onOriginalDeleted(const int row) -{ - PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); - std::vector originals = pcTransformed->Originals.getValues(); - originals.erase(originals.begin() + row); - pcTransformed->Originals.setValues(originals); - pcTransformed->getDocument()->recomputeFeature(pcTransformed); -} - PartDesign::Transformed *TaskTransformedParameters::getObject() const { diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index 81997da1fb..47c7968659 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -62,24 +62,19 @@ public: protected Q_SLOTS: - virtual void onButtonReference() = 0; - virtual void onOriginalDeleted() = 0; - virtual void onUpdateView(bool) = 0; - /// Connect the subTask OK button to the MultiTransform task virtual void onSubTaskButtonOK() {} protected: - void onOriginalDeleted(const int row); const bool originalSelected(const Gui::SelectionChanges& msg); /// Get the TransformedFeature object associated with this task // Either through the ViewProvider or the currently active subFeature of the parentTask PartDesign::Transformed *getObject() const; - /// Recompute either this feature or the parent feature (MultiTransform mode) - void recomputeFeature(); /// Get the original object either of the object associated with this feature or with the parent feature (MultiTransform mode) App::DocumentObject* getOriginalObject() const; + /// Recompute either this feature or the parent feature (MultiTransform mode) + void recomputeFeature(); void hideObject(); void showObject(); @@ -93,7 +88,7 @@ protected: protected: QWidget* proxy; ViewProviderTransformed *TransformedView; - bool featureSelectionMode; + bool originalSelectionMode; /// The MultiTransform parent task of this task TaskMultiTransformParameters* parentTask; From d9808b4b97bee4a3ad1dfa1c2a8ad310bd25cadb Mon Sep 17 00:00:00 2001 From: logari81 Date: Thu, 13 Sep 2012 15:46:46 +0200 Subject: [PATCH 02/11] PartDesign: fix bug in checkbox "Update View" of pattern features and do some code refactoring --- .../Gui/TaskLinearPatternParameters.cpp | 157 +++++++++--------- .../Gui/TaskLinearPatternParameters.h | 3 +- .../PartDesign/Gui/TaskMirroredParameters.cpp | 132 +++++++-------- .../PartDesign/Gui/TaskMirroredParameters.h | 3 +- .../Gui/TaskMultiTransformParameters.cpp | 44 ++--- .../Gui/TaskMultiTransformParameters.h | 6 - .../Gui/TaskPolarPatternParameters.cpp | 157 +++++++++--------- .../Gui/TaskPolarPatternParameters.h | 3 +- .../PartDesign/Gui/TaskScaledParameters.cpp | 53 +++--- src/Mod/PartDesign/Gui/TaskScaledParameters.h | 1 - .../Gui/TaskTransformedParameters.cpp | 36 ++-- .../Gui/TaskTransformedParameters.h | 10 +- 12 files changed, 277 insertions(+), 328 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index b5a9a9ba23..ef73505fc3 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -29,6 +29,7 @@ #include "ui_TaskLinearPatternParameters.h" #include "TaskLinearPatternParameters.h" +#include "TaskMultiTransformParameters.h" #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include "TaskMultiTransformParameters.h" using namespace PartDesignGui; using namespace Gui; @@ -64,7 +64,7 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(ViewProviderTransformed referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -87,7 +87,7 @@ TaskLinearPatternParameters::TaskLinearPatternParameters(TaskMultiTransformParam referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -138,9 +138,9 @@ void TaskLinearPatternParameters::setupUI() void TaskLinearPatternParameters::updateUI() { - if (updateUIinProgress) + if (blockUpdate) return; - updateUIinProgress = true; + blockUpdate = true; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); @@ -177,39 +177,45 @@ void TaskLinearPatternParameters::updateUI() ui->lineReference->setText(tr("Select an edge or a face")); // Note: These three lines would trigger onLength(), on Occurrences() and another updateUI() if we - // didn't check for updateUIinProgress + // didn't check for blockUpdate ui->checkReverse->setChecked(reverse); ui->spinLength->setValue(length); ui->spinOccurrences->setValue(occurrences); - updateUIinProgress = false; + blockUpdate = false; } void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (msg.Type == Gui::SelectionChanges::AddSelection) { + + if (strcmp(msg.pDocName, getObject()->getDocument()->getName()) != 0) + return; + std::string subName(msg.pSubName); - PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); - if (originalSelectionMode) { - App::DocumentObject* selectedObject = pcLinearPattern->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - if (originalSelected(msg)) - ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + if (originalSelected(msg)) { + ui->lineOriginal->setText(QString::fromAscii(msg.pObjectName)); } else if (referenceSelectionMode && ((subName.size() > 4 && subName.substr(0,4) == "Edge") || (subName.size() > 4 && subName.substr(0,4) == "Face"))) { - std::vector directions; - directions.push_back(subName.c_str()); - pcLinearPattern->Direction.setValue(getOriginalObject(), directions); - pcLinearPattern->StdDirection.setValue(""); - - if (updateView()) - recomputeFeature(); + if (strcmp(msg.pObjectName, getSupportObject()->getNameInDocument()) != 0) + return; exitSelectionMode(); - updateUI(); + if (!blockUpdate) { + PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); + std::vector directions(1,subName); + pcLinearPattern->Direction.setValue(getSupportObject(), directions); + pcLinearPattern->StdDirection.setValue(""); + + recomputeFeature(); + updateUI(); + } + else { + ui->buttonReference->setChecked(referenceSelectionMode); + ui->lineReference->setText(QString::fromAscii(subName.c_str())); + } } } } @@ -227,43 +233,40 @@ void TaskLinearPatternParameters::onButtonZ() { } void TaskLinearPatternParameters::onCheckReverse(const bool on) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Reversed.setValue(on); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskLinearPatternParameters::onLength(const double l) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Length.setValue(l); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskLinearPatternParameters::onOccurrences(const int n) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->Occurrences.setValue(n); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskLinearPatternParameters::onStdDirection(const std::string& dir) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); pcLinearPattern->StdDirection.setValue(dir.c_str()); @@ -271,14 +274,11 @@ void TaskLinearPatternParameters::onStdDirection(const std::string& dir) { exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskLinearPatternParameters::onButtonReference(bool checked) { - if (updateUIinProgress) - return; if (checked ) { hideObject(); showOriginals(); @@ -292,49 +292,46 @@ void TaskLinearPatternParameters::onButtonReference(bool checked) void TaskLinearPatternParameters::onUpdateView(bool on) { - ui->buttonX->blockSignals(!on); - ui->buttonY->blockSignals(!on); - ui->buttonZ->blockSignals(!on); - ui->checkReverse->blockSignals(!on); - ui->spinLength->blockSignals(!on); - ui->spinOccurrences->blockSignals(!on); + blockUpdate = !on; + if (on) { + // Do the same like in TaskDlgLinearPatternParameters::accept() but without doCommand + PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); + + std::string direction = getDirection(); + if (!direction.empty()) { + std::vector directions(1,direction); + pcLinearPattern->Direction.setValue(getSupportObject(), directions); + } else + pcLinearPattern->Direction.setValue(NULL); + + std::string stdDirection = getStdDirection(); + if (!stdDirection.empty()) + pcLinearPattern->StdDirection.setValue(stdDirection.c_str()); + else + pcLinearPattern->StdDirection.setValue(NULL); + + pcLinearPattern->Reversed.setValue(getReverse()); + pcLinearPattern->Length.setValue(getLength()); + pcLinearPattern->Occurrences.setValue(getOccurrences()); + + recomputeFeature(); + } } const std::string TaskLinearPatternParameters::getStdDirection(void) const { - std::string stdDirection; - if (ui->buttonX->isChecked()) - stdDirection = "X"; + return std::string("X"); else if (ui->buttonY->isChecked()) - stdDirection = "Y"; + return std::string("Y"); else if (ui->buttonZ->isChecked()) - stdDirection = "Z"; - - if (!stdDirection.empty()) - return std::string("\"") + stdDirection + "\""; - else - return std::string(""); + return std::string("Z"); + return std::string(""); } -const QString TaskLinearPatternParameters::getDirection(void) const +const std::string TaskLinearPatternParameters::getDirection(void) const { - PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); - App::DocumentObject* feature = pcLinearPattern->Direction.getValue(); - if (feature == NULL) - return QString::fromUtf8(""); - std::vector directions = pcLinearPattern->Direction.getSubValues(); - QString buf; - - if ((feature != NULL) && !directions.empty()) { - buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); - buf = buf.arg(QString::fromUtf8(feature->getNameInDocument())); - buf = buf.arg(QString::fromUtf8(directions.front().c_str())); - } - else - buf = QString::fromUtf8(""); - - return buf; + return ui->lineReference->text().toStdString(); } const bool TaskLinearPatternParameters::getReverse(void) const @@ -352,14 +349,6 @@ const unsigned TaskLinearPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -const bool TaskLinearPatternParameters::updateView() const -{ - if (insideMultiTransform) - return parentTask->updateView(); - else - return ui->checkBoxUpdateView->isChecked(); -} - void TaskLinearPatternParameters::exitSelectionMode() { originalSelectionMode = false; @@ -409,12 +398,16 @@ bool TaskDlgLinearPatternParameters::accept() return false; TaskLinearPatternParameters* linearpatternParameter = static_cast(parameter); - std::string direction = linearpatternParameter->getDirection().toStdString(); - if (!direction.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Direction = %s", name.c_str(), direction.c_str()); + std::string direction = linearpatternParameter->getDirection(); + if (!direction.empty()) { + QString buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); + buf = buf.arg(QString::fromUtf8(linearpatternParameter->getSupportObject()->getNameInDocument())); + buf = buf.arg(QString::fromUtf8(direction.c_str())); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Direction = %s", name.c_str(), buf.toStdString().c_str()); + } else + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Direction = None", name.c_str()); std::string stdDirection = linearpatternParameter->getStdDirection(); - if (!stdDirection.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdDirection = %s",name.c_str(),stdDirection.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdDirection = \"%s\"",name.c_str(),stdDirection.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Reversed = %u",name.c_str(),linearpatternParameter->getReverse()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Length = %f",name.c_str(),linearpatternParameter->getLength()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Occurrences = %u",name.c_str(),linearpatternParameter->getOccurrences()); diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h index 07e5f435e7..28a82b5f8a 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h @@ -56,12 +56,11 @@ public: TaskLinearPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); virtual ~TaskLinearPatternParameters(); - const QString getDirection(void) const; const std::string getStdDirection(void) const; + const std::string getDirection(void) const; const bool getReverse(void) const; const double getLength(void) const; const unsigned getOccurrences(void) const; - const bool updateView() const; private Q_SLOTS: void onStdDirection(const std::string& dir); diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index eb082eb1d3..ec1cf67204 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -43,7 +43,6 @@ #include #include - using namespace PartDesignGui; using namespace Gui; @@ -65,7 +64,7 @@ TaskMirroredParameters::TaskMirroredParameters(ViewProviderTransformed *Transfor referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -88,7 +87,7 @@ TaskMirroredParameters::TaskMirroredParameters(TaskMultiTransformParameters *par referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -130,9 +129,9 @@ void TaskMirroredParameters::setupUI() void TaskMirroredParameters::updateUI() { - if (updateUIinProgress) + if (blockUpdate) return; - updateUIinProgress = true; + blockUpdate = true; PartDesign::Mirrored* pcMirrored = static_cast(getObject()); App::DocumentObject* mirrorPlaneFeature = pcMirrored->MirrorPlane.getValue(); std::vector mirrorPlanes = pcMirrored->MirrorPlane.getSubValues(); @@ -163,39 +162,45 @@ void TaskMirroredParameters::updateUI() if (referenceSelectionMode) ui->lineReference->setText(tr("Select a plane")); - updateUIinProgress = false; + blockUpdate = false; } void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (msg.Type == Gui::SelectionChanges::AddSelection) { + + if (strcmp(msg.pDocName, getObject()->getDocument()->getName()) != 0) + return; + std::string subName(msg.pSubName); - PartDesign::Mirrored* pcMirrored = static_cast(getObject()); - if (originalSelectionMode) { - App::DocumentObject* selectedObject = pcMirrored->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - if (originalSelected(msg)) - ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + if (originalSelected(msg)) { + ui->lineOriginal->setText(QString::fromAscii(msg.pObjectName)); } else if (referenceSelectionMode && (subName.size() > 4 && subName.substr(0,4) == "Face")) { - std::vector mirrorPlanes; - mirrorPlanes.push_back(subName.c_str()); - pcMirrored->MirrorPlane.setValue(getOriginalObject(), mirrorPlanes); - pcMirrored->StdMirrorPlane.setValue(""); - - if (updateView()) - recomputeFeature(); + if (strcmp(msg.pObjectName, getSupportObject()->getNameInDocument()) != 0) + return; exitSelectionMode(); - updateUI(); + if (!blockUpdate) { + PartDesign::Mirrored* pcMirrored = static_cast(getObject()); + std::vector mirrorPlanes(1,subName); + pcMirrored->MirrorPlane.setValue(getSupportObject(), mirrorPlanes); + pcMirrored->StdMirrorPlane.setValue(""); + + recomputeFeature(); + updateUI(); + } + else { + ui->buttonReference->setChecked(referenceSelectionMode); + ui->lineReference->setText(QString::fromAscii(subName.c_str())); + } } } } void TaskMirroredParameters::onStdMirrorPlane(const std::string &plane) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::Mirrored* pcMirrored = static_cast(getObject()); pcMirrored->StdMirrorPlane.setValue(plane.c_str()); @@ -203,8 +208,7 @@ void TaskMirroredParameters::onStdMirrorPlane(const std::string &plane) { exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskMirroredParameters::onButtonXY() { @@ -221,8 +225,6 @@ void TaskMirroredParameters::onButtonYZ() { void TaskMirroredParameters::onButtonReference(bool checked) { - if (updateUIinProgress) - return; if (checked ) { hideObject(); showOriginals(); @@ -236,54 +238,42 @@ void TaskMirroredParameters::onButtonReference(bool checked) void TaskMirroredParameters::onUpdateView(bool on) { - ui->buttonXY->blockSignals(!on); - ui->buttonYZ->blockSignals(!on); - ui->buttonXZ->blockSignals(!on); + blockUpdate = !on; + if (on) { + // Do the same like in TaskDlgMirroredParameters::accept() but without doCommand + PartDesign::Mirrored* pcMirrored = static_cast(getObject()); + + std::string mirrorPlane = getMirrorPlane(); + if (!mirrorPlane.empty()) { + std::vector planes(1,mirrorPlane); + pcMirrored->MirrorPlane.setValue(getSupportObject(),planes); + } else + pcMirrored->MirrorPlane.setValue(NULL); + + std::string stdMirrorPlane = getStdMirrorPlane(); + if (!stdMirrorPlane.empty()) + pcMirrored->StdMirrorPlane.setValue(stdMirrorPlane.c_str()); + else + pcMirrored->StdMirrorPlane.setValue(NULL); + + recomputeFeature(); + } } const std::string TaskMirroredParameters::getStdMirrorPlane(void) const { - std::string stdMirrorPlane; - if (ui->buttonXY->isChecked()) - stdMirrorPlane = "XY"; + return std::string("XY"); else if (ui->buttonYZ->isChecked()) - stdMirrorPlane = "YZ"; + return std::string("YZ"); else if (ui->buttonXZ->isChecked()) - stdMirrorPlane = "XZ"; - - if (!stdMirrorPlane.empty()) - return std::string("\"") + stdMirrorPlane + "\""; - else - return std::string(""); + return std::string("XZ"); + return std::string(""); } -const QString TaskMirroredParameters::getMirrorPlane(void) const +const std::string TaskMirroredParameters::getMirrorPlane(void) const { - PartDesign::Mirrored* pcMirrored = static_cast(getObject()); - App::DocumentObject* feature = pcMirrored->MirrorPlane.getValue(); - if (feature == NULL) - return QString::fromUtf8(""); - std::vector mirrorPlanes = pcMirrored->MirrorPlane.getSubValues(); - QString buf; - - if ((feature != NULL) && !mirrorPlanes.empty()) { - buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); - buf = buf.arg(QString::fromUtf8(feature->getNameInDocument())); - buf = buf.arg(QString::fromUtf8(mirrorPlanes.front().c_str())); - } - else - buf = QString::fromUtf8(""); - - return buf; -} - -const bool TaskMirroredParameters::updateView() const -{ - if (insideMultiTransform) - return parentTask->updateView(); - else - return ui->checkBoxUpdateView->isChecked(); + return ui->lineReference->text().toStdString(); } void TaskMirroredParameters::exitSelectionMode() @@ -335,12 +325,16 @@ bool TaskDlgMirroredParameters::accept() return false; TaskMirroredParameters* mirrorParameter = static_cast(parameter); - std::string mirrorPlane = mirrorParameter->getMirrorPlane().toStdString(); - if (!mirrorPlane.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MirrorPlane = %s", name.c_str(), mirrorPlane.c_str()); + std::string mirrorPlane = mirrorParameter->getMirrorPlane(); + if (!mirrorPlane.empty()) { + QString buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); + buf = buf.arg(QString::fromUtf8(mirrorParameter->getSupportObject()->getNameInDocument())); + buf = buf.arg(QString::fromUtf8(mirrorPlane.c_str())); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MirrorPlane = %s", name.c_str(), buf.toStdString().c_str()); + } else + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MirrorPlane = None", name.c_str()); std::string stdMirrorPlane = mirrorParameter->getStdMirrorPlane(); - if (!stdMirrorPlane.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdMirrorPlane = %s",name.c_str(),stdMirrorPlane.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdMirrorPlane = \"%s\"",name.c_str(),stdMirrorPlane.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); if (!TransformedView->getObject()->isValid()) throw Base::Exception(TransformedView->getObject()->getStatusString()); diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h index e8f8a0ec2d..caa4109241 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h @@ -57,9 +57,8 @@ public: virtual ~TaskMirroredParameters(); - const QString getMirrorPlane(void) const; const std::string getStdMirrorPlane(void) const; - const bool updateView() const; + const std::string getMirrorPlane(void) const; private Q_SLOTS: void onButtonXY(); diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index cd23c45da1..25635c5f36 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -101,8 +101,6 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform this, SLOT(onMoveDown())); ui->listTransformFeatures->addAction(action); ui->listTransformFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), - this, SLOT(onUpdateView(bool))); connect(ui->listTransformFeatures, SIGNAL(activated(QModelIndex)), this, SLOT(onTransformActivated(QModelIndex))); @@ -144,20 +142,16 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform void TaskMultiTransformParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); - App::DocumentObject* selectedObject = pcMultiTransform->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - - if (originalSelectionMode) { - if (originalSelected(msg)) - ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + if (originalSelected(msg)) { + App::DocumentObject* selectedObject = TransformedView->getObject()->getDocument()->getActiveObject(); + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); } } void TaskMultiTransformParameters::closeSubTask() { if (subTask) { + disconnect(ui->checkBoxUpdateView, 0, subTask, 0); delete subTask; subTask = NULL; } @@ -175,9 +169,10 @@ void TaskMultiTransformParameters::onTransformDelete() closeSubTask(); transformFeatures.erase(transformFeatures.begin() + row); - pcMultiTransform->Transformations.setValues(transformFeatures); - if (ui->checkBoxUpdateView->isChecked()) - pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform); + pcMultiTransform->Transformations.setValues(transformFeatures); + // Note: When the last transformation is deleted, recomputeFeature does nothing, because Transformed::execute() + // says: "No transformations defined, exit silently" + recomputeFeature(); ui->listTransformFeatures->model()->removeRow(row); ui->listTransformFeatures->setCurrentRow(0, QItemSelectionModel::ClearAndSelect); @@ -203,6 +198,9 @@ void TaskMultiTransformParameters::onTransformEdit() subTask = new TaskScaledParameters(this, ui->verticalLayout); else return; // TODO: Show an error? + + connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), + subTask, SLOT(onUpdateView(bool))); } void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index) { @@ -300,8 +298,7 @@ void TaskMultiTransformParameters::finishAdd(std::string &newFeatName) } pcMultiTransform->Transformations.setValues(transformFeatures); - if (ui->checkBoxUpdateView->isChecked()) - pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform); + recomputeFeature(); // Set state to hidden - only the MultiTransform should be visible Gui::Command::doCommand( @@ -341,8 +338,7 @@ void TaskMultiTransformParameters::moveTransformFeature(const int increment) } pcMultiTransform->Transformations.setValues(transformFeatures); - if (ui->checkBoxUpdateView->isChecked()) - pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform); + recomputeFeature(); } void TaskMultiTransformParameters::onMoveUp() @@ -359,10 +355,6 @@ void TaskMultiTransformParameters::onSubTaskButtonOK() { closeSubTask(); } -void TaskMultiTransformParameters::onUpdateView(bool on) -{ -} - const std::vector TaskMultiTransformParameters::getTransformFeatures(void) const { PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); @@ -385,16 +377,6 @@ void TaskMultiTransformParameters::changeEvent(QEvent *e) } } -void TaskMultiTransformParameters::recomputeFeature() { - PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); - pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform); -} - -const bool TaskMultiTransformParameters::updateView() const -{ - return ui->checkBoxUpdateView->isChecked(); -} - //************************************************************************** //************************************************************************** // TaskDialog diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h index 2ffca3c204..7d81e43436 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h @@ -62,11 +62,6 @@ public: /// Return the currently active subFeature PartDesign::Transformed* getSubFeature(void) { return subFeature; } - /// Recompute the feature associated with this task - void recomputeFeature(); - /// Tell the subtask whether the view should be updated - const bool updateView() const; - private Q_SLOTS: void onTransformDelete(); void onTransformEdit(); @@ -77,7 +72,6 @@ private Q_SLOTS: void onTransformAddScaled(); void onMoveUp(); void onMoveDown(); - virtual void onUpdateView(bool); /// User finished editing a subFeature virtual void onSubTaskButtonOK(); // Note: There is no Cancel button because I couldn't work out how to save the state of diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index f6b5ee3939..f218522a24 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -29,6 +29,7 @@ #include "ui_TaskPolarPatternParameters.h" #include "TaskPolarPatternParameters.h" +#include "TaskMultiTransformParameters.h" #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include "TaskMultiTransformParameters.h" using namespace PartDesignGui; using namespace Gui; @@ -64,7 +64,7 @@ TaskPolarPatternParameters::TaskPolarPatternParameters(ViewProviderTransformed * referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -87,7 +87,7 @@ TaskPolarPatternParameters::TaskPolarPatternParameters(TaskMultiTransformParamet referenceSelectionMode = false; - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -138,9 +138,9 @@ void TaskPolarPatternParameters::setupUI() void TaskPolarPatternParameters::updateUI() { - if (updateUIinProgress) + if (blockUpdate) return; - updateUIinProgress = true; + blockUpdate = true; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); @@ -180,33 +180,39 @@ void TaskPolarPatternParameters::updateUI() ui->spinAngle->setValue(angle); ui->spinOccurrences->setValue(occurrences); - updateUIinProgress = false; + blockUpdate = false; } void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { if (msg.Type == Gui::SelectionChanges::AddSelection) { + + if (strcmp(msg.pDocName, getObject()->getDocument()->getName()) != 0) + return; + std::string subName(msg.pSubName); - PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); - if (originalSelectionMode) { - App::DocumentObject* selectedObject = pcPolarPattern->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - if (originalSelected(msg)) - ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + if (originalSelected(msg)) { + ui->lineOriginal->setText(QString::fromAscii(msg.pObjectName)); } else if (referenceSelectionMode && (subName.size() > 4 && subName.substr(0,4) == "Edge")) { - std::vector axes; - axes.push_back(subName.c_str()); - pcPolarPattern->Axis.setValue(getOriginalObject(), axes); - pcPolarPattern->StdAxis.setValue(""); - - if (updateView()) - recomputeFeature(); + if (strcmp(msg.pObjectName, getSupportObject()->getNameInDocument()) != 0) + return; exitSelectionMode(); - updateUI(); + if (!blockUpdate) { + PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); + std::vector axes(1,subName); + pcPolarPattern->Axis.setValue(getSupportObject(), axes); + pcPolarPattern->StdAxis.setValue(""); + + recomputeFeature(); + updateUI(); + } + else { + ui->buttonReference->setChecked(referenceSelectionMode); + ui->lineReference->setText(QString::fromAscii(subName.c_str())); + } } } } @@ -224,43 +230,40 @@ void TaskPolarPatternParameters::onButtonZ() { } void TaskPolarPatternParameters::onCheckReverse(const bool on) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Reversed.setValue(on); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskPolarPatternParameters::onAngle(const double a) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Angle.setValue(a); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskPolarPatternParameters::onOccurrences(const int n) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->Occurrences.setValue(n); exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskPolarPatternParameters::onStdAxis(const std::string& axis) { - if (updateUIinProgress) + if (blockUpdate) return; PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); pcPolarPattern->StdAxis.setValue(axis.c_str()); @@ -268,14 +271,11 @@ void TaskPolarPatternParameters::onStdAxis(const std::string& axis) { exitSelectionMode(); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskPolarPatternParameters::onButtonReference(bool checked) { - if (updateUIinProgress) - return; if (checked ) { hideObject(); showOriginals(); @@ -289,51 +289,48 @@ void TaskPolarPatternParameters::onButtonReference(bool checked) void TaskPolarPatternParameters::onUpdateView(bool on) { - ui->buttonX->blockSignals(!on); - ui->buttonY->blockSignals(!on); - ui->buttonZ->blockSignals(!on); - ui->checkReverse->blockSignals(!on); - ui->spinAngle->blockSignals(!on); - ui->spinOccurrences->blockSignals(!on); + blockUpdate = !on; + if (on) { + // Do the same like in TaskDlgPolarPatternParameters::accept() but without doCommand + PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); + + std::string axis = getAxis(); + if (!axis.empty()) { + std::vector axes(1,axis); + pcPolarPattern->Axis.setValue(getSupportObject(),axes); + } else + pcPolarPattern->Axis.setValue(NULL); + + std::string stdAxis = getStdAxis(); + if (!stdAxis.empty()) + pcPolarPattern->StdAxis.setValue(stdAxis.c_str()); + else + pcPolarPattern->StdAxis.setValue(NULL); + + pcPolarPattern->Reversed.setValue(getReverse()); + pcPolarPattern->Angle.setValue(getAngle()); + pcPolarPattern->Occurrences.setValue(getOccurrences()); + + recomputeFeature(); + } } const std::string TaskPolarPatternParameters::getStdAxis(void) const { - std::string stdAxis; - if (ui->buttonX->isChecked()) - stdAxis = "X"; + return std::string("X"); else if (ui->buttonY->isChecked()) - stdAxis = "Y"; + return std::string("Y"); else if (ui->buttonZ->isChecked()) - stdAxis = "Z"; - - if (!stdAxis.empty()) - return std::string("\"") + stdAxis + "\""; - else - return std::string(""); + return std::string("Z"); + return std::string(""); } -const QString TaskPolarPatternParameters::getAxis(void) const +const std::string TaskPolarPatternParameters::getAxis(void) const { - PartDesign::PolarPattern* pcPolarPattern = static_cast(getObject()); - App::DocumentObject* feature = pcPolarPattern->Axis.getValue(); - if (feature == NULL) - return QString::fromUtf8(""); - std::vector axes = pcPolarPattern->Axis.getSubValues(); - QString buf; - - if ((feature != NULL) && !axes.empty()) { - buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); - buf = buf.arg(QString::fromUtf8(feature->getNameInDocument())); - buf = buf.arg(QString::fromUtf8(axes.front().c_str())); - } - else - buf = QString::fromUtf8(""); - - return buf; + return ui->lineReference->text().toStdString(); } - + const bool TaskPolarPatternParameters::getReverse(void) const { return ui->checkReverse->isChecked(); @@ -349,14 +346,6 @@ const unsigned TaskPolarPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -const bool TaskPolarPatternParameters::updateView() const -{ - if (insideMultiTransform) - return parentTask->updateView(); - else - return ui->checkBoxUpdateView->isChecked(); -} - void TaskPolarPatternParameters::exitSelectionMode() { originalSelectionMode = false; @@ -406,12 +395,16 @@ bool TaskDlgPolarPatternParameters::accept() return false; TaskPolarPatternParameters* polarpatternParameter = static_cast(parameter); - std::string axis = polarpatternParameter->getAxis().toStdString(); - if (!axis.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Axis = %s", name.c_str(), axis.c_str()); + std::string axis = polarpatternParameter->getAxis(); + if (!axis.empty()) { + QString buf = QString::fromUtf8("(App.ActiveDocument.%1,[\"%2\"])"); + buf = buf.arg(QString::fromUtf8(polarpatternParameter->getSupportObject()->getNameInDocument())); + buf = buf.arg(QString::fromUtf8(axis.c_str())); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Axis = %s", name.c_str(), buf.toStdString().c_str()); + } else + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Axis = None", name.c_str()); std::string stdAxis = polarpatternParameter->getStdAxis(); - if (!stdAxis.empty()) - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdAxis = %s",name.c_str(),stdAxis.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.StdAxis = \"%s\"",name.c_str(),stdAxis.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Reversed = %u",name.c_str(),polarpatternParameter->getReverse()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Angle = %f",name.c_str(),polarpatternParameter->getAngle()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Occurrences = %u",name.c_str(),polarpatternParameter->getOccurrences()); diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h index 19fadb9090..2c8dd8f9aa 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h @@ -56,12 +56,11 @@ public: TaskPolarPatternParameters(TaskMultiTransformParameters *parentTask, QLayout *layout); virtual ~TaskPolarPatternParameters(); - const QString getAxis(void) const; const std::string getStdAxis(void) const; + const std::string getAxis(void) const; const bool getReverse(void) const; const double getAngle(void) const; const unsigned getOccurrences(void) const; - const bool updateView() const; private Q_SLOTS: void onStdAxis(const std::string& axis); diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp index c26a731079..81caea3dc3 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.cpp @@ -29,6 +29,7 @@ #include "ui_TaskScaledParameters.h" #include "TaskScaledParameters.h" +#include "TaskMultiTransformParameters.h" #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include "TaskMultiTransformParameters.h" using namespace PartDesignGui; using namespace Gui; @@ -62,7 +62,7 @@ TaskScaledParameters::TaskScaledParameters(ViewProviderTransformed *TransformedV ui->buttonOK->hide(); ui->checkBoxUpdateView->setEnabled(true); - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -83,7 +83,7 @@ TaskScaledParameters::TaskScaledParameters(TaskMultiTransformParameters *parentT ui->lineOriginal->hide(); ui->checkBoxUpdateView->hide(); - updateUIinProgress = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! + blockUpdate = false; // Hack, sometimes it is NOT false although set to false in Transformed::Transformed()!! setupUI(); } @@ -119,8 +119,9 @@ void TaskScaledParameters::setupUI() void TaskScaledParameters::updateUI() { - if (updateUIinProgress) return; - updateUIinProgress = true; + if (blockUpdate) + return; + blockUpdate = true; PartDesign::Scaled* pcScaled = static_cast(getObject()); @@ -130,44 +131,45 @@ void TaskScaledParameters::updateUI() ui->spinFactor->setValue(factor); ui->spinOccurrences->setValue(occurrences); - updateUIinProgress = false; + blockUpdate = false; } void TaskScaledParameters::onSelectionChanged(const Gui::SelectionChanges& msg) { - PartDesign::Scaled* pcScaled = static_cast(getObject()); - App::DocumentObject* selectedObject = pcScaled->getDocument()->getActiveObject(); - if ((selectedObject == NULL) || !selectedObject->isDerivedFrom(Part::Feature::getClassTypeId())) - return; - - if (originalSelectionMode) { - if (originalSelected(msg)) - ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); + if (originalSelected(msg)) { + App::DocumentObject* selectedObject = TransformedView->getObject()->getDocument()->getActiveObject(); + ui->lineOriginal->setText(QString::fromAscii(selectedObject->getNameInDocument())); } } void TaskScaledParameters::onFactor(const double f) { - if (updateUIinProgress) return; + if (blockUpdate) + return; PartDesign::Scaled* pcScaled = static_cast(getObject()); pcScaled->Factor.setValue(f); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskScaledParameters::onOccurrences(const int n) { - if (updateUIinProgress) return; + if (blockUpdate) + return; PartDesign::Scaled* pcScaled = static_cast(getObject()); pcScaled->Occurrences.setValue(n); updateUI(); - if (updateView()) - recomputeFeature(); + recomputeFeature(); } void TaskScaledParameters::onUpdateView(bool on) { - ui->spinFactor->blockSignals(!on); - ui->spinOccurrences->blockSignals(!on); + blockUpdate = !on; + if (on) { + // Do the same like in TaskDlgScaledParameters::accept() but without doCommand + PartDesign::Scaled* pcScaled = static_cast(getObject()); + pcScaled->Factor.setValue(getFactor()); + pcScaled->Occurrences.setValue(getOccurrences()); + recomputeFeature(); + } } const double TaskScaledParameters::getFactor(void) const @@ -180,13 +182,6 @@ const unsigned TaskScaledParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -const bool TaskScaledParameters::updateView() const -{ - if (insideMultiTransform) - return parentTask->updateView(); - else - return ui->checkBoxUpdateView->isChecked(); -} TaskScaledParameters::~TaskScaledParameters() { diff --git a/src/Mod/PartDesign/Gui/TaskScaledParameters.h b/src/Mod/PartDesign/Gui/TaskScaledParameters.h index a93d2ce828..80ab2958d9 100644 --- a/src/Mod/PartDesign/Gui/TaskScaledParameters.h +++ b/src/Mod/PartDesign/Gui/TaskScaledParameters.h @@ -58,7 +58,6 @@ public: const double getFactor(void) const; const unsigned getOccurrences(void) const; - const bool updateView() const; private Q_SLOTS: void onFactor(const double f); diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 8d0e141da9..fc3b5ee7c3 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -55,7 +55,7 @@ TaskTransformedParameters::TaskTransformedParameters(ViewProviderTransformed *Tr TransformedView(TransformedView), parentTask(NULL), insideMultiTransform(false), - updateUIinProgress(false) + blockUpdate(false) { originalSelectionMode = false; } @@ -65,7 +65,7 @@ TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameter TransformedView(NULL), parentTask(parentTask), insideMultiTransform(true), - updateUIinProgress(false) + blockUpdate(false) { // Original feature selection makes no sense inside a MultiTransform originalSelectionMode = false; @@ -73,22 +73,21 @@ TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameter const bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& msg) { - if (originalSelectionMode && (msg.Type == Gui::SelectionChanges::AddSelection)) { - PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); - App::DocumentObject* selectedObject = pcTransformed->getDocument()->getActiveObject(); - if (!selectedObject->isDerivedFrom(PartDesign::Additive::getClassTypeId()) && - !selectedObject->isDerivedFrom(PartDesign::Subtractive::getClassTypeId())) - return false; - if (TransformedView->getObject() == pcTransformed) + if (msg.Type == Gui::SelectionChanges::AddSelection && originalSelectionMode) { + + if (strcmp(msg.pDocName, getObject()->getDocument()->getName()) != 0) return false; - std::vector originals = pcTransformed->Originals.getValues(); + PartDesign::Transformed* pcTransformed = getObject(); + App::DocumentObject* selectedObject = pcTransformed->getDocument()->getObject(msg.pObjectName); + if (selectedObject->isDerivedFrom(PartDesign::Additive::getClassTypeId()) || + selectedObject->isDerivedFrom(PartDesign::Subtractive::getClassTypeId())) { + + // Do the same like in TaskDlgTransformedParameters::accept() but without doCommand + std::vector originals(1,selectedObject); + pcTransformed->Originals.setValues(originals); + recomputeFeature(); - if (std::find(originals.begin(), originals.end(), selectedObject) == originals.end()) { - Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.Originals = [App.activeDocument().%s]", - getObject()->getNameInDocument(), - selectedObject->getNameInDocument() ); - Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); originalSelectionMode = false; return true; } @@ -109,8 +108,9 @@ PartDesign::Transformed *TaskTransformedParameters::getObject() const void TaskTransformedParameters::recomputeFeature() { if (insideMultiTransform) { + // redirect recompute and let the parent decide if recompute has to be blocked parentTask->recomputeFeature(); - } else { + } else if (!blockRecompute) { PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); pcTransformed->getDocument()->recomputeFeature(pcTransformed); } @@ -128,10 +128,10 @@ const std::vector TaskTransformedParameters::getOriginals( } } -App::DocumentObject* TaskTransformedParameters::getOriginalObject() const +App::DocumentObject* TaskTransformedParameters::getSupportObject() const { if (insideMultiTransform) { - return parentTask->getOriginalObject(); + return parentTask->getSupportObject(); } else { PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); return pcTransformed->getOriginalObject(); diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index 47c7968659..7636fbd820 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -59,6 +59,8 @@ public: {} const std::vector getOriginals(void) const; + /// Get the support object either of the object associated with this feature or with the parent feature (MultiTransform mode) + App::DocumentObject* getSupportObject() const; protected Q_SLOTS: @@ -71,8 +73,6 @@ protected: /// Get the TransformedFeature object associated with this task // Either through the ViewProvider or the currently active subFeature of the parentTask PartDesign::Transformed *getObject() const; - /// Get the original object either of the object associated with this feature or with the parent feature (MultiTransform mode) - App::DocumentObject* getOriginalObject() const; /// Recompute either this feature or the parent feature (MultiTransform mode) void recomputeFeature(); @@ -94,8 +94,10 @@ protected: TaskMultiTransformParameters* parentTask; /// Flag indicating whether this object is a container for MultiTransform bool insideMultiTransform; - /// Lock updateUI() so that no unnecessary recomputeFeatures() are triggered - bool updateUIinProgress; + /// Lock updateUI() and applying changes to the underlying feature + bool blockUpdate; + /// Lock recomputeFeature() + bool blockRecompute; }; /// simulation dialog for the TaskView From 05d7d0bc8bd80b43470398379729656830f2523b Mon Sep 17 00:00:00 2001 From: jrheinlaender Date: Thu, 13 Sep 2012 16:21:18 +0200 Subject: [PATCH 03/11] PartDesign: re-enable viewprovider for Scaled feature --- src/Mod/PartDesign/Gui/AppPartDesignGui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp b/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp index c4ae7118ef..a65a57e7ff 100644 --- a/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp +++ b/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp @@ -41,7 +41,7 @@ #include "ViewProviderMirrored.h" #include "ViewProviderLinearPattern.h" #include "ViewProviderPolarPattern.h" -//#include "ViewProviderScaled.h" +#include "ViewProviderScaled.h" #include "ViewProviderMultiTransform.h" //#include "resources/qrc_PartDesign.cpp" @@ -95,7 +95,7 @@ void PartDesignGuiExport initPartDesignGui() PartDesignGui::ViewProviderMirrored ::init(); PartDesignGui::ViewProviderLinearPattern ::init(); PartDesignGui::ViewProviderPolarPattern ::init(); -// PartDesignGui::ViewProviderScaled ::init(); + PartDesignGui::ViewProviderScaled ::init(); PartDesignGui::ViewProviderMultiTransform::init(); // add resources and reloads the translators From 9ec4e0b029ac96df055d2f04e070b78fa74bf3cf Mon Sep 17 00:00:00 2001 From: jrheinlaender Date: Thu, 13 Sep 2012 16:22:48 +0200 Subject: [PATCH 04/11] PartDesign: fix bug when adding transformation to MultiTransform --- .../PartDesign/Gui/TaskMultiTransformParameters.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 25635c5f36..86bb68e9d0 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -278,11 +278,12 @@ void TaskMultiTransformParameters::finishAdd(std::string &newFeatName) int row = ui->listTransformFeatures->currentIndex().row(); if (row < 0) { // 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!) hideOriginals(); } + // Insert new transformation after the selected row + // This means that in order to insert at the beginning, the user has to use "Move Up" in the menu App::DocumentObject* newFeature = pcMultiTransform->getDocument()->getObject(newFeatName.c_str()); std::vector transformFeatures = pcMultiTransform->Transformations.getValues(); if (row == ui->listTransformFeatures->model()->rowCount() - 1) { @@ -292,9 +293,10 @@ void TaskMultiTransformParameters::finishAdd(std::string &newFeatName) ui->listTransformFeatures->addItem(QString::fromAscii(newFeature->Label.getValue())); ui->listTransformFeatures->setCurrentRow(row+1, QItemSelectionModel::ClearAndSelect); } else { - transformFeatures.insert(transformFeatures.begin() + row, newFeature); - ui->listTransformFeatures->insertItem(row, QString::fromAscii(newFeature->Label.getValue())); - ui->listTransformFeatures->setCurrentRow(row, QItemSelectionModel::ClearAndSelect); + // Note: The feature tree always seems to append to the end, no matter what we say here + transformFeatures.insert(transformFeatures.begin() + row + 1, newFeature); + ui->listTransformFeatures->insertItem(row + 1, QString::fromAscii(newFeature->Label.getValue())); + ui->listTransformFeatures->setCurrentRow(row + 1, QItemSelectionModel::ClearAndSelect); } pcMultiTransform->Transformations.setValues(transformFeatures); From a42420086287c67d8baad480c320cb786f8d0047 Mon Sep 17 00:00:00 2001 From: jrheinlaender Date: Fri, 14 Sep 2012 00:16:43 +0200 Subject: [PATCH 05/11] PartDesign: make MultiTransform honour the "Update view" checkbox when adding transformations --- .../Gui/TaskMultiTransformParameters.cpp | 17 +++++++++++++---- .../Gui/TaskMultiTransformParameters.h | 1 + .../Gui/TaskTransformedParameters.cpp | 2 +- .../PartDesign/Gui/TaskTransformedParameters.h | 4 +--- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index 86bb68e9d0..b6dcd90960 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -101,6 +101,8 @@ TaskMultiTransformParameters::TaskMultiTransformParameters(ViewProviderTransform this, SLOT(onMoveDown())); ui->listTransformFeatures->addAction(action); ui->listTransformFeatures->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(ui->checkBoxUpdateView, SIGNAL(toggled(bool)), + this, SLOT(onUpdateView(bool))); connect(ui->listTransformFeatures, SIGNAL(activated(QModelIndex)), this, SLOT(onTransformActivated(QModelIndex))); @@ -214,7 +216,7 @@ void TaskMultiTransformParameters::onTransformAddMirrored() Gui::Command::openCommand("Mirrored"); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Mirrored\",\"%s\")",newFeatName.c_str()); - Gui::Command::updateActive(); + //Gui::Command::updateActive(); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdMirrorPlane = \"XY\"", newFeatName.c_str()); finishAdd(newFeatName); @@ -227,7 +229,7 @@ void TaskMultiTransformParameters::onTransformAddLinearPattern() Gui::Command::openCommand("LinearPattern"); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::LinearPattern\",\"%s\")",newFeatName.c_str()); - Gui::Command::updateActive(); + //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()); @@ -242,7 +244,7 @@ void TaskMultiTransformParameters::onTransformAddPolarPattern() Gui::Command::openCommand("PolarPattern"); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::PolarPattern\",\"%s\")",newFeatName.c_str()); - Gui::Command::updateActive(); + //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()); @@ -257,7 +259,7 @@ void TaskMultiTransformParameters::onTransformAddScaled() Gui::Command::openCommand("Scaled"); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Scaled\",\"%s\")",newFeatName.c_str()); - Gui::Command::updateActive(); + //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()); @@ -357,6 +359,13 @@ void TaskMultiTransformParameters::onSubTaskButtonOK() { closeSubTask(); } +void TaskMultiTransformParameters::onUpdateView(bool on) +{ + blockUpdate = !on; + if (on) + recomputeFeature(); +} + const std::vector TaskMultiTransformParameters::getTransformFeatures(void) const { PartDesign::MultiTransform* pcMultiTransform = static_cast(TransformedView->getObject()); diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h index 7d81e43436..d385ec328d 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.h @@ -76,6 +76,7 @@ private Q_SLOTS: virtual void onSubTaskButtonOK(); // Note: There is no Cancel button because I couldn't work out how to save the state of // a subFeature so as to revert the changes of an edit operation + virtual void onUpdateView(bool); protected: virtual void changeEvent(QEvent *e); diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index fc3b5ee7c3..2b53b150b5 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -110,7 +110,7 @@ void TaskTransformedParameters::recomputeFeature() if (insideMultiTransform) { // redirect recompute and let the parent decide if recompute has to be blocked parentTask->recomputeFeature(); - } else if (!blockRecompute) { + } else if (!blockUpdate) { PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); pcTransformed->getDocument()->recomputeFeature(pcTransformed); } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index 7636fbd820..edff128c7d 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -94,10 +94,8 @@ protected: TaskMultiTransformParameters* parentTask; /// Flag indicating whether this object is a container for MultiTransform bool insideMultiTransform; - /// Lock updateUI() and applying changes to the underlying feature + /// Lock updateUI(), applying changes to the underlying feature and calling recomputeFeature() bool blockUpdate; - /// Lock recomputeFeature() - bool blockRecompute; }; /// simulation dialog for the TaskView From e0184a9d4ba3ba61c6565698182d4257f6b2becc Mon Sep 17 00:00:00 2001 From: logari81 Date: Fri, 14 Sep 2012 12:51:59 +0200 Subject: [PATCH 06/11] PartDesign: add messages frame in the task view of Transform/Pattern features --- src/Mod/PartDesign/App/Feature.cpp | 4 +- src/Mod/PartDesign/App/Feature.h | 4 +- src/Mod/PartDesign/App/FeatureTransformed.cpp | 28 +++++--- src/Mod/PartDesign/App/FeatureTransformed.h | 15 ++-- src/Mod/PartDesign/Gui/CMakeLists.txt | 7 +- .../Gui/TaskTransformedMessages.cpp | 68 +++++++++++++++++++ .../PartDesign/Gui/TaskTransformedMessages.h | 64 +++++++++++++++++ .../PartDesign/Gui/TaskTransformedMessages.ui | 37 ++++++++++ .../Gui/TaskTransformedParameters.cpp | 12 ++-- .../Gui/TaskTransformedParameters.h | 2 + .../Gui/ViewProviderTransformed.cpp | 27 ++++++++ .../PartDesign/Gui/ViewProviderTransformed.h | 5 ++ 12 files changed, 248 insertions(+), 25 deletions(-) create mode 100644 src/Mod/PartDesign/Gui/TaskTransformedMessages.cpp create mode 100644 src/Mod/PartDesign/Gui/TaskTransformedMessages.h create mode 100644 src/Mod/PartDesign/Gui/TaskTransformedMessages.ui diff --git a/src/Mod/PartDesign/App/Feature.cpp b/src/Mod/PartDesign/App/Feature.cpp index e8ccbd849a..aa4cd3267d 100644 --- a/src/Mod/PartDesign/App/Feature.cpp +++ b/src/Mod/PartDesign/App/Feature.cpp @@ -45,7 +45,7 @@ Feature::Feature() { } -TopoDS_Shape Feature::getSolid(const TopoDS_Shape& shape) const +TopoDS_Shape Feature::getSolid(const TopoDS_Shape& shape) { if (shape.IsNull()) Standard_Failure::Raise("Shape is null"); @@ -58,7 +58,7 @@ TopoDS_Shape Feature::getSolid(const TopoDS_Shape& shape) const return TopoDS_Shape(); } -const gp_Pnt Feature::getPointFromFace(const TopoDS_Face& f) const +const gp_Pnt Feature::getPointFromFace(const TopoDS_Face& f) { if (!f.Infinite()) { TopExp_Explorer exp; diff --git a/src/Mod/PartDesign/App/Feature.h b/src/Mod/PartDesign/App/Feature.h index f3658c0db2..42c9a3173d 100644 --- a/src/Mod/PartDesign/App/Feature.h +++ b/src/Mod/PartDesign/App/Feature.h @@ -49,10 +49,10 @@ protected: /** * Get a solid of the given shape. If no solid is found an exception is raised. */ - TopoDS_Shape getSolid(const TopoDS_Shape&) const; + static TopoDS_Shape getSolid(const TopoDS_Shape&); /// Grab any point from the given face - const gp_Pnt getPointFromFace(const TopoDS_Face& f) const; + static const gp_Pnt getPointFromFace(const TopoDS_Face& f); }; diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 278f6f8666..f871f89a08 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -28,6 +28,7 @@ # include # include # include +# include # include # include # include @@ -50,7 +51,7 @@ namespace PartDesign { PROPERTY_SOURCE(PartDesign::Transformed, PartDesign::Feature) -Transformed::Transformed() +Transformed::Transformed() : rejected(0) { ADD_PROPERTY(Originals,(0)); Originals.setSize(0); @@ -58,12 +59,12 @@ Transformed::Transformed() void Transformed::positionBySupport(void) { - Part::Feature *support = static_cast(getOriginalObject()); + Part::Feature *support = static_cast(getSupportObject()); if ((support != NULL) && support->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) this->Placement.setValue(support->Placement.getValue()); } -App::DocumentObject* Transformed::getOriginalObject() const +App::DocumentObject* Transformed::getSupportObject() const { if (!Originals.getValues().empty()) return Originals.getValues().front(); @@ -80,6 +81,8 @@ short Transformed::mustExecute() const App::DocumentObjectExecReturn *Transformed::execute(void) { + rejected.clear(); + std::vector originals = Originals.getValues(); if (originals.empty()) // typically InsideMultiTransform return App::DocumentObject::StdReturn; @@ -101,10 +104,10 @@ App::DocumentObjectExecReturn *Transformed::execute(void) // NOTE: Because of the way we define the support, FeatureTransformed can only work on // one Body feature at a time // TODO: Currently, the support is simply the first Original. Change this to the Body feature later - Part::Feature* supportFeature = static_cast(originals.front()); + Part::Feature* supportFeature = static_cast(getSupportObject()); const Part::TopoShape& supportTopShape = supportFeature->Shape.getShape(); if (supportTopShape._Shape.IsNull()) - return new App::DocumentObjectExecReturn("Cannot transform invalid shape"); + return new App::DocumentObjectExecReturn("Cannot transform invalid support shape"); // create an untransformed copy of the support shape Part::TopoShape supportShape(supportTopShape); @@ -162,9 +165,10 @@ App::DocumentObjectExecReturn *Transformed::execute(void) Bnd_Box transformed_bb; BRepBndLib::Add(mkTrf.Shape(), transformed_bb); if (support_bb.Distance(transformed_bb) > Precision::Confusion()) { - Base::Console().Warning("Transformed shape does not intersect original %s: Removed\n", (*o)->getNameInDocument()); + Base::Console().Warning("Transformed shape does not intersect support %s: Removed\n", (*o)->getNameInDocument()); // Note: The removal happens in getSolid() after the fuse. If we remove here, // the histories get messed up and we get a crash + rejected.push_back(*t); } builder.Add(transformedShapes, mkTrf.Shape()); v_transformedShapes.push_back(mkTrf.Shape()); @@ -178,7 +182,7 @@ App::DocumentObjectExecReturn *Transformed::execute(void) Bnd_Box transformed_bb; BRepBndLib::Add(trfShape, transformed_bb); if (support_bb.Distance(transformed_bb) > Precision::Confusion()) { - Base::Console().Warning("Transformed shape does not intersect original %s: Removed\n", (*o)->getNameInDocument()); + Base::Console().Warning("Transformed shape does not intersect support %s: Removed\n", (*o)->getNameInDocument()); // Note: The removal happens in getSolid() after the fuse. If we remove here, // the histories get messed up and we get a crash } @@ -231,8 +235,14 @@ App::DocumentObjectExecReturn *Transformed::execute(void) result = this->getSolid(mkFuse.Shape()); // lets check if the result is a solid if (result.IsNull()) - return new App::DocumentObjectExecReturn("Transformed: Resulting shape is not a solid", *o); - + return new App::DocumentObjectExecReturn("Resulting shape is not a solid", *o); + // check if mkFuse created more than one solids + TopExp_Explorer xp; + xp.Init(mkFuse.Shape(),TopAbs_SOLID); + if (xp.More()) + xp.Next(); + if (!xp.More()) // There are no rejected transformations even + rejected.clear(); // if the bb check guessed that there would be } else { BRepAlgoAPI_Cut mkCut(support, transformedShapes); if (!mkCut.IsDone()) diff --git a/src/Mod/PartDesign/App/FeatureTransformed.h b/src/Mod/PartDesign/App/FeatureTransformed.h index 099e6dd293..6bb89f50a7 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.h +++ b/src/Mod/PartDesign/App/FeatureTransformed.h @@ -45,11 +45,12 @@ public: Transformed(); /** The shapes to be transformed - if Originals is empty the instance is just a container for storing transformation data */ + * if Originals is empty the instance is just a container for storing transformation data + */ App::PropertyLinkList Originals; /// Return first original, which serves as "Support" until Body feature becomes functional - App::DocumentObject* getOriginalObject() const; + App::DocumentObject* getSupportObject() const; /// Get the list of transformations describing the members of the pattern // Note: Only the Scaled feature requires the originals @@ -72,11 +73,13 @@ public: void positionBySupport(void); + /** returns a list of the transformations that where rejected during the last execute + * because they did not ovelap with the support + */ + const std::list getRejectedTransformations(void) { return rejected; } + protected: - void buildTransformHistory(BRepBuilderAPI_MakeShape& mkFuse, - const TopoDS_Shape& newShape, - const TopoDS_Shape& oldShape, - const int index); + std::list rejected; }; } //namespace PartDesign diff --git a/src/Mod/PartDesign/Gui/CMakeLists.txt b/src/Mod/PartDesign/Gui/CMakeLists.txt index 97b9b8e5f2..07d2bfe022 100644 --- a/src/Mod/PartDesign/Gui/CMakeLists.txt +++ b/src/Mod/PartDesign/Gui/CMakeLists.txt @@ -32,6 +32,7 @@ set(PartDesignGui_MOC_HDRS TaskHoleParameters.h TaskRevolutionParameters.h TaskGrooveParameters.h + TaskTransformedMessages.h TaskTransformedParameters.h TaskMirroredParameters.h TaskLinearPatternParameters.h @@ -52,6 +53,7 @@ set(PartDesignGui_UIC_SRCS TaskHoleParameters.ui TaskRevolutionParameters.ui TaskGrooveParameters.ui + TaskTransformedMessages.ui TaskMirroredParameters.ui TaskLinearPatternParameters.ui TaskPolarPatternParameters.ui @@ -111,8 +113,11 @@ SET(PartDesignGuiTaskDlgs_SRCS TaskGrooveParameters.ui TaskGrooveParameters.cpp TaskGrooveParameters.h - TaskTransformedParameters.h + TaskTransformedMessages.ui + TaskTransformedMessages.cpp + TaskTransformedMessages.h TaskTransformedParameters.cpp + TaskTransformedParameters.h TaskMirroredParameters.ui TaskMirroredParameters.cpp TaskMirroredParameters.h diff --git a/src/Mod/PartDesign/Gui/TaskTransformedMessages.cpp b/src/Mod/PartDesign/Gui/TaskTransformedMessages.cpp new file mode 100644 index 0000000000..2c15ec528c --- /dev/null +++ b/src/Mod/PartDesign/Gui/TaskTransformedMessages.cpp @@ -0,0 +1,68 @@ +/*************************************************************************** + * Copyright (c) 2012 Jürgen Riegel * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" + +#ifndef _PreComp_ +#endif + +#include "ui_TaskTransformedMessages.h" +#include "TaskTransformedMessages.h" +#include +#include +#include + +#include + +#include "ViewProviderTransformed.h" + +using namespace PartDesignGui; +using namespace Gui::TaskView; + +TaskTransformedMessages::TaskTransformedMessages(ViewProviderTransformed *transformedView_) + : TaskBox(Gui::BitmapFactory().pixmap("document-new"),tr("Transformed feature messages"),true, 0), + transformedView(transformedView_) +{ + // we need a separate container widget to add all controls to + proxy = new QWidget(this); + ui = new Ui_TaskTransformedMessages(); + ui->setupUi(proxy); + QMetaObject::connectSlotsByName(this); + + this->groupLayout()->addWidget(proxy); + + connectionDiagnosis = transformedView->signalDiagnosis.connect(boost::bind(&PartDesignGui::TaskTransformedMessages::slotDiagnosis, this,_1)); +} + +TaskTransformedMessages::~TaskTransformedMessages() +{ + connectionDiagnosis.disconnect(); + delete ui; +} + +void TaskTransformedMessages::slotDiagnosis(QString msg) +{ + ui->labelTransformationStatus->setText(msg); +} + +#include "moc_TaskTransformedMessages.cpp" diff --git a/src/Mod/PartDesign/Gui/TaskTransformedMessages.h b/src/Mod/PartDesign/Gui/TaskTransformedMessages.h new file mode 100644 index 0000000000..afeadb31e9 --- /dev/null +++ b/src/Mod/PartDesign/Gui/TaskTransformedMessages.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (c) 2012 Jürgen Riegel * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#ifndef GUI_TASKVIEW_TaskTransformedMessages_H +#define GUI_TASKVIEW_TaskTransformedMessages_H + +#include +#include + +class Ui_TaskTransformedMessages; +typedef boost::signals::connection Connection; + +namespace App { +class Property; +} + +namespace PartDesignGui { + +class ViewProviderTransformed; + +class TaskTransformedMessages : public Gui::TaskView::TaskBox +{ + Q_OBJECT + +public: + TaskTransformedMessages(ViewProviderTransformed *transformedView); + ~TaskTransformedMessages(); + + void slotDiagnosis(QString msg); + +private Q_SLOTS: + +protected: + ViewProviderTransformed *transformedView; + Connection connectionDiagnosis; + +private: + QWidget* proxy; + Ui_TaskTransformedMessages* ui; +}; + +} //namespace PartDesignGui + +#endif // GUI_TASKVIEW_TaskTransformedMessages_H diff --git a/src/Mod/PartDesign/Gui/TaskTransformedMessages.ui b/src/Mod/PartDesign/Gui/TaskTransformedMessages.ui new file mode 100644 index 0000000000..203f4577b9 --- /dev/null +++ b/src/Mod/PartDesign/Gui/TaskTransformedMessages.ui @@ -0,0 +1,37 @@ + + + TaskTransformedMessages + + + + 0 + 0 + 228 + 89 + + + + Form + + + + + + + Bitstream Charter + 9 + + + + No message + + + true + + + + + + + + diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 2b53b150b5..8d6123530c 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -111,8 +111,7 @@ void TaskTransformedParameters::recomputeFeature() // redirect recompute and let the parent decide if recompute has to be blocked parentTask->recomputeFeature(); } else if (!blockUpdate) { - PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); - pcTransformed->getDocument()->recomputeFeature(pcTransformed); + TransformedView->recomputeFeature(); } } @@ -134,7 +133,7 @@ App::DocumentObject* TaskTransformedParameters::getSupportObject() const return parentTask->getSupportObject(); } else { PartDesign::Transformed* pcTransformed = static_cast(TransformedView->getObject()); - return pcTransformed->getOriginalObject(); + return pcTransformed->getSupportObject(); } } @@ -186,10 +185,13 @@ void TaskTransformedParameters::showOriginals() // TaskDialog //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -TaskDlgTransformedParameters::TaskDlgTransformedParameters(ViewProviderTransformed *TransformedView) - : TaskDialog(),TransformedView(TransformedView) +TaskDlgTransformedParameters::TaskDlgTransformedParameters(ViewProviderTransformed *TransformedView_) + : TaskDialog(), TransformedView(TransformedView_) { assert(TransformedView); + message = new TaskTransformedMessages(TransformedView); + + Content.push_back(message); } //==== calls from the TaskView =============================================================== diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index edff128c7d..a531de4f8a 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -28,6 +28,7 @@ #include #include +#include "TaskTransformedMessages.h" #include "ViewProviderTransformed.h" namespace PartDesign { @@ -133,6 +134,7 @@ protected: ViewProviderTransformed *TransformedView; TaskTransformedParameters *parameter; + TaskTransformedMessages *message; }; } //namespace PartDesignGui diff --git a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp index d413a83729..9efe20aa41 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp @@ -112,3 +112,30 @@ const bool ViewProviderTransformed::checkDlgOpen(TaskDlgTransformedParameters* t // Continue (usually in virtual method setEdit()) return true; } + +void ViewProviderTransformed::recomputeFeature(void) +{ + PartDesign::Transformed* pcTransformed = static_cast(getObject()); + pcTransformed->getDocument()->recomputeFeature(pcTransformed); + const std::vector log = pcTransformed->getDocument()->getRecomputeLog(); + unsigned rejected = pcTransformed->getRejectedTransformations().size(); + QString msg = QString::fromAscii("%1"); + if (rejected > 0) { + msg = QString::fromLatin1("%1
\r\n%2"); + if (rejected == 1) + msg = msg.arg(QObject::tr("One transformed shape does not intersect support")); + else { + msg = msg.arg(QObject::tr("%1 transformed shapes do not intersect support")); + msg = msg.arg(rejected); + } + } + if (log.size() > 0) { + msg = msg.arg(QString::fromLatin1("%1
")); + msg = msg.arg(QString::fromStdString(log.back()->Why)); + } else { + msg = msg.arg(QString::fromLatin1("%1
")); + msg = msg.arg(QObject::tr("Transformation succeeded")); + } + signalDiagnosis(msg); +} + diff --git a/src/Mod/PartDesign/Gui/ViewProviderTransformed.h b/src/Mod/PartDesign/Gui/ViewProviderTransformed.h index 4a29865ee4..39b7b099cf 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderTransformed.h +++ b/src/Mod/PartDesign/Gui/ViewProviderTransformed.h @@ -48,6 +48,9 @@ public: virtual bool onDelete(const std::vector &); + /// signals if the transformation contains errors + boost::signal signalDiagnosis; + // The feature name of the subclass std::string featureName; @@ -56,6 +59,8 @@ protected: virtual void unsetEdit(int ModNum); const bool checkDlgOpen(TaskDlgTransformedParameters* transformedDlg); +public: + void recomputeFeature(); }; From 4091b661b4bca9ff88785f7e62d93569c1ea77af Mon Sep 17 00:00:00 2001 From: logari81 Date: Sat, 15 Sep 2012 08:14:36 +0200 Subject: [PATCH 07/11] PartDesign: use selection filter gate for picking references for pattern/transform features --- .../Gui/TaskLinearPatternParameters.cpp | 9 +--- .../Gui/TaskLinearPatternParameters.h | 3 -- .../PartDesign/Gui/TaskMirroredParameters.cpp | 9 +--- .../PartDesign/Gui/TaskMirroredParameters.h | 3 -- .../Gui/TaskPolarPatternParameters.cpp | 9 +--- .../Gui/TaskPolarPatternParameters.h | 3 -- .../Gui/TaskTransformedParameters.cpp | 51 +++++++++++++++++++ .../Gui/TaskTransformedParameters.h | 4 ++ 8 files changed, 58 insertions(+), 33 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index ef73505fc3..bea2229bb5 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -284,6 +284,7 @@ void TaskLinearPatternParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(true, true); } else { exitSelectionMode(); } @@ -349,14 +350,6 @@ const unsigned TaskLinearPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -void TaskLinearPatternParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskLinearPatternParameters::~TaskLinearPatternParameters() { diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h index 28a82b5f8a..b351f59b0e 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.h @@ -77,12 +77,9 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskLinearPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index ec1cf67204..ec4dd414ec 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -230,6 +230,7 @@ void TaskMirroredParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(false, true); } else { exitSelectionMode(); } @@ -276,15 +277,7 @@ const std::string TaskMirroredParameters::getMirrorPlane(void) const return ui->lineReference->text().toStdString(); } -void TaskMirroredParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskMirroredParameters::~TaskMirroredParameters() { delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h index caa4109241..ec9fd210f4 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.h +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.h @@ -71,13 +71,10 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void onStdMirrorPlane(const std::string& plane); void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskMirroredParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index f218522a24..0c5e0750a2 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -281,6 +281,7 @@ void TaskPolarPatternParameters::onButtonReference(bool checked) showOriginals(); referenceSelectionMode = true; Gui::Selection().clearSelection(); + addReferenceSelectionGate(true, false); } else { exitSelectionMode(); } @@ -346,14 +347,6 @@ const unsigned TaskPolarPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } -void TaskPolarPatternParameters::exitSelectionMode() -{ - originalSelectionMode = false; - referenceSelectionMode = false; - showObject(); - hideOriginals(); -} - TaskPolarPatternParameters::~TaskPolarPatternParameters() { diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h index 2c8dd8f9aa..6b06f10a61 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.h @@ -77,12 +77,9 @@ protected: virtual void changeEvent(QEvent *e); virtual void onSelectionChanged(const Gui::SelectionChanges& msg); - bool referenceSelectionMode; - private: void setupUI(); void updateUI(); - void exitSelectionMode(); private: Ui_TaskPolarPatternParameters* ui; diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 8d6123530c..83952dcfcc 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -24,6 +24,10 @@ #ifndef _PreComp_ # include +# include +# include +# include +# include #endif #include "TaskTransformedParameters.h" @@ -179,6 +183,53 @@ void TaskTransformedParameters::showOriginals() } } +void TaskTransformedParameters::exitSelectionMode() +{ + originalSelectionMode = false; + referenceSelectionMode = false; + Gui::Selection().rmvSelectionGate(); + showObject(); + hideOriginals(); +} + +class ReferenceSelection : public Gui::SelectionFilterGate +{ + const App::DocumentObject* support; + bool edge, plane; +public: + ReferenceSelection(const App::DocumentObject* support_, bool edge_, bool plane_) + : Gui::SelectionFilterGate((Gui::SelectionFilter*)0), + support(support_), edge(edge_), plane(plane_) + { + } + bool allow(App::Document* pDoc, App::DocumentObject* pObj, const char* sSubName) + { + if (!sSubName || sSubName[0] == '\0') + return false; + if (pObj != support) + return false; + std::string subName(sSubName); + if (edge && subName.size() > 4 && subName.substr(0,4) == "Edge") + return true; + if (plane && subName.size() > 4 && subName.substr(0,4) == "Face") { + const Part::TopoShape &shape = static_cast(support)->Shape.getValue(); + TopoDS_Shape sh = shape.getSubShape(subName.c_str()); + const TopoDS_Face& face = TopoDS::Face(sh); + if (!face.IsNull()) { + BRepAdaptor_Surface adapt(face); + if (adapt.GetType() == GeomAbs_Plane) + return true; + } + } + return false; + } +}; + +void TaskTransformedParameters::addReferenceSelectionGate(bool edge, bool face) +{ + Gui::Selection().addSelectionGate(new ReferenceSelection(getSupportObject(), edge, face)); +} + //************************************************************************** //************************************************************************** diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index a531de4f8a..53b7206ad0 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -81,7 +81,9 @@ protected: void showObject(); void hideOriginals(); void showOriginals(); + void exitSelectionMode(); + void addReferenceSelectionGate(bool edge, bool face); protected: virtual void changeEvent(QEvent *e) = 0; virtual void onSelectionChanged(const Gui::SelectionChanges& msg) = 0; @@ -89,7 +91,9 @@ protected: protected: QWidget* proxy; ViewProviderTransformed *TransformedView; + bool originalSelectionMode; + bool referenceSelectionMode; /// The MultiTransform parent task of this task TaskMultiTransformParameters* parentTask; From c1449e4f6df8997e5cb2540081cdf049074a7d99 Mon Sep 17 00:00:00 2001 From: jrheinlaender Date: Sat, 15 Sep 2012 09:20:51 +0200 Subject: [PATCH 08/11] PartDesign: list original feature candidates for creation of transformed features if current selection is not valid --- src/Mod/PartDesign/Gui/CMakeLists.txt | 5 + src/Mod/PartDesign/Gui/Command.cpp | 178 +++++++++++++------ src/Mod/PartDesign/Gui/FeaturePickDialog.cpp | 75 ++++++++ src/Mod/PartDesign/Gui/FeaturePickDialog.h | 55 ++++++ src/Mod/PartDesign/Gui/FeaturePickDialog.ui | 67 +++++++ 5 files changed, 325 insertions(+), 55 deletions(-) create mode 100644 src/Mod/PartDesign/Gui/FeaturePickDialog.cpp create mode 100644 src/Mod/PartDesign/Gui/FeaturePickDialog.h create mode 100644 src/Mod/PartDesign/Gui/FeaturePickDialog.ui diff --git a/src/Mod/PartDesign/Gui/CMakeLists.txt b/src/Mod/PartDesign/Gui/CMakeLists.txt index 07d2bfe022..fb518372f5 100644 --- a/src/Mod/PartDesign/Gui/CMakeLists.txt +++ b/src/Mod/PartDesign/Gui/CMakeLists.txt @@ -25,6 +25,7 @@ set(PartDesignGui_LIBS ) set(PartDesignGui_MOC_HDRS + FeaturePickDialog.h TaskPadParameters.h TaskPocketParameters.h TaskChamferParameters.h @@ -46,6 +47,7 @@ SOURCE_GROUP("Moc" FILES ${PartDesignGui_MOC_SRCS}) qt4_add_resources(PartDesignGui_SRCS Resources/PartDesign.qrc) set(PartDesignGui_UIC_SRCS + FeaturePickDialog.ui TaskPadParameters.ui TaskPocketParameters.ui TaskChamferParameters.ui @@ -95,6 +97,9 @@ SET(PartDesignGuiViewProvider_SRCS SOURCE_GROUP("ViewProvider" FILES ${PartDesignGuiViewProvider_SRCS}) SET(PartDesignGuiTaskDlgs_SRCS + FeaturePickDialog.ui + FeaturePickDialog.cpp + FeaturePickDialog.h TaskPadParameters.ui TaskPadParameters.cpp TaskPadParameters.h diff --git a/src/Mod/PartDesign/Gui/Command.cpp b/src/Mod/PartDesign/Gui/Command.cpp index 39280f05f8..81c3be3062 100644 --- a/src/Mod/PartDesign/Gui/Command.cpp +++ b/src/Mod/PartDesign/Gui/Command.cpp @@ -52,6 +52,8 @@ using namespace std; +#include "FeaturePickDialog.h" + //=========================================================================== // Part_Pad //=========================================================================== @@ -717,14 +719,27 @@ CmdPartDesignMirrored::CmdPartDesignMirrored() void CmdPartDesignMirrored::activated(int iMsg) { - std::vector selection = getSelection().getSelectionEx(); - - if (selection.size() != 1 || - (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && - !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select only one additive or subtractive feature, please.")); - return; + // Get a valid original from the user + // First check selections + std::vector features = getSelection().getObjectsOfType(PartDesign::Additive::getClassTypeId()); + std::vector subtractive = getSelection().getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + // Next create a list of all eligible objects + if (features.size() == 0) { + features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); + subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + if (features.size() == 0) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), + QObject::tr("Please create a subtractive or additive feature first, please")); + return; + } + } + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected } std::string FeatName = getUniqueObjectName("Mirrored"); @@ -732,9 +747,9 @@ void CmdPartDesignMirrored::activated(int iMsg) std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ - str << "App.activeDocument()." << it->getFeatName() << ","; - tempSelNames.push_back(it->getFeatName()); + for (std::vector::iterator it = features.begin(); it != features.end(); ++it){ + str << "App.activeDocument()." << (*it)->getNameInDocument() << ","; + tempSelNames.push_back((*it)->getNameInDocument()); } str << "]"; @@ -779,24 +794,38 @@ CmdPartDesignLinearPattern::CmdPartDesignLinearPattern() void CmdPartDesignLinearPattern::activated(int iMsg) { - std::vector selection = getSelection().getSelectionEx(); + // Get a valid original from the user + // First check selections + std::vector features = getSelection().getObjectsOfType(PartDesign::Additive::getClassTypeId()); + std::vector subtractive = getSelection().getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + // Next create a list of all eligible objects + if (features.size() == 0) { + features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); + subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + if (features.size() == 0) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), + QObject::tr("Please create a subtractive or additive feature first, please")); + return; + } + } + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } - if (selection.size() != 1 || - (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && - !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select only one additive or subtractive feature, please.")); - return; - } std::string FeatName = getUniqueObjectName("LinearPattern"); std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ - str << "App.activeDocument()." << it->getFeatName() << ","; - tempSelNames.push_back(it->getFeatName()); + for (std::vector::iterator it = features.begin(); it != features.end(); ++it){ + str << "App.activeDocument()." << (*it)->getNameInDocument() << ","; + tempSelNames.push_back((*it)->getNameInDocument()); } str << "]"; @@ -841,14 +870,27 @@ CmdPartDesignPolarPattern::CmdPartDesignPolarPattern() void CmdPartDesignPolarPattern::activated(int iMsg) { - std::vector selection = getSelection().getSelectionEx(); - - if (selection.size() != 1 || - (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && - !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select only one additive or subtractive feature, please.")); - return; + // Get a valid original from the user + // First check selections + std::vector features = getSelection().getObjectsOfType(PartDesign::Additive::getClassTypeId()); + std::vector subtractive = getSelection().getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + // Next create a list of all eligible objects + if (features.size() == 0) { + features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); + subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + if (features.size() == 0) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), + QObject::tr("Please create a subtractive or additive feature first, please")); + return; + } + } + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected } std::string FeatName = getUniqueObjectName("PolarPattern"); @@ -856,9 +898,9 @@ void CmdPartDesignPolarPattern::activated(int iMsg) std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ - str << "App.activeDocument()." << it->getFeatName() << ","; - tempSelNames.push_back(it->getFeatName()); + for (std::vector::iterator it = features.begin(); it != features.end(); ++it){ + str << "App.activeDocument()." << (*it)->getNameInDocument() << ","; + tempSelNames.push_back((*it)->getNameInDocument()); } str << "]"; @@ -903,14 +945,27 @@ CmdPartDesignScaled::CmdPartDesignScaled() void CmdPartDesignScaled::activated(int iMsg) { - std::vector selection = getSelection().getSelectionEx(); - - if (selection.size() != 1 || - (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && - !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select only one additive or subtractive feature, please.")); - return; + // Get a valid original from the user + // First check selections + std::vector features = getSelection().getObjectsOfType(PartDesign::Additive::getClassTypeId()); + std::vector subtractive = getSelection().getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + // Next create a list of all eligible objects + if (features.size() == 0) { + features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); + subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + if (features.size() == 0) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), + QObject::tr("Please create a subtractive or additive feature first, please")); + return; + } + } + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected } std::string FeatName = getUniqueObjectName("Scaled"); @@ -918,9 +973,9 @@ void CmdPartDesignScaled::activated(int iMsg) std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ - str << "App.activeDocument()." << it->getFeatName() << ","; - tempSelNames.push_back(it->getFeatName()); + for (std::vector::iterator it = features.begin(); it != features.end(); ++it){ + str << "App.activeDocument()." << (*it)->getNameInDocument() << ","; + tempSelNames.push_back((*it)->getNameInDocument()); } str << "]"; @@ -964,14 +1019,27 @@ CmdPartDesignMultiTransform::CmdPartDesignMultiTransform() void CmdPartDesignMultiTransform::activated(int iMsg) { - std::vector selection = getSelection().getSelectionEx(); - - if (selection.size() != 1 || - (!selection[0].isObjectTypeOf(PartDesign::Additive::getClassTypeId()) && - !selection[0].isObjectTypeOf(PartDesign::Subtractive::getClassTypeId()))) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select only one additive or subtractive feature, please.")); - return; + // Get a valid original from the user + // First check selections + std::vector features = getSelection().getObjectsOfType(PartDesign::Additive::getClassTypeId()); + std::vector subtractive = getSelection().getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + // Next create a list of all eligible objects + if (features.size() == 0) { + features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); + subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); + features.insert(features.end(), subtractive.begin(), subtractive.end()); + if (features.size() == 0) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), + QObject::tr("Please create a subtractive or additive feature first, please")); + return; + } + } + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected } std::string FeatName = getUniqueObjectName("MultiTransform"); @@ -979,9 +1047,9 @@ void CmdPartDesignMultiTransform::activated(int iMsg) std::stringstream str; std::vector tempSelNames; str << "App.activeDocument()." << FeatName << ".Originals = ["; - for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it){ - str << "App.activeDocument()." << it->getFeatName() << ","; - tempSelNames.push_back(it->getFeatName()); + for (std::vector::iterator it = features.begin(); it != features.end(); ++it){ + str << "App.activeDocument()." << (*it)->getNameInDocument() << ","; + tempSelNames.push_back((*it)->getNameInDocument()); } str << "]"; diff --git a/src/Mod/PartDesign/Gui/FeaturePickDialog.cpp b/src/Mod/PartDesign/Gui/FeaturePickDialog.cpp new file mode 100644 index 0000000000..2b95e6f83a --- /dev/null +++ b/src/Mod/PartDesign/Gui/FeaturePickDialog.cpp @@ -0,0 +1,75 @@ +/****************************************************************************** + * Copyright (c)2012 Jan Rheinlaender * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ******************************************************************************/ + +#include "PreCompiled.h" + +#ifndef _PreComp_ +# include +# include +# include +#endif + +#include +#include +#include +#include +#include + +#include "ui_FeaturePickDialog.h" +#include "FeaturePickDialog.h" + +using namespace PartDesignGui; + +FeaturePickDialog::FeaturePickDialog(std::vector& objects) + : QDialog(Gui::getMainWindow()), ui(new Ui_FeaturePickDialog) +{ + ui->setupUi(this); + for (std::vector::const_iterator o = objects.begin(); o != objects.end(); o++) + ui->listWidget->addItem(QString::fromAscii((*o)->getNameInDocument())); +} + +FeaturePickDialog::~FeaturePickDialog() +{ + +} + +std::vector FeaturePickDialog::getFeatures() { + std::vector result; + + for (std::vector::const_iterator s = features.begin(); s != features.end(); s++) + result.push_back(App::GetApplication().getActiveDocument()->getObject(s->toAscii().data())); + + return result; +} + + + +void FeaturePickDialog::accept() +{ + features.clear(); + QListIterator i(ui->listWidget->selectedItems()); + while (i.hasNext()) + features.push_back(i.next()->text()); + + QDialog::accept(); +} +#include "moc_FeaturePickDialog.cpp" diff --git a/src/Mod/PartDesign/Gui/FeaturePickDialog.h b/src/Mod/PartDesign/Gui/FeaturePickDialog.h new file mode 100644 index 0000000000..c8569d2a2d --- /dev/null +++ b/src/Mod/PartDesign/Gui/FeaturePickDialog.h @@ -0,0 +1,55 @@ +/****************************************************************************** + * Copyright (c)2012 Jan Rheinlaender * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ******************************************************************************/ + +#ifndef PARTDESIGNGUI_FeaturePickDialog_H +#define PARTDESIGNGUI_FeaturePickDialog_H + +#include +#include +#include + +namespace PartDesignGui { + +class Ui_FeaturePickDialog; +class FeaturePickDialog : public QDialog +{ + Q_OBJECT + +public: + FeaturePickDialog(std::vector &objects); + ~FeaturePickDialog(); + + std::vector getFeatures(); + + void accept(); + +protected Q_SLOTS: + +private: + Ui_FeaturePickDialog* ui; + + std::vector features; +}; + +} + +#endif // PARTDESIGNGUI_FeaturePickDialog_H diff --git a/src/Mod/PartDesign/Gui/FeaturePickDialog.ui b/src/Mod/PartDesign/Gui/FeaturePickDialog.ui new file mode 100644 index 0000000000..22e1193850 --- /dev/null +++ b/src/Mod/PartDesign/Gui/FeaturePickDialog.ui @@ -0,0 +1,67 @@ + + + PartDesignGui::FeaturePickDialog + + + + 0 + 0 + 218 + 235 + + + + Choose feature + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + PartDesignGui::FeaturePickDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PartDesignGui::FeaturePickDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + From 41dcb75c1e2793013eaffdb64d2e6e17c5ae7fb1 Mon Sep 17 00:00:00 2001 From: logari81 Date: Sat, 15 Sep 2012 10:12:33 +0200 Subject: [PATCH 09/11] PartDesign: exit selection mode when closing a MultiTrasnform subtask and small space improvements --- .../Gui/TaskMultiTransformParameters.cpp | 1 + .../Gui/TaskMultiTransformParameters.ui | 24 +++++++------------ 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index b6dcd90960..c581054fd9 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -153,6 +153,7 @@ void TaskMultiTransformParameters::onSelectionChanged(const Gui::SelectionChange void TaskMultiTransformParameters::closeSubTask() { if (subTask) { + exitSelectionMode(); disconnect(ui->checkBoxUpdateView, 0, subTask, 0); delete subTask; subTask = NULL; diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui index d8d2ced3f5..ad44059e69 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.ui @@ -7,7 +7,7 @@ 0 0 225 - 559 + 182 @@ -36,7 +36,14 @@ - + + + + 16777215 + 80 + + + @@ -48,19 +55,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - From 46bc4ded9ab9a82b9f8587a976cb79a4cc207282 Mon Sep 17 00:00:00 2001 From: logari81 Date: Mon, 17 Sep 2012 16:28:34 +0200 Subject: [PATCH 10/11] PartDesign: avoid selecting origin for transformed features silently --- src/Mod/PartDesign/Gui/Command.cpp | 66 ++++++++++++++---------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/src/Mod/PartDesign/Gui/Command.cpp b/src/Mod/PartDesign/Gui/Command.cpp index 81c3be3062..cd584a3f0a 100644 --- a/src/Mod/PartDesign/Gui/Command.cpp +++ b/src/Mod/PartDesign/Gui/Command.cpp @@ -729,18 +729,17 @@ void CmdPartDesignMirrored::activated(int iMsg) features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); features.insert(features.end(), subtractive.begin(), subtractive.end()); - if (features.size() == 0) { + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), QObject::tr("Please create a subtractive or additive feature first, please")); return; } } - // If there is more than one selected or eligible object, show dialog and let user pick one - if (features.size() > 1) { - PartDesignGui::FeaturePickDialog Dlg(features); - if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) - return; // Cancelled or nothing selected - } std::string FeatName = getUniqueObjectName("Mirrored"); @@ -804,19 +803,17 @@ void CmdPartDesignLinearPattern::activated(int iMsg) features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); features.insert(features.end(), subtractive.begin(), subtractive.end()); - if (features.size() == 0) { + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), QObject::tr("Please create a subtractive or additive feature first, please")); return; } } - // If there is more than one selected or eligible object, show dialog and let user pick one - if (features.size() > 1) { - PartDesignGui::FeaturePickDialog Dlg(features); - if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) - return; // Cancelled or nothing selected - } - std::string FeatName = getUniqueObjectName("LinearPattern"); @@ -880,18 +877,17 @@ void CmdPartDesignPolarPattern::activated(int iMsg) features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); features.insert(features.end(), subtractive.begin(), subtractive.end()); - if (features.size() == 0) { + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), QObject::tr("Please create a subtractive or additive feature first, please")); return; } } - // If there is more than one selected or eligible object, show dialog and let user pick one - if (features.size() > 1) { - PartDesignGui::FeaturePickDialog Dlg(features); - if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) - return; // Cancelled or nothing selected - } std::string FeatName = getUniqueObjectName("PolarPattern"); @@ -955,18 +951,17 @@ void CmdPartDesignScaled::activated(int iMsg) features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); features.insert(features.end(), subtractive.begin(), subtractive.end()); - if (features.size() == 0) { + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), QObject::tr("Please create a subtractive or additive feature first, please")); return; } } - // If there is more than one selected or eligible object, show dialog and let user pick one - if (features.size() > 1) { - PartDesignGui::FeaturePickDialog Dlg(features); - if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) - return; // Cancelled or nothing selected - } std::string FeatName = getUniqueObjectName("Scaled"); @@ -1029,18 +1024,17 @@ void CmdPartDesignMultiTransform::activated(int iMsg) features = getDocument()->getObjectsOfType(PartDesign::Additive::getClassTypeId()); subtractive = getDocument()->getObjectsOfType(PartDesign::Subtractive::getClassTypeId()); features.insert(features.end(), subtractive.begin(), subtractive.end()); - if (features.size() == 0) { + // If there is more than one selected or eligible object, show dialog and let user pick one + if (features.size() > 1) { + PartDesignGui::FeaturePickDialog Dlg(features); + if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) + return; // Cancelled or nothing selected + } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid features in this document"), QObject::tr("Please create a subtractive or additive feature first, please")); return; } } - // If there is more than one selected or eligible object, show dialog and let user pick one - if (features.size() > 1) { - PartDesignGui::FeaturePickDialog Dlg(features); - if ((Dlg.exec() != QDialog::Accepted) || (features = Dlg.getFeatures()).empty()) - return; // Cancelled or nothing selected - } std::string FeatName = getUniqueObjectName("MultiTransform"); From 38ffa16faee9bffb11abff9fd6891b934967d9b6 Mon Sep 17 00:00:00 2001 From: logari81 Date: Tue, 18 Sep 2012 12:15:22 +0200 Subject: [PATCH 11/11] PartDesign: fix offering transformed tools in the task panel --- src/Mod/PartDesign/Gui/Workbench.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index bbb6494208..40c1bf9880 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -103,10 +103,10 @@ void Workbench::activated() "PartDesign_MultiTransform", 0}; Watcher.push_back(new Gui::TaskView::TaskWatcherCommands( - "SELECT Part::Feature", + "SELECT PartDesign::SketchBased", Transformed, "Transformation tools", - "PartDesign_Mirrored" + "PartDesign_MultiTransform" )); const char* Empty[] = {