X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH_I%2FSMESH_Gen_i.cxx;h=142a908957ffe65d5505d79b0f5904820ddb1d6c;hb=662ae2fe78711182d4d2846be738caf4a7e3aab6;hp=3d36ed3423e45f94afbafd1775fcde3d37b0e84a;hpb=ab4288fb65ac5324117872ca0425e0200b6fd7e0;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 3d36ed342..142a90895 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_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 // // // @@ -41,16 +41,36 @@ #include #include #include +#include +#include #include #include #include +#include #include "Utils_CorbaException.hxx" #include "utilities.h" #include #include -#include + +#ifdef WNT + #include +#else + #include +#endif + +#ifdef WNT + #define LibHandle HMODULE + #define LoadLib( name ) LoadLibrary( name ) + #define GetProc GetProcAddress + #define UnLoadLib( handle ) FreeLibrary( handle ); +#else + #define LibHandle void* + #define LoadLib( name ) dlopen( name, RTLD_LAZY ) + #define GetProc dlsym + #define UnLoadLib( handle ) dlclose( handle ); +#endif #include @@ -59,11 +79,15 @@ #include "SMESH_Hypothesis_i.hxx" #include "SMESH_Algo_i.hxx" #include "SMESH_Group_i.hxx" +#include "SMESH_PythonDump.hxx" #include "SMESHDS_Document.hxx" #include "SMESHDS_Group.hxx" #include "SMESHDS_GroupOnGeom.hxx" +#include "SMESH_Mesh.hxx" +#include "SMESH_Hypothesis.hxx" #include "SMESH_Group.hxx" +#include "SMESH_MeshEditor.hxx" #include "SMDS_EdgePosition.hxx" #include "SMDS_FacePosition.hxx" @@ -86,14 +110,14 @@ #include "Utils_ExceptHandlers.hxx" #include -#include using namespace std; +using SMESH::TPythonDump; #define NUM_TMP_FILES 2 #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; #else static int MYDEBUG = 0; #endif @@ -237,8 +261,12 @@ SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr orb, _thisObj = this ; _id = myPoa->activate_object( _thisObj ); + myIsEmbeddedMode = false; myShapeReader = NULL; // shape reader mySMESHGen = this; + + // set it in standalone mode only + //OSD::SetSignal( true ); } //============================================================================= @@ -283,8 +311,28 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName const char* theLibName) throw (SALOME::SALOME_Exception) { + /* It's Need to tranlate lib name for WIN32 or X platform */ + char* aPlatformLibName = 0; + if ( theLibName && theLibName[0] != '\0' ) + { +#ifdef WNT + aPlatformLibName = new char[ strlen(theLibName) + 5 ]; + aPlatformLibName[0] = '\0'; + aPlatformLibName = strcat( aPlatformLibName, theLibName ); + aPlatformLibName = strcat( aPlatformLibName, ".dll" ); +#else + aPlatformLibName = new char[ strlen(theLibName) + 7 ]; + aPlatformLibName[0] = '\0'; + aPlatformLibName = strcat( aPlatformLibName, "lib" ); + aPlatformLibName = strcat( aPlatformLibName, theLibName ); + aPlatformLibName = strcat( aPlatformLibName, ".so" ); +#endif + } + + + Unexpect aCatch(SALOME_SalomeException); - if(MYDEBUG) MESSAGE( "Create Hypothesis <" << theHypName << "> from " << theLibName); + if(MYDEBUG) MESSAGE( "Create Hypothesis <" << theHypName << "> from " << aPlatformLibName/*theLibName*/); // create a new hypothesis object servant SMESH_Hypothesis_i* myHypothesis_i = 0; @@ -297,23 +345,27 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName { // load plugin library if(MYDEBUG) MESSAGE("Loading server meshers plugin library ..."); - void* libHandle = dlopen (theLibName, RTLD_LAZY); + LibHandle libHandle = LoadLib( aPlatformLibName/*theLibName*/ ); if (!libHandle) { // report any error, if occured +#ifndef WNT const char* anError = dlerror(); throw(SALOME_Exception(anError)); +#else + throw(SALOME_Exception(LOCALIZED( "Can't load server meshers plugin library" ))); +#endif } // get method, returning hypothesis creator if(MYDEBUG) MESSAGE("Find GetHypothesisCreator() method ..."); typedef GenericHypothesisCreator_i* (*GetHypothesisCreator)(const char* theHypName); GetHypothesisCreator procHandle = - (GetHypothesisCreator)dlsym( libHandle, "GetHypothesisCreator" ); + (GetHypothesisCreator)GetProc( libHandle, "GetHypothesisCreator" ); if (!procHandle) { throw(SALOME_Exception(LOCALIZED("bad hypothesis plugin library"))); - dlclose(libHandle); + UnLoadLib(libHandle); } // get hypothesis creator @@ -332,22 +384,23 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName if(MYDEBUG) MESSAGE("Create Hypothesis " << theHypName); myHypothesis_i = myHypCreatorMap[string(theHypName)]->Create (myPoa, GetCurrentStudyID(), &myGen); - // _CS_gbo Explicit activation (no longer made in the constructor). - myHypothesis_i->Activate(); - myHypothesis_i->SetLibName(theLibName); // for persistency assurance + myHypothesis_i->SetLibName(aPlatformLibName/*theLibName*/); // for persistency assurance } catch (SALOME_Exception& S_ex) { THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); } + if ( aPlatformLibName ) + delete[] aPlatformLibName; + if (!myHypothesis_i) return hypothesis_i._retn(); // activate the CORBA servant of hypothesis hypothesis_i = SMESH::SMESH_Hypothesis::_narrow( myHypothesis_i->_this() ); int nextId = RegisterObject( hypothesis_i ); - if(MYDEBUG) MESSAGE( "Add hypo to map with id = "<< nextId ); + if(MYDEBUG) MESSAGE( "Add hypo to map with id = "<< nextId ); return hypothesis_i._retn(); } @@ -370,7 +423,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh() // create a new mesh object servant, store it in a map in study context SMESH_Mesh_i* meshServant = new SMESH_Mesh_i( GetPOA(), this, GetCurrentStudyID() ); // create a new mesh object - meshServant->SetImpl( myGen.CreateMesh( GetCurrentStudyID() )); + meshServant->SetImpl( myGen.CreateMesh( GetCurrentStudyID(), myIsEmbeddedMode )); // activate the CORBA servant of Mesh SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( meshServant->_this() ); @@ -400,6 +453,46 @@ GEOM_Client* SMESH_Gen_i::GetShapeReader() return myShapeReader; } +//============================================================================= +/*! + * SMESH_Gen_i::SetEmbeddedMode + * + * Set current mode + */ +//============================================================================= + +void SMESH_Gen_i::SetEmbeddedMode( CORBA::Boolean theMode ) +{ + myIsEmbeddedMode = theMode; + + if ( !myIsEmbeddedMode ) { + bool raiseFPE; +#ifdef _DEBUG_ + raiseFPE = true; + char* envDisableFPE = getenv("DISABLE_FPE"); + if (envDisableFPE && atoi(envDisableFPE)) + raiseFPE = false; +#else + raiseFPE = false; +#endif + OSD::SetSignal( raiseFPE ); + } + // else OSD::SetSignal() is called in GUI +} + +//============================================================================= +/*! + * SMESH_Gen_i::IsEmbeddedMode + * + * Get current mode + */ +//============================================================================= + +CORBA::Boolean SMESH_Gen_i::IsEmbeddedMode() +{ + return myIsEmbeddedMode; +} + //============================================================================= /*! * SMESH_Gen_i::SetCurrentStudy @@ -411,7 +504,7 @@ GEOM_Client* SMESH_Gen_i::GetShapeReader() void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy ) { //if(MYDEBUG) - MESSAGE( "SMESH_Gen_i::SetCurrentStudy" ); + //MESSAGE( "SMESH_Gen_i::SetCurrentStudy" ); myCurrentStudy = SALOMEDS::Study::_duplicate( theStudy ); // create study context, if it doesn't exist and set current study int studyId = GetCurrentStudyID(); @@ -420,12 +513,16 @@ void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy ) myStudyContextMap[ studyId ] = new StudyContext; } - SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); - aStudyBuilder->LoadWith( myCurrentStudy->FindComponent( "GEOM" ), GetGeomEngine() ); + // myCurrentStudy may be nil + if ( !CORBA::is_nil( myCurrentStudy ) ) { + SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); + if( !myCurrentStudy->FindComponent( "GEOM" )->_is_nil() ) + aStudyBuilder->LoadWith( myCurrentStudy->FindComponent( "GEOM" ), GetGeomEngine() ); // set current study for geom engine //if ( !CORBA::is_nil( GetGeomEngine() ) ) // GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() ); + } } //============================================================================= @@ -479,20 +576,92 @@ SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis( const char* theHypNam SALOMEDS::SObject_var aSO = PublishHypothesis( myCurrentStudy, hyp ); if ( !aSO->_is_nil() ) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = smesh.CreateHypothesis(\""; - aStr += Standard_CString(theHypName); - aStr += "\", \""; - aStr += Standard_CString(theLibName); - aStr += "\")"; - - AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = " << this << ".CreateHypothesis('" + << theHypName << "', '" << theLibName << "')"; } } return hyp._retn(); } +//================================================================================ +/*! + * \brief Return hypothesis of given type holding parameter values of the existing mesh + * \param theHypType - hypothesis type name + * \param theLibName - plugin library name + * \param theMesh - The mesh of interest + * \param theGeom - The shape to get parameter values from + * \retval SMESH::SMESH_Hypothesis_ptr - The returned hypothesis may be the one existing + * in a study and used to compute the mesh, or a temporary one created just to pass + * parameter values + */ +//================================================================================ + +SMESH::SMESH_Hypothesis_ptr +SMESH_Gen_i::GetHypothesisParameterValues (const char* theHypType, + const char* theLibName, + SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Object_ptr theGeom) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if ( CORBA::is_nil( theMesh ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", SALOME::BAD_PARAM ); + if ( CORBA::is_nil( theGeom ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM ); + + // ----------------------------------------------- + // find hypothesis used to mesh theGeom + // ----------------------------------------------- + + // get mesh and shape + SMESH_Mesh_i* meshServant = SMESH::DownCast( theMesh ); + TopoDS_Shape shape = GeomObjectToShape( theGeom ); + if ( !meshServant || shape.IsNull() ) + return SMESH::SMESH_Hypothesis::_nil(); + ::SMESH_Mesh& mesh = meshServant->GetImpl(); + + if ( mesh.NbNodes() == 0 ) // empty mesh + return SMESH::SMESH_Hypothesis::_nil(); + + // create a temporary hypothesis to know its dimention + SMESH::SMESH_Hypothesis_var tmpHyp = this->createHypothesis( theHypType, theLibName ); + SMESH_Hypothesis_i* hypServant = SMESH::DownCast( tmpHyp ); + if ( !hypServant ) + return SMESH::SMESH_Hypothesis::_nil(); + ::SMESH_Hypothesis* hyp = hypServant->GetImpl(); + + // look for a hypothesis of theHypType used to mesh the shape + if ( myGen.GetShapeDim( shape ) == hyp->GetDim() ) + { + // check local shape + SMESH::ListOfHypothesis_var aHypList = theMesh->GetHypothesisList( theGeom ); + int nbLocalHyps = aHypList->length(); + for ( int i = 0; i < nbLocalHyps; i++ ) + if ( strcmp( theHypType, aHypList[i]->GetName() ) == 0 ) // FOUND local! + return SMESH::SMESH_Hypothesis::_duplicate( aHypList[i] ); + // check super shapes + TopTools_ListIteratorOfListOfShape itShape( mesh.GetAncestors( shape )); + while ( nbLocalHyps == 0 && itShape.More() ) { + GEOM::GEOM_Object_ptr geomObj = ShapeToGeomObject( itShape.Value() ); + if ( ! CORBA::is_nil( geomObj )) { + SMESH::ListOfHypothesis_var aHypList = theMesh->GetHypothesisList( geomObj ); + nbLocalHyps = aHypList->length(); + for ( int i = 0; i < nbLocalHyps; i++ ) + if ( strcmp( theHypType, aHypList[i]->GetName() ) == 0 ) // FOUND global! + return SMESH::SMESH_Hypothesis::_duplicate( aHypList[i] ); + } + itShape.Next(); + } + } + + // let the temporary hypothesis find out some how parameter values + if ( hyp->SetParametersByMesh( &mesh, shape )) + return SMESH::SMESH_Hypothesis::_duplicate( tmpHyp ); + + return SMESH::SMESH_Hypothesis::_nil(); +} + //============================================================================= /*! * SMESH_Gen_i::CreateMesh @@ -509,7 +678,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Object_ptr theShapeObj // create mesh SMESH::SMESH_Mesh_var mesh = this->createMesh(); // set shape - SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( mesh ).in() ); + SMESH_Mesh_i* meshServant = SMESH::DownCast( mesh ); ASSERT( meshServant ); meshServant->SetShape( theShapeObject ); @@ -521,11 +690,38 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Object_ptr theShapeObj aStudyBuilder->CommitCommand(); if ( !aSO->_is_nil() ) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = smesh.CreateMesh("; - SMESH_Gen_i::AddObject(aStr, theShapeObject) += ")"; - - AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = " << this << ".CreateMesh(" << theShapeObject << ")"; + } + } + + return mesh._retn(); +} + +//============================================================================= +/*! + * SMESH_Gen_i::CreateEmptyMesh + * + * Create empty mesh + */ +//============================================================================= + +SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateEmptyMesh() + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMesh" ); + // create mesh + SMESH::SMESH_Mesh_var mesh = this->createMesh(); + + // publish mesh in the study + if ( CanPublishInStudy( mesh ) ) { + SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); + aStudyBuilder->NewCommand(); // There is a transaction + SALOMEDS::SObject_var aSO = PublishMesh( myCurrentStudy, mesh.in() ); + aStudyBuilder->CommitCommand(); + if ( !aSO->_is_nil() ) { + // Update Python script + TPythonDump() << aSO << " = " << this << ".CreateEmptyMesh()"; } } @@ -547,7 +743,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshesFromUNV" ); SMESH::SMESH_Mesh_var aMesh = createMesh(); - string aFileName; // = boost::filesystem::path(theFileName).leaf(); + string aFileName; // publish mesh in the study if ( CanPublishInStudy( aMesh ) ) { SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); @@ -556,18 +752,17 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName aStudyBuilder->CommitCommand(); if ( !aSO->_is_nil() ) { // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = smesh.CreateMeshesFromUNV(\""; - aStr += Standard_CString(theFileName); - aStr += "\")"; - - AddToCurrentPyScript(aStr); + TPythonDump() << aSO << " = smeshgen.CreateMeshesFromUNV('" << theFileName << "')"; } } SMESH_Mesh_i* aServant = dynamic_cast( GetServant( aMesh ).in() ); ASSERT( aServant ); aServant->ImportUNVFile( theFileName ); + + // Dump creation of groups + aServant->GetGroups(); + return aMesh._retn(); } @@ -586,9 +781,6 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, Unexpect aCatch(SALOME_SalomeException); if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" ); - // Python Dump - TCollection_AsciiString aStr ("(["); - // Retrieve mesh names from the file DriverMED_R_SMESHDS_Mesh myReader; myReader.SetFile( theFileName ); @@ -597,6 +789,14 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, list aNames = myReader.GetMeshNames(aStatus); SMESH::mesh_array_var aResult = new SMESH::mesh_array(); theStatus = (SMESH::DriverMED_ReadStatus)aStatus; + + { // open a new scope to make aPythonDump die before PythonDump in SMESH_Mesh::GetGroups() + + // Python Dump + TPythonDump aPythonDump; + aPythonDump << "(["; + //TCollection_AsciiString aStr ("(["); + if (theStatus == SMESH::DRS_OK) { SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); aStudyBuilder->NewCommand(); // There is a transaction @@ -606,7 +806,8 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, // Iterate through all meshes and create mesh objects for ( list::iterator it = aNames.begin(); it != aNames.end(); it++ ) { // Python Dump - if (i > 0) aStr += ", "; + //if (i > 0) aStr += ", "; + if (i > 0) aPythonDump << ", "; // create mesh SMESH::SMESH_Mesh_var mesh = createMesh(); @@ -617,11 +818,13 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, aSO = PublishMesh( myCurrentStudy, mesh.in(), (*it).c_str() ); if ( !aSO->_is_nil() ) { // Python Dump - aStr += aSO->GetID(); + aPythonDump << aSO; + //aStr += aSO->GetID(); } else { // Python Dump - aStr += "mesh_"; - aStr += TCollection_AsciiString(i); + aPythonDump << "mesh_" << i; +// aStr += "mesh_"; +// aStr += TCollection_AsciiString(i); } // Read mesh data (groups are published automatically by ImportMEDFile()) @@ -638,11 +841,11 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, } // Update Python script - aStr += "], status) = smesh.CreateMeshesFromMED(\""; - aStr += Standard_CString(theFileName); - aStr += "\")"; - - AddToCurrentPyScript(aStr); + aPythonDump << "], status) = " << this << ".CreateMeshesFromMED('" << theFileName << "')"; + } + // Dump creation of groups + for ( int i = 0; i < aResult->length(); ++i ) + aResult[ i ]->GetGroups(); return aResult._retn(); } @@ -662,7 +865,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromSTL( const char* theFileName if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshesFromSTL" ); SMESH::SMESH_Mesh_var aMesh = createMesh(); - string aFileName; // = boost::filesystem::path(theFileName).leaf(); + string aFileName; // publish mesh in the study if ( CanPublishInStudy( aMesh ) ) { SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder(); @@ -671,13 +874,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromSTL( const char* theFileName ( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() ); aStudyBuilder->CommitCommand(); if ( !aSO->_is_nil() ) { - // Update Python script - TCollection_AsciiString aStr (aSO->GetID()); - aStr += " = smesh.CreateMeshesFromSTL(\""; - aStr += Standard_CString(theFileName); - aStr += "\")"; - - AddToCurrentPyScript(aStr); + // Update Python script + TPythonDump() << aSO << " = " << this << ".CreateMeshesFromSTL('" << theFileName << "')"; } } @@ -728,6 +926,100 @@ CORBA::Boolean SMESH_Gen_i::IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh, return false; } +//================================================================================ +/*! + * \brief Returns errors of hypotheses definintion + * \param theMesh - the mesh + * \param theSubObject - the main or sub- shape + * \retval SMESH::algo_error_array* - sequence of errors + */ +//================================================================================ + +SMESH::algo_error_array* SMESH_Gen_i::GetAlgoState( SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Object_ptr theSubObject ) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if(MYDEBUG) MESSAGE( "SMESH_Gen_i::GetAlgoState()" ); + + if ( CORBA::is_nil( theSubObject ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference", SALOME::BAD_PARAM ); + + if ( CORBA::is_nil( theMesh ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",SALOME::BAD_PARAM ); + + SMESH::algo_error_array_var error_array = new SMESH::algo_error_array; + try { + SMESH_Mesh_i* meshServant = SMESH::DownCast( theMesh ); + ASSERT( meshServant ); + if ( meshServant ) { + TopoDS_Shape myLocShape = GeomObjectToShape( theSubObject ); + ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); + list< ::SMESH_Gen::TAlgoStateError > error_list; + list< ::SMESH_Gen::TAlgoStateError >::iterator error; + // call ::SMESH_Gen::GetAlgoState() + myGen.GetAlgoState( myLocMesh, myLocShape, error_list ); + error_array->length( error_list.size() ); + int i = 0; + for ( error = error_list.begin(); error != error_list.end(); ++error ) + { + // error name + SMESH::AlgoStateErrorName errName; + switch ( error->_name ) { + case ::SMESH_Gen::MISSING_ALGO: errName = SMESH::MISSING_ALGO; break; + case ::SMESH_Gen::MISSING_HYPO: errName = SMESH::MISSING_HYPO; break; + case ::SMESH_Gen::NOT_CONFORM_MESH: errName = SMESH::NOT_CONFORM_MESH; break; + default: + THROW_SALOME_CORBA_EXCEPTION( "bad error name",SALOME::BAD_PARAM ); + } + // algo name + CORBA::String_var algoName; + if ( error->_algo ) { + if ( !myCurrentStudy->_is_nil() ) { + // find algo in the study + SALOMEDS::SComponent_var father = SALOMEDS::SComponent::_narrow + ( myCurrentStudy->FindComponent( ComponentDataType() ) ); + if ( !father->_is_nil() ) { + SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( father ); + for ( ; itBig->More(); itBig->Next() ) { + SALOMEDS::SObject_var gotBranch = itBig->Value(); + if ( gotBranch->Tag() == GetAlgorithmsRootTag() ) { + SALOMEDS::ChildIterator_var algoIt = myCurrentStudy->NewChildIterator( gotBranch ); + for ( ; algoIt->More(); algoIt->Next() ) { + SALOMEDS::SObject_var algoSO = algoIt->Value(); + CORBA::Object_var algoIOR = SObjectToObject( algoSO ); + if ( !CORBA::is_nil( algoIOR )) { + SMESH_Hypothesis_i* myImpl = SMESH::DownCast( algoIOR ); + if ( myImpl && myImpl->GetImpl() == error->_algo ) { + algoName = algoSO->GetName(); + break; + } + } + } // loop on algo SO's + break; + } // if algo tag + } // SMESH component iterator + } + } + if ( algoName.in() == 0 ) + // use algo type name + algoName = CORBA::string_dup( error->_algo->GetName() ); + } + // fill AlgoStateError structure + SMESH::AlgoStateError & errStruct = error_array[ i++ ]; + errStruct.name = errName; + errStruct.algoName = algoName; + errStruct.algoDim = error->_algoDim; + errStruct.isGlobalAlgo = error->_isGlobalAlgo; + } + } + } + catch ( SALOME_Exception& S_ex ) { + INFOS( "catch exception "<< S_ex.what() ); + } + return error_array._retn(); +} + //============================================================================= /*! * SMESH_Gen_i::GetSubShapesId @@ -827,15 +1119,9 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, SALOME::BAD_PARAM ); // Update Python script - TCollection_AsciiString aStr ("isDone = smesh.Compute("); - SMESH_Gen_i::AddObject(aStr, theMesh) += ", "; - SMESH_Gen_i::AddObject(aStr, theShapeObject) += ")"; - - AddToCurrentPyScript(aStr); - - aStr = "if isDone == 0: print \"Mesh "; - SMESH_Gen_i::AddObject(aStr, theMesh) += " computation failed\""; - AddToCurrentPyScript(aStr); + TPythonDump() << "isDone = " << this << ".Compute( " + << theMesh << ", " << theShapeObject << ")"; + TPythonDump() << "if not isDone: print 'Mesh " << theMesh << " : computation failed'"; try { // get mesh servant @@ -858,6 +1144,63 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, return false; } +//================================================================================ +/*! + * \brief Return geometrical object the given element is built on + * \param theMesh - the mesh the element is in + * \param theElementID - the element ID + * \param theGeomName - the name of the result geom object if it is not yet published + * \retval GEOM::GEOM_Object_ptr - the found or just published geom object + */ +//================================================================================ + +GEOM::GEOM_Object_ptr +SMESH_Gen_i::GetGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, + CORBA::Long theElementID, + const char* theGeomName) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + if ( CORBA::is_nil( theMesh ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", SALOME::BAD_PARAM ); + + GEOM::GEOM_Object_var mainShape = theMesh->GetShapeToMesh(); + GEOM::GEOM_Gen_var geomGen = GetGeomEngine(); + + // get a core mesh DS + SMESH_Mesh_i* meshServant = SMESH::DownCast( theMesh ); + if ( meshServant && !geomGen->_is_nil() && !mainShape->_is_nil() ) + { + ::SMESH_Mesh & mesh = meshServant->GetImpl(); + SMESHDS_Mesh* meshDS = mesh.GetMeshDS(); + // find the element in mesh + if ( const SMDS_MeshElement * elem = meshDS->FindElement( theElementID ) ) + // find a shape id by the element + if ( int shapeID = ::SMESH_MeshEditor( &mesh ).FindShape( elem )) { + // get a geom object by the shape id + GEOM::GEOM_Object_var geom = ShapeToGeomObject( meshDS->IndexToShape( shapeID )); + if ( geom->_is_nil() ) { + GEOM::GEOM_IShapesOperations_var op = + geomGen->GetIShapesOperations( GetCurrentStudyID() ); + if ( !op->_is_nil() ) + geom = op->GetSubShape( mainShape, shapeID ); + } + if ( !geom->_is_nil() ) { + // try to find the corresponding SObject + GeomObjectToShape( geom ); // geom client remembers the found shape + SALOMEDS::SObject_var SObj = ObjectToSObject( myCurrentStudy, geom.in() ); + if ( SObj->_is_nil() ) + // publish a new subshape + SObj = geomGen->AddInStudy( myCurrentStudy, geom, theGeomName, mainShape ); + // return only published geometry + if ( !SObj->_is_nil() ) + return geom._retn(); + } + } + } + return GEOM::GEOM_Object::_nil(); +} + //============================================================================= /*! * SMESH_Gen_i::Save @@ -866,8 +1209,8 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, */ //============================================================================= SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile ) + const char* theURL, + bool isMultiFile ) { INFOS( "SMESH_Gen_i::Save" ); @@ -916,6 +1259,15 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, HDFgroup* aSubSubGroup; hdf_size aSize[ 1 ]; + + //Remove the files if they exist: BugID: 11225 + TCollection_AsciiString cmd("rm -f \""); + cmd+=filename; + cmd+="\" \""; + cmd+=meshfile; + cmd+="\""; + system(cmd.ToCString()); + // MED writer to be used by storage process DriverMED_W_SMESHDS_Mesh myWriter; myWriter.SetFile( meshfile.ToCString() ); @@ -924,7 +1276,7 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, // ---> create HDF file aFile = new HDFfile( filename.ToCString() ); aFile->CreateOnDisk(); - + // --> iterator for top-level objects SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( theComponent ); for ( ; itBig->More(); itBig->Next() ) { @@ -947,8 +1299,20 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); if ( myImpl ) { string hypname = string( myHyp->GetName() ); - string libname = string( myHyp->GetLibName() ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + string libname = string( myHyp->GetLibName() ); +// BUG SWP13062 +// Needs for save crossplatform libname, i.e. parth of name ( ".dll" for +// WNT and ".so" for X-system) must be deleted + int libname_len = libname.length(); +#ifdef WNT + if( libname_len > 4 ) + libname.resize( libname_len - 4 ); +#else + if( libname_len > 3 ) + libname.resize( libname_len - 3 ); +#endif + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); string hypdata = string( myImpl->SaveTo() ); // for each hypothesis create HDF group basing on its id @@ -1001,7 +1365,19 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( myImpl ) { string hypname = string( myHyp->GetName() ); string libname = string( myHyp->GetLibName() ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); +// BUG SWP13062 +// Needs for save crossplatform libname, i.e. parth of name ( ".dll" for +// WNT and ".so" for X-system) must be deleted + int libname_len = libname.length(); +#ifdef WNT + if( libname_len > 4 ) + libname.resize( libname_len - 4 ); +#else + if( libname_len > 3 ) + libname.resize( libname_len - 3 ); +#endif + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); string hypdata = string( myImpl->SaveTo() ); // for each algorithm create HDF group basing on its id @@ -1044,7 +1420,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( !myMesh->_is_nil() ) { SMESH_Mesh_i* myImpl = dynamic_cast( GetServant( myMesh ).in() ); if ( myImpl ) { - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); ::SMESH_Mesh& myLocMesh = myImpl->GetImpl(); SMESHDS_Mesh* mySMESHDSMesh = myLocMesh.GetMeshDS(); @@ -1113,7 +1490,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, //string myRefOnObject = myRefOnHyp->GetID(); CORBA::Object_var anObject = SObjectToObject( myRefOnHyp ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); //if ( myRefOnObject.length() > 0 ) { //aSize[ 0 ] = myRefOnObject.length() + 1; char hypName[ 30 ], hypId[ 30 ]; @@ -1155,7 +1533,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, //string myRefOnObject = myRefOnAlgo->GetID(); CORBA::Object_var anObject = SObjectToObject( myRefOnAlgo ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); //if ( myRefOnObject.length() > 0 ) { //aSize[ 0 ] = myRefOnObject.length() + 1; char algoName[ 30 ], algoId[ 30 ]; @@ -1245,7 +1624,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( !CORBA::is_nil( anSubObject )) { SMESH::SMESH_subMesh_var mySubMesh = SMESH::SMESH_subMesh::_narrow( anSubObject ) ; - int subid = myStudyContext->findId( string( GetORB()->object_to_string( anSubObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anSubObject ); + int subid = myStudyContext->findId( string( objStr.in() ) ); // for each mesh open the HDF group basing on its id char submeshGrpName[ 30 ]; @@ -1282,7 +1662,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( ok ) { //string myRefOnObject = myRefOnHyp->GetID(); CORBA::Object_var anObject = SObjectToObject( myRefOnHyp ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); //if ( myRefOnObject.length() > 0 ) { //aSize[ 0 ] = myRefOnObject.length() + 1; char hypName[ 30 ], hypId[ 30 ]; @@ -1316,7 +1697,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( ok ) { //string myRefOnObject = myRefOnAlgo->GetID(); CORBA::Object_var anObject = SObjectToObject( myRefOnAlgo ); - int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( anObject ); + int id = myStudyContext->findId( string( objStr.in() ) ); //if ( myRefOnObject.length() > 0 ) { //aSize[ 0 ] = myRefOnObject.length() + 1; char algoName[ 30 ], algoId[ 30 ]; @@ -1373,7 +1755,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, if ( !myGroupImpl ) continue; - int anId = myStudyContext->findId( string( GetORB()->object_to_string( aSubObject ) ) ); + CORBA::String_var objStr = GetORB()->object_to_string( aSubObject ); + int anId = myStudyContext->findId( string( objStr.in() ) ); // For each group, create a dataset named "Group " // and store the group's user name into it @@ -1794,8 +2177,8 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); if ( myImpl ) { myImpl->LoadFrom( hypdata.c_str() ); - string iorString = GetORB()->object_to_string( myHyp ); - int newId = myStudyContext->findId( iorString ); + CORBA::String_var iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( string( iorString.in() ) ); myStudyContext->mapOldToNew( id, newId ); } else @@ -1892,8 +2275,8 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); if ( myImpl ) { myImpl->LoadFrom( hypdata.c_str() ); - string iorString = GetORB()->object_to_string( myHyp ); - int newId = myStudyContext->findId( iorString ); + CORBA::String_var iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( string( iorString.in() ) ); myStudyContext->mapOldToNew( id, newId ); } else @@ -1932,8 +2315,8 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, SMESH_Mesh_i* myNewMeshImpl = dynamic_cast( GetServant( myNewMesh ).in() ); if ( !myNewMeshImpl ) continue; - string iorString = GetORB()->object_to_string( myNewMesh ); - int newId = myStudyContext->findId( iorString ); + CORBA::String_var iorString = GetORB()->object_to_string( myNewMesh ); + int newId = myStudyContext->findId( string( iorString.in() ) ); myStudyContext->mapOldToNew( id, newId ); ::SMESH_Mesh& myLocMesh = myNewMeshImpl->GetImpl(); @@ -2118,8 +2501,8 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, ( myNewMeshImpl->createSubMesh( aSubShapeObject ) ); if ( aSubMesh->_is_nil() ) continue; - string iorSubString = GetORB()->object_to_string( aSubMesh ); - int newSubId = myStudyContext->findId( iorSubString ); + CORBA::String_var iorSubString = GetORB()->object_to_string( aSubMesh ); + int newSubId = myStudyContext->findId( string( iorSubString.in() ) ); myStudyContext->mapOldToNew( subid, newSubId ); } } @@ -2416,8 +2799,8 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, if ( aNewGroup->_is_nil() ) continue; - string iorSubString = GetORB()->object_to_string( aNewGroup ); - int newSubId = myStudyContext->findId( iorSubString ); + CORBA::String_var iorSubString = GetORB()->object_to_string( aNewGroup ); + int newSubId = myStudyContext->findId( string( iorSubString.in() ) ); myStudyContext->mapOldToNew( subid, newSubId ); SMESH_GroupBase_i* aGroupImpl = @@ -2571,8 +2954,8 @@ int SMESH_Gen_i::RegisterObject(CORBA::Object_ptr theObject) { StudyContext* myStudyContext = GetCurrentStudyContext(); if ( myStudyContext && !CORBA::is_nil( theObject )) { - string iorString = GetORB()->object_to_string( theObject ); - return myStudyContext->addObject( iorString ); + CORBA::String_var iorString = GetORB()->object_to_string( theObject ); + return myStudyContext->addObject( string( iorString.in() ) ); } return 0; } @@ -2586,7 +2969,7 @@ int SMESH_Gen_i::RegisterObject(CORBA::Object_ptr theObject) //============================================================================= extern "C" -{ +{ SMESH_I_EXPORT PortableServer::ObjectId* SMESHEngine_factory( CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId* contId,