From: rnv Date: Fri, 2 Mar 2007 08:03:40 +0000 (+0000) Subject: Implementation of PAL13462 (Complete MergeNodes). X-Git-Tag: V3_2_6a1~14 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=4ce5a89eed0ec6b3678fb33d2388be688aa501ab;p=modules%2Fsmesh.git Implementation of PAL13462 (Complete MergeNodes). --- diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 81c2bf990..492e95440 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -329,6 +329,10 @@ module SMESH void FindCoincidentNodes (in double Tolerance, out array_of_long_array GroupsOfNodes); + void FindCoincidentNodesOnPart (in SMESH_IDSource SubMeshOrGroup, + in double Tolerance, + out array_of_long_array GroupsOfNodes); + void MergeNodes (in array_of_long_array GroupsOfNodes); void MergeEqualElements(); diff --git a/src/SMESHGUI/SMESHGUI_MergeNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_MergeNodesDlg.cxx index 203d28328..aea515e40 100644 --- a/src/SMESHGUI/SMESHGUI_MergeNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MergeNodesDlg.cxx @@ -36,6 +36,8 @@ #include "SMESH_Actor.h" #include "SMESH_TypeFilter.hxx" +#include "SMESH_LogicalFilter.hxx" +#include "SMESHGUI_MeshUtils.h" #include "SMDS_Mesh.hxx" #include "GEOMBase.h" @@ -54,8 +56,6 @@ #include "utilities.h" -#include CORBA_SERVER_HEADER(SMESH_MeshEditor) - // OCCT Includes #include @@ -74,6 +74,9 @@ #include #include +//IDL Headers +#include CORBA_SERVER_HEADER(SMESH_Group) + using namespace std; //================================================================================= @@ -160,7 +163,7 @@ SMESHGUI_MergeNodesDlg::SMESHGUI_MergeNodesDlg( SMESHGUI* theModule, const char* // Controls for mesh defining GroupMesh = new QGroupBox(this, "GroupMesh"); - GroupMesh->setTitle(tr("SMESH_MESH")); + GroupMesh->setTitle(tr("SMESH_SELECT_WHOLE_MESH")); GroupMesh->setColumnLayout(0, Qt::Vertical); GroupMesh->layout()->setSpacing(0); GroupMesh->layout()->setMargin(0); @@ -256,12 +259,24 @@ SMESHGUI_MergeNodesDlg::SMESHGUI_MergeNodesDlg( SMESHGUI* theModule, const char* myEditCurrentArgument = (QWidget*)LineEditMesh; myActor = 0; + mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil(); mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); mySMESHGUI->SetActiveDialogBox((QDialog*)this); - - myMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); + + // Costruction of the logical filter + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); + SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); + + QPtrList aListOfFilters; + if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); + if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); + + myMeshOrSubMeshOrGroupFilter = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); + + //myMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); /* signals and slots connections */ connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); @@ -464,7 +479,10 @@ void SMESHGUI_MergeNodesDlg::onDetect() ListEdit->clear(); SMESH::array_of_long_array_var aNodeGroups; - aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aNodeGroups); + if(!mySubMeshOrGroup->_is_nil()) + aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aNodeGroups); + else + aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aNodeGroups); for (int i = 0; i < aNodeGroups->length(); i++) { SMESH::long_array& aGroup = aNodeGroups[i]; @@ -626,7 +644,7 @@ void SMESHGUI_MergeNodesDlg::SetEditCurrentArgument() SMESH::SetPointRepresentation(false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myMeshOrSubMeshFilter); + mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } myEditCurrentArgument->setFocus(); @@ -643,23 +661,37 @@ void SMESHGUI_MergeNodesDlg::SelectionIntoArgument() if (myEditCurrentArgument == (QWidget*)LineEditMesh) { QString aString = ""; LineEditMesh->setText(aString); - + ListCoincident->clear(); ListEdit->clear(); - + myActor = 0; + int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); if (nbSel != 1) return; SALOME_ListIO aList; mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - + Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::IObjectToInterface(IO); - myActor = SMESH::FindActorByEntry(aList.First()->getEntry()); - if (myMesh->_is_nil() || !myActor) + myMesh = SMESH::GetMeshByIO(IO); + + if (myMesh->_is_nil()) return; - + + myActor = SMESH::FindActorByEntry(IO->getEntry()); + if (!myActor) + myActor = SMESH::FindActorByObject(myMesh); + if(!myActor) + return; + + mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil(); + + if ((!SMESH::IObjectToInterface(IO)->_is_nil() || //SUBMESH OR GROUP + !SMESH::IObjectToInterface(IO)->_is_nil()) && + !SMESH::IObjectToInterface(IO)->_is_nil()) + mySubMeshOrGroup = SMESH::IObjectToInterface(IO); + LineEditMesh->setText(aString); } } diff --git a/src/SMESHGUI/SMESHGUI_MergeNodesDlg.h b/src/SMESHGUI/SMESHGUI_MergeNodesDlg.h index eda961e8c..4177984e6 100644 --- a/src/SMESHGUI/SMESHGUI_MergeNodesDlg.h +++ b/src/SMESHGUI/SMESHGUI_MergeNodesDlg.h @@ -56,7 +56,7 @@ class SVTK_Selector; // IDL Headers #include -#include CORBA_SERVER_HEADER(SMESH_Mesh) +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) //================================================================================= @@ -89,9 +89,10 @@ private: QWidget* myEditCurrentArgument; SMESH::SMESH_Mesh_var myMesh; + SMESH::SMESH_IDSource_var mySubMeshOrGroup; SMESH_Actor* myActor; //Handle(SMESH_TypeFilter) myMeshOrSubMeshFilter; - SUIT_SelectionFilter* myMeshOrSubMeshFilter; + SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter; QButtonGroup* GroupConstructors; QRadioButton* RadioButton1; diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 80bcaa23d..13aa0d714 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -1776,6 +1776,64 @@ void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tol << Tolerance << " )"; } +//======================================================================= +//function : FindCoincidentNodesOnPart +//purpose : +//======================================================================= +void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr theObject, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes) +{ + initData(); + SMESH::long_array_var aElementsId = theObject->GetIDs(); + + SMESHDS_Mesh* aMesh = GetMeshDS(); + set nodes; + + if ( !CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(theObject)) && + SMESH::SMESH_GroupBase::_narrow(theObject)->GetType() == SMESH::NODE) { + for(int i = 0; i < aElementsId->length(); i++) { + CORBA::Long ind = aElementsId[i]; + const SMDS_MeshNode * elem = aMesh->FindNode(ind); + if(elem) + nodes.insert(elem); + } + } + else { + for(int i = 0; i < aElementsId->length(); i++) { + CORBA::Long ind = aElementsId[i]; + const SMDS_MeshElement * elem = aMesh->FindElement(ind); + if(elem) { + SMDS_ElemIteratorPtr nIt = elem->nodesIterator(); + while ( nIt->more() ) + nodes.insert( nodes.end(),static_cast(nIt->next())); + } + } + } + + + ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; + ::SMESH_MeshEditor anEditor( myMesh ); + if(!nodes.empty()) + anEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + + GroupsOfNodes = new SMESH::array_of_long_array; + GroupsOfNodes->length( aListOfListOfNodes.size() ); + ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); + for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) { + list< const SMDS_MeshNode* >& aListOfNodes = *llIt; + list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; + SMESH::long_array& aGroup = GroupsOfNodes[ i ]; + aGroup.length( aListOfNodes.size() ); + for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) + aGroup[ j ] = (*lIt)->GetID(); + } + // Update Python script + TPythonDump() << "coincident_nodes_on_part = " << this << ".FindCoincidentNodesOnPart( " + <