diff --git a/src/Base/QuantityLexer.c b/src/Base/QuantityLexer.c index c70b69d62..49473e266 100644 --- a/src/Base/QuantityLexer.c +++ b/src/Base/QuantityLexer.c @@ -109,7 +109,10 @@ typedef unsigned int flex_uint32_t; #endif /* Returned upon end-of-file. */ -#define YY_NULL 0 +# ifdef YY_NULL +# undef YY_NULL +# define YY_NULL 0 +# endif /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, @@ -686,7 +689,7 @@ static int input (void ); if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - int n; \ + unsigned int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 5c4e2a6b1..79d3a4e9e 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -81,11 +81,12 @@ bool getConstraintPrerequisits(Fem::FemAnalysis **Analysis) } //OvG: Visibility automation show parts and hide meshes on activation of a constraint -std::string gethideMeshShowPartStr() +std::string gethideMeshShowPartStr(std::string showConstr="") { - return - "for amesh in App.activeDocument().Objects:\n\ - if \"Mesh\" in amesh.TypeId:\n\ + return "for amesh in App.activeDocument().Objects:\n\ + if \""+showConstr+"\" == amesh.Name:\n\ + amesh.ViewObject.Visibility = True\n\ + elif \"Mesh\" in amesh.TypeId:\n\ aparttoshow = amesh.Name.replace(\"_Mesh\",\"\")\n\ for apart in App.activeDocument().Objects:\n\ if aparttoshow == apart.Name:\n\ @@ -291,7 +292,7 @@ void CmdFemConstraintBearing::activated(int iMsg) doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintBearing\",\"%s\")",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -333,7 +334,7 @@ void CmdFemConstraintFixed::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Scale = 1",FeatName.c_str()); //OvG: set initial scale to 1 doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -377,7 +378,7 @@ void CmdFemConstraintForce::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Scale = 1",FeatName.c_str()); //OvG: set initial scale to 1 doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -422,7 +423,7 @@ void CmdFemConstraintPressure::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]", Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -463,7 +464,7 @@ void CmdFemConstraintGear::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Diameter = 100.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -509,7 +510,7 @@ void CmdFemConstraintPulley::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.TensionForce = 100.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); @@ -551,7 +552,7 @@ void CmdFemConstraintDisplacement::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]", Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); - doCommand(Doc,"%s",gethideMeshShowPartStr().c_str()); //OvG: Hide meshes and show parts + doCommand(Doc,"%s",gethideMeshShowPartStr(FeatName).c_str()); //OvG: Hide meshes and show parts updateActive(); diff --git a/src/Mod/Fem/Gui/TaskFemConstraint.cpp b/src/Mod/Fem/Gui/TaskFemConstraint.cpp index 000b3bd1d..66ca65320 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraint.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraint.cpp @@ -181,6 +181,11 @@ const QString TaskFemConstraint::makeRefText(const App::DocumentObject* obj, con //==== calls from the TaskView =============================================================== +void TaskDlgFemConstraint::open() +{ + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts +} bool TaskDlgFemConstraint::accept() { diff --git a/src/Mod/Fem/Gui/TaskFemConstraint.h b/src/Mod/Fem/Gui/TaskFemConstraint.h index 275c38f76..9108c25ea 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraint.h +++ b/src/Mod/Fem/Gui/TaskFemConstraint.h @@ -77,9 +77,10 @@ class TaskDlgFemConstraint : public Gui::TaskView::TaskDialog Q_OBJECT public: - /* + /// is called the TaskView when the dialog is opened - virtual void open() {} + void open(); + /* /// is called by the framework if an button is clicked which has no accept or reject role virtual void clicked(int) {} /// is called by the framework if the dialog is accepted (Ok) diff --git a/src/Mod/Fem/Gui/TaskFemConstraintDisplacement.cpp b/src/Mod/Fem/Gui/TaskFemConstraintDisplacement.cpp index cae552348..41d948ee7 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintDisplacement.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintDisplacement.cpp @@ -435,10 +435,30 @@ void TaskFemConstraintDisplacement::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(""); + 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)){ + std::string Msg="Only one type of selection (vertex,face or edge) per constraint allowed!"; + QMessageBox::warning(this, tr("Selection error"),QString::fromStdString(Msg)); + addMe=false; + break; + } + } if (addMe){ + disconnect(ui->lw_references, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), + this, SLOT(setSelection(QListWidgetItem*))); Objects.push_back(obj); SubElements.push_back(subNames[subIt]); ui->lw_references->addItem(makeRefText(obj, subNames[subIt])); + connect(ui->lw_references, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), + this, SLOT(setSelection(QListWidgetItem*))); } } } @@ -458,7 +478,7 @@ void TaskFemConstraintDisplacement::removeFromSelection() Fem::ConstraintDisplacement* 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){ QMessageBox::warning(this, tr("Selection error"),tr("Selected object is not a part!")); @@ -480,6 +500,7 @@ void TaskFemConstraintDisplacement::removeFromSelection() } } + std::sort(itemsToDel.begin(),itemsToDel.end()); while (itemsToDel.size()>0){ Objects.erase(Objects.begin()+itemsToDel.back()); SubElements.erase(SubElements.begin()+itemsToDel.back()); @@ -502,9 +523,9 @@ void TaskFemConstraintDisplacement::removeFromSelection() } void TaskFemConstraintDisplacement::setSelection(QListWidgetItem* item){ - std::string docName=ConstraintView->getObject()->getDocument()->getName(); - std::string s = item->text().toStdString(); + std::string docName=ConstraintView->getObject()->getDocument()->getName(); + std::string delimiter = ":"; size_t pos = 0; @@ -520,10 +541,7 @@ void TaskFemConstraintDisplacement::setSelection(QListWidgetItem* item){ } void TaskFemConstraintDisplacement::onReferenceDeleted() { - int row = ui->lw_references->currentIndex().row(); - TaskFemConstraint::onReferenceDeleted(row); - ui->lw_references->model()->removeRow(row); - ui->lw_references->setCurrentRow(0, QItemSelectionModel::ClearAndSelect); + TaskFemConstraintDisplacement::removeFromSelection(); //OvG: On right-click face is automatically selected, so just remove } const std::string TaskFemConstraintDisplacement::getReferences() const @@ -585,8 +603,10 @@ void TaskDlgFemConstraintDisplacement::open() { // a transaction is already open at creation time of the panel if (!Gui::Command::hasPendingCommand()) { - QString msg = QObject::tr("Constraint normal stress"); + QString msg = QObject::tr("Constraint displacement"); Gui::Command::openCommand((const char*)msg.toUtf8()); + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts } } diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFixed.cpp b/src/Mod/Fem/Gui/TaskFemConstraintFixed.cpp index 3a2627087..e367660ba 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFixed.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintFixed.cpp @@ -213,6 +213,17 @@ TaskDlgFemConstraintFixed::TaskDlgFemConstraintFixed(ViewProviderFemConstraintFi //==== calls from the TaskView =============================================================== +void TaskDlgFemConstraintFixed::open() +{ + // a transaction is already open at creation time of the panel + if (!Gui::Command::hasPendingCommand()) { + QString msg = QObject::tr("Constraint fixed"); + Gui::Command::openCommand((const char*)msg.toUtf8()); + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts + } +} + bool TaskDlgFemConstraintFixed::accept() { std::string name = ConstraintView->getObject()->getNameInDocument(); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFixed.h b/src/Mod/Fem/Gui/TaskFemConstraintFixed.h index d6c404282..08b93b1b3 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFixed.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintFixed.h @@ -76,7 +76,7 @@ public: /// is called by the framework if the dialog is accepted (Ok) virtual bool accept(); - + void open(); }; } //namespace FemGui diff --git a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp index 1e83b2b1d..b95d36e34 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintForce.cpp @@ -342,6 +342,8 @@ void TaskDlgFemConstraintForce::open() if (!Gui::Command::hasPendingCommand()) { QString msg = QObject::tr("Constraint force"); Gui::Command::openCommand((const char*)msg.toUtf8()); + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts } } diff --git a/src/Mod/Fem/Gui/TaskFemConstraintPressure.cpp b/src/Mod/Fem/Gui/TaskFemConstraintPressure.cpp index cc276b2c8..dcc21be87 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintPressure.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintPressure.cpp @@ -240,8 +240,10 @@ void TaskDlgFemConstraintPressure::open() { // a transaction is already open at creation time of the panel if (!Gui::Command::hasPendingCommand()) { - QString msg = QObject::tr("Constraint normal stress"); + QString msg = QObject::tr("Constraint pressure"); Gui::Command::openCommand((const char*)msg.toUtf8()); + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts } } diff --git a/src/Mod/Fem/Gui/TaskFemConstraintPulley.cpp b/src/Mod/Fem/Gui/TaskFemConstraintPulley.cpp index adcbb113d..5a84ac364 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintPulley.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintPulley.cpp @@ -188,6 +188,17 @@ TaskDlgFemConstraintPulley::TaskDlgFemConstraintPulley(ViewProviderFemConstraint //==== calls from the TaskView =============================================================== +void TaskDlgFemConstraintPulley::open() +{ + // a transaction is already open at creation time of the panel + if (!Gui::Command::hasPendingCommand()) { + QString msg = QObject::tr("Constraint pulley"); + Gui::Command::openCommand((const char*)msg.toUtf8()); + ConstraintView->setVisible(true); + Gui::Command::doCommand(Gui::Command::Doc,ViewProviderFemConstraint::gethideMeshShowPartStr((static_cast(ConstraintView->getObject()))->getNameInDocument()).c_str()); //OvG: Hide meshes and show parts + } +} + bool TaskDlgFemConstraintPulley::accept() { std::string name = ConstraintView->getObject()->getNameInDocument(); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintPulley.h b/src/Mod/Fem/Gui/TaskFemConstraintPulley.h index f2b92c5b9..5ec4916ce 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintPulley.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintPulley.h @@ -66,7 +66,7 @@ public: /// is called by the framework if the dialog is accepted (Ok) virtual bool accept(); - + void open(); }; } //namespace FemGui diff --git a/src/Mod/Fem/Gui/ViewProviderFemConstraint.cpp b/src/Mod/Fem/Gui/ViewProviderFemConstraint.cpp index f5387339e..6042d868a 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemConstraint.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemConstraint.cpp @@ -168,8 +168,28 @@ void ViewProviderFemConstraint::onChanged(const App::Property* prop) } } +//OvG: Visibility automation show parts and hide meshes on activation of a constraint +std::string ViewProviderFemConstraint::gethideMeshShowPartStr(const std::string showConstr) +{ + return "for amesh in App.activeDocument().Objects:\n\ + if \""+showConstr+"\" == amesh.Name:\n\ + amesh.ViewObject.Visibility = True\n\ + elif \"Mesh\" in amesh.TypeId:\n\ + aparttoshow = amesh.Name.replace(\"_Mesh\",\"\")\n\ + for apart in App.activeDocument().Objects:\n\ + if aparttoshow == apart.Name:\n\ + apart.ViewObject.Visibility = True\n\ + amesh.ViewObject.Visibility = False\n"; +} + +std::string ViewProviderFemConstraint::gethideMeshShowPartStr() +{ + return ViewProviderFemConstraint::gethideMeshShowPartStr(""); +} + bool ViewProviderFemConstraint::setEdit(int ModNum) { + Gui::Command::doCommand(Gui::Command::Doc,"%s",ViewProviderFemConstraint::gethideMeshShowPartStr().c_str()); return Gui::ViewProviderGeometryObject::setEdit(ModNum); } diff --git a/src/Mod/Fem/Gui/ViewProviderFemConstraint.h b/src/Mod/Fem/Gui/ViewProviderFemConstraint.h index 2bfe344a3..688597714 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemConstraint.h +++ b/src/Mod/Fem/Gui/ViewProviderFemConstraint.h @@ -64,6 +64,9 @@ public: std::vector claimChildren(void)const; void setupContextMenu(QMenu*, QObject*, const char*); + + static std::string gethideMeshShowPartStr(); + static std::string gethideMeshShowPartStr(const std::string showConstr); protected: void onChanged(const App::Property* prop);