mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-28 04:40:33 +05:00
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:
parent
cce300634f
commit
3096113268
@ -221,10 +221,45 @@ module SMESH
|
|||||||
raises ( SALOME::SALOME_Exception );
|
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()
|
SMESH_Mesh CopyMesh(in SMESH_IDSource meshPart,
|
||||||
// raises ( SALOME::SALOME_Exception );
|
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.
|
* Mesh a subShape.
|
||||||
@ -309,33 +344,6 @@ module SMESH
|
|||||||
in long theElementID)
|
in long theElementID)
|
||||||
raises ( SALOME::SALOME_Exception );
|
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
|
* \brief Return id of object, registered in current study context
|
||||||
*
|
*
|
||||||
|
@ -91,9 +91,10 @@
|
|||||||
|
|
||||||
#include "SMDS_EdgePosition.hxx"
|
#include "SMDS_EdgePosition.hxx"
|
||||||
#include "SMDS_FacePosition.hxx"
|
#include "SMDS_FacePosition.hxx"
|
||||||
#include "SMDS_VertexPosition.hxx"
|
|
||||||
#include "SMDS_SpacePosition.hxx"
|
|
||||||
#include "SMDS_PolyhedralVolumeOfNodes.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_Group)
|
||||||
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
||||||
@ -898,7 +899,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName
|
|||||||
aServant->ImportUNVFile( theFileName );
|
aServant->ImportUNVFile( theFileName );
|
||||||
|
|
||||||
// Dump creation of groups
|
// Dump creation of groups
|
||||||
aServant->GetGroups();
|
SMESH::ListOfGroups_var groups = aServant->GetGroups();
|
||||||
|
|
||||||
return aMesh._retn();
|
return aMesh._retn();
|
||||||
}
|
}
|
||||||
@ -977,7 +978,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
|
|||||||
}
|
}
|
||||||
// Dump creation of groups
|
// Dump creation of groups
|
||||||
for ( int i = 0; i < aResult->length(); ++i )
|
for ( int i = 0; i < aResult->length(); ++i )
|
||||||
aResult[ i ]->GetGroups();
|
SMESH::ListOfGroups_var groups = aResult[ i ]->GetGroups();
|
||||||
|
|
||||||
return aResult._retn();
|
return aResult._retn();
|
||||||
}
|
}
|
||||||
@ -2201,6 +2202,214 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray,
|
|||||||
return aNewMesh._retn();
|
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
|
* SMESH_Gen_i::GetMEDVersion
|
||||||
|
@ -236,6 +236,12 @@ public:
|
|||||||
SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName )
|
SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName )
|
||||||
throw ( SALOME::SALOME_Exception );
|
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
|
// Compute mesh on a shape
|
||||||
CORBA::Boolean Compute( SMESH::SMESH_Mesh_ptr theMesh,
|
CORBA::Boolean Compute( SMESH::SMESH_Mesh_ptr theMesh,
|
||||||
GEOM::GEOM_Object_ptr theShapeObject )
|
GEOM::GEOM_Object_ptr theShapeObject )
|
||||||
|
Loading…
Reference in New Issue
Block a user