X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Mesh_i.cxx;h=367eda450af834afe338271f2f4eb1b58b9bf1f8;hp=3fc5a38dd27c92b41b3a704c2df42888d21ff55c;hb=104ff7b2818ce4d0f8a38d840abd3e5c70190668;hpb=5f6698232ede27dc2cc2fa526b1b116b532ec390 diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 3fc5a38dd..367eda450 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -17,7 +17,7 @@ // 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -31,6 +31,7 @@ #include "SMESH_MEDMesh_i.hxx" #include "SMESH_Group_i.hxx" #include "SMESH_Filter_i.hxx" +#include "SMESH_PythonDump.hxx" #include "Utils_CorbaException.hxx" #include "Utils_ExceptHandlers.hxx" @@ -45,6 +46,9 @@ #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" // OCCT Includes #include @@ -68,9 +72,12 @@ static int MYDEBUG = 0; #endif using namespace std; +using SMESH::TPythonDump; int SMESH_Mesh_i::myIdGenerator = 0; + + //============================================================================= /*! * Constructor @@ -233,6 +240,18 @@ int SMESH_Mesh_i::ImportUNVFile( const char* theFileName ) // Read mesh with name = into SMESH_Mesh _impl->UNVToMesh( 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::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; } @@ -264,24 +283,7 @@ int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshNam { // Read mesh with name = and all its groups into SMESH_Mesh int status = _impl->MEDToMesh( theFileName, theMeshName ); - - // Create group servants, if any groups were imported - list aGroupIds = _impl->GetGroupIds(); - for ( list::iterator it = aGroupIds.begin(); it != aGroupIds.end(); it++ ) { - SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, *it ); - - // 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 - - SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() ); - _mapGroups[*it] = SMESH::SMESH_Group::_duplicate( aGroup ); - - // register CORBA object for persistence - int nextId = _gen_i->RegisterObject( aGroup ); - if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId); - } + CreateGroupServants(); return status; } @@ -314,6 +316,8 @@ static SMESH::Hypothesis_Status ConvertHypothesisStatus res = SMESH::HYP_ALREADY_EXIST; break; case SMESH_Hypothesis::HYP_BAD_DIM: res = SMESH::HYP_BAD_DIM; break; + case SMESH_Hypothesis::HYP_BAD_SUBSHAPE: + res = SMESH::HYP_BAD_SUBSHAPE; break; default: res = SMESH::HYP_UNKNOWN_FATAL; } @@ -344,12 +348,8 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubS if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status ); // Update Python script - TCollection_AsciiString aStr ("status = "); - SMESH_Gen_i::AddObject(aStr, _this()) += ".AddHypothesis("; - SMESH_Gen_i::AddObject(aStr, aSubShapeObject) += ", "; - SMESH_Gen_i::AddObject(aStr, anHyp) += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << "status = " << _this() << ".AddHypothesis( " + << aSubShapeObject << ", " << anHyp << " )"; return ConvertHypothesisStatus(status); } @@ -382,7 +382,7 @@ SMESH_Hypothesis::Hypothesis_Status int hypId = myHyp->GetId(); status = _impl->AddHypothesis(myLocSubShape, hypId); if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { - _mapHypo[hypId] = myHyp; + _mapHypo[hypId] = SMESH::SMESH_Hypothesis::_duplicate( myHyp ); // assure there is a corresponding submesh if ( !_impl->IsMainShape( myLocSubShape )) { int shapeId = _impl->GetMeshDS()->ShapeToIndex( myLocSubShape ); @@ -416,12 +416,8 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aS aSubShapeObject, anHyp ); // Update Python script - TCollection_AsciiString aStr ("status = "); - SMESH_Gen_i::AddObject(aStr, _this()) += ".RemoveHypothesis("; - SMESH_Gen_i::AddObject(aStr, aSubShapeObject) += ", "; - SMESH_Gen_i::AddObject(aStr, anHyp) += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << "status = " << _this() << ".RemoveHypothesis( " + << aSubShapeObject << ", " << anHyp << " )"; return ConvertHypothesisStatus(status); } @@ -537,14 +533,8 @@ SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShap subMesh, aSubShapeObject, theName ); if ( !aSO->_is_nil()) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".GetSubMesh("; - SMESH_Gen_i::AddObject(aStr, aSubShapeObject) += ", \""; - aStr += (char*)theName; - aStr += "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = " << _this() << ".GetSubMesh( " + << aSubShapeObject << ", '" << theName << "' )"; } } } @@ -581,12 +571,7 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) aStudy->NewBuilder()->RemoveObjectWithChildren( anSO ); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".RemoveSubMesh("; - aStr += anSO->GetID(); - aStr += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".RemoveSubMesh( " << anSO << " )"; } } @@ -598,29 +583,18 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) * ElementTypeString */ //============================================================================= +#define CASE2STRING(enum) case SMESH::enum: return "SMESH."#enum; inline TCollection_AsciiString ElementTypeString (SMESH::ElementType theElemType) { - TCollection_AsciiString aStr; switch (theElemType) { - case SMESH::ALL: - aStr = "SMESH.ALL"; - break; - case SMESH::NODE: - aStr = "SMESH.NODE"; - break; - case SMESH::EDGE: - aStr = "SMESH.EDGE"; - break; - case SMESH::FACE: - aStr = "SMESH.FACE"; - break; - case SMESH::VOLUME: - aStr = "SMESH.VOLUME"; - break; - default: - break; + CASE2STRING( ALL ); + CASE2STRING( NODE ); + CASE2STRING( EDGE ); + CASE2STRING( FACE ); + CASE2STRING( VOLUME ); + default:; } - return aStr; + return ""; } //============================================================================= @@ -643,15 +617,10 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateGroup( SMESH::ElementType theElemType aNewGroup, GEOM::GEOM_Object::_nil(), theName); if ( !aSO->_is_nil()) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".CreateGroup("; - aStr += ElementTypeString(theElemType) + ", \"" + (char*)theName + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = " << _this() << ".CreateGroup( " + << ElementTypeString(theElemType) << ", '" << theName << "' )"; } } - return aNewGroup._retn(); } @@ -679,13 +648,9 @@ SMESH::SMESH_GroupOnGeom_ptr SMESH_Mesh_i::CreateGroupFromGEOM (SMESH::ElementTy aNewGroup, theGeomObj, theName); if ( !aSO->_is_nil()) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".CreateGroupFromGEOM("; - aStr += ElementTypeString(theElemType) + ", \"" + (char*)theName + "\", "; - SMESH_Gen_i::AddObject(aStr, theGeomObj) += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = " << _this() << ".CreateGroupFromGEOM(" + << ElementTypeString(theElemType) << ", '" << theName << "', " + << theGeomObj << " )"; } } } @@ -716,12 +681,7 @@ void SMESH_Mesh_i::RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ) if ( !aGroupSO->_is_nil() ) { // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".RemoveGroup("; - aStr += aGroupSO->GetID(); - aStr += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".RemoveGroup( " << aGroupSO << " )"; // Remove group's SObject aStudy->NewBuilder()->RemoveObject( aGroupSO ); @@ -752,11 +712,7 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup SMESH::SMESH_MeshEditor_var aMeshEditor = SMESH_Mesh_i::GetMeshEditor(); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".RemoveGroupWithContents("; - SMESH_Gen_i::AddObject(aStr, theGroup) += ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".RemoveGroupWithContents( " << theGroup << " )"; // Remove contents if ( aGroup->GetType() == SMESH::NODE ) @@ -772,6 +728,47 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup _gen_i->RemoveLastFromPythonScript(_gen_i->GetCurrentStudy()->StudyId()); } + +//================================================================================ +/*! + * \brief Get the list of groups existing in the mesh + * \retval SMESH::ListOfGroups * - list of groups + */ +//================================================================================ + +SMESH::ListOfGroups * SMESH_Mesh_i::GetGroups() throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + if (MYDEBUG) MESSAGE("GetGroups"); + + SMESH::ListOfGroups_var aList = new SMESH::ListOfGroups(); + // Python Dump + TPythonDump aPythonDump; + aPythonDump << "[ "; + + try { + aList->length( _mapGroups.size() ); + int i = 0; + map::iterator it = _mapGroups.begin(); + for ( ; it != _mapGroups.end(); it++ ) { + if ( CORBA::is_nil( it->second )) continue; + aList[i++] = SMESH::SMESH_GroupBase::_duplicate( it->second ); + // Python Dump + if (i > 1) aPythonDump << ", "; + aPythonDump << it->second; + } + aList->length( i ); + } + catch(SALOME_Exception & S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + // Update Python script + aPythonDump << " ] = " << _this() << ".GetGroups()"; + + return aList._retn(); +} + //============================================================================= /*! UnionGroups * New group is created. All mesh elements that are @@ -821,14 +818,9 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::UnionGroups( SMESH::SMESH_GroupBase_ptr the _gen_i->RemoveLastFromPythonScript(aStudy->StudyId()); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, aResGrp) += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".UnionGroups("; - SMESH_Gen_i::AddObject(aStr, theGroup1) += ", "; - SMESH_Gen_i::AddObject(aStr, theGroup2) += ", \""; - aStr += TCollection_AsciiString((char*)theName) + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aResGrp << " = " << _this() << ".UnionGroups( " + << theGroup1 << ", " << theGroup2 << ", '" + << theName << "' )"; return aResGrp._retn(); } @@ -886,14 +878,8 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectGroups( SMESH::SMESH_GroupBase_ptr _gen_i->RemoveLastFromPythonScript(aStudy->StudyId()); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, aResGrp) += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".IntersectGroups("; - SMESH_Gen_i::AddObject(aStr, theGroup1) += ", "; - SMESH_Gen_i::AddObject(aStr, theGroup2) += ", \""; - aStr += TCollection_AsciiString((char*)theName) + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aResGrp << " = " << _this() << ".IntersectGroups( " + << theGroup1 << ", " << theGroup2 << ", '" << theName << "')"; return aResGrp._retn(); } @@ -946,14 +932,9 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGr _gen_i->RemoveLastFromPythonScript(aStudy->StudyId()); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, aResGrp) += " = "; - SMESH_Gen_i::AddObject(aStr, _this()) += ".CutGroups("; - SMESH_Gen_i::AddObject(aStr, theGroup1) += ", "; - SMESH_Gen_i::AddObject(aStr, theGroup2) += ", \""; - aStr += TCollection_AsciiString((char*)theName) + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << aResGrp << " = " << _this() << ".CutGroups( " + << theGroup1 << ", " << theGroup2 << ", '" + << theName << "' )"; return aResGrp._retn(); } @@ -1213,15 +1194,13 @@ void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl) SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor() { - // Update Python script - TCollection_AsciiString aStr ("mesh_editor = "); - SMESH_Gen_i::AddObject(aStr, _this()) += ".GetMeshEditor()"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); - // Create MeshEditor SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( _impl ); SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this(); + + // Update Python script + TPythonDump() << aMeshEditor << " = " << _this() << ".GetMeshEditor()"; + return aMesh._retn(); } @@ -1231,6 +1210,11 @@ SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor() */ //============================================================================= +CORBA::Boolean SMESH_Mesh_i::HasDuplicatedGroupNamesMED() +{ + return _impl->HasDuplicatedGroupNamesMED(); +} + static void PrepareForWriting (const char* file) { TCollection_AsciiString aFullName ((char*)file); @@ -1258,29 +1242,16 @@ static void PrepareForWriting (const char* file) THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM); } } else { - // nonexisting file - TCollection_AsciiString aDirName = aPath.TrekValue(aPath.TrekLength()); - aPath.UpTrek(); - aPath.SetName(aDirName); - aPath.SetExtension(""); - OSD_Directory aDir (aPath); - TCollection_AsciiString aFullDirName; - aPath.SystemName(aFullDirName); - if (aDir.Exists()) { - aFile.Reset(); - aFile.Build(OSD_WriteOnly, OSD_Protection()); - if (aFile.Failed()) { - TCollection_AsciiString msg ("You cannot write to directory "); - msg += aFullDirName + "."; - THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM); - } else { - aFile.Close(); - aFile.Remove(); - } - } else { - TCollection_AsciiString msg ("Directory "); - msg += aFullDirName + " does not exist."; + // nonexisting file; check if it can be created + aFile.Reset(); + aFile.Build(OSD_WriteOnly, OSD_Protection()); + if (aFile.Failed()) { + TCollection_AsciiString msg ("You cannot create the file "); + msg += aFullName + ". Check the directory existance and access rights."; THROW_SALOME_CORBA_EXCEPTION(msg.ToCString(), SALOME::BAD_PARAM); + } else { + aFile.Close(); + aFile.Remove(); } } } @@ -1293,23 +1264,8 @@ void SMESH_Mesh_i::ExportToMED (const char* file, Unexpect aCatch(SALOME_SalomeException); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".ExportToMED(\""; - aStr += TCollection_AsciiString((char*)file) + "\", "; - aStr += TCollection_AsciiString((int)auto_groups) + ", "; - switch (theVersion) { - case SMESH::MED_V2_1: - aStr += "SMESH.MED_V2_1)"; - break; - case SMESH::MED_V2_2: - aStr += "SMESH.MED_V2_2)"; - break; - default: - aStr += TCollection_AsciiString(theVersion) + ")"; - break; - } - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".ExportToMED( '" + << file << "', " << auto_groups << ", " << theVersion << " )"; // Perform Export PrepareForWriting(file); @@ -1357,11 +1313,7 @@ void SMESH_Mesh_i::ExportDAT (const char *file) Unexpect aCatch(SALOME_SalomeException); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".ExportDAT(\""; - aStr += TCollection_AsciiString((char*)file) + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".ExportDAT( '" << file << "' )"; // Perform Export PrepareForWriting(file); @@ -1374,11 +1326,7 @@ void SMESH_Mesh_i::ExportUNV (const char *file) Unexpect aCatch(SALOME_SalomeException); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".ExportUNV(\""; - aStr += TCollection_AsciiString((char*)file) + "\")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".ExportUNV( '" << file << "' )"; // Perform Export PrepareForWriting(file); @@ -1391,12 +1339,7 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii) Unexpect aCatch(SALOME_SalomeException); // Update Python script - TCollection_AsciiString aStr; - SMESH_Gen_i::AddObject(aStr, _this()) += ".ExportSTL(\""; - aStr += TCollection_AsciiString((char*)file) + "\", "; - aStr += TCollection_AsciiString((int)isascii) + ")"; - - SMESH_Gen_i::AddToCurrentPyScript(aStr); + TPythonDump() << _this() << ".ExportSTL( '" << file << "', " << isascii << " )"; // Perform Export PrepareForWriting(file); @@ -1450,6 +1393,13 @@ CORBA::Long SMESH_Mesh_i::NbEdges()throw(SALOME::SALOME_Exception) return _impl->NbEdges(); } +CORBA::Long SMESH_Mesh_i::NbEdgesOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbEdges( (::SMESH_Mesh::ElementOrder) order); +} + //============================================================================= /*! * @@ -1479,6 +1429,27 @@ CORBA::Long SMESH_Mesh_i::NbPolygons()throw(SALOME::SALOME_Exception) return _impl->NbPolygons(); } +CORBA::Long SMESH_Mesh_i::NbFacesOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbFaces( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbTrianglesOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbTriangles( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbQuadranglesOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbQuadrangles( (::SMESH_Mesh::ElementOrder) order); +} + //============================================================================= /*! * @@ -1520,6 +1491,41 @@ CORBA::Long SMESH_Mesh_i::NbPolyhedrons()throw(SALOME::SALOME_Exception) return _impl->NbPolyhedrons(); } +CORBA::Long SMESH_Mesh_i::NbVolumesOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbVolumes( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbTetrasOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbTetras( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbHexasOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbHexas( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbPyramidsOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbPyramids( (::SMESH_Mesh::ElementOrder) order); +} + +CORBA::Long SMESH_Mesh_i::NbPrismsOfOrder(SMESH::ElementOrder order) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbPrisms( (::SMESH_Mesh::ElementOrder) order); +} + //============================================================================= /*! * @@ -1550,17 +1556,19 @@ char* SMESH_Mesh_i::Dump() //============================================================================= SMESH::long_array* SMESH_Mesh_i::GetIDs() { - SMESH::long_array_var aResult = new SMESH::long_array(); - SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); - int aMinId = aSMESHDS_Mesh->MinElementID(); - int aMaxId = aSMESHDS_Mesh->MaxElementID(); +// SMESH::long_array_var aResult = new SMESH::long_array(); +// SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); +// int aMinId = aSMESHDS_Mesh->MinElementID(); +// int aMaxId = aSMESHDS_Mesh->MaxElementID(); - aResult->length(aMaxId - aMinId + 1); +// aResult->length(aMaxId - aMinId + 1); - for (int i = 0, id = aMinId; id <= aMaxId; id++ ) - aResult[i++] = id; +// for (int i = 0, id = aMinId; id <= aMaxId; id++ ) +// aResult[i++] = id; - return aResult._retn(); +// return aResult._retn(); + // PAL12398 + return GetElementsId(); } //============================================================================= @@ -1668,3 +1676,449 @@ SMESH::ElementType SMESH_Mesh_i::GetElementType( const CORBA::Long id, const boo { return ( SMESH::ElementType )_impl->GetElementType( id, iselem ); } + + +//============================================================================= +/*! + * Returns ID of elements for given submesh + */ +//============================================================================= +SMESH::long_array* SMESH_Mesh_i::GetSubMeshElementsId(const CORBA::Long ShapeID) + throw (SALOME::SALOME_Exception) +{ + SMESH::long_array_var aResult = new SMESH::long_array(); + + SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID); + if(!SM) return aResult._retn(); + + SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS(); + if(!SDSM) return aResult._retn(); + + aResult->length(SDSM->NbElements()); + + SMDS_ElemIteratorPtr eIt = SDSM->GetElements(); + int i = 0; + while ( eIt->more() ) { + aResult[i++] = eIt->next()->GetID(); + } + + return aResult._retn(); +} + + +//============================================================================= +/*! + * Returns ID of nodes for given submesh + * If param all==true - returns all nodes, else - + * returns only nodes on shapes. + */ +//============================================================================= +SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID, CORBA::Boolean all) + throw (SALOME::SALOME_Exception) +{ + SMESH::long_array_var aResult = new SMESH::long_array(); + + SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID); + if(!SM) return aResult._retn(); + + SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS(); + if(!SDSM) return aResult._retn(); + + map theElems; + if( !all || (SDSM->NbElements()==0 && SDSM->NbNodes()==1) ) { + SMDS_NodeIteratorPtr nIt = SDSM->GetNodes(); + while ( nIt->more() ) { + const SMDS_MeshNode* elem = nIt->next(); + theElems.insert( make_pair(elem->GetID(),elem) ); + } + } + else { // all nodes of submesh elements + SMDS_ElemIteratorPtr eIt = SDSM->GetElements(); + while ( eIt->more() ) { + const SMDS_MeshElement* anElem = eIt->next(); + SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); + while ( nIt->more() ) { + const SMDS_MeshElement* elem = nIt->next(); + theElems.insert( make_pair(elem->GetID(),elem) ); + } + } + } + + aResult->length(theElems.size()); + map::iterator itElem; + int i = 0; + for ( itElem = theElems.begin(); itElem != theElems.end(); itElem++ ) + aResult[i++] = (*itElem).first; + + return aResult._retn(); +} + + +//============================================================================= +/*! + * Returns type of elements for given submesh + */ +//============================================================================= +SMESH::ElementType SMESH_Mesh_i::GetSubMeshElementType(const CORBA::Long ShapeID) + throw (SALOME::SALOME_Exception) +{ + SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID); + if(!SM) return SMESH::ALL; + + SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS(); + if(!SDSM) return SMESH::ALL; + + if(SDSM->NbElements()==0) + return (SM->GetSubShape().ShapeType() == TopAbs_VERTEX) ? SMESH::NODE : SMESH::ALL; + + SMDS_ElemIteratorPtr eIt = SDSM->GetElements(); + const SMDS_MeshElement* anElem = eIt->next(); + return ( SMESH::ElementType ) anElem->GetType(); +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::GetMeshPtr() +{ + return CORBA::Long(size_t(_impl)); +} + + +//============================================================================= +/*! + * Get XYZ coordinates of node as list of double + * If there is not node for given ID - returns empty list + */ +//============================================================================= + +SMESH::double_array* SMESH_Mesh_i::GetNodeXYZ(const CORBA::Long id) +{ + SMESH::double_array_var aResult = new SMESH::double_array(); + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) + return aResult._retn(); + + // find node + const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + if(!aNode) + return aResult._retn(); + + // add coordinates + aResult->length(3); + aResult[0] = aNode->X(); + aResult[1] = aNode->Y(); + aResult[2] = aNode->Z(); + return aResult._retn(); +} + + +//============================================================================= +/*! + * For given node returns list of IDs of inverse elements + * If there is not node for given ID - returns empty list + */ +//============================================================================= + +SMESH::long_array* SMESH_Mesh_i::GetNodeInverseElements(const CORBA::Long id) +{ + SMESH::long_array_var aResult = new SMESH::long_array(); + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) + return aResult._retn(); + + // find node + const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + if(!aNode) + return aResult._retn(); + + // find inverse elements + SMDS_ElemIteratorPtr eIt = aNode->GetInverseElementIterator(); + TColStd_SequenceOfInteger IDs; + while(eIt->more()) { + const SMDS_MeshElement* elem = eIt->next(); + IDs.Append(elem->GetID()); + } + if(IDs.Length()>0) { + aResult->length(IDs.Length()); + int i = 1; + for(; i<=IDs.Length(); i++) { + aResult[i-1] = IDs.Value(i); + } + } + return aResult._retn(); +} + + +//============================================================================= +/*! + * If given element is node returns IDs of shape from position + * else - return ID of result shape after ::FindShape() + * from SMESH_MeshEditor + * If there is not element for given ID - returns -1 + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::GetShapeID(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) + return -1; + + // try to find node + const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id); + if(aNode) { + SMDS_PositionPtr pos = aNode->GetPosition(); + if(!pos) + return -1; + else + return pos->GetShapeId(); + } + + // try to find element + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) + return -1; + + // need implementation??????????????????????????????????????????????? + return -1; +} + + +//============================================================================= +/*! + * Returns number of nodes for given element + * If there is not element for given ID - returns -1 + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::GetElemNbNodes(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return -1; + // try to find element + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return -1; + return elem->NbNodes(); +} + + +//============================================================================= +/*! + * Returns ID of node by given index for given element + * If there is not element for given ID - returns -1 + * If there is not node for given index - returns -2 + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::GetElemNode(const CORBA::Long id, const CORBA::Long index) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return -1; + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return -1; + if( index>=elem->NbNodes() || index<0 ) return -1; + return elem->GetNode(index)->GetID(); +} + + +//============================================================================= +/*! + * Returns true if given node is medium node + * in given quadratic element + */ +//============================================================================= + +CORBA::Boolean SMESH_Mesh_i::IsMediumNode(const CORBA::Long ide, const CORBA::Long idn) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return false; + // try to find node + const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn); + if(!aNode) return false; + // try to find element + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(ide); + if(!elem) return false; + + return elem->IsMediumNode(aNode); +} + + +//============================================================================= +/*! + * Returns true if given node is medium node + * in one of quadratic elements + */ +//============================================================================= + +CORBA::Boolean SMESH_Mesh_i::IsMediumNodeOfAnyElem(const CORBA::Long idn, + SMESH::ElementType theElemType) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return false; + + // try to find node + const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn); + if(!aNode) return false; + + SMESH_MesherHelper aHelper( *(_impl) ); + + SMDSAbs_ElementType aType; + if(theElemType==SMESH::EDGE) aType = SMDSAbs_Edge; + else if(theElemType==SMESH::FACE) aType = SMDSAbs_Face; + else if(theElemType==SMESH::VOLUME) aType = SMDSAbs_Volume; + else aType = SMDSAbs_All; + + return aHelper.IsMedium(aNode,aType); +} + + +//============================================================================= +/*! + * Returns number of edges for given element + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::ElemNbEdges(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return -1; + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return -1; + return elem->NbEdges(); +} + + +//============================================================================= +/*! + * Returns number of faces for given element + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::ElemNbFaces(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return -1; + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return -1; + return elem->NbFaces(); +} + + +//============================================================================= +/*! + * Returns true if given element is polygon + */ +//============================================================================= + +CORBA::Boolean SMESH_Mesh_i::IsPoly(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return false; + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return false; + return elem->IsPoly(); +} + + +//============================================================================= +/*! + * Returns true if given element is quadratic + */ +//============================================================================= + +CORBA::Boolean SMESH_Mesh_i::IsQuadratic(const CORBA::Long id) +{ + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) return false; + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) return false; + return elem->IsQuadratic(); +} + + +//============================================================================= +/*! + * Returns bary center for given element + */ +//============================================================================= + +SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id) +{ + SMESH::double_array_var aResult = new SMESH::double_array(); + SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS(); + if ( aSMESHDS_Mesh == NULL ) + return aResult._retn(); + + const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id); + if(!elem) + 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; + } + } + } + else { + SMDS_ElemIteratorPtr anIt = elem->nodesIterator(); + int nbn = 0; + double x=0., y=0., z=0.; + for(; anIt->more(); ) { + nbn++; + const SMDS_MeshNode* aNode = static_cast(anIt->next()); + x += aNode->X(); + y += aNode->Y(); + z += aNode->Z(); + } + if(nbn>0) { + // add coordinates + aResult->length(3); + aResult[0] = x/nbn; + aResult[1] = y/nbn; + aResult[2] = z/nbn; + } + } + + return aResult._retn(); +} + + +//============================================================================= +/*! + * + */ +//============================================================================= +void SMESH_Mesh_i::CreateGroupServants() +{ + // Create group servants, if any groups were imported + list aGroupIds = _impl->GetGroupIds(); + for ( list::iterator it = aGroupIds.begin(); it != aGroupIds.end(); it++ ) { + SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, *it ); + + // 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 + + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() ); + _mapGroups[*it] = SMESH::SMESH_Group::_duplicate( aGroup ); + + // register CORBA object for persistence + int nextId = _gen_i->RegisterObject( aGroup ); + if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId); + } +} +