diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp index dbac0057ff..c4acc7764a 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp @@ -49,6 +49,7 @@ #include "ui_TaskFemConstraintFluidBoundary.h" #include "TaskFemConstraintFluidBoundary.h" +#include #include #include #include @@ -551,62 +552,64 @@ void TaskFemConstraintFluidBoundary::onReferenceDeleted() { TaskFemConstraintFluidBoundary::removeFromSelection(); //On right-click face is automatically selected, so just remove } -void TaskFemConstraintFluidBoundary::onButtonDirection(const bool pressed) { +void TaskFemConstraintFluidBoundary::onButtonDirection(const bool pressed) +{ // sets the normal vector of the currently selecteed planar face as direction Q_UNUSED(pressed) //get vector of selected objects of active document std::vector selection = Gui::Selection().getSelectionEx(); if (selection.size() == 0) { - QMessageBox::warning(this, tr("Selection error"), tr("Nothing selected!")); + QMessageBox::warning(this, tr("Empty selection"), tr("Select an edge or a face, please.")); return; } Fem::ConstraintFluidBoundary* pcConstraint = static_cast(ConstraintView->getObject()); // we only handle the first selected object - std::vector::iterator selectionElement = selection.begin(); - std::string TypeName = static_cast(selectionElement->getTypeName()); + Gui::SelectionObject& selectionElement = selection.at(0); // we can only handle part objects - if (TypeName.substr(0, 4).compare(std::string("Part")) != 0) { - QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); + if (!selectionElement.isObjectTypeOf(Part::Feature::getClassTypeId())) { + QMessageBox::warning(this, tr("Wrong selection"), tr("Selected object is not a part object!")); return; } // get the names of the subobjects - std::vector subNames = selectionElement->getSubNames(); + const std::vector& subNames = selectionElement.getSubNames(); - if (subNames.size() > 1) { - QMessageBox::warning(this, tr("Selection error"), tr("Only one planar face or edge can be selected!")); + if (subNames.size() != 1) { + QMessageBox::warning(this, tr("Wrong selection"), tr("Only one planar face or edge can be selected!")); return; } + // we are now sure we only have one object std::string subNamesElement = subNames[0]; // vector for the direction std::vector direction(1, subNamesElement); - App::DocumentObject* obj = ConstraintView->getObject()->getDocument()->getObject(selectionElement->getFeatName()); - Part::Feature* feat = static_cast(obj); + Part::Feature* feat = static_cast(selectionElement.getObject()); TopoDS_Shape ref = feat->Shape.getShape().getSubShape(subNamesElement.c_str()); if (subNamesElement.substr(0, 4) == "Face") { if (!Fem::Tools::isPlanar(TopoDS::Face(ref))) { - QMessageBox::warning(this, tr("Selection error"), tr("Only planar faces can be picked for 3D")); + QMessageBox::warning(this, tr("Wrong selection"), tr("Only planar faces can be picked for 3D")); return; } } else if (subNamesElement.substr(0, 4) == "Edge") { // 2D or 3D can use edge as direction vector if (!Fem::Tools::isLinear(TopoDS::Edge(ref))) { - QMessageBox::warning(this, tr("Selection error"), tr("Only planar edges can be picked for 2D")); + QMessageBox::warning(this, tr("Wrong selection"), tr("Only planar edges can be picked for 2D")); return; } } else { - QMessageBox::warning(this, tr("Selection error"), tr("Only faces for 3D part or edges for 2D can be picked")); + QMessageBox::warning(this, tr("Wrong selection"), tr("Only faces for 3D part or edges for 2D can be picked")); return; } + // update the direction - pcConstraint->Direction.setValue(obj, direction); - ui->lineDirection->setText(makeRefText(obj, subNamesElement)); + pcConstraint->Direction.setValue(feat, direction); + ui->lineDirection->setText(makeRefText(feat, subNamesElement)); + //Update UI updateUI(); } @@ -741,14 +744,14 @@ void TaskFemConstraintFluidBoundary::addToSelection() std::vector SubElements = pcConstraint->References.getSubValues(); for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it) {//for every selected object - if (static_cast(it->getTypeName()).substr(0, 4).compare(std::string("Part")) != 0) { + if (!it->isObjectTypeOf(Part::Feature::getClassTypeId())) { QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); return; } - std::vector subNames = it->getSubNames(); - App::DocumentObject* obj = ConstraintView->getObject()->getDocument()->getObject(it->getFeatName()); - for (unsigned int subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element + const std::vector& subNames = it->getSubNames(); + App::DocumentObject* obj = it->getObject(); + for (size_t subIt = 0; subIt < subNames.size(); ++subIt) {// for every selected sub element bool addMe = true; for (std::vector::iterator itr = std::find(SubElements.begin(), SubElements.end(), subNames[subIt]); itr != SubElements.end(); @@ -758,16 +761,18 @@ void TaskFemConstraintFluidBoundary::addToSelection() addMe = false; } } + // limit constraint such that only vertexes or faces or edges can be used depending on what was selected first - std::string searchStr(""); + std::string searchStr; if (subNames[subIt].find("Vertex") != std::string::npos) searchStr = "Vertex"; else if (subNames[subIt].find("Edge") != std::string::npos) searchStr = "Edge"; else searchStr = "Face"; - for (unsigned int iStr = 0; iStr < (SubElements.size()); ++iStr) { - if ((SubElements[iStr].find(searchStr) == std::string::npos) && (SubElements.size() > 0)) { + + for (size_t iStr = 0; iStr < (SubElements.size()); ++iStr) { + if (SubElements[iStr].find(searchStr) == std::string::npos) { QString msg = tr("Only one type of selection (vertex,face or edge) per constraint allowed!"); QMessageBox::warning(this, tr("Selection error"), msg); addMe = false; @@ -775,16 +780,14 @@ void TaskFemConstraintFluidBoundary::addToSelection() } } if (addMe) { - disconnect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); + QSignalBlocker block(ui->listReferences); Objects.push_back(obj); SubElements.push_back(subNames[subIt]); ui->listReferences->addItem(makeRefText(obj, subNames[subIt])); - connect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); } } } + //Update UI pcConstraint->References.setValues(Objects, SubElements); updateUI(); @@ -801,17 +804,17 @@ void TaskFemConstraintFluidBoundary::removeFromSelection() Fem::ConstraintFluidBoundary* pcConstraint = static_cast(ConstraintView->getObject()); std::vector Objects = pcConstraint->References.getValues(); std::vector SubElements = pcConstraint->References.getSubValues(); - std::vector itemsToDel; + std::vector itemsToDel; for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it) {//for every selected object - if (static_cast(it->getTypeName()).substr(0, 4).compare(std::string("Part")) != 0) { + if (!it->isObjectTypeOf(Part::Feature::getClassTypeId())) { QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); return; } - std::vector subNames = it->getSubNames(); - App::DocumentObject* obj = ConstraintView->getObject()->getDocument()->getObject(it->getFeatName()); + const std::vector& subNames = it->getSubNames(); + App::DocumentObject* obj = it->getObject(); - for (unsigned int subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element + for (size_t subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element for (std::vector::iterator itr = std::find(SubElements.begin(), SubElements.end(), subNames[subIt]); itr != SubElements.end(); itr = std::find(++itr, SubElements.end(), subNames[subIt])) @@ -831,15 +834,13 @@ void TaskFemConstraintFluidBoundary::removeFromSelection() } //Update UI - disconnect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); - - ui->listReferences->clear(); - for (unsigned int j = 0; j < Objects.size(); j++) { - ui->listReferences->addItem(makeRefText(Objects[j], SubElements[j])); + { + QSignalBlocker block(ui->listReferences); + ui->listReferences->clear(); + for (size_t j = 0; j < Objects.size(); j++) { + ui->listReferences->addItem(makeRefText(Objects[j], SubElements[j])); + } } - connect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); pcConstraint->References.setValues(Objects, SubElements); updateUI(); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp index acc6d7a5f9..2022bbe8d5 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp @@ -46,6 +46,7 @@ #include "ui_TaskFemConstraintForce.h" #include "TaskFemConstraintForce.h" +#include #include #include #include @@ -154,14 +155,14 @@ void TaskFemConstraintForce::addToSelection() std::vector SubElements = pcConstraint->References.getSubValues(); for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it) {//for every selected object - if (static_cast(it->getTypeName()).substr(0, 4).compare(std::string("Part")) != 0) { + if (!it->isObjectTypeOf(Part::Feature::getClassTypeId())) { QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); return; } - std::vector subNames = it->getSubNames(); - App::DocumentObject* obj = ConstraintView->getObject()->getDocument()->getObject(it->getFeatName()); - for (unsigned int subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element + const std::vector& subNames = it->getSubNames(); + App::DocumentObject* obj = it->getObject(); + for (size_t subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element bool addMe = true; for (std::vector::iterator itr = std::find(SubElements.begin(), SubElements.end(), subNames[subIt]); itr != SubElements.end(); @@ -171,16 +172,18 @@ void TaskFemConstraintForce::addToSelection() addMe = false; } } + // limit constraint such that only vertexes or faces or edges can be used depending on what was selected first - std::string searchStr(""); + std::string searchStr; if (subNames[subIt].find("Vertex") != std::string::npos) searchStr = "Vertex"; else if (subNames[subIt].find("Edge") != std::string::npos) searchStr = "Edge"; else searchStr = "Face"; - for (unsigned int iStr = 0; iStr < (SubElements.size()); ++iStr) { - if ((SubElements[iStr].find(searchStr) == std::string::npos) && (SubElements.size() > 0)) { + + for (size_t iStr = 0; iStr < (SubElements.size()); ++iStr) { + if (SubElements[iStr].find(searchStr) == std::string::npos) { QString msg = tr("Only one type of selection (vertex,face or edge) per constraint allowed!"); QMessageBox::warning(this, tr("Selection error"), msg); addMe = false; @@ -188,16 +191,14 @@ void TaskFemConstraintForce::addToSelection() } } if (addMe) { - disconnect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); + QSignalBlocker block(ui->listReferences); Objects.push_back(obj); SubElements.push_back(subNames[subIt]); ui->listReferences->addItem(makeRefText(obj, subNames[subIt])); - connect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); } } } + //Update UI pcConstraint->References.setValues(Objects, SubElements); updateUI(); @@ -214,17 +215,17 @@ void TaskFemConstraintForce::removeFromSelection() Fem::ConstraintForce* pcConstraint = static_cast(ConstraintView->getObject()); std::vector Objects = pcConstraint->References.getValues(); std::vector SubElements = pcConstraint->References.getSubValues(); - std::vector itemsToDel; + std::vector itemsToDel; for (std::vector::iterator it = selection.begin(); it != selection.end(); ++it) {//for every selected object - if (static_cast(it->getTypeName()).substr(0, 4).compare(std::string("Part")) != 0) { + if (!it->isObjectTypeOf(Part::Feature::getClassTypeId())) { QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); return; } - std::vector subNames = it->getSubNames(); - App::DocumentObject* obj = ConstraintView->getObject()->getDocument()->getObject(it->getFeatName()); + const std::vector& subNames = it->getSubNames(); + App::DocumentObject* obj = it->getObject(); - for (unsigned int subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element + for (size_t subIt = 0; subIt < (subNames.size()); ++subIt) {// for every selected sub element for (std::vector::iterator itr = std::find(SubElements.begin(), SubElements.end(), subNames[subIt]); itr != SubElements.end(); itr = std::find(++itr, SubElements.end(), subNames[subIt])) @@ -244,19 +245,18 @@ void TaskFemConstraintForce::removeFromSelection() } //Update UI - disconnect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); - - ui->listReferences->clear(); - for (unsigned int j = 0; j < Objects.size(); j++) { - ui->listReferences->addItem(makeRefText(Objects[j], SubElements[j])); + { + QSignalBlocker block(ui->listReferences); + ui->listReferences->clear(); + for (unsigned int j = 0; j < Objects.size(); j++) { + ui->listReferences->addItem(makeRefText(Objects[j], SubElements[j])); + } } - connect(ui->listReferences, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(setSelection(QListWidgetItem*))); pcConstraint->References.setValues(Objects, SubElements); updateUI(); } + void TaskFemConstraintForce::onForceChanged(double f) { Fem::ConstraintForce* pcConstraint = static_cast(ConstraintView->getObject());