X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Mesh_i.cxx;h=ed84d70f066d156b00647d56f57b64a7582c3cb7;hb=326d4252be2d48227b13d02ebbe80f3046ebeafc;hp=fc489aa0c4b42ed6289ae80c9cf3cc3144a02480;hpb=57b43b4d010e2d0a1529d3c131bbb9d416e63258;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index fc489aa0c..ed84d70f0 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 // // // @@ -27,43 +27,52 @@ // $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 "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 "DriverMED_W_SMESHDS_Mesh.h" #include "SMDS_VolumeTool.hxx" +#include "SMESHDS_Command.hxx" +#include "SMESHDS_CommandType.hxx" +#include "SMESHDS_GroupOnGeom.hxx" +#include "SMESH_Group.hxx" +#include "SMESH_MeshEditor.hxx" #include "SMESH_MesherHelper.hxx" +#include "SMDS_EdgePosition.hxx" +#include "SMDS_FacePosition.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 -#include +#include #include +#include +#include #include -#include #include +#include #include -#include "TCollection_AsciiString.hxx" +#include +#include +#include // STL Includes #include #include #include +#include #ifdef _DEBUG_ static int MYDEBUG = 0; @@ -89,12 +98,11 @@ SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA, CORBA::Long studyId ) : SALOME::GenericObj_i( thePOA ) { - INFOS("SMESH_Mesh_i"); + MESSAGE("SMESH_Mesh_i"); _impl = NULL; _gen_i = gen_i; _id = myIdGenerator++; _studyId = studyId; - thePOA->activate_object( this ); } //============================================================================= @@ -110,14 +118,14 @@ SMESH_Mesh_i::~SMESH_Mesh_i() for ( it = _mapGroups.begin(); it != _mapGroups.end(); it++ ) { SMESH_GroupBase_i* aGroup = dynamic_cast( 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; } //============================================================================= @@ -142,13 +150,33 @@ void SMESH_Mesh_i::SetShape( GEOM::GEOM_Object_ptr theShapeObject ) } } +//================================================================================ +/*! + * \brief return true if mesh has a shape to build a shape on + */ +//================================================================================ + +CORBA::Boolean SMESH_Mesh_i::HasShapeToMesh() + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + bool res = false; + try { + res = _impl->HasShapeToMesh(); + } + catch(SALOME_Exception & S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + return res; +} + //======================================================================= //function : GetShapeToMesh //purpose : //======================================================================= 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; @@ -163,6 +191,42 @@ GEOM::GEOM_Object_ptr SMESH_Mesh_i::GetShapeToMesh() 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); + } +} + //============================================================================= /*! * @@ -204,7 +268,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); @@ -213,19 +277,42 @@ 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::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(); + + 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); } +//================================================================================ +/*! + * \brief Return string representation of a MED file version comprising nbDigits + */ +//================================================================================ + +char* SMESH_Mesh_i::GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits) +{ + std::string ver = DriverMED_W_SMESHDS_Mesh::GetVersionString(MED::EVersion(version), + nbDigits); + return CORBA::string_dup( ver.c_str() ); +} + //============================================================================= /*! * ImportUNVFile @@ -242,16 +329,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::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; } @@ -279,14 +356,14 @@ int SMESH_Mesh_i::ImportSTLFile( const char* theFileName ) */ //============================================================================= -int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName ) -{ - // Read mesh with name = 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 = and all its groups into SMESH_Mesh +// int status = _impl->MEDToMesh( theFileName, theMeshName ); +// CreateGroupServants(); - return status; -} +// return status; +// } //============================================================================= /*! @@ -294,34 +371,29 @@ int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshNam */ //============================================================================= -static SMESH::Hypothesis_Status ConvertHypothesisStatus +#define RETURNCASE(hyp_stat) case SMESH_Hypothesis::hyp_stat: return SMESH::hyp_stat; + +SMESH::Hypothesis_Status SMESH_Mesh_i::ConvertHypothesisStatus (SMESH_Hypothesis::Hypothesis_Status theStatus) { - SMESH::Hypothesis_Status res; - switch (theStatus) - { - case SMESH_Hypothesis::HYP_OK: - res = SMESH::HYP_OK; break; - case SMESH_Hypothesis::HYP_MISSING: - res = SMESH::HYP_MISSING; break; - case SMESH_Hypothesis::HYP_CONCURENT: - res = SMESH::HYP_CONCURENT; break; - case SMESH_Hypothesis::HYP_BAD_PARAMETER: - res = SMESH::HYP_BAD_PARAMETER; break; - case SMESH_Hypothesis::HYP_INCOMPATIBLE: - res = SMESH::HYP_INCOMPATIBLE; break; - case SMESH_Hypothesis::HYP_NOTCONFORM: - res = SMESH::HYP_NOTCONFORM; break; - case SMESH_Hypothesis::HYP_ALREADY_EXIST: - 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; + switch (theStatus) { + RETURNCASE( HYP_OK ); + RETURNCASE( HYP_MISSING ); + RETURNCASE( HYP_CONCURENT ); + RETURNCASE( HYP_BAD_PARAMETER ); + RETURNCASE( HYP_HIDDEN_ALGO ); + RETURNCASE( HYP_HIDING_ALGO ); + RETURNCASE( HYP_UNKNOWN_FATAL ); + RETURNCASE( HYP_INCOMPATIBLE ); + RETURNCASE( HYP_NOTCONFORM ); + RETURNCASE( HYP_ALREADY_EXIST ); + RETURNCASE( HYP_BAD_DIM ); + RETURNCASE( HYP_BAD_SUBSHAPE ); + RETURNCASE( HYP_BAD_GEOMETRY ); + RETURNCASE( HYP_NEED_SHAPE ); + default:; } - return res; + return SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -348,9 +420,14 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubS if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status ); // Update Python script - TPythonDump() << "status = " << _this() << ".AddHypothesis( " - << aSubShapeObject << ", " << anHyp << " )"; - + if(_impl->HasShapeToMesh()) { + TPythonDump() << "status = " << _this() << ".AddHypothesis( " + << aSubShapeObject << ", " << anHyp << " )"; + } + else { + TPythonDump() << "status = " << _this() << ".AddHypothesis( "<< anHyp << " )"; + } + return ConvertHypothesisStatus(status); } @@ -366,7 +443,7 @@ SMESH_Hypothesis::Hypothesis_Status { if(MYDEBUG) MESSAGE("addHypothesis"); - if (CORBA::is_nil(aSubShapeObject)) + if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh()) THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", SALOME::BAD_PARAM); @@ -378,7 +455,13 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; try { - TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); + TopoDS_Shape myLocSubShape; + //use PseudoShape in case if mesh has no shape + if(HasShapeToMesh()) + myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); + else + myLocSubShape = _impl->GetShapeToMesh(); + int hypId = myHyp->GetId(); status = _impl->AddHypothesis(myLocSubShape, hypId); if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { @@ -416,8 +499,15 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aS aSubShapeObject, anHyp ); // Update Python script + // Update Python script + if(_impl->HasShapeToMesh()) { TPythonDump() << "status = " << _this() << ".RemoveHypothesis( " << aSubShapeObject << ", " << anHyp << " )"; + } + else { + TPythonDump() << "status = " << _this() << ".RemoveHypothesis( " + << anHyp << " )"; + } return ConvertHypothesisStatus(status); } @@ -434,7 +524,7 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Ob if(MYDEBUG) MESSAGE("removeHypothesis()"); // **** proposer liste de subShape (selection multiple) - if (CORBA::is_nil(aSubShapeObject)) + if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh()) THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", SALOME::BAD_PARAM); @@ -446,8 +536,14 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Ob SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; try { - TopoDS_Shape myLocSubShape = _gen_i->GeomObjectToShape(aSubShapeObject); - int hypId = myHyp->GetId(); + TopoDS_Shape myLocSubShape; + //use PseudoShape in case if mesh has no shape + if(HasShapeToMesh()) + myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); + else + myLocSubShape = _impl->GetShapeToMesh(); + + int hypId = myHyp->GetId(); status = _impl->RemoveHypothesis(myLocSubShape, hypId); if ( !SMESH_Hypothesis::IsStatusFatal(status) ) _mapHypo.erase( hypId ); @@ -684,7 +780,7 @@ void SMESH_Mesh_i::RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ) TPythonDump() << _this() << ".RemoveGroup( " << aGroupSO << " )"; // Remove group's SObject - aStudy->NewBuilder()->RemoveObject( aGroupSO ); + aStudy->NewBuilder()->RemoveObjectWithChildren( aGroupSO ); } } @@ -742,9 +838,11 @@ SMESH::ListOfGroups * SMESH_Mesh_i::GetGroups() throw(SALOME::SALOME_Exception) if (MYDEBUG) MESSAGE("GetGroups"); SMESH::ListOfGroups_var aList = new SMESH::ListOfGroups(); + // Python Dump TPythonDump aPythonDump; - aPythonDump << "[ "; + if ( !_mapGroups.empty() ) // (IMP13463) avoid "SyntaxError: can't assign to []" + aPythonDump << "[ "; try { aList->length( _mapGroups.size() ); @@ -764,10 +862,22 @@ SMESH::ListOfGroups * SMESH_Mesh_i::GetGroups() throw(SALOME::SALOME_Exception) } // Update Python script - aPythonDump << " ] = " << _this() << ".GetGroups()"; + if ( !_mapGroups.empty() ) // (IMP13463) avoid "SyntaxError: can't assign to []" + aPythonDump << " ] = " << _this() << ".GetGroups()"; 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 @@ -830,6 +940,85 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::UnionGroups( SMESH::SMESH_GroupBase_ptr the } } +//============================================================================= +/*! + \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 @@ -884,6 +1073,100 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectGroups( SMESH::SMESH_GroupBase_ptr 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 @@ -912,7 +1195,6 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGr 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 ] ) ) @@ -939,6 +1221,414 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGr 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( 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( aMeshDS->FindNode( aNodeIter.Value() ) ); + if ( !aNode ) + continue; + + SMDS_ElemIteratorPtr anElemIter = aNode->elementsIterator( anElemType ); + while( anElemIter->more() ) + { + const SMDS_MeshElement* anElem = + dynamic_cast( 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( 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 + */ +//================================================================================ + +static GEOM::GEOM_Object_ptr getGroupItemsFromStudy(CORBA::Object_ptr theMesh, + SMESH_Gen_i* theGen, + list & theItems) +{ + 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(); + + 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; + } + } + return groupObj._retn(); +} + +//============================================================================= +/*! + * \brief Update hypotheses assigned to geom groups if the latter change + * + * NPAL16168: "geometrical group edition from a submesh don't modifiy mesh computation" + */ +//============================================================================= + +void SMESH_Mesh_i::CheckGeomGroupModif() +{ + if ( !_impl->HasShapeToMesh() ) return; + + SALOMEDS::Study_var study = _gen_i->GetCurrentStudy(); + if ( study->_is_nil() ) return; + + // check if items of groups changed + map::iterator i_sm = _mapSubMesh.begin(); + for ( ; i_sm != _mapSubMesh.end(); ++i_sm ) + { + 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::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; + + 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::iterator item = newItems.begin(); + for ( ; item != newItems.end() && !groupChanged; ++item ) + { + SMESHDS_SubMesh * itemDS = _impl->GetMeshDS()->MeshElements( *item ); + groupChanged = ( !itemDS || !oldDS->ContainsSubMesh( itemDS )); + } + } + } + // update hypotheses and submeshes if necessary + if ( groupChanged ) + { + // 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 ); + // update hypotheses + list hyps = _impl->GetHypothesisList(oldGroupShape); + list ::iterator hypIt; + for ( hypIt = hyps.begin(); hypIt != hyps.end(); ++hypIt ) + { + _impl->RemoveHypothesis( oldGroupShape, (*hypIt)->GetID()); + _impl->AddHypothesis ( newGroupShape, (*hypIt)->GetID()); + } + // care of submeshes + SMESH_subMesh* newSubmesh = _impl->GetSubMesh( newGroupShape ); + 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); + _mapSubMeshIor.erase(oldID); + _mapSubMesh_i [ newID ]->changeLocalId( newID ); + } + } + } +} + //============================================================================= /*! * @@ -1185,17 +1875,16 @@ void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl) return *_impl; } - //============================================================================= /*! - * + * Return mesh editor */ //============================================================================= SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor() { // Create MeshEditor - SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( _impl ); + SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, false ); SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this(); // Update Python script @@ -1204,6 +1893,42 @@ SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor() return aMesh._retn(); } +//============================================================================= +/*! + * Return mesh edition previewer + */ +//============================================================================= + +SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditPreviewer() +{ + SMESH_MeshEditor_i *aMeshEditor = new SMESH_MeshEditor_i( this, true ); + SMESH::SMESH_MeshEditor_var aMesh = aMeshEditor->_this(); + return aMesh._retn(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= +void SMESH_Mesh_i::SetAutoColor(CORBA::Boolean theAutoColor) throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + _impl->SetAutoColor(theAutoColor); +} + +//============================================================================= +/*! + * + */ +//============================================================================= +CORBA::Boolean SMESH_Mesh_i::GetAutoColor() throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->GetAutoColor(); +} + + //============================================================================= /*! * Export in different formats @@ -1215,7 +1940,7 @@ CORBA::Boolean SMESH_Mesh_i::HasDuplicatedGroupNamesMED() 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); @@ -1263,22 +1988,14 @@ void SMESH_Mesh_i::ExportToMED (const char* file, { 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() ) { @@ -1297,6 +2014,16 @@ void SMESH_Mesh_i::ExportToMED (const char* file, } } } + // 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 ); } @@ -1313,6 +2040,8 @@ void SMESH_Mesh_i::ExportDAT (const char *file) Unexpect aCatch(SALOME_SalomeException); // Update Python script + // check names of groups + checkGroupNames(); TPythonDump() << _this() << ".ExportDAT( '" << file << "' )"; // Perform Export @@ -1326,6 +2055,8 @@ void SMESH_Mesh_i::ExportUNV (const char *file) Unexpect aCatch(SALOME_SalomeException); // Update Python script + // check names of groups + checkGroupNames(); TPythonDump() << _this() << ".ExportUNV( '" << file << "' )"; // Perform Export @@ -1339,6 +2070,8 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii) Unexpect aCatch(SALOME_SalomeException); // Update Python script + // check names of groups + checkGroupNames(); TPythonDump() << _this() << ".ExportSTL( '" << file << "', " << isascii << " )"; // Perform Export @@ -1397,7 +2130,7 @@ CORBA::Long SMESH_Mesh_i::NbEdgesOfOrder(SMESH::ElementOrder order) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); - return _impl->NbEdges( (::SMESH_Mesh::ElementOrder) order); + return _impl->NbEdges( (SMDSAbs_ElementOrder) order); } //============================================================================= @@ -1433,21 +2166,21 @@ CORBA::Long SMESH_Mesh_i::NbFacesOfOrder(SMESH::ElementOrder order) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); - return _impl->NbFaces( (::SMESH_Mesh::ElementOrder) order); + return _impl->NbFaces( (SMDSAbs_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); + return _impl->NbTriangles( (SMDSAbs_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); + return _impl->NbQuadrangles( (SMDSAbs_ElementOrder) order); } //============================================================================= @@ -1495,35 +2228,35 @@ CORBA::Long SMESH_Mesh_i::NbVolumesOfOrder(SMESH::ElementOrder order) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); - return _impl->NbVolumes( (::SMESH_Mesh::ElementOrder) order); + return _impl->NbVolumes( (SMDSAbs_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); + return _impl->NbTetras( (SMDSAbs_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); + return _impl->NbHexas( (SMDSAbs_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); + return _impl->NbPyramids( (SMDSAbs_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); + return _impl->NbPrisms( (SMDSAbs_ElementOrder) order); } //============================================================================= @@ -1556,17 +2289,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(); } //============================================================================= @@ -1722,12 +2457,12 @@ SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID, CO SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS(); if(!SDSM) return aResult._retn(); - map theElems; - if( !all || (SDSM->NbElements()==0 && SDSM->NbNodes()==1) ) { + set theElems; + if( !all || (SDSM->NbElements()==0) ) { // internal nodes or vertex submesh SMDS_NodeIteratorPtr nIt = SDSM->GetNodes(); while ( nIt->more() ) { const SMDS_MeshNode* elem = nIt->next(); - theElems.insert( make_pair(elem->GetID(),elem) ); + theElems.insert( elem->GetID() ); } } else { // all nodes of submesh elements @@ -1737,16 +2472,16 @@ SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID, CO SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); while ( nIt->more() ) { const SMDS_MeshElement* elem = nIt->next(); - theElems.insert( make_pair(elem->GetID(),elem) ); + theElems.insert( elem->GetID() ); } } } aResult->length(theElems.size()); - map::iterator itElem; + set::iterator itElem; int i = 0; for ( itElem = theElems.begin(); itElem != theElems.end(); itElem++ ) - aResult[i++] = (*itElem).first; + aResult[i++] = *itElem; return aResult._retn(); } @@ -1781,9 +2516,12 @@ SMESH::ElementType SMESH_Mesh_i::GetSubMeshElementType(const CORBA::Long ShapeID */ //============================================================================= -CORBA::Long SMESH_Mesh_i::GetMeshPtr() +CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() { - return CORBA::Long(size_t(_impl)); + CORBA::LongLong pointeur = CORBA::LongLong(_impl); + if ( MYDEBUG ) + MESSAGE("CORBA::LongLong SMESH_Mesh_i::GetMeshPtr() "<shapeID = 0; + aNodePosition->shapeType = GEOM::SHAPE; + + SMESHDS_Mesh* mesh = _impl->GetMeshDS(); + if ( !mesh ) return aNodePosition; + + if ( const SMDS_MeshNode* aNode = mesh->FindNode(NodeID) ) + { + if ( SMDS_PositionPtr pos = aNode->GetPosition() ) + { + aNodePosition->shapeID = pos->GetShapeId(); + switch ( pos->GetTypeOfPosition() ) { + case SMDS_TOP_EDGE: + aNodePosition->shapeType = GEOM::EDGE; + aNodePosition->params.length(1); + aNodePosition->params[0] = + static_cast( pos.get() )->GetUParameter(); + break; + case SMDS_TOP_FACE: + aNodePosition->shapeType = GEOM::FACE; + aNodePosition->params.length(2); + aNodePosition->params[0] = + static_cast( pos.get() )->GetUParameter(); + aNodePosition->params[1] = + static_cast( pos.get() )->GetVParameter(); + break; + case SMDS_TOP_VERTEX: + aNodePosition->shapeType = GEOM::VERTEX; + break; + case SMDS_TOP_3DSPACE: + if ( TopExp_Explorer(_impl->GetShapeToMesh(), TopAbs_SOLID).More() ) + aNodePosition->shapeType = GEOM::SOLID; + else if ( TopExp_Explorer(_impl->GetShapeToMesh(), TopAbs_SHELL).More() ) + aNodePosition->shapeType = GEOM::SHELL; + break; + default:; + } + } + } + return aNodePosition; +} //============================================================================= /*! * 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 + * If there is not node for given ID - returns -1 */ //============================================================================= @@ -1877,12 +2663,35 @@ CORBA::Long SMESH_Mesh_i::GetShapeID(const CORBA::Long id) return pos->GetShapeId(); } + return -1; +} + + +//============================================================================= +/*! + * For given element returns ID of result shape after + * ::FindShape() from SMESH_MeshEditor + * If there is not element for given ID - returns -1 + */ +//============================================================================= + +CORBA::Long SMESH_Mesh_i::GetShapeIDForElem(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; - // need implementation??????????????????????????????????????????????? + //SMESH::SMESH_MeshEditor_var aMeshEditor = SMESH_Mesh_i::GetMeshEditor(); + ::SMESH_MeshEditor aMeshEditor(_impl); + int index = aMeshEditor.FindShape( elem ); + if(index>0) + return index; + return -1; } @@ -1923,6 +2732,26 @@ CORBA::Long SMESH_Mesh_i::GetElemNode(const CORBA::Long id, const CORBA::Long in return elem->GetNode(index)->GetID(); } +//============================================================================= +/*! + * Returns IDs of nodes of given element + */ +//============================================================================= + +SMESH::long_array* SMESH_Mesh_i::GetElemNodes(const CORBA::Long id) +{ + SMESH::long_array_var aResult = new SMESH::long_array(); + if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() ) + { + if ( const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id) ) + { + aResult->length( elem->NbNodes() ); + for ( int i = 0; i < elem->NbNodes(); ++i ) + aResult[ i ] = elem->GetNode( i )->GetID(); + } + } + return aResult._retn(); +} //============================================================================= /*! @@ -2057,17 +2886,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 { @@ -2096,27 +2919,130 @@ 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 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 ); + 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::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( 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& groupIDs) const +{ + int nbGroups = groupIDs.size(); + SMESH::ListOfGroups_var aList = new SMESH::ListOfGroups(); + aList->length( nbGroups ); + + list::const_iterator ids = groupIDs.begin(); + for ( nbGroups = 0; ids != groupIDs.end(); ++ids ) + { + map::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(); +} + +//============================================================================= +/*! + * \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 ); + } +}