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();
#include "SMESH_Actor.h"
#include "SMESH_TypeFilter.hxx"
+#include "SMESH_LogicalFilter.hxx"
+#include "SMESHGUI_MeshUtils.h"
#include "SMDS_Mesh.hxx"
#include "GEOMBase.h"
#include "utilities.h"
-#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
-
// OCCT Includes
#include <TColStd_MapOfInteger.hxx>
#include <qpixmap.h>
#include <qheader.h>
+//IDL Headers
+#include CORBA_SERVER_HEADER(SMESH_Group)
+
using namespace std;
//=================================================================================
// 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);
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<SUIT_SelectionFilter> 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()));
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];
SMESH::SetPointRepresentation(false);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
- mySelectionMgr->installFilter(myMeshOrSubMeshFilter);
+ mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
}
myEditCurrentArgument->setFocus();
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<SMESH::SMESH_Mesh>(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<SMESH::SMESH_subMesh>(IO)->_is_nil() || //SUBMESH OR GROUP
+ !SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO)->_is_nil()) &&
+ !SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO)->_is_nil())
+ mySubMeshOrGroup = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(IO);
+
LineEditMesh->setText(aString);
}
}
// IDL Headers
#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
+#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
//=================================================================================
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;
<< 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<const SMDS_MeshNode*> 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<const SMDS_MeshNode*>(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( "
+ <<theObject<<", "
+ << Tolerance << " )";
+}
+
//=======================================================================
//function : MergeNodes
//purpose :
void FindCoincidentNodes (CORBA::Double Tolerance,
SMESH::array_of_long_array_out GroupsOfNodes);
+ void FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr theObject,
+ CORBA::Double Tolerance,
+ SMESH::array_of_long_array_out GroupsOfNodes);
void MergeNodes (const SMESH::array_of_long_array& GroupsOfNodes);
void MergeEqualElements();
CORBA::Long MoveClosestNodeToPoint(CORBA::Double x,
def FindCoincidentNodes (self, Tolerance):
return self.editor.FindCoincidentNodes(Tolerance)
+ ## Find group of nodes close to each other within Tolerance.
+ # @param Tolerance tolerance value
+ # @param SubMeshOrGroup SubMesh or Group
+ # @param list of group of nodes
+ def FindCoincidentNodesOnPart (self, SubMeshOrGroup, Tolerance):
+ return self.editor.FindCoincidentNodesOnPart(SubMeshOrGroup, Tolerance)
+
## Merge nodes
# @param list of group of nodes
def MergeNodes (self, GroupsOfNodes):