diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 3d0ebd610..74ccb4dbf 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1408,6 +1408,14 @@ Please, select face, shell or solid and try again GEOM_SELECT_UNPUBLISHED_EDGES Select unpublished edges + + GEOM_GENERATE_GROUPS + Generate Groups + + + GEOM_GROUP_NAME_PREFIX + Group Names Prefix + GEOM_PLANE Plane diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx index dfd6f0755..7bc91a8a5 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx @@ -53,7 +53,13 @@ //================================================================================= GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl) - : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl) + : GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl), + myGenGroupCheckGP (0), + myPrefixLblGP (0), + myPrefixEditGP (0), + myGenGroupCheckGMP (0), + myPrefixLblGMP (0), + myPrefixEditGMP (0) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -81,6 +87,19 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupPoints->PushButton3->setIcon(image1); GroupPoints->CheckButton1->setText(tr("GEOM_SELECT_UNPUBLISHED_EDGES")); + // Add widgets for group generation + QGridLayout *aLayoutGP = (QGridLayout *)GroupPoints->GroupBox1->layout(); + + myGenGroupCheckGP = + new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupPoints->GroupBox1); + myPrefixLblGP = + new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupPoints->GroupBox1); + myPrefixEditGP = new QLineEdit(GroupPoints->GroupBox1); + + aLayoutGP->addWidget(myGenGroupCheckGP, 4, 0, 1, 3); + aLayoutGP->addWidget(myPrefixLblGP, 5, 0, 1, 2); + aLayoutGP->addWidget(myPrefixEditGP, 5, 2); + GroupMakePoints = new DlgRef_3Sel2Check3Spin(centralWidget()); GroupMakePoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); @@ -92,6 +111,12 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupMakePoints->PushButton3->setIcon(image1); GroupMakePoints->CheckBox1->setText(tr("GEOM_WITH_CONTACT")); GroupMakePoints->CheckBox2->setText(tr("GEOM_WITH_CORRECTION")); + GroupMakePoints->SpinBox1->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->SpinBox2->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->SpinBox3->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel4->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel5->setAttribute(Qt::WA_DeleteOnClose); + GroupMakePoints->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); GroupMakePoints->SpinBox1->close(); GroupMakePoints->SpinBox2->close(); GroupMakePoints->SpinBox3->close(); @@ -99,6 +124,19 @@ GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidg GroupMakePoints->TextLabel5->close(); GroupMakePoints->TextLabel6->close(); + // Add widgets for group generation + QGridLayout *aLayoutGMP = (QGridLayout *)GroupMakePoints->GroupBox1->layout(); + + myGenGroupCheckGMP = + new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupMakePoints->GroupBox1); + myPrefixLblGMP = + new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupMakePoints->GroupBox1); + myPrefixEditGMP = new QLineEdit(GroupMakePoints->GroupBox1); + + aLayoutGMP->addWidget(myGenGroupCheckGMP, 8, 0, 1, 3); + aLayoutGMP->addWidget(myPrefixLblGMP, 9, 0, 1, 2); + aLayoutGMP->addWidget(myPrefixEditGMP, 9, 2); + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(GroupPoints); @@ -166,6 +204,8 @@ void GenerationGUI_PipeDlg::Init() connect(GroupMakePoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupMakePoints->CheckBox1, SIGNAL(clicked()), this, SLOT(processPreview())); connect(GroupMakePoints->CheckBox2, SIGNAL(clicked()), this, SLOT(processPreview())); + connect(myGenGroupCheckGP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); + connect(myGenGroupCheckGMP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool))); initName(tr("GEOM_PIPE")); resize(100,100); @@ -195,6 +235,8 @@ void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) GroupPoints->PushButton3->hide(); GroupPoints->LineEdit3->hide(); GroupPoints->PushButton1->click(); + myGenGroupCheckGP->setChecked(false); + resetGenGroup(myGenGroupCheckGP, false, true); break; case 1: GroupMakePoints->hide(); @@ -203,11 +245,15 @@ void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId ) GroupPoints->PushButton3->show(); GroupPoints->LineEdit3->show(); GroupPoints->PushButton1->click(); + myGenGroupCheckGP->setChecked(false); + resetGenGroup(myGenGroupCheckGP, false, true); break; case 2: GroupPoints->hide(); GroupMakePoints->show(); GroupMakePoints->PushButton1->click(); + myGenGroupCheckGMP->setChecked(false); + resetGenGroup(myGenGroupCheckGMP, false, true); break; default: break; @@ -483,21 +529,38 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects) GEOM::ListOfGO_var aList; GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation()); + bool doGroups = !IsPreview(); + + myGroupObjectsMap.clear(); + switch( getConstructorId() ) { case 0: case 1: + if (doGroups) { + doGroups = myGenGroupCheckGP->isChecked(); + } + for (int i = 0; i < myBaseObjects.count(); i++) { switch ( getConstructorId() ) { case 0 : - aList = anOper->MakePipe(myBaseObjects[i].get(), myPath.get(), false); - break; + aList = anOper->MakePipe(myBaseObjects[i].get(), + myPath.get(), doGroups); + break; case 1 : - aList = anOper->MakePipeBiNormalAlongVector(myBaseObjects[i].get(), myPath.get(), myVec.get(), false); - break; + aList = anOper->MakePipeBiNormalAlongVector + (myBaseObjects[i].get(), myPath.get(), myVec.get(), doGroups); + break; } - if (!aList[0]->_is_nil()) - objects.push_back(aList[0]._retn()); + if (aList->length() > 0) { + if (!aList[0]->_is_nil()) { + objects.push_back(aList[0]._retn()); + } + + if (doGroups) { + addGroups(aList); + } + } } break; case 2: @@ -507,17 +570,30 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects) myBaseGO->length( myBaseObjects.count() ); myLocationsGO->length( myLocations.count() ); for (int i = 0; i < myBaseObjects.count(); i++) { - myBaseGO[i] = myBaseObjects[i].copy(); + myBaseGO[i] = myBaseObjects[i].copy(); } for (int i = 0; i < myLocations.count(); i++) { - myLocationsGO[i] = myLocations[i].copy(); + myLocationsGO[i] = myLocations[i].copy(); } - aList = anOper->MakePipeWithDifferentSections(myBaseGO.in(), myLocationsGO.in(), myPath.get(), - GroupMakePoints->CheckBox1->isChecked(), - GroupMakePoints->CheckBox2->isChecked(), false); - if (!aList[0]->_is_nil()) - objects.push_back(aList[0]._retn()); + if (doGroups) { + doGroups = myGenGroupCheckGMP->isChecked(); + } + + aList = anOper->MakePipeWithDifferentSections + (myBaseGO.in(), myLocationsGO.in(), myPath.get(), + GroupMakePoints->CheckBox1->isChecked(), + GroupMakePoints->CheckBox2->isChecked(), doGroups); + + if (aList->length() > 0) { + if (!aList[0]->_is_nil()) { + objects.push_back(aList[0]._retn()); + } + + if (doGroups) { + addGroups(aList); + } + } } break; default: @@ -545,6 +621,75 @@ bool GenerationGUI_PipeDlg::extractPrefix() const return myBaseObjects.count() > 1; } +//================================================================================= +// function : restoreSubShapes +// purpose : virtual method to restore tree of argument's sub-shapes under +// the resulting shape. Redefined from GEOMBase_Helper class. +//================================================================================= +void GenerationGUI_PipeDlg::restoreSubShapes + (SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject) +{ + QCheckBox *aGenGroupCheck = NULL; + QLineEdit *aPrefixEdit = NULL; + + + switch (getConstructorId()) { + case 0 : + case 1 : + aGenGroupCheck = myGenGroupCheckGP; + aPrefixEdit = myPrefixEditGP; + break; + case 2 : + aGenGroupCheck = myGenGroupCheckGMP; + aPrefixEdit = myPrefixEditGMP; + break; + default: + break; + } + + if (aGenGroupCheck == NULL || !aGenGroupCheck->isChecked()) { + return; + } + + SALOMEDS::GenericAttribute_var anAttr; + + if (!theSObject->FindAttribute(anAttr, "AttributeIOR")) { + return; + } + + SALOMEDS::AttributeIOR_var anAttrIOR = + SALOMEDS::AttributeIOR::_narrow(anAttr); + CORBA::String_var anIORso = anAttrIOR->Value(); + + // get Object from SObject + GEOM::GEOM_Object_var aFather = GEOM::GEOM_Object::_narrow + (myGeomGUI->getApp()->orb()->string_to_object(anIORso)); + + if (CORBA::is_nil(aFather)) { + return; + } + + ObjectMap::const_iterator anIter = myGroupObjectsMap.find(aFather); + + if (anIter != myGroupObjectsMap.end()) { + ObjectList::const_iterator it = anIter->second.begin(); + QString aName = aPrefixEdit->text(); + + if (!aName.isEmpty()) { + aName += "_"; + } + + for (; it != anIter->second.end(); it++) { + // Compose the name + QString aGrpName = tr((*it)->GetName()); + + aName += aGrpName; + getGeomEngine()->AddInStudy(theStudy, (*it), + aName.toStdString().c_str(), aFather); + } + } +} + //================================================================================= // function : getSourceObjects // purpose : virtual method to get source objects @@ -557,3 +702,64 @@ QList GenerationGUI_PipeDlg::getSourceObjects() res << myLocations[i]; return res; } + +//================================================================================= +// function : GenGroupClicked +// purpose : Slot to treat checking "Generate groups" check box. +//================================================================================= +void GenerationGUI_PipeDlg::GenGroupClicked(bool isChecked) +{ + resetGenGroup((QCheckBox *)sender(), isChecked, false); +} + +//================================================================================= +// function : resetGenGroup +// purpose : Resets data of "Generate groups" widgets. +//================================================================================= +void GenerationGUI_PipeDlg::resetGenGroup(QCheckBox *theGenGroup, + const bool isChecked, + const bool isClearPrefix) +{ + QLabel *aPrefixLbl = NULL; + QLineEdit *aPrefixEdit = NULL; + + if (theGenGroup == myGenGroupCheckGP) { + aPrefixLbl = myPrefixLblGP; + aPrefixEdit = myPrefixEditGP; + } else if (theGenGroup == myGenGroupCheckGMP) { + aPrefixLbl = myPrefixLblGMP; + aPrefixEdit = myPrefixEditGMP; + } + + if (aPrefixLbl != NULL) { + aPrefixLbl->setEnabled(isChecked); + aPrefixEdit->setEnabled(isChecked); + + if (isClearPrefix) { + aPrefixEdit->setText(""); + } + } +} + +//================================================================================= +// function : addGroups +// purpose : Add result groups to the list of groups. +//================================================================================= +void GenerationGUI_PipeDlg::addGroups(GEOM::ListOfGO_var &theResult) +{ + const int aNbObj = theResult->length(); + + if (aNbObj > 0) { + GEOM::GEOM_Object_ptr aKey = theResult[0]._retn(); + + if (!aKey->_is_nil()) { + int i; + + for (i = 1; i < aNbObj; ++i) { + if (!theResult[i]->_is_nil()) { + myGroupObjectsMap[aKey].push_back(theResult[i]._retn()); + } + } + } + } +} diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.h b/src/GenerationGUI/GenerationGUI_PipeDlg.h index 868b465af..7af0402b3 100644 --- a/src/GenerationGUI/GenerationGUI_PipeDlg.h +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.h @@ -30,6 +30,9 @@ #include "GEOMBase_Skeleton.h" #include "GEOM_GenericObjPtr.h" +typedef std::map ObjectMap; + + class DlgRef_3Sel1Check; class DlgRef_3Sel2Check3Spin; @@ -52,11 +55,19 @@ protected: virtual bool execute( ObjectList& ); virtual void addSubshapesToStudy(); virtual bool extractPrefix() const; + virtual void restoreSubShapes + (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); virtual QList getSourceObjects(); private: void Init(); void enterEvent( QEvent* ); + void resetGenGroup + (QCheckBox *theGenGroup, + const bool isChecked, + const bool isClearPrefix); + void addGroups + (GEOM::ListOfGO_var &theResult); private: QList myBaseObjects; /* Base shapes */ @@ -66,6 +77,13 @@ private: DlgRef_3Sel1Check* GroupPoints; DlgRef_3Sel2Check3Spin* GroupMakePoints; + QCheckBox *myGenGroupCheckGP; + QLabel *myPrefixLblGP; + QLineEdit *myPrefixEditGP; + QCheckBox *myGenGroupCheckGMP; + QLabel *myPrefixLblGMP; + QLineEdit *myPrefixEditGMP; + ObjectMap myGroupObjectsMap; private slots: void ClickOnOk(); @@ -75,6 +93,7 @@ private slots: void SetEditCurrentArgument(); void ConstructorsClicked( int ); void SelectionTypeButtonClicked(); + void GenGroupClicked(bool); }; #endif // GENERATIONGUI_PIPEDLG_H