From 91746010c93514c1435ac156e0f4490b804c298b Mon Sep 17 00:00:00 2001 From: vtn Date: Tue, 4 Dec 2007 09:53:23 +0000 Subject: [PATCH] NPAL16716: Compound. To create the groups of the initial meshes. --- idl/SMESH_Gen.idl | 14 ++ src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx | 28 ++-- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h | 1 + src/SMESHGUI/SMESH_msg_en.po | 3 + src/SMESH_I/SMESH_2smeshpy.cxx | 3 +- src/SMESH_I/SMESH_Gen_i.cxx | 150 ++++++++++++++++++++- src/SMESH_I/SMESH_Gen_i.hxx | 15 +++ 7 files changed, 199 insertions(+), 15 deletions(-) diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index ed976632e..0c1a05e1b 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -246,6 +246,20 @@ module SMESH in double theMergeTolerance) raises ( SALOME::SALOME_Exception ); + /*! + * Concatenate the given meshes into one mesh. + * Union groups with the same name and type if + * theUniteIdenticalGroups flag is true. + * Merge coincident nodes and elements if + * theMergeNodesAndElements flag is true. + * Create the groups of all elements from initial meshes. + */ + SMESH_Mesh ConcatenateWithGroups(in mesh_array theMeshesArray, + in boolean theUniteIdenticalGroups, + in boolean theMergeNodesAndElements, + in double theMergeTolerance) + raises ( SALOME::SALOME_Exception ); + }; }; diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx index 32160647c..88e5d6074 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx @@ -150,17 +150,21 @@ SMESHGUI_BuildCompoundDlg::SMESHGUI_BuildCompoundDlg( SMESHGUI* theModule) ComboBoxUnion = new QComboBox(GroupArgs, "ComboBoxUnion"); GroupArgsLayout->addMultiCellWidget(ComboBoxUnion, 1, 1, 3, 3); + CheckBoxCommon = new QCheckBox(GroupArgs, "CheckBoxCommon"); + CheckBoxCommon->setText(tr("CREATE_COMMON_GROUPS" )); + GroupArgsLayout->addMultiCellWidget(CheckBoxCommon, 2, 2, 0, 3); + CheckBoxMerge = new QCheckBox(GroupArgs, "CheckBoxMerge"); CheckBoxMerge->setText(tr("MERGE_NODES_AND_ELEMENTS" )); - GroupArgsLayout->addMultiCellWidget(CheckBoxMerge, 2, 2, 0, 3); + GroupArgsLayout->addMultiCellWidget(CheckBoxMerge, 3, 3, 0, 3); TextLabelTol = new QLabel (GroupArgs, "TextLabelTol"); TextLabelTol->setText(tr("SMESH_TOLERANCE")); TextLabelTol->setAlignment(Qt::AlignCenter); - GroupArgsLayout->addMultiCellWidget(TextLabelTol, 3, 3, 0, 1); + GroupArgsLayout->addMultiCellWidget(TextLabelTol, 4, 4, 0, 1); SpinBoxTol = new SMESHGUI_SpinBox (GroupArgs, "SpinBoxTol"); SpinBoxTol->RangeStepAndValidator(0.0, COORD_MAX, 0.1, 6); - GroupArgsLayout->addMultiCellWidget(SpinBoxTol, 3, 3, 2, 3); + GroupArgsLayout->addMultiCellWidget(SpinBoxTol, 4, 4, 2, 3); SMESHGUI_BuildCompoundDlgLayout->addWidget(GroupArgs, 2, 0); @@ -313,12 +317,18 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); // concatenate meshes - SMESH::SMESH_Mesh_var aCompoundMesh = - aSMESHGen->Concatenate(myMeshArray, - !(ComboBoxUnion->currentItem()), - CheckBoxMerge->isChecked(), - SpinBoxTol->GetValue()); - + SMESH::SMESH_Mesh_var aCompoundMesh; + if(CheckBoxCommon->isChecked()) + aCompoundMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, + !(ComboBoxUnion->currentItem()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); + else + aCompoundMesh = aSMESHGen->Concatenate(myMeshArray, + !(ComboBoxUnion->currentItem()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); + SMESH::SetName( SMESH::FindSObject( aCompoundMesh ), LineEditName->text().latin1() ); QApplication::restoreOverrideCursor(); mySMESHGUI->updateObjBrowser(); diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h index c7bc29cda..a3f1c7701 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h @@ -108,6 +108,7 @@ public : QLineEdit* LineEditMeshes; QLabel* TextLabelUnion; QComboBox* ComboBoxUnion; + QCheckBox* CheckBoxCommon; QCheckBox* CheckBoxMerge; QLabel* TextLabelTol; SMESHGUI_SpinBox* SpinBoxTol; diff --git a/src/SMESHGUI/SMESH_msg_en.po b/src/SMESHGUI/SMESH_msg_en.po index 86a9a09e3..9593c10c0 100644 --- a/src/SMESHGUI/SMESH_msg_en.po +++ b/src/SMESHGUI/SMESH_msg_en.po @@ -3354,6 +3354,9 @@ msgstr "Rename" msgid "SMESHGUI_BuildCompoundDlg::MERGE_NODES_AND_ELEMENTS" msgstr "Merge coincident nodes and elements" +msgid "SMESHGUI_BuildCompoundDlg::CREATE_COMMON_GROUPS" +msgstr "Create common groups for initial meshes" + #----------------------------------------------------------- msgid "SMESHGUI_ShapeByMeshDlg::CAPTION" diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 0f313fb86..f9b7ed055 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -338,7 +338,8 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) } // Concatenate( [mesh1, ...], ... ) - if ( theCommand->GetMethod() == "Concatenate" ) + if ( theCommand->GetMethod() == "Concatenate" || + theCommand->GetMethod() == "ConcatenateWithGroups") { AddMeshAccessorMethod( theCommand ); } diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index e343bea5a..357b8d77f 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -1337,6 +1337,52 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe CORBA::Boolean theMergeNodesAndElements, CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ) +{ + return ConcatenateCommon(theMeshesArray, + theUniteIdenticalGroups, + theMergeNodesAndElements, + theMergeTolerance, + false); +} + +//================================================================================ +/*! + * SMESH_Gen_i::ConcatenateWithGroups + * + * Concatenate the given meshes into one mesh + * Create the groups of all elements from initial meshes + */ +//================================================================================ + +SMESH::SMESH_Mesh_ptr +SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) + throw ( SALOME::SALOME_Exception ) +{ + return ConcatenateCommon(theMeshesArray, + theUniteIdenticalGroups, + theMergeNodesAndElements, + theMergeTolerance, + true); +} + +//================================================================================ +/*! + * SMESH_Gen_i::ConcatenateCommon + * + * Concatenate the given meshes into one mesh + */ +//================================================================================ + +SMESH::SMESH_Mesh_ptr +SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance, + CORBA::Boolean theCommonGroups) + throw ( SALOME::SALOME_Exception ) { typedef map TIDsMap; typedef list TListOfNewGroups; @@ -1377,6 +1423,23 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe const SMDS_MeshElement* aNewElem = 0; int anElemNbNodes = 0; + int anNbNodes = 0; + int anNbEdges = 0; + int anNbFaces = 0; + int anNbVolumes = 0; + + SMESH::long_array_var anIDsNodes = new SMESH::long_array(); + SMESH::long_array_var anIDsEdges = new SMESH::long_array(); + SMESH::long_array_var anIDsFaces = new SMESH::long_array(); + SMESH::long_array_var anIDsVolumes = new SMESH::long_array(); + + if( theCommonGroups ) { + anIDsNodes->length( anInitMeshDS->NbNodes() ); + anIDsEdges->length( anInitMeshDS->NbEdges() ); + anIDsFaces->length( anInitMeshDS->NbFaces() ); + anIDsVolumes->length( anInitMeshDS->NbVolumes() ); + } + for ( int j = 0; itElems->more(); j++) { anElem = itElems->next(); SMDSAbs_ElementType anElemType = anElem->GetType(); @@ -1393,6 +1456,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe if ( nodesMap.find(aNode->GetID()) == nodesMap.end() ) { aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) ); + if( theCommonGroups ) + anIDsNodes[anNbNodes++] = aNewNode->GetID(); } else aNewNode = aNewMeshDS->FindNode( nodesMap.find(aNode->GetID())->second ); @@ -1408,6 +1473,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe aNewElem = aNewMeshDS->AddPolyhedralVolume(aNodesArray, aVolume->GetQuanities()); elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); + if( theCommonGroups ) + anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); } } else { @@ -1416,6 +1483,14 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe anElemType, anElem->IsPoly()); elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); + if( theCommonGroups ) { + if( anElemType == SMDSAbs_Edge ) + anIDsEdges[anNbEdges++] = aNewElem->GetID(); + else if( anElemType == SMDSAbs_Face ) + anIDsFaces[anNbFaces++] = aNewElem->GetID(); + else if( anElemType == SMDSAbs_Volume ) + anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); + } } }//elems loop @@ -1426,12 +1501,73 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe SMESH::long_array_var anInitIDs = new SMESH::long_array(); SMESH::long_array_var anNewIDs = new SMESH::long_array(); SMESH::SMESH_Group_var aNewGroup; + + SMESH::ElementType aGroupType; + CORBA::String_var aGroupName; + if ( theCommonGroups ) { + for(aGroupType=SMESH::NODE;aGroupType<=SMESH::VOLUME;aGroupType=(SMESH::ElementType)(aGroupType+1)) { + string str = "Gr"; + SALOMEDS::SObject_var aMeshSObj = ObjectToSObject( myCurrentStudy, anInitMesh ); + if(aMeshSObj) + str += aMeshSObj->GetName(); + str += "_"; + + switch(aGroupType) { + case SMESH::NODE: + str += "Nodes"; + anIDsNodes->length(anNbNodes++); + break; + case SMESH::EDGE: + str += "Edges"; + anIDsEdges->length(anNbEdges++); + break; + case SMESH::FACE: + str += "Faces"; + anIDsFaces->length(anNbFaces++); + break; + case SMESH::VOLUME: + str += "Volumes"; + anIDsVolumes->length(anNbVolumes++); + break; + default: + break; + } + + aGroupName = str.c_str(); + + // add a new group in the mesh + aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + + switch(aGroupType) { + case SMESH::NODE: + aNewGroup->Add( anIDsNodes ); + break; + case SMESH::EDGE: + aNewGroup->Add( anIDsEdges ); + break; + case SMESH::FACE: + aNewGroup->Add( anIDsFaces ); + break; + case SMESH::VOLUME: + aNewGroup->Add( anIDsVolumes ); + break; + default: + break; + } + + aListOfNewGroups.clear(); + aListOfNewGroups.push_back(aNewGroup); + aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); + } + } + + // check that current group name and type don't have identical ones in union mesh for (int i = 0; i < aListOfGroups->length(); i++) { aGroup = aListOfGroups[i]; aListOfNewGroups.clear(); - SMESH::ElementType aGroupType = aGroup->GetType(); - CORBA::String_var aGroupName = aGroup->GetName(); - + aGroupType = aGroup->GetType(); + aGroupName = aGroup->GetName(); + TGroupsMap::iterator anIter = aGroupsMap.find(make_pair(aGroupName, aGroupType)); // convert a list of IDs @@ -1498,7 +1634,11 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe } // Update Python script - aPythonDump << aNewMesh << " = " << this << ".Concatenate("; + aPythonDump << aNewMesh << " = " << this; + if( !theCommonGroups ) + aPythonDump << ".Concatenate("; + else + aPythonDump << ".ConcatenateWithGroups("; aPythonDump << "["; for ( int i = 0; i < theMeshesArray.length(); i++) { if (i > 0) aPythonDump << ", "; @@ -1506,7 +1646,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe } aPythonDump << "], "; aPythonDump << theUniteIdenticalGroups << ", " - << theMergeNodesAndElements << ", " + << theMergeNodesAndElements << ", " << theMergeTolerance << ")"; return aNewMesh._retn(); diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 8ba56ef3a..23ec7f9a0 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -256,6 +256,14 @@ public: CORBA::Long theElementID) throw ( SALOME::SALOME_Exception ); + // Concatenate the given meshes into one mesh + SMESH::SMESH_Mesh_ptr ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance, + CORBA::Boolean theCommonGroups) + throw ( SALOME::SALOME_Exception ); + // Concatenate the given meshes into one mesh SMESH::SMESH_Mesh_ptr Concatenate(const SMESH::mesh_array& theMeshesArray, CORBA::Boolean theUniteIdenticalGroups, @@ -263,6 +271,13 @@ public: CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ); + // Concatenate the given meshes into one mesh + // Create the groups of all elements from initial meshes + SMESH::SMESH_Mesh_ptr ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) + throw ( SALOME::SALOME_Exception ); // **************************************************** // Interface inherited methods (from SALOMEDS::Driver) -- 2.39.2