mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-02 21:00:34 +05:00
PAL16842 (Genertion of groups when a mesh is transformed)
+ CORBA::Long NbGroups()
This commit is contained in:
parent
019d2167d9
commit
ba46f82f7d
@ -27,29 +27,30 @@
|
||||
// $Header$
|
||||
|
||||
#include "SMESH_Mesh_i.hxx"
|
||||
#include "SMESH_subMesh_i.hxx"
|
||||
#include "SMESH_MEDMesh_i.hxx"
|
||||
#include "SMESH_Group_i.hxx"
|
||||
|
||||
#include "SMESH_Filter_i.hxx"
|
||||
#include "SMESH_Gen_i.hxx"
|
||||
#include "SMESH_Group_i.hxx"
|
||||
#include "SMESH_MEDMesh_i.hxx"
|
||||
#include "SMESH_MeshEditor_i.hxx"
|
||||
#include "SMESH_PythonDump.hxx"
|
||||
#include "SMESH_subMesh_i.hxx"
|
||||
|
||||
#include "Utils_CorbaException.hxx"
|
||||
#include "Utils_ExceptHandlers.hxx"
|
||||
#include "utilities.h"
|
||||
|
||||
#include "SALOME_NamingService.hxx"
|
||||
#include "Utils_SINGLETON.hxx"
|
||||
#include "OpUtil.hxx"
|
||||
|
||||
#include "DriverMED_R_SMESHDS_Mesh.h"
|
||||
#include "SMDS_VolumeTool.hxx"
|
||||
#include "SMESHDS_Command.hxx"
|
||||
#include "SMESHDS_CommandType.hxx"
|
||||
#include "SMESH_MeshEditor_i.hxx"
|
||||
#include "SMESH_Gen_i.hxx"
|
||||
#include "DriverMED_R_SMESHDS_Mesh.h"
|
||||
//#include "SMDS_ElemIterator.hxx"
|
||||
#include "SMDS_VolumeTool.hxx"
|
||||
#include "SMESH_MesherHelper.hxx"
|
||||
#include "SMESHDS_GroupOnGeom.hxx"
|
||||
#include "SMESH_Group.hxx"
|
||||
#include "SMESH_MeshEditor.hxx"
|
||||
#include "SMESH_MesherHelper.hxx"
|
||||
|
||||
#include "OpUtil.hxx"
|
||||
#include "SALOME_NamingService.hxx"
|
||||
#include "Utils_CorbaException.hxx"
|
||||
#include "Utils_ExceptHandlers.hxx"
|
||||
#include "Utils_SINGLETON.hxx"
|
||||
#include "utilities.h"
|
||||
|
||||
// OCCT Includes
|
||||
#include <BRep_Builder.hxx>
|
||||
@ -226,7 +227,7 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
|
||||
Unexpect aCatch(SALOME_SalomeException);
|
||||
int status;
|
||||
try {
|
||||
status = importMEDFile( theFileName, theMeshName );
|
||||
status = _impl->MEDToMesh( theFileName, theMeshName );
|
||||
}
|
||||
catch( SALOME_Exception& S_ex ) {
|
||||
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
|
||||
@ -235,16 +236,8 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
|
||||
THROW_SALOME_CORBA_EXCEPTION("ImportMEDFile(): unknown exception", SALOME::BAD_PARAM);
|
||||
}
|
||||
|
||||
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
|
||||
if ( !aStudy->_is_nil() ) {
|
||||
// publishing of the groups in the study (sub-meshes are out of scope of MED import)
|
||||
map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.begin();
|
||||
for (; it != _mapGroups.end(); it++ ) {
|
||||
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_duplicate( it->second );
|
||||
_gen_i->PublishGroup( aStudy, _this(), aGroup,
|
||||
GEOM::GEOM_Object::_nil(), aGroup->GetName());
|
||||
}
|
||||
}
|
||||
CreateGroupServants();
|
||||
|
||||
return ConvertDriverMEDReadStatus(status);
|
||||
}
|
||||
|
||||
@ -264,16 +257,6 @@ int SMESH_Mesh_i::ImportUNVFile( const char* theFileName )
|
||||
|
||||
CreateGroupServants();
|
||||
|
||||
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
|
||||
if ( !aStudy->_is_nil() ) {
|
||||
// publishing of the groups in the study (sub-meshes are out of scope of UNV import)
|
||||
map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.begin();
|
||||
for (; it != _mapGroups.end(); it++ ) {
|
||||
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_duplicate( it->second );
|
||||
_gen_i->PublishGroup( aStudy, _this(), aGroup,
|
||||
GEOM::GEOM_Object::_nil(), aGroup->GetName());
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -301,14 +284,14 @@ int SMESH_Mesh_i::ImportSTLFile( const char* theFileName )
|
||||
*/
|
||||
//=============================================================================
|
||||
|
||||
int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName )
|
||||
{
|
||||
// Read mesh with name = <theMeshName> and all its groups into SMESH_Mesh
|
||||
int status = _impl->MEDToMesh( theFileName, theMeshName );
|
||||
CreateGroupServants();
|
||||
// int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName )
|
||||
// {
|
||||
// // Read mesh with name = <theMeshName> and all its groups into SMESH_Mesh
|
||||
// int status = _impl->MEDToMesh( theFileName, theMeshName );
|
||||
// CreateGroupServants();
|
||||
|
||||
return status;
|
||||
}
|
||||
// return status;
|
||||
// }
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
@ -811,6 +794,17 @@ SMESH::ListOfGroups * SMESH_Mesh_i::GetGroups() throw(SALOME::SALOME_Exception)
|
||||
|
||||
return aList._retn();
|
||||
}
|
||||
//=============================================================================
|
||||
/*!
|
||||
* Get number of groups existing in the mesh
|
||||
*/
|
||||
//=============================================================================
|
||||
|
||||
CORBA::Long SMESH_Mesh_i::NbGroups() throw (SALOME::SALOME_Exception)
|
||||
{
|
||||
Unexpect aCatch(SALOME_SalomeException);
|
||||
return _mapGroups.size();
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*! UnionGroups
|
||||
@ -1370,7 +1364,7 @@ void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl)
|
||||
SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor()
|
||||
{
|
||||
// Create MeshEditor
|
||||
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( _impl, false );
|
||||
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, false );
|
||||
SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this();
|
||||
|
||||
// Update Python script
|
||||
@ -1387,7 +1381,7 @@ SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor()
|
||||
|
||||
SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditPreviewer()
|
||||
{
|
||||
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( _impl, true );
|
||||
SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, true );
|
||||
SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this();
|
||||
return aMesh._retn();
|
||||
}
|
||||
@ -2313,17 +2307,11 @@ SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id)
|
||||
return aResult._retn();
|
||||
|
||||
if(elem->GetType()==SMDSAbs_Volume) {
|
||||
// use SMDS_VolumeTool
|
||||
SMDS_VolumeTool aTool;
|
||||
if(aTool.Set(elem)) {
|
||||
double x=0., y=0., z=0.;
|
||||
if(aTool.GetBaryCenter(x,y,z)) {
|
||||
// add coordinates
|
||||
aResult->length(3);
|
||||
aResult[0] = x;
|
||||
aResult[1] = y;
|
||||
aResult[2] = z;
|
||||
}
|
||||
aResult->length(3);
|
||||
if (!aTool.GetBaryCenter( aResult[0], aResult[1], aResult[2]) )
|
||||
aResult->length(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -2352,27 +2340,75 @@ SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id)
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
*
|
||||
* Create and publish group servants if any groups were imported or created anyhow
|
||||
*/
|
||||
//=============================================================================
|
||||
|
||||
void SMESH_Mesh_i::CreateGroupServants()
|
||||
{
|
||||
// Create group servants, if any groups were imported
|
||||
list<int> aGroupIds = _impl->GetGroupIds();
|
||||
for ( list<int>::iterator it = aGroupIds.begin(); it != aGroupIds.end(); it++ ) {
|
||||
SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, *it );
|
||||
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
|
||||
|
||||
// PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
|
||||
::SMESH_Mesh::GroupIteratorPtr groupIt = _impl->GetGroups();
|
||||
while ( groupIt->more() )
|
||||
{
|
||||
::SMESH_Group* group = groupIt->next();
|
||||
int anId = group->GetGroupDS()->GetID();
|
||||
|
||||
map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.find(anId);
|
||||
if ( it != _mapGroups.end() && !CORBA::is_nil( it->second ))
|
||||
continue;
|
||||
|
||||
SMESH_GroupBase_i* aGroupImpl;
|
||||
TopoDS_Shape shape;
|
||||
if ( SMESHDS_GroupOnGeom* groupOnGeom =
|
||||
dynamic_cast<SMESHDS_GroupOnGeom*>( group->GetGroupDS() ))
|
||||
{
|
||||
aGroupImpl = new SMESH_GroupOnGeom_i( SMESH_Gen_i::GetPOA(), this, anId );
|
||||
shape = groupOnGeom->GetShape();
|
||||
}
|
||||
else {
|
||||
aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId );
|
||||
}
|
||||
|
||||
// To ensure correct mapping of servant and correct reference counting in GenericObj_i
|
||||
SMESH_Gen_i::GetPOA()->activate_object( aGroupImpl );
|
||||
aGroupImpl->Register();
|
||||
// PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i
|
||||
|
||||
SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() );
|
||||
_mapGroups[*it] = SMESH::SMESH_Group::_duplicate( aGroup );
|
||||
SMESH::SMESH_GroupBase_var groupVar =
|
||||
SMESH::SMESH_GroupBase::_narrow( aGroupImpl->_this() );
|
||||
_mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( groupVar );
|
||||
|
||||
// register CORBA object for persistence
|
||||
int nextId = _gen_i->RegisterObject( aGroup );
|
||||
int nextId = _gen_i->RegisterObject( groupVar );
|
||||
if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
|
||||
|
||||
// publishing of the groups in the study
|
||||
if ( !aStudy->_is_nil() ) {
|
||||
GEOM::GEOM_Object_var shapeVar = _gen_i->ShapeToGeomObject( shape );
|
||||
_gen_i->PublishGroup( aStudy, _this(), groupVar, shapeVar, groupVar->GetName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
/*!
|
||||
* \brief Return groups cantained in _mapGroups by their IDs
|
||||
*/
|
||||
//=============================================================================
|
||||
|
||||
SMESH::ListOfGroups* SMESH_Mesh_i::GetGroups(const list<int>& groupIDs) const
|
||||
{
|
||||
int nbGroups = groupIDs.size();
|
||||
SMESH::ListOfGroups_var aList = new SMESH::ListOfGroups();
|
||||
aList->length( nbGroups );
|
||||
|
||||
list<int>::const_iterator ids = groupIDs.begin();
|
||||
for ( nbGroups = 0; ids != groupIDs.end(); ++ids )
|
||||
{
|
||||
map<int, SMESH::SMESH_GroupBase_ptr>::const_iterator it = _mapGroups.find( *ids );
|
||||
if ( it != _mapGroups.end() && !CORBA::is_nil( it->second ))
|
||||
aList[nbGroups++] = SMESH::SMESH_GroupBase::_duplicate( it->second );
|
||||
}
|
||||
aList->length( nbGroups );
|
||||
return aList._retn();
|
||||
}
|
||||
|
@ -108,6 +108,9 @@ public:
|
||||
SMESH::ListOfGroups* GetGroups()
|
||||
throw (SALOME::SALOME_Exception);
|
||||
|
||||
CORBA::Long NbGroups()
|
||||
throw (SALOME::SALOME_Exception);
|
||||
|
||||
SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
|
||||
SMESH::SMESH_GroupBase_ptr theGroup2,
|
||||
const char* theName )
|
||||
@ -303,7 +306,7 @@ public:
|
||||
static SMESH::Hypothesis_Status
|
||||
ConvertHypothesisStatus (SMESH_Hypothesis::Hypothesis_Status theStatus);
|
||||
|
||||
int importMEDFile( const char* theFileName, const char* theMeshName );
|
||||
//int importMEDFile( const char* theFileName, const char* theMeshName );
|
||||
|
||||
SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject );
|
||||
|
||||
@ -333,6 +336,15 @@ public:
|
||||
|
||||
CORBA::LongLong GetMeshPtr();
|
||||
|
||||
/*!
|
||||
* \brief Assure that all groups are published
|
||||
*/
|
||||
void CreateGroupServants();
|
||||
|
||||
/*!
|
||||
* \brief Return groups cantained in _mapGroups by their IDs
|
||||
*/
|
||||
SMESH::ListOfGroups* GetGroups(const std::list<int>& groupIDs) const;
|
||||
|
||||
/*!
|
||||
* Get XYZ coordinates of node as list of double
|
||||
@ -420,7 +432,6 @@ public:
|
||||
map<int, ::SMESH_subMesh*> _mapSubMesh; //NRI
|
||||
|
||||
private:
|
||||
void CreateGroupServants();
|
||||
|
||||
static int myIdGenerator;
|
||||
::SMESH_Mesh* _impl; // :: force no namespace here
|
||||
|
Loading…
Reference in New Issue
Block a user