0020945: EDF 1465 SMESH: create a new mesh from a selected group or from selected elements

+    SMESH_Mesh CopyMesh(in SMESH_IDSource meshPart,
+                        in string         meshName,
+                        in boolean        toCopyGroups,
+                        in boolean        toKeepIDs)
This commit is contained in:
eap 2010-11-30 10:38:18 +00:00
parent cce300634f
commit 3096113268
3 changed files with 257 additions and 34 deletions

View File

@ -221,10 +221,45 @@ module SMESH
raises ( SALOME::SALOME_Exception );
/*!
* Create a Mesh object, without a geometry shape reference
* Create a mesh by copying a part of another mesh
* \param meshPart - a part of mesh to copy
* \param meshName - a name of the new mesh
* \param toCopyGroups - to create in the new mesh groups
* the copied elements belongs to
* \param toKeepIDs - to preserve IDs of the copied elements or not
*/
// SMESH_Mesh NewEmpty()
// raises ( SALOME::SALOME_Exception );
SMESH_Mesh CopyMesh(in SMESH_IDSource meshPart,
in string meshName,
in boolean toCopyGroups,
in boolean toKeepIDs)
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.
*/
SMESH_Mesh Concatenate(in mesh_array theMeshesArray,
in boolean theUniteIdenticalGroups,
in boolean theMergeNodesAndElements,
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 );
/*!
* Mesh a subShape.
@ -309,33 +344,6 @@ module SMESH
in long theElementID)
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.
*/
SMESH_Mesh Concatenate(in mesh_array theMeshesArray,
in boolean theUniteIdenticalGroups,
in boolean theMergeNodesAndElements,
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 );
/*!
* \brief Return id of object, registered in current study context
*

View File

@ -91,9 +91,10 @@
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_VertexPosition.hxx"
#include "SMDS_SpacePosition.hxx"
#include "SMDS_PolyhedralVolumeOfNodes.hxx"
#include "SMDS_SetIterator.hxx"
#include "SMDS_SpacePosition.hxx"
#include "SMDS_VertexPosition.hxx"
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_Filter)
@ -898,7 +899,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName
aServant->ImportUNVFile( theFileName );
// Dump creation of groups
aServant->GetGroups();
SMESH::ListOfGroups_var groups = aServant->GetGroups();
return aMesh._retn();
}
@ -977,7 +978,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
}
// Dump creation of groups
for ( int i = 0; i < aResult->length(); ++i )
aResult[ i ]->GetGroups();
SMESH::ListOfGroups_var groups = aResult[ i ]->GetGroups();
return aResult._retn();
}
@ -2201,6 +2202,214 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray,
return aNewMesh._retn();
}
//================================================================================
/*!
* \brief Create a mesh by copying a part of another mesh
* \param meshPart - a part of mesh to copy
* \param toCopyGroups - to create in the new mesh groups
* the copied elements belongs to
* \param toKeepIDs - to preserve IDs of the copied elements or not
* \retval SMESH::SMESH_Mesh_ptr - the new mesh
*/
//================================================================================
SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CopyMesh(SMESH::SMESH_IDSource_ptr meshPart,
const char* meshName,
CORBA::Boolean toCopyGroups,
CORBA::Boolean toKeepIDs)
{
Unexpect aCatch(SALOME_SalomeException);
TPythonDump* pyDump = new TPythonDump; // prevent dump from CreateMesh()
// 1. Get source mesh
if ( CORBA::is_nil( meshPart ))
THROW_SALOME_CORBA_EXCEPTION( "bad IDSource", SALOME::BAD_PARAM );
SMESH::SMESH_Mesh_var srcMesh = meshPart->GetMesh();
SMESH_Mesh_i* srcMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( srcMesh );
if ( !srcMesh_i )
THROW_SALOME_CORBA_EXCEPTION( "bad mesh of IDSource", SALOME::BAD_PARAM );
SMESHDS_Mesh* srcMeshDS = srcMesh_i->GetImpl().GetMeshDS();
// 2. Make a new mesh
SMESH::SMESH_Mesh_var newMesh = CreateMesh(GEOM::GEOM_Object::_nil());
SMESH_Mesh_i* newMesh_i = SMESH::DownCast<SMESH_Mesh_i*>( newMesh );
if ( !newMesh_i )
THROW_SALOME_CORBA_EXCEPTION( "can't create a mesh", SALOME::INTERNAL_ERROR );
SALOMEDS::SObject_var meshSO = ObjectToSObject(myCurrentStudy, newMesh );
if ( !meshSO->_is_nil() )
{
SetName( meshSO, meshName, "Mesh" );
SetPixMap( meshSO, "ICON_SMESH_TREE_MESH_IMPORTED");
}
SMESHDS_Mesh* newMeshDS = newMesh_i->GetImpl().GetMeshDS();
::SMESH_MeshEditor editor( &newMesh_i->GetImpl() );
// 3. Get elements to copy
SMDS_ElemIteratorPtr srcElemIt;
TIDSortedElemSet srcElems;
SMESH::array_of_ElementType_var srcElemTypes = meshPart->GetTypes();
if ( SMESH::DownCast<SMESH_Mesh_i*>( meshPart ))
{
srcElemIt = srcMeshDS->elementsIterator();
}
else
{
SMESH::long_array_var ids = meshPart->GetIDs();
if ( srcElemTypes->length() == 1 && srcElemTypes[0] == SMESH::NODE ) // group of nodes
{
for (int i=0; i < ids->length(); i++)
if ( const SMDS_MeshElement * elem = srcMeshDS->FindNode( ids[i] ))
srcElems.insert( elem );
}
else
{
for (int i=0; i < ids->length(); i++)
if ( const SMDS_MeshElement * elem = srcMeshDS->FindElement( ids[i] ))
srcElems.insert( elem );
}
if ( srcElems.empty() )
return newMesh._retn();
typedef SMDS_SetIterator< SMDS_pElement, TIDSortedElemSet::const_iterator > ElIter;
srcElemIt = SMDS_ElemIteratorPtr( new ElIter( srcElems.begin(), srcElems.end() ));
}
// 4. Copy elements
typedef map<SMDS_pElement, SMDS_pElement, TIDCompare> TE2EMap;
TE2EMap e2eMapByType[ SMDSAbs_NbElementTypes ];
TE2EMap& n2nMap = e2eMapByType[ SMDSAbs_Node ];
int iN;
const SMDS_MeshNode *nSrc, *nTgt;
vector< const SMDS_MeshNode* > nodes;
while ( srcElemIt->more() )
{
const SMDS_MeshElement * elem = srcElemIt->next();
nodes.resize( elem->NbNodes());
SMDS_ElemIteratorPtr nIt = elem->nodesIterator();
if ( toKeepIDs ) {
for ( iN = 0; nIt->more(); ++iN )
{
nSrc = static_cast<const SMDS_MeshNode*>( nIt->next() );
nTgt = newMeshDS->FindNode( nSrc->GetID());
if ( !nTgt )
nTgt = newMeshDS->AddNodeWithID( nSrc->X(), nSrc->Y(), nSrc->Z(), nSrc->GetID());
nodes[ iN ] = nTgt;
}
}
else {
for ( iN = 0; nIt->more(); ++iN )
{
nSrc = static_cast<const SMDS_MeshNode*>( nIt->next() );
TE2EMap::iterator n2n = n2nMap.insert( make_pair( nSrc, SMDS_pNode(0) )).first;
if ( !n2n->second )
n2n->second = newMeshDS->AddNode( nSrc->X(), nSrc->Y(), nSrc->Z() );
nodes[ iN ] = (const SMDS_MeshNode*) n2n->second;
}
}
if ( elem->GetType() != SMDSAbs_Node )
{
int ID = toKeepIDs ? elem->GetID() : 0;
const SMDS_MeshElement * newElem = editor.AddElement( nodes,
elem->GetType(),
elem->IsPoly(),
ID);
if ( toCopyGroups && !toKeepIDs )
e2eMapByType[ elem->GetType() ].insert( make_pair( elem, newElem ));
}
}
// 5. Copy groups
int nbNewGroups = 0;
if ( toCopyGroups )
{
SMESH::ElementType* typesBeg = & srcElemTypes[0];
SMESH::ElementType* typesEnd = typesBeg+srcElemTypes->length();
SMESH_Mesh::GroupIteratorPtr gIt = srcMesh_i->GetImpl().GetGroups();
while ( gIt->more() )
{
SMESH_Group* group = gIt->next();
const SMESHDS_GroupBase* groupDS = group->GetGroupDS();
// Check group type. We copy nodal groups containing nodes of copied element
SMDSAbs_ElementType groupType = groupDS->GetType();
if ( groupType != SMDSAbs_Node &&
std::find( typesBeg, typesEnd, groupType ) == typesEnd )
continue; // group type differs from types of meshPart
// Find copied elements in the group
vector< const SMDS_MeshElement* > groupElems;
SMDS_ElemIteratorPtr eIt = groupDS->GetElements();
if ( toKeepIDs )
{
const SMDS_MeshElement* foundElem;
if ( groupType == SMDSAbs_Node )
{
while ( eIt->more() )
if (( foundElem = newMeshDS->FindNode( eIt->next()->GetID() )))
groupElems.push_back( foundElem );
}
else
{
while ( eIt->more() )
if (( foundElem = newMeshDS->FindElement( eIt->next()->GetID() )))
groupElems.push_back( foundElem );
}
}
else
{
TE2EMap & e2eMap = e2eMapByType[ groupDS->GetType() ];
if ( e2eMap.empty() ) continue;
int minID = e2eMap.begin()->first->GetID();
int maxID = e2eMap.rbegin()->first->GetID();
TE2EMap::iterator e2e;
while ( eIt->more() && groupElems.size() < e2eMap.size())
{
const SMDS_MeshElement* e = eIt->next();
if ( e->GetID() < minID || e->GetID() > maxID ) continue;
if ((e2e = e2eMap.find( e )) != e2eMap.end())
groupElems.push_back( e2e->second );
}
}
// Make a new group
if ( !groupElems.empty() )
{
SMESH::SMESH_Group_var newGroupObj =
newMesh->CreateGroup( SMESH::ElementType(groupType), group->GetName() );
if ( SMESH_GroupBase_i* newGroup_i = SMESH::DownCast<SMESH_GroupBase_i*>( newGroupObj))
{
SMESHDS_GroupBase * newGroupDS = newGroup_i->GetGroupDS();
SMDS_MeshGroup& smdsGroup = ((SMESHDS_Group*)newGroupDS)->SMDSGroup();
for ( unsigned i = 0; i < groupElems.size(); ++i )
smdsGroup.Add( groupElems[i] );
nbNewGroups++;
}
}
}
}
*pyDump << newMesh << " = " << this
<< ".CopyMesh( " << meshPart << ", "
<< toCopyGroups << ", "
<< toKeepIDs << ")";
delete pyDump; pyDump = 0; // allow dump in GetGroups()
if ( nbNewGroups > 0 ) // dump created groups
SMESH::ListOfGroups_var groups = newMesh->GetGroups();
return newMesh._retn();
}
//================================================================================
/*!
* SMESH_Gen_i::GetMEDVersion

View File

@ -236,6 +236,12 @@ public:
SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName )
throw ( SALOME::SALOME_Exception );
// Copy a part of mesh
SMESH::SMESH_Mesh_ptr CopyMesh(SMESH::SMESH_IDSource_ptr meshPart,
const char* meshName,
CORBA::Boolean toCopyGroups,
CORBA::Boolean toKeepIDs);
// Compute mesh on a shape
CORBA::Boolean Compute( SMESH::SMESH_Mesh_ptr theMesh,
GEOM::GEOM_Object_ptr theShapeObject )