From 6cc0e3580f96752d981b71f48ef7810d767a7d76 Mon Sep 17 00:00:00 2001 From: donovaly Date: Fri, 21 Feb 2020 02:22:20 +0100 Subject: [PATCH] [FEM] fix direction handling in Force dialog - the direction handling did not work because of yesterdays' PR from me --- src/Mod/Fem/Gui/TaskFemConstraintForce.cpp | 71 +++++++++++++++++++--- 1 file changed, 64 insertions(+), 7 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp index 8b4be0e92574..4eb50841d9a8 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp @@ -86,6 +86,8 @@ TaskFemConstraintForce::TaskFemConstraintForce(ViewProviderFemConstraintForce *C this, SLOT(onButtonDirection())); connect(ui->checkReverse, SIGNAL(toggled(bool)), this, SLOT(onCheckReverse(bool))); + connect(ui->listReferences, SIGNAL(itemClicked(QListWidgetItem*)), + this, SLOT(setSelection(QListWidgetItem*))); this->groupLayout()->addWidget(proxy); @@ -284,14 +286,69 @@ void TaskFemConstraintForce::onReferenceDeleted() { TaskFemConstraintForce::removeFromSelection(); //OvG: On right-click face is automatically selected, so just remove } -void TaskFemConstraintForce::onButtonDirection(const bool pressed) { - if (pressed) { - selectionMode = seldir; - } else { - selectionMode = selnone; +void TaskFemConstraintForce::onButtonDirection(const bool pressed) +{ + // sets the normal vector of the currently selecteed planar face as direction + + //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!")); + return; } - ui->buttonDirection->setChecked(pressed); - Gui::Selection().clearSelection(); + Fem::ConstraintForce* 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()); + + // 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!")); + return; + } + // get the names of the subobjects + 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!")); + 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); + TopoDS_Shape ref = feat->Shape.getShape().getSubShape(subNamesElement.c_str()); + + if (TypeName.substr(0, 4).compare(std::string("Part")) != 0) { + QMessageBox::warning(this, tr("Selection error"), tr("Selected object is not a part!")); + return; + } + 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")); + 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")); + return; + } + } + else { + QMessageBox::warning(this, tr("Selection error"), 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)); + + //Update UI + updateUI(); } void TaskFemConstraintForce::onCheckReverse(const bool pressed)