mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-14 02:30:33 +05:00
FindCoincidentNodes() now accepts a set on nodes to search between; AddToSameGroup() becomes public
This commit is contained in:
parent
dee2c0771d
commit
4c367fbe91
@ -28,13 +28,14 @@
|
|||||||
|
|
||||||
#include "SMESH_MeshEditor.hxx"
|
#include "SMESH_MeshEditor.hxx"
|
||||||
|
|
||||||
#include "SMESH_ControlsDef.hxx"
|
|
||||||
|
|
||||||
#include "SMDS_FaceOfNodes.hxx"
|
#include "SMDS_FaceOfNodes.hxx"
|
||||||
#include "SMDS_VolumeTool.hxx"
|
#include "SMDS_VolumeTool.hxx"
|
||||||
#include "SMESHDS_Group.hxx"
|
#include "SMESHDS_Group.hxx"
|
||||||
#include "SMESHDS_Mesh.hxx"
|
#include "SMESHDS_Mesh.hxx"
|
||||||
#include "SMESH_subMesh.hxx"
|
#include "SMESH_subMesh.hxx"
|
||||||
|
#include "SMESH_ControlsDef.hxx"
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
#include <TopTools_ListOfShape.hxx>
|
#include <TopTools_ListOfShape.hxx>
|
||||||
@ -47,10 +48,7 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "utilities.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace SMESH::Controls;
|
|
||||||
|
|
||||||
typedef map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
|
typedef map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
|
||||||
typedef map<const SMDS_MeshNode*, list<const SMDS_MeshNode*> > TNodeOfNodeListMap;
|
typedef map<const SMDS_MeshNode*, list<const SMDS_MeshNode*> > TNodeOfNodeListMap;
|
||||||
@ -495,7 +493,7 @@ bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theFace)
|
|||||||
static double getBadRate (const SMDS_MeshElement* theElem,
|
static double getBadRate (const SMDS_MeshElement* theElem,
|
||||||
SMESH::Controls::NumericalFunctorPtr& theCrit)
|
SMESH::Controls::NumericalFunctorPtr& theCrit)
|
||||||
{
|
{
|
||||||
TSequenceOfXYZ P;
|
SMESH::Controls::TSequenceOfXYZ P;
|
||||||
if ( !theElem || !theCrit->GetPoints( theElem, P ))
|
if ( !theElem || !theCrit->GetPoints( theElem, P ))
|
||||||
return 1e100;
|
return 1e100;
|
||||||
return theCrit->GetBadRate( theCrit->GetValue( P ), theElem->NbNodes() );
|
return theCrit->GetBadRate( theCrit->GetValue( P ), theElem->NbNodes() );
|
||||||
@ -570,11 +568,11 @@ bool SMESH_MeshEditor::QuadToTri (set<const SMDS_MeshElement*> & theElems,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : addToSameGroups
|
//function : AddToSameGroups
|
||||||
//purpose : add elemToAdd to the groups the elemInGroups belongs to
|
//purpose : add elemToAdd to the groups the elemInGroups belongs to
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
static void addToSameGroups (const SMDS_MeshElement* elemToAdd,
|
void SMESH_MeshEditor::AddToSameGroups (const SMDS_MeshElement* elemToAdd,
|
||||||
const SMDS_MeshElement* elemInGroups,
|
const SMDS_MeshElement* elemInGroups,
|
||||||
SMESHDS_Mesh * aMesh)
|
SMESHDS_Mesh * aMesh)
|
||||||
{
|
{
|
||||||
@ -632,7 +630,7 @@ bool SMESH_MeshEditor::QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
|
|||||||
if ( aShapeId )
|
if ( aShapeId )
|
||||||
aMesh->SetMeshElementOnShape( newElem, aShapeId );
|
aMesh->SetMeshElementOnShape( newElem, aShapeId );
|
||||||
|
|
||||||
addToSameGroups( newElem, elem, aMesh );
|
AddToSameGroups( newElem, elem, aMesh );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -651,7 +649,7 @@ double getAngle(const SMDS_MeshElement * tr1,
|
|||||||
double angle = 2*PI; // bad angle
|
double angle = 2*PI; // bad angle
|
||||||
|
|
||||||
// get normals
|
// get normals
|
||||||
TSequenceOfXYZ P1, P2;
|
SMESH::Controls::TSequenceOfXYZ P1, P2;
|
||||||
if ( !SMESH::Controls::NumericalFunctor::GetPoints( tr1, P1 ) ||
|
if ( !SMESH::Controls::NumericalFunctor::GetPoints( tr1, P1 ) ||
|
||||||
!SMESH::Controls::NumericalFunctor::GetPoints( tr2, P2 ))
|
!SMESH::Controls::NumericalFunctor::GetPoints( tr2, P2 ))
|
||||||
return angle;
|
return angle;
|
||||||
@ -1317,7 +1315,7 @@ void centroidalSmooth(SMESHDS_Mesh * theMesh,
|
|||||||
nbElems++;
|
nbElems++;
|
||||||
|
|
||||||
gp_XYZ elemCenter(0.,0.,0.);
|
gp_XYZ elemCenter(0.,0.,0.);
|
||||||
TSequenceOfXYZ aNodePoints;
|
SMESH::Controls::TSequenceOfXYZ aNodePoints;
|
||||||
SMDS_ElemIteratorPtr itN = elem->nodesIterator();
|
SMDS_ElemIteratorPtr itN = elem->nodesIterator();
|
||||||
while ( itN->more() )
|
while ( itN->more() )
|
||||||
{
|
{
|
||||||
@ -1455,7 +1453,7 @@ void SMESH_MeshEditor::Smooth (set<const SMDS_MeshElement*> & theElems,
|
|||||||
const SMDS_MeshElement* elem = (*itElem);
|
const SMDS_MeshElement* elem = (*itElem);
|
||||||
if ( !elem || elem->GetType() != SMDSAbs_Face )
|
if ( !elem || elem->GetType() != SMDSAbs_Face )
|
||||||
continue;
|
continue;
|
||||||
TSequenceOfXYZ aPoints;
|
SMESH::Controls::TSequenceOfXYZ aPoints;
|
||||||
if ( aQualityFunc.GetPoints( elem, aPoints )) {
|
if ( aQualityFunc.GetPoints( elem, aPoints )) {
|
||||||
double aValue = aQualityFunc.GetValue( aPoints );
|
double aValue = aQualityFunc.GetValue( aPoints );
|
||||||
if ( aValue > maxRatio )
|
if ( aValue > maxRatio )
|
||||||
@ -1930,17 +1928,26 @@ void SMESH_MeshEditor::Transform (set<const SMDS_MeshElement*> & theElems,
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : FindCoincidentNodes
|
//function : FindCoincidentNodes
|
||||||
//purpose : Return list of group of nodes close to each other within theTolerance
|
//purpose : Return list of group of nodes close to each other within theTolerance
|
||||||
|
// Search among theNodes or in the whole mesh if theNodes is empty.
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
void SMESH_MeshEditor::FindCoincidentNodes (const double theTolerance,
|
void SMESH_MeshEditor::FindCoincidentNodes (set<const SMDS_MeshNode*> & theNodes,
|
||||||
|
const double theTolerance,
|
||||||
TListOfListOfNodes & theGroupsOfNodes)
|
TListOfListOfNodes & theGroupsOfNodes)
|
||||||
{
|
{
|
||||||
double tol2 = theTolerance * theTolerance;
|
double tol2 = theTolerance * theTolerance;
|
||||||
|
|
||||||
list<const SMDS_MeshNode*> nodes;
|
list<const SMDS_MeshNode*> nodes;
|
||||||
|
if ( theNodes.empty() )
|
||||||
|
{ // get all nodes in the mesh
|
||||||
SMDS_NodeIteratorPtr nIt = GetMeshDS()->nodesIterator();
|
SMDS_NodeIteratorPtr nIt = GetMeshDS()->nodesIterator();
|
||||||
while ( nIt->more() )
|
while ( nIt->more() )
|
||||||
nodes.push_back( nIt->next() );
|
nodes.push_back( nIt->next() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nodes.insert( nodes.end(), theNodes.begin(), theNodes.end() );
|
||||||
|
}
|
||||||
|
|
||||||
list<const SMDS_MeshNode*>::iterator it2, it1 = nodes.begin();
|
list<const SMDS_MeshNode*>::iterator it2, it1 = nodes.begin();
|
||||||
for ( ; it1 != nodes.end(); it1++ )
|
for ( ; it1 != nodes.end(); it1++ )
|
||||||
@ -1997,7 +2004,7 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes)
|
|||||||
nodeNodeMap.insert( TNodeNodeMap::value_type( nToRemove, nToKeep ));
|
nodeNodeMap.insert( TNodeNodeMap::value_type( nToRemove, nToKeep ));
|
||||||
if ( nToRemove != nToKeep ) {
|
if ( nToRemove != nToKeep ) {
|
||||||
rmNodeIds.push_back( nToRemove->GetID() );
|
rmNodeIds.push_back( nToRemove->GetID() );
|
||||||
addToSameGroups( nToKeep, nToRemove, aMesh );
|
AddToSameGroups( nToKeep, nToRemove, aMesh );
|
||||||
}
|
}
|
||||||
|
|
||||||
SMDS_ElemIteratorPtr invElemIt = nToRemove->GetInverseElementIterator();
|
SMDS_ElemIteratorPtr invElemIt = nToRemove->GetInverseElementIterator();
|
||||||
|
@ -130,9 +130,11 @@ class SMESH_MeshEditor {
|
|||||||
|
|
||||||
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
|
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
|
||||||
|
|
||||||
void FindCoincidentNodes (const double theTolerance,
|
void FindCoincidentNodes (std::set<const SMDS_MeshNode*> & theNodes,
|
||||||
|
const double theTolerance,
|
||||||
TListOfListOfNodes & theGroupsOfNodes);
|
TListOfListOfNodes & theGroupsOfNodes);
|
||||||
// Return list of group of nodes close to each other within theTolerance
|
// Return list of group of nodes close to each other within theTolerance.
|
||||||
|
// Search among theNodes or in the whole mesh if theNodes is empty.
|
||||||
|
|
||||||
void MergeNodes (TListOfListOfNodes & theNodeGroups);
|
void MergeNodes (TListOfListOfNodes & theNodeGroups);
|
||||||
// In each group, the cdr of nodes are substituted by the first one
|
// In each group, the cdr of nodes are substituted by the first one
|
||||||
@ -221,6 +223,10 @@ class SMESH_MeshEditor {
|
|||||||
// Set 8 nodes of a hexahedron in a good order.
|
// Set 8 nodes of a hexahedron in a good order.
|
||||||
// Return success status
|
// Return success status
|
||||||
|
|
||||||
|
static void AddToSameGroups (const SMDS_MeshElement* elemToAdd,
|
||||||
|
const SMDS_MeshElement* elemInGroups,
|
||||||
|
SMESHDS_Mesh * aMesh);
|
||||||
|
// Add elemToAdd to the groups the elemInGroups belongs to
|
||||||
|
|
||||||
int FindShape (const SMDS_MeshElement * theElem);
|
int FindShape (const SMDS_MeshElement * theElem);
|
||||||
// Return an index of the shape theElem is on
|
// Return an index of the shape theElem is on
|
||||||
|
Loading…
Reference in New Issue
Block a user