From 666c66fdb301eb91cd08985414092b615cd49354 Mon Sep 17 00:00:00 2001 From: mpv Date: Thu, 18 Oct 2012 07:11:22 +0000 Subject: [PATCH] Initial integration of SimanIO support and SIMAN study interfaces --- src/SMESH_I/SMESH_Gen_i.cxx | 147 ++++++++++++++++++++++++++++++++++++ src/SMESH_I/SMESH_Gen_i.hxx | 11 ++- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 5f62002b9..9f624af55 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -101,6 +101,7 @@ #include #include +#include #include #include #include @@ -111,6 +112,7 @@ #include #include #include +#include #include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) #include CORBA_CLIENT_HEADER(SALOME_Session) @@ -4797,6 +4799,9 @@ int SMESH_Gen_i::RegisterObject(CORBA::Object_ptr theObject) { StudyContext* myStudyContext = GetCurrentStudyContext(); if ( myStudyContext && !CORBA::is_nil( theObject )) { + if (GetCurrentStudyID() == myImportedStudyId) + myImportedStudyChanged = true; + CORBA::String_var iorString = GetORB()->object_to_string( theObject ); return myStudyContext->addObject( string( iorString.in() ) ); } @@ -4845,6 +4850,148 @@ int SMESH_Gen_i::GetCurrentStudyID() return myCurrentStudy->_is_nil() || myCurrentStudy->_non_existent() ? -1 : myCurrentStudy->StudyId(); } +//================================================================================= +// function : importData +// purpose : imports mesh data file (the med one) into the SMESH internal data structure +//================================================================================= +Engines::ListOfIdentifiers* SMESH_Gen_i::importData( + CORBA::Long studyId, Engines::DataContainer_ptr data, const Engines::ListOfOptions& options) +{ + Engines::ListOfIdentifiers_var aResultIds = new Engines::ListOfIdentifiers; + list aResultList; + + CORBA::Object_var aSMObject = myNS->Resolve( "/myStudyManager" ); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow( aSMObject ); + SALOMEDS::Study_var aStudy = aStudyManager->GetStudyByID( studyId ); + SetCurrentStudy(aStudy); + + // load and store temporary imported file + string aFileName = Kernel_Utils::GetTmpFileName(); + aFileName += string(".") + data->extension(); + Engines::TMPFile* aFileStream = data->get(); + const char *aBuffer = (const char*)aFileStream->NP_data(); +#ifdef WIN32 + std::ofstream aFile(aFileName.c_str(), std::ios::binary); +#else + std::ofstream aFile(aFileName.c_str()); +#endif + aFile.write(aBuffer, aFileStream->length()); + aFile.close(); + + // Retrieve mesh names from the file + DriverMED_R_SMESHDS_Mesh aReader; + aReader.SetFile( aFileName ); + aReader.SetMeshId(-1); + Driver_Mesh::Status aStatus; + list aNames = aReader.GetMeshNames(aStatus); + SMESH::mesh_array_var aResult = new SMESH::mesh_array(); + SMESH::DriverMED_ReadStatus aStatus2 = (SMESH::DriverMED_ReadStatus)aStatus; + if (aStatus2 == SMESH::DRS_OK) { + // Iterate through all meshes and create mesh objects + for ( list::iterator it = aNames.begin(); it != aNames.end(); it++ ) { + // create mesh + SMESH::SMESH_Mesh_var mesh = createMesh(); + + // publish mesh in the study + SALOMEDS::SObject_var aSO; + if (CanPublishInStudy(mesh)) { + aSO = PublishMesh(aStudy, mesh.in(), (*it).c_str()); + aResultList.push_back(aSO->GetID()); + } + // Read mesh data (groups are published automatically by ImportMEDFile()) + SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( mesh ).in() ); + ASSERT( meshServant ); + meshServant->ImportMEDFile( aFileName.c_str(), (*it).c_str() ); + //meshServant->GetImpl().GetMeshDS()->Modified(); + } + } else { + MESSAGE("Opening MED file problems "<length(aResultList.size()); + list::iterator aListIter = aResultList.begin(); + for(int a = 0; aListIter != aResultList.end(); aListIter++, a++) + aResultIds[a] = aListIter->c_str(); + } + + myImportedStudyId = studyId; + myImportedStudyChanged = false; + + return aResultIds._retn(); +} + +//================================================================================= +// function : getModifiedData +// purpose : exports all geometry of this GEOM module into one BRep file +//================================================================================= +Engines::ListOfData* SMESH_Gen_i::getModifiedData(CORBA::Long studyId) +{ + Engines::ListOfData_var aResult = new Engines::ListOfData; + + if (!myImportedStudyChanged) { + MESSAGE("Study is not changed") + return aResult._retn(); + } + + CORBA::Object_var aSMObject = myNS->Resolve("/myStudyManager"); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject); + SALOMEDS::Study_var aStudy = aStudyManager->GetStudyByID(studyId); + SetCurrentStudy(aStudy); + SALOMEDS::SComponent_var aComponent = aStudy->FindComponent("SMESH"); + + std::string aFullPath(Kernel_Utils::GetTmpFileName()); + aFullPath += ".med"; + DriverMED_W_SMESHDS_Mesh aWriter; + aWriter.SetFile(aFullPath.c_str()); + StudyContext* myStudyContext = GetCurrentStudyContext(); + + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published meshes + int aNumMeshes = 0; // number of meshes in result + for(; anIter->More(); anIter->Next()) { + SALOMEDS::SObject_var aSO = anIter->Value(); + CORBA::Object_var anObj = aSO->GetObject(); + if (!CORBA::is_nil(anObj)) { + SMESH::SMESH_Mesh_var aCORBAMesh = SMESH::SMESH_Mesh::_narrow(anObj); + if(!aCORBAMesh->_is_nil()) { + SMESH_Mesh_i* myImpl = dynamic_cast(GetServant(aCORBAMesh).in()); + if (myImpl) { + CORBA::String_var objStr = GetORB()->object_to_string(anObj); + int id = myStudyContext->findId(string(objStr.in())); + SMESHDS_Mesh* mySMESHDSMesh = myImpl->GetImpl().GetMeshDS(); + if (mySMESHDSMesh->NbNodes() > 0) { + // write mesh data to med file + aWriter.SetMesh(mySMESHDSMesh); + aWriter.SetMeshId(id); + aNumMeshes++; + } else { + MESSAGE("Mesh has zero nodes and can not be exported"); + } + } + } + } + } + if (aNumMeshes > 0) { // compund is correct, write it to the temporary file + MESSAGE("Write "<length(1); + Engines::DataContainer_var aData = (new Engines_DataContainer_i( + aFullPath.c_str(), "", "", true))->_this(); + aResult[0] = aData; + } + return aResult._retn(); +} + + + //============================================================================= /*! * SMESHEngine_factory diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 04edf2f1f..1b8cd377d 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -464,7 +464,13 @@ public: void CleanPythonTrace (int theStudyID); - + // ============ + // Check In / Check Out + // ============ + virtual Engines::ListOfIdentifiers* importData( + CORBA::Long studyId, Engines::DataContainer_ptr data, const Engines::ListOfOptions& options); + virtual Engines::ListOfData* getModifiedData(CORBA::Long studyId); + // ***************************************** // Internal methods // ***************************************** @@ -603,6 +609,9 @@ private: std::map < int, Handle(TColStd_HSequenceOfAsciiString) > myPythonScripts; bool myIsHistoricalPythonDump; std::vector< std::string > myLastParameters; + + int myImportedStudyId; // identifier of the imported in importData study to keep no-modifiection flag for getModifiedData method + int myImportedStudyChanged; // flag that indicates that the imported study has been changed (by creation of the additional mesh) }; -- 2.39.2