-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
+// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
// File : SMESH_Mesh_i.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-// $Header$
-
+//
#include "SMESH_Mesh_i.hxx"
#include "SMESH_Filter_i.hxx"
#include "Utils_ExceptHandlers.hxx"
#include "Utils_SINGLETON.hxx"
#include "utilities.h"
+#include "GEOMImpl_Types.hxx"
// OCCT Includes
#include <BRep_Builder.hxx>
#include <string>
#include <iostream>
#include <sstream>
+#include <sys/stat.h>
#ifdef _DEBUG_
static int MYDEBUG = 0;
for ( it = _mapGroups.begin(); it != _mapGroups.end(); it++ ) {
SMESH_GroupBase_i* aGroup = dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( it->second ).in() );
if ( aGroup ) {
-
// this method is colled from destructor of group (PAL6331)
//_impl->RemoveGroup( aGroup->GetLocalID() );
-
+
aGroup->Destroy();
}
}
_mapGroups.clear();
+ delete _impl;
}
//=============================================================================
catch(SALOME_Exception & S_ex) {
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
}
+ // to track changes of GEOM groups
+ addGeomGroupData( theShapeObject, _this() );
}
//================================================================================
//=======================================================================
GEOM::GEOM_Object_ptr SMESH_Mesh_i::GetShapeToMesh()
- throw (SALOME::SALOME_Exception)
+ throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
GEOM::GEOM_Object_var aShapeObj;
return aShapeObj._retn();
}
+//================================================================================
+/*!
+ * \brief Remove all nodes and elements
+ */
+//================================================================================
+
+void SMESH_Mesh_i::Clear() throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ try {
+ _impl->Clear();
+ }
+ catch(SALOME_Exception & S_ex) {
+ THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ }
+ TPythonDump() << _this() << ".Clear()";
+}
+
+//================================================================================
+/*!
+ * \brief Remove all nodes and elements for indicated shape
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ClearSubMesh(CORBA::Long ShapeID)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ try {
+ _impl->ClearSubMesh( ShapeID );
+ }
+ catch(SALOME_Exception & S_ex) {
+ THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+ }
+}
+
//=============================================================================
/*!
*
CreateGroupServants();
+ int major, minor, release;
+ if( !MED::getMEDVersion( theFileName, major, minor, release ) )
+ major = minor = release = -1;
+ myFileInfo = new SALOME_MED::MedFileInfo();
+ myFileInfo->fileName = theFileName;
+ myFileInfo->fileSize = 0;
+#ifdef WIN32
+ struct _stati64 d;
+ if ( ::_stati64( theFileName, &d ) != -1 )
+#else
+ struct stat64 d;
+ if ( ::stat64( theFileName, &d ) != -1 )
+#endif
+ myFileInfo->fileSize = d.st_size;
+ myFileInfo->major = major;
+ myFileInfo->minor = minor;
+ myFileInfo->release = release;
+
return ConvertDriverMEDReadStatus(status);
}
RETURNCASE( HYP_BAD_DIM );
RETURNCASE( HYP_BAD_SUBSHAPE );
RETURNCASE( HYP_BAD_GEOMETRY );
+ RETURNCASE( HYP_NEED_SHAPE );
default:;
}
return SMESH::HYP_UNKNOWN_FATAL;
// create a new subMesh object servant if there is none for the shape
if ( subMesh->_is_nil() )
subMesh = createSubMesh( aSubShapeObject );
-
if ( _gen_i->CanPublishInStudy( subMesh )) {
SALOMEDS::SObject_var aSO =
_gen_i->PublishSubMesh(_gen_i->GetCurrentStudy(), aMesh,
SMESH::SMESH_GroupOnGeom_var aNewGroup;
TopoDS_Shape aShape = _gen_i->GeomObjectToShape( theGeomObj );
- if ( !aShape.IsNull() ) {
+ if ( !aShape.IsNull() )
+ {
aNewGroup = SMESH::SMESH_GroupOnGeom::_narrow
( createGroup( theElemType, theName, aShape ));
+
if ( _gen_i->CanPublishInStudy( aNewGroup ) ) {
SALOMEDS::SObject_var aSO =
_gen_i->PublishGroup(_gen_i->GetCurrentStudy(), _this(),
TPythonDump() << _this() << ".RemoveGroup( " << aGroupSO << " )";
// Remove group's SObject
- aStudy->NewBuilder()->RemoveObject( aGroupSO );
+ aStudy->NewBuilder()->RemoveObjectWithChildren( aGroupSO );
}
}
}
}
+//=============================================================================
+/*!
+ \brief Union list of groups. New group is created. All mesh elements that are
+ present in initial groups are added to the new one.
+ \param theGroups list of groups
+ \param theName name of group to be created
+ \return pointer on the group
+*/
+//=============================================================================
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::UnionListOfGroups(const SMESH::ListOfGroups& theGroups,
+ const char* theName )
+throw (SALOME::SALOME_Exception)
+{
+ if ( !theName )
+ return SMESH::SMESH_Group::_nil();
+
+ try
+ {
+ NCollection_Map< int > anIds;
+ SMESH::ElementType aType = SMESH::ALL;
+ for ( int g = 0, n = theGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
+ {
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
+ }
+
+ // unite ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ anIds.Add( aCurrId );
+ }
+ }
+
+ // Create group
+ SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.Extent() );
+
+ NCollection_Map< int >::Iterator anIter( anIds );
+ for ( int i = 0; anIter.More(); anIter.Next(), i++ )
+ {
+ aResIds[ i ] = anIter.Value();
+ }
+ aResGrp->Add( aResIds );
+
+ // Clear python lines, created by CreateGroup() and Add()
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+
+ // Update Python script
+
+ TPythonDump() << aResGrp << " = " << _this() << ".UnionListOfGroups( "
+ << &theGroups << ", '" << theName << "' )";
+
+ return aResGrp._retn();
+ }
+ catch( ... )
+ {
+ return SMESH::SMESH_Group::_nil();
+ }
+}
+
//=============================================================================
/*! IntersectGroups
* New group is created. All mesh elements that are
return aResGrp._retn();
}
+//=============================================================================
+/*!
+ \brief Intersect list of groups. New group is created. All mesh elements that
+ are present in all initial groups simultaneously are added to the new one.
+ \param theGroups list of groups
+ \param theName name of group to be created
+ \return pointer on the group
+*/
+//=============================================================================
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectListOfGroups(
+ const SMESH::ListOfGroups& theGroups, const char* theName )
+throw (SALOME::SALOME_Exception)
+{
+ if ( !theName )
+ return SMESH::SMESH_Group::_nil();
+
+ try
+ {
+ NCollection_DataMap< int, int > anIdToCount;
+ SMESH::ElementType aType = SMESH::ALL;
+ for ( int g = 0, n = theGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
+ {
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
+ }
+
+ // calculates number of occurance ids in groups
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ if ( !anIdToCount.IsBound( aCurrId ) )
+ anIdToCount.Bind( aCurrId, 1 );
+ else
+ anIdToCount( aCurrId ) = anIdToCount( aCurrId ) + 1;
+ }
+ }
+
+ // create map of ids
+ int nbGrp = theGroups.length();
+ NCollection_Map< int > anIds;
+ NCollection_DataMap< int, int >::Iterator anIter( anIdToCount );
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ int aCurrId = anIter.Key();
+ int aCurrNb = anIter.Value();
+ if ( aCurrNb == nbGrp )
+ anIds.Add( aCurrId );
+ }
+
+ // Create group
+ SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.Extent() );
+
+ NCollection_Map< int >::Iterator aListIter( anIds );
+ for ( int i = 0; aListIter.More(); aListIter.Next(), i++ )
+ {
+ aResIds[ i ] = aListIter.Value();
+ }
+ aResGrp->Add( aResIds );
+
+ // Clear python lines, created by CreateGroup() and Add()
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+
+ // Update Python script
+
+ TPythonDump() << aResGrp << " = " << _this() << ".IntersectListOfGroups( "
+ << &theGroups << ", '" << theName << "' )";
+
+ return aResGrp._retn();
+ }
+ catch( ... )
+ {
+ return SMESH::SMESH_Group::_nil();
+ }
+}
+
//=============================================================================
/*! CutGroups
* New group is created. All mesh elements that are present in
for ( int i2 = 0, n2 = anIds2->length(); i2 < n2; i2++ )
aMap2.Add( anIds2[ i2 ] );
-
TColStd_SequenceOfInteger aSeq;
for ( int i1 = 0, n1 = anIds1->length(); i1 < n1; i1++ )
if ( !aMap2.Contains( anIds1[ i1 ] ) )
return aResGrp._retn();
}
+//=============================================================================
+/*!
+ \brief Cut lists of groups. New group is created. All mesh elements that are
+ present in main groups but do not present in tool groups are added to the new one
+ \param theMainGroups list of main groups
+ \param theToolGroups list of tool groups
+ \param theName name of group to be created
+ \return pointer on the group
+*/
+//=============================================================================
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutListOfGroups(
+ const SMESH::ListOfGroups& theMainGroups,
+ const SMESH::ListOfGroups& theToolGroups,
+ const char* theName )
+ throw (SALOME::SALOME_Exception)
+{
+ if ( !theName )
+ return SMESH::SMESH_Group::_nil();
+
+ try
+ {
+ NCollection_Map< int > aToolIds;
+ SMESH::ElementType aType = SMESH::ALL;
+ int g, n;
+ // iterate through tool groups
+ for ( g = 0, n = theToolGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theToolGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
+ {
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
+ }
+
+ // unite tool ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ aToolIds.Add( aCurrId );
+ }
+ }
+
+ NCollection_Map< int > anIds; // result
+
+ // Iterate through main group
+ for ( g = 0, n = theMainGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theMainGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ // check type
+ SMESH::ElementType aCurrType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ aType = aCurrType;
+ else
+ {
+ if ( aType != aCurrType )
+ return SMESH::SMESH_Group::_nil();
+ }
+
+ // unite tool ids
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ if ( !aToolIds.Contains( aCurrId ) )
+ anIds.Add( aCurrId );
+ }
+ }
+
+ // Create group
+ SMESH::SMESH_Group_var aResGrp = CreateGroup( aType, theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( anIds.Extent() );
+
+ NCollection_Map< int >::Iterator anIter( anIds );
+ for ( int i = 0; anIter.More(); anIter.Next(), i++ )
+ {
+ aResIds[ i ] = anIter.Value();
+ }
+ aResGrp->Add( aResIds );
+
+ // Clear python lines, created by CreateGroup() and Add()
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+
+ // Update Python script
+
+ TPythonDump() << aResGrp << " = " << _this() << ".CutListOfGroups( "
+ << &theMainGroups << ", " << &theToolGroups << ", '"
+ << theName << "' )";
+
+ return aResGrp._retn();
+ }
+ catch( ... )
+ {
+ return SMESH::SMESH_Group::_nil();
+ }
+}
+
+//=============================================================================
+/*!
+ \brief Create groups of entities from existing groups of superior dimensions
+ System
+ 1) extract all nodes from each group,
+ 2) combine all elements of specified dimension laying on these nodes.
+ \param theGroups list of source groups
+ \param theElemType dimension of elements
+ \param theName name of new group
+ \return pointer on new group
+*/
+//=============================================================================
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateDimGroup(
+ const SMESH::ListOfGroups& theGroups,
+ SMESH::ElementType theElemType,
+ const char* theName )
+ throw (SALOME::SALOME_Exception)
+{
+ SMESHDS_Mesh* aMeshDS = _impl->GetMeshDS();
+
+ if ( !theName || !aMeshDS )
+ return SMESH::SMESH_Group::_nil();
+
+ SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)theElemType;
+
+ try
+ {
+ // Create map of nodes from all groups
+
+ NCollection_Map< int > aNodeMap;
+
+ for ( int g = 0, n = theGroups.length(); g < n; g++ )
+ {
+ SMESH::SMESH_GroupBase_var aGrp = theGroups[ g ];
+ if ( CORBA::is_nil( aGrp ) )
+ continue;
+
+ SMESH::ElementType aType = aGrp->GetType();
+ if ( aType == SMESH::ALL )
+ continue;
+ else if ( aType == SMESH::NODE )
+ {
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ const SMDS_MeshNode* aNode = aMeshDS->FindNode( aCurrId );
+ if ( aNode )
+ aNodeMap.Add( aNode->GetID() );
+ }
+ }
+ else
+ {
+ SMESH::long_array_var aCurrIds = aGrp->GetListOfID();
+ for ( int i = 0, n = aCurrIds->length(); i < n; i++ )
+ {
+ int aCurrId = aCurrIds[ i ];
+ const SMDS_MeshElement* anElem = aMeshDS->FindElement( aCurrId );
+ if ( !anElem )
+ continue;
+ SMDS_ElemIteratorPtr aNodeIter = anElem->nodesIterator();
+ while( aNodeIter->more() )
+ {
+ const SMDS_MeshNode* aNode =
+ dynamic_cast<const SMDS_MeshNode*>( aNodeIter->next() );
+ if ( aNode )
+ aNodeMap.Add( aNode->GetID() );
+ }
+ }
+ }
+ }
+
+ // Get result identifiers
+
+ NCollection_Map< int > aResultIds;
+ if ( theElemType == SMESH::NODE )
+ {
+ NCollection_Map< int >::Iterator aNodeIter( aNodeMap );
+ for ( ; aNodeIter.More(); aNodeIter.Next() )
+ aResultIds.Add( aNodeIter.Value() );
+ }
+ else
+ {
+ // Create list of elements of given dimension constructed on the nodes
+ NCollection_Map< int > anElemList;
+ NCollection_Map< int >::Iterator aNodeIter( aNodeMap );
+ for ( ; aNodeIter.More(); aNodeIter.Next() )
+ {
+ const SMDS_MeshElement* aNode =
+ dynamic_cast<const SMDS_MeshElement*>( aMeshDS->FindNode( aNodeIter.Value() ) );
+ if ( !aNode )
+ continue;
+
+ SMDS_ElemIteratorPtr anElemIter = aNode->elementsIterator( anElemType );
+ while( anElemIter->more() )
+ {
+ const SMDS_MeshElement* anElem =
+ dynamic_cast<const SMDS_MeshElement*>( anElemIter->next() );
+ if ( anElem && anElem->GetType() == anElemType )
+ anElemList.Add( anElem->GetID() );
+ }
+ }
+
+ // check whether all nodes of elements are present in nodes map
+ NCollection_Map< int >::Iterator anIter( anElemList );
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ const SMDS_MeshElement* anElem = aMeshDS->FindElement( anIter.Value() );
+ if ( !anElem )
+ continue;
+
+ bool isOk = true;
+ SMDS_ElemIteratorPtr aNodeIter = anElem->nodesIterator();
+ while( aNodeIter->more() )
+ {
+ const SMDS_MeshNode* aNode =
+ dynamic_cast<const SMDS_MeshNode*>( aNodeIter->next() );
+ if ( !aNode || !aNodeMap.Contains( aNode->GetID() ) )
+ {
+ isOk = false;
+ break;
+ }
+ }
+ if ( isOk )
+ aResultIds.Add( anElem->GetID() );
+ }
+ }
+
+ // Create group
+
+ SMESH::SMESH_Group_var aResGrp = CreateGroup( theElemType, theName );
+ if ( aResGrp->_is_nil() )
+ return SMESH::SMESH_Group::_nil();
+
+ // Create array of identifiers
+ SMESH::long_array_var aResIds = new SMESH::long_array;
+ aResIds->length( aResultIds.Extent() );
+
+ NCollection_Map< int >::Iterator aResIter( aResultIds );
+ for ( int i = 0; aResIter.More(); aResIter.Next(), i++ )
+ aResIds[ i ] = aResIter.Value();
+ aResGrp->Add( aResIds );
+
+ // Remove strings corresponding to group creation
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+ _gen_i->RemoveLastFromPythonScript( aStudy->StudyId() );
+
+ // Update Python script
+
+ TPythonDump() << aResGrp << " = " << _this() << ".CreateDimGroup( "
+ << &theGroups << ", " << theElemType << ", '" << theName << "' )";
+
+ return aResGrp._retn();
+ }
+ catch( ... )
+ {
+ return SMESH::SMESH_Group::_nil();
+ }
+}
+
//================================================================================
/*!
- * \brief Return group items of a group present in a study
+ * \brief Remember GEOM group data
*/
//================================================================================
-static GEOM::GEOM_Object_ptr getGroupItemsFromStudy(CORBA::Object_ptr theMesh,
- SMESH_Gen_i* theGen,
- list<TopoDS_Shape> & theItems)
+void SMESH_Mesh_i::addGeomGroupData(GEOM::GEOM_Object_ptr theGeomObj,
+ CORBA::Object_ptr theSmeshObj)
{
- GEOM::GEOM_Object_var groupObj;
- SALOMEDS::Study_var study = theGen->GetCurrentStudy();
- GEOM::GEOM_Gen_var geomGen = theGen->GetGeomEngine();
- if ( study->_is_nil() || geomGen->_is_nil() )
- return groupObj._retn();
-
+ if ( CORBA::is_nil( theGeomObj ) || theGeomObj->GetType() != GEOM_GROUP )
+ return;
+ // group SO
+ SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
+ SALOMEDS::SObject_var groupSO = _gen_i->ObjectToSObject( study, theGeomObj );
+ if ( groupSO->_is_nil() )
+ return;
+ // group indices
+ GEOM::GEOM_Gen_var geomGen = _gen_i->GetGeomEngine();
GEOM::GEOM_IGroupOperations_var groupOp =
- geomGen->GetIGroupOperations( theGen->GetCurrentStudyID() );
- GEOM::GEOM_IShapesOperations_var shapeOp =
- geomGen->GetIShapesOperations( theGen->GetCurrentStudyID() );
-
- SALOMEDS::SObject_var meshOS = theGen->ObjectToSObject(study, theMesh);
- if ( meshOS->_is_nil() || groupOp->_is_nil() || shapeOp->_is_nil() )
- return groupObj._retn();
- SALOMEDS::SObject_var fatherSO = meshOS->GetFather();
- if ( fatherSO->_is_nil() || fatherSO->Tag() != theGen->GetSubMeshOnCompoundTag() )
- return groupObj._retn(); // keep only submeshes on groups
-
- SALOMEDS::ChildIterator_var anIter = study->NewChildIterator(meshOS);
- if ( anIter->_is_nil() ) return groupObj._retn();
- for ( ; anIter->More(); anIter->Next())
- {
- SALOMEDS::SObject_var aSObject = anIter->Value();
- SALOMEDS::SObject_var aRefSO;
- if ( !aSObject->_is_nil() && aSObject->ReferencedObject(aRefSO) )
- {
- groupObj = GEOM::GEOM_Object::_narrow(aRefSO->GetObject());
- if ( groupObj->_is_nil() ) break;
- GEOM::ListOfLong_var ids = groupOp->GetObjects( groupObj );
- GEOM::GEOM_Object_var mainShape = groupObj->GetMainShape();
- for ( int i = 0; i < ids->length(); ++i ) {
- GEOM::GEOM_Object_var subShape = shapeOp->GetSubShape( mainShape, ids[i] );
- TopoDS_Shape S = theGen->GeomObjectToShape( subShape );
- if ( !S.IsNull() )
- theItems.push_back( S );
- }
- break;
+ geomGen->GetIGroupOperations( _gen_i->GetCurrentStudyID() );
+ GEOM::ListOfLong_var ids = groupOp->GetObjects( theGeomObj );
+
+ // store data
+ _geomGroupData.push_back( TGeomGroupData() );
+ TGeomGroupData & groupData = _geomGroupData.back();
+ // entry
+ CORBA::String_var entry = groupSO->GetID();
+ groupData._groupEntry = entry.in();
+ // indices
+ for ( int i = 0; i < ids->length(); ++i )
+ groupData._indices.insert( ids[i] );
+ // SMESH object
+ groupData._smeshObject = theSmeshObj;
+}
+
+//================================================================================
+/*!
+ * Remove GEOM group data relating to removed smesh object
+ */
+//================================================================================
+
+void SMESH_Mesh_i::removeGeomGroupData(CORBA::Object_ptr theSmeshObj)
+{
+ list<TGeomGroupData>::iterator
+ data = _geomGroupData.begin(), dataEnd = _geomGroupData.end();
+ for ( ; data != dataEnd; ++data ) {
+ if ( theSmeshObj->_is_equivalent( data->_smeshObject )) {
+ _geomGroupData.erase( data );
+ return;
}
}
- return groupObj._retn();
+}
+
+//================================================================================
+/*!
+ * \brief Return new group contents if it has been changed and update group data
+ */
+//================================================================================
+
+TopoDS_Shape SMESH_Mesh_i::newGroupShape( TGeomGroupData & groupData)
+{
+ TopoDS_Shape newShape;
+
+ // get geom group
+ SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
+ if ( study->_is_nil() ) return newShape; // means "not changed"
+ SALOMEDS::SObject_var groupSO = study->FindObjectID( groupData._groupEntry.c_str() );
+ if ( !groupSO->_is_nil() )
+ {
+ CORBA::Object_var groupObj = _gen_i->SObjectToObject( groupSO );
+ if ( CORBA::is_nil( groupObj )) return newShape;
+ GEOM::GEOM_Object_var geomGroup = GEOM::GEOM_Object::_narrow( groupObj );
+
+ // get indices of group items
+ set<int> curIndices;
+ GEOM::GEOM_Gen_var geomGen = _gen_i->GetGeomEngine();
+ GEOM::GEOM_IGroupOperations_var groupOp =
+ geomGen->GetIGroupOperations( _gen_i->GetCurrentStudyID() );
+ GEOM::ListOfLong_var ids = groupOp->GetObjects( geomGroup );
+ for ( int i = 0; i < ids->length(); ++i )
+ curIndices.insert( ids[i] );
+
+ if ( groupData._indices == curIndices )
+ return newShape; // group not changed
+
+ // update data
+ groupData._indices = curIndices;
+
+ GEOM_Client* geomClient = _gen_i->GetShapeReader();
+ if ( !geomClient ) return newShape;
+ TCollection_AsciiString groupIOR = geomGen->GetStringFromIOR( geomGroup );
+ geomClient->RemoveShapeFromBuffer( groupIOR );
+ newShape = _gen_i->GeomObjectToShape( geomGroup );
+ }
+
+ if ( newShape.IsNull() ) {
+ // geom group becomes empty - return empty compound
+ TopoDS_Compound compound;
+ BRep_Builder builder;
+ builder.MakeCompound(compound);
+ newShape = compound;
+ }
+ return newShape;
}
//=============================================================================
/*!
- * \brief Update hypotheses assigned to geom groups if the latter change
+ * \brief Update objects depending on changed geom groups
*
- * NPAL16168: "geometrical group edition from a submesh don't modifiy mesh computation"
+ * NPAL16168: geometrical group edition from a submesh don't modifiy mesh computation
+ * issue 0020210: Update of a smesh group after modification of the associated geom group
*/
//=============================================================================
SALOMEDS::Study_var study = _gen_i->GetCurrentStudy();
if ( study->_is_nil() ) return;
- // check if items of groups changed
- map<int, ::SMESH_subMesh*>::iterator i_sm = _mapSubMesh.begin();
- for ( ; i_sm != _mapSubMesh.end(); ++i_sm )
+ CORBA::Long nbEntities = NbNodes() + NbElements();
+
+ // Check if group contents changed
+
+ typedef map< string, TopoDS_Shape > TEntry2Geom;
+ TEntry2Geom newGroupContents;
+
+ list<TGeomGroupData>::iterator
+ data = _geomGroupData.begin(), dataEnd = _geomGroupData.end();
+ for ( ; data != dataEnd; ++data )
{
- const TopoDS_Shape & oldGroupShape = i_sm->second->GetSubShape();
- SMESHDS_SubMesh * oldDS = i_sm->second->GetSubMeshDS();
- if ( !oldDS /*|| !oldDS->IsComplexSubmesh()*/ )
- continue;
- int oldID = i_sm->first;
- map<int, SMESH::SMESH_subMesh_ptr>::iterator i_smIor = _mapSubMeshIor.find( oldID );
- if ( i_smIor == _mapSubMeshIor.end() )
- continue;
- list< TopoDS_Shape> newItems;
- GEOM::GEOM_Object_var groupObj = getGroupItemsFromStudy ( i_smIor->second, _gen_i, newItems );
- if ( groupObj->_is_nil() )
- continue;
+ pair< TEntry2Geom::iterator, bool > it_new =
+ newGroupContents.insert( make_pair( data->_groupEntry, TopoDS_Shape() ));
+ bool processedGroup = !it_new.second;
+ TopoDS_Shape& newShape = it_new.first->second;
+ if ( !processedGroup )
+ newShape = newGroupShape( *data );
+ if ( newShape.IsNull() )
+ continue; // no changes
+
+ if ( processedGroup ) { // update group indices
+ list<TGeomGroupData>::iterator data2 = data;
+ for ( --data2; data2->_groupEntry != data->_groupEntry; --data2)
+ data->_indices = data2->_indices;
+ }
- int nbOldItems = oldDS->IsComplexSubmesh() ? oldDS->NbSubMeshes() : 1;
- int nbNewItems = newItems.size();
- bool groupChanged = ( nbOldItems != nbNewItems);
- if ( !groupChanged ) {
- if ( !oldDS->IsComplexSubmesh() ) { // old group has one item
- groupChanged = ( oldGroupShape != newItems.front() );
- }
- else {
- list<TopoDS_Shape>::iterator item = newItems.begin();
- for ( ; item != newItems.end() && !groupChanged; ++item )
- {
- SMESHDS_SubMesh * itemDS = _impl->GetMeshDS()->MeshElements( *item );
- groupChanged = ( !itemDS || !oldDS->ContainsSubMesh( itemDS ));
- }
- }
+ // Update SMESH objects according to new GEOM group contents
+
+ SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( data->_smeshObject );
+ if ( !mesh->_is_nil() ) // -------------- MESH ----------------------------
+ {
+ // TODO
+ continue;
}
- // update hypotheses and submeshes if necessary
- if ( groupChanged )
+
+ SMESH::SMESH_subMesh_var submesh = SMESH::SMESH_subMesh::_narrow( data->_smeshObject );
+ if ( !submesh->_is_nil() ) // -------------- Sub mesh ---------------------
{
- // get a new group shape
- GEOM_Client* geomClient = _gen_i->GetShapeReader();
- if ( !geomClient ) continue;
- TCollection_AsciiString groupIOR = _gen_i->GetGeomEngine()->GetStringFromIOR( groupObj );
- geomClient->RemoveShapeFromBuffer( groupIOR );
- TopoDS_Shape newGroupShape = _gen_i->GeomObjectToShape( groupObj );
+ int oldID = submesh->GetId();
+ if ( _mapSubMeshIor.find( oldID ) == _mapSubMeshIor.end() )
+ continue;
+ TopoDS_Shape oldShape = _mapSubMesh[oldID]->GetSubShape();
+
// update hypotheses
- list <const SMESHDS_Hypothesis * > hyps = _impl->GetHypothesisList(oldGroupShape);
+ list <const SMESHDS_Hypothesis * > hyps = _impl->GetHypothesisList(oldShape);
list <const SMESHDS_Hypothesis * >::iterator hypIt;
for ( hypIt = hyps.begin(); hypIt != hyps.end(); ++hypIt )
{
- _impl->RemoveHypothesis( oldGroupShape, (*hypIt)->GetID());
- _impl->AddHypothesis ( newGroupShape, (*hypIt)->GetID());
+ _impl->RemoveHypothesis( oldShape, (*hypIt)->GetID());
+ _impl->AddHypothesis ( newShape, (*hypIt)->GetID());
}
// care of submeshes
- SMESH_subMesh* newSubmesh = _impl->GetSubMesh( newGroupShape );
+ SMESH_subMesh* newSubmesh = _impl->GetSubMesh( newShape );
int newID = newSubmesh->GetId();
if ( newID != oldID ) {
_mapSubMesh [ newID ] = newSubmesh;
_mapSubMesh_i [ newID ] = _mapSubMesh_i [ oldID ];
_mapSubMeshIor[ newID ] = _mapSubMeshIor[ oldID ];
- _mapSubMesh.erase (oldID);
- _mapSubMesh_i.erase (oldID);
+ _mapSubMesh. erase(oldID);
+ _mapSubMesh_i. erase(oldID);
_mapSubMeshIor.erase(oldID);
_mapSubMesh_i [ newID ]->changeLocalId( newID );
}
+ continue;
+ }
+
+ SMESH::SMESH_GroupOnGeom_var smeshGroup =
+ SMESH::SMESH_GroupOnGeom::_narrow( data->_smeshObject );
+ if ( !smeshGroup->_is_nil() ) // ------------ GROUP -----------------------
+ {
+ SMESH_GroupOnGeom_i* group_i = SMESH::DownCast<SMESH_GroupOnGeom_i*>( smeshGroup );
+ if ( group_i ) {
+ ::SMESH_Group* group = _impl->GetGroup( group_i->GetLocalID() );
+ SMESHDS_GroupOnGeom* ds = static_cast<SMESHDS_GroupOnGeom*>( group->GetGroupDS() );
+ ds->SetShape( newShape );
+ }
+ continue;
+ }
+ }
+
+ // Update icons
+
+ CORBA::Long newNbEntities = NbNodes() + NbElements();
+ list< SALOMEDS::SObject_var > soToUpdateIcons;
+ if ( newNbEntities != nbEntities )
+ {
+ // Add all SObjects with icons
+ soToUpdateIcons.push_back( _gen_i->ObjectToSObject( study, _this() )); // mesh
+
+ for (map<int, SMESH::SMESH_subMesh_ptr>::iterator i_sm = _mapSubMeshIor.begin();
+ i_sm != _mapSubMeshIor.end(); ++i_sm ) // submeshes
+ soToUpdateIcons.push_back( _gen_i->ObjectToSObject( study, i_sm->second ));
+
+ for ( map<int, SMESH::SMESH_GroupBase_ptr>::iterator i_gr = _mapGroups.begin();
+ i_gr != _mapGroups.end(); ++i_gr ) // groups
+ soToUpdateIcons.push_back( _gen_i->ObjectToSObject( study, i_gr->second ));
+ }
+
+ list< SALOMEDS::SObject_var >::iterator so = soToUpdateIcons.begin();
+ for ( ; so != soToUpdateIcons.end(); ++so )
+ _gen_i->SetPixMap( *so, "ICON_SMESH_TREE_MESH_WARN" );
+}
+
+//=============================================================================
+/*!
+ * \brief Create standalone group instead if group on geometry
+ *
+ */
+//=============================================================================
+
+SMESH::SMESH_Group_ptr SMESH_Mesh_i::ConvertToStandalone( SMESH::SMESH_GroupOnGeom_ptr theGroup )
+{
+ SMESH::SMESH_Group_var aGroup;
+ if ( theGroup->_is_nil() )
+ return aGroup._retn();
+
+ Unexpect aCatch(SALOME_SalomeException);
+
+ SMESH_GroupBase_i* aGroupToRem =
+ dynamic_cast<SMESH_GroupBase_i*>( SMESH_Gen_i::GetServant( theGroup ).in() );
+ if ( !aGroupToRem )
+ return aGroup._retn();
+
+ int anId = aGroupToRem->GetLocalID();
+ if ( !_impl->ConvertToStandalone( anId ) )
+ return aGroup._retn();
+ removeGeomGroupData( theGroup );
+
+ SMESH_GroupBase_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId );
+
+ // remove old instance of group from own map
+ _mapGroups.erase( anId );
+
+ SALOMEDS::StudyBuilder_var builder;
+ SALOMEDS::SObject_var aGroupSO;
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ if ( !aStudy->_is_nil() ) {
+ builder = aStudy->NewBuilder();
+ aGroupSO = _gen_i->ObjectToSObject( aStudy, theGroup );
+ if ( !aGroupSO->_is_nil() ) {
+
+ // remove reference to geometry
+ SALOMEDS::ChildIterator_var chItr = aStudy->NewChildIterator(aGroupSO);
+ for ( ; chItr->More(); chItr->Next() )
+ // Remove group's child SObject
+ builder->RemoveObject( chItr->Value() );
+
+ // Update Python script
+ TPythonDump() << aGroupSO << " = " << _this() << ".ConvertToStandalone( "
+ << aGroupSO << " )";
}
}
+
+ // PAL7962: san -- 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
+
+ // remember new group in own map
+ aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() );
+ _mapGroups[anId] = SMESH::SMESH_GroupBase::_duplicate( aGroup );
+
+ // register CORBA object for persistence
+ //int nextId = _gen_i->RegisterObject( aGroup );
+ //if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
+ builder->SetIOR( aGroupSO, _gen_i->GetORB()->object_to_string( aGroup ) );
+
+ return aGroup._retn();
}
//=============================================================================
int nextId = _gen_i->RegisterObject( subMesh );
if(MYDEBUG) MESSAGE( "Add submesh to map with id = "<< nextId);
+ // to track changes of GEOM groups
+ addGeomGroupData( theSubShapeObject, subMesh );
+
return subMesh._retn();
}
catch( const SALOME::SALOME_Exception& ) {
INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!");
}
+ removeGeomGroupData( theSubShapeObject );
int subMeshId = theSubMesh->GetId();
// register CORBA object for persistence
int nextId = _gen_i->RegisterObject( aGroup );
if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
+
+ // to track changes of GEOM groups
+ if ( !theShape.IsNull() ) {
+ GEOM::GEOM_Object_var geom = _gen_i->ShapeToGeomObject( theShape );
+ addGeomGroupData( geom, aGroup );
+ }
}
return aGroup._retn();
}
{
if(MYDEBUG) MESSAGE("SMESH_Mesh_i::removeGroup()" );
if ( _mapGroups.find( theId ) != _mapGroups.end() ) {
+ removeGeomGroupData( _mapGroups[theId] );
_mapGroups.erase( theId );
_impl->RemoveGroup( theId );
}
return _impl->HasDuplicatedGroupNamesMED();
}
-static void PrepareForWriting (const char* file)
+void SMESH_Mesh_i::PrepareForWriting (const char* file)
{
TCollection_AsciiString aFullName ((char*)file);
OSD_Path aPath (aFullName);
{
Unexpect aCatch(SALOME_SalomeException);
- // Update Python script
- TPythonDump() << _this() << ".ExportToMED( '"
- << file << "', " << auto_groups << ", " << theVersion << " )";
-
// Perform Export
PrepareForWriting(file);
- char* aMeshName = "Mesh";
+ const char* aMeshName = "Mesh";
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
if ( !aStudy->_is_nil() ) {
SALOMEDS::SObject_var aMeshSO = _gen_i->ObjectToSObject( aStudy, _this() );
if ( !aMeshSO->_is_nil() ) {
aMeshName = aMeshSO->GetName();
- //SCRUTE(file);
- //SCRUTE(aMeshName);
- //SCRUTE(aMeshSO->GetID());
-
// asv : 27.10.04 : fix of 6903: check for StudyLocked before adding attributes
if ( !aStudy->GetProperties()->IsLocked() )
{
}
}
}
+ // Update Python script
+ // set name of mesh before export
+ TPythonDump() << _gen_i << ".SetName(" << _this() << ", '" << aMeshName << "')";
+
+ // check names of groups
+ checkGroupNames();
+
+ TPythonDump() << _this() << ".ExportToMED( '"
+ << file << "', " << auto_groups << ", " << theVersion << " )";
+
_impl->ExportMED( file, aMeshName, auto_groups, theVersion );
}
Unexpect aCatch(SALOME_SalomeException);
// Update Python script
+ // check names of groups
+ checkGroupNames();
TPythonDump() << _this() << ".ExportDAT( '" << file << "' )";
// Perform Export
Unexpect aCatch(SALOME_SalomeException);
// Update Python script
+ // check names of groups
+ checkGroupNames();
TPythonDump() << _this() << ".ExportUNV( '" << file << "' )";
// Perform Export
Unexpect aCatch(SALOME_SalomeException);
// Update Python script
+ // check names of groups
+ checkGroupNames();
TPythonDump() << _this() << ".ExportSTL( '" << file << "', " << isascii << " )";
// Perform Export
CORBA::Long SMESH_Mesh_i::NbSubMesh()throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- return _impl->NbSubMesh();
+ return _mapSubMesh_i.size();
}
//=============================================================================
CORBA::LongLong SMESH_Mesh_i::GetMeshPtr()
{
CORBA::LongLong pointeur = CORBA::LongLong(_impl);
- cerr << "CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() " << pointeur << endl;
+ if ( MYDEBUG )
+ MESSAGE("CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() "<<pointeur);
return pointeur;
}
aList->length( nbGroups );
return aList._retn();
}
+
+//=============================================================================
+/*!
+ * \brief Return information about imported file
+ */
+//=============================================================================
+
+SALOME_MED::MedFileInfo* SMESH_Mesh_i::GetMEDFileInfo()
+{
+ SALOME_MED::MedFileInfo_var res( myFileInfo );
+ if ( !res.operator->() ) {
+ res = new SALOME_MED::MedFileInfo;
+ res->fileName = "";
+ res->fileSize = res->major = res->minor = res->release = -1;
+ }
+ return res._retn();
+}
+
+//=============================================================================
+/*!
+ * \brief Check and correct names of mesh groups
+ */
+//=============================================================================
+
+void SMESH_Mesh_i::checkGroupNames()
+{
+ int nbGrp = NbGroups();
+ if ( !nbGrp )
+ return;
+
+ SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
+ if ( aStudy->_is_nil() )
+ return; // nothing to do
+
+ SMESH::ListOfGroups* grpList = 0;
+ // avoid dump of "GetGroups"
+ {
+ // store python dump into a local variable inside local scope
+ SMESH::TPythonDump pDump; // do not delete this line of code
+ grpList = GetGroups();
+ }
+
+ for ( int gIndx = 0; gIndx < nbGrp; gIndx++ ) {
+ SMESH::SMESH_GroupBase_ptr aGrp = (*grpList)[ gIndx ];
+ if ( !aGrp )
+ continue;
+ SALOMEDS::SObject_var aGrpSO = _gen_i->ObjectToSObject( aStudy, aGrp );
+ if ( aGrpSO->_is_nil() )
+ continue;
+ // correct name of the mesh group if necessary
+ const char* guiName = aGrpSO->GetName();
+ if ( strcmp(guiName, aGrp->GetName()) )
+ aGrp->SetName( guiName );
+ }
+}
+
+//=============================================================================
+/*!
+ * \brief Sets list of notebook variables used for Mesh operations separated by ":" symbol
+ */
+//=============================================================================
+void SMESH_Mesh_i::SetParameters(const char* theParameters)
+{
+ SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Mesh::_narrow(_this()),
+ CORBA::string_dup(theParameters));
+}
+
+//=============================================================================
+/*!
+ * \brief Returns list of notebook variables used for Mesh operations separated by ":" symbol
+ */
+//=============================================================================
+char* SMESH_Mesh_i::GetParameters()
+{
+ SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+ return CORBA::string_dup(gen->GetParameters(SMESH::SMESH_Mesh::_narrow(_this())));
+}
+
+//=============================================================================
+/*!
+ * \brief Returns list of notebook variables used for last Mesh operation
+ */
+//=============================================================================
+SMESH::string_array* SMESH_Mesh_i::GetLastParameters()
+{
+ SMESH::string_array_var aResult = new SMESH::string_array();
+ SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+ if(gen) {
+ char *aParameters = GetParameters();
+ SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
+ if(!aStudy->_is_nil()) {
+ SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters);
+ if(aSections->length() > 0) {
+ SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
+ aResult->length(aVars.length());
+ for(int i = 0;i < aVars.length();i++)
+ aResult[i] = CORBA::string_dup( aVars[i]);
+ }
+ }
+ }
+ return aResult._retn();
+}