From 03265b70ced9abfa02e4e6b13d470721873bdbd9 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 14 Feb 2013 12:33:12 +0000 Subject: [PATCH] Merge from BR_siman_phase1 14/02/2013 --- src/GEOM/GEOM_Engine.cxx | 11 +++ src/GEOM/GEOM_Engine.hxx | 7 ++ src/GEOM/GEOM_IOperations.cxx | 1 + src/GEOM_I/GEOM_Gen_i.cc | 127 ++++++++++++++++++++++++++++++++++ src/GEOM_I/GEOM_Gen_i.hh | 5 ++ src/GEOM_SWIG/geompyDC.py | 7 +- 6 files changed, 157 insertions(+), 1 deletion(-) diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx index 501909d7a..d68df5838 100644 --- a/src/GEOM/GEOM_Engine.cxx +++ b/src/GEOM/GEOM_Engine.cxx @@ -955,6 +955,17 @@ std::list GEOM_Engine::getAllTextures(int theDocID) return id_list; } +void GEOM_Engine::DocumentModified(const int theDocId, const bool isModified) +{ + if (isModified) _mapModifiedDocs.Add(theDocId); + else _mapModifiedDocs.Remove(theDocId); +} + +bool GEOM_Engine::DocumentModified(const int theDocId) +{ + return _mapModifiedDocs.Contains(theDocId); +} + //=========================================================================== // Internal functions //=========================================================================== diff --git a/src/GEOM/GEOM_Engine.hxx b/src/GEOM/GEOM_Engine.hxx index 4ae37dfec..1d019f320 100644 --- a/src/GEOM/GEOM_Engine.hxx +++ b/src/GEOM/GEOM_Engine.hxx @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -178,6 +179,10 @@ class GEOM_Engine static const Standard_GUID& GetTextureGUID(); + void DocumentModified(const int theDocId, const bool isModified); + + bool DocumentModified(const int theDocId); + protected: Standard_EXPORT static void SetEngine(GEOM_Engine* theEngine); @@ -189,6 +194,8 @@ class GEOM_Engine #else Interface_DataMapOfIntegerTransient _mapIDDocument; #endif + TColStd_MapOfInteger _mapModifiedDocs; // keeps the identifiers of the modified document ids + int _UndoLimit; GEOM_DataMapOfAsciiStringTransient _objects; diff --git a/src/GEOM/GEOM_IOperations.cxx b/src/GEOM/GEOM_IOperations.cxx index d7a381c16..cc90a0599 100644 --- a/src/GEOM/GEOM_IOperations.cxx +++ b/src/GEOM/GEOM_IOperations.cxx @@ -79,6 +79,7 @@ void GEOM_IOperations::FinishOperation() Handle(TDocStd_Document) aDoc = _engine->GetDocument(_docID); if(aDoc->GetUndoLimit() > 0) aDoc->CommitCommand(); + _engine->DocumentModified(_docID, true); } //============================================================================= diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index b034757f7..4de016fc3 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -62,6 +62,8 @@ #include #include +#include +#include //============================================================================ // function : GEOM_Gen_i() @@ -2571,6 +2573,131 @@ char* GEOM_Gen_i::getVersion() #endif } +//================================================================================= +// function : importData +// purpose : imports geometrical data file into the GEOM internal data structure +//================================================================================= +Engines::ListOfIdentifiers* GEOM_Gen_i::importData( + CORBA::Long studyId, Engines::DataContainer_ptr data, const Engines::ListOfOptions& options) +{ + CORBA::Object_var aSMObject = name_service->Resolve( "/myStudyManager" ); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow( aSMObject ); + SALOMEDS::Study_var aStudy = aStudyManager->GetStudyByID( studyId ); + + Engines::ListOfIdentifiers_var aResult = new Engines::ListOfIdentifiers; + GEOM::GEOM_IInsertOperations_var aInsOp = GetIInsertOperations(aStudy->StudyId()); + if (aInsOp->_is_nil()) { + MESSAGE("No insert operations!"); + return aResult._retn(); + } + + // Get a temporary directory to store a file + std::string aTmpDir = SALOMEDS_Tool::GetTmpDir(); + std::string aFileName("file"); + if (aFileName.rfind("/") != std::string::npos) { // remove folders from the name + aFileName = aFileName.substr(aFileName.rfind("/") + 1); + } + std::string anExtension(data->extension()); + aFileName += "." + anExtension; + // convert extension to upper case + std::transform(anExtension.begin(), anExtension.end(), anExtension.begin(), ::toupper); + + std::string aFullPath = aTmpDir + aFileName; + + Engines::TMPFile* aFileStream = data->get(); + const char *aBuffer = (const char*)aFileStream->NP_data(); +#ifdef WIN32 + std::ofstream aFile(aFullPath.c_str(), std::ios::binary); +#else + std::ofstream aFile(aFullPath.c_str()); +#endif + aFile.write(aBuffer, aFileStream->length()); + aFile.close(); + + GEOM::GEOM_Object_var anObj = aInsOp->ImportFile(aFullPath.c_str(), anExtension.c_str()); + if ( !anObj->_is_nil() && aInsOp->IsDone() ) { + SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), anObj, data->name()); + aResult->length(1); + aResult[0] = aSO->GetID(); // unioque identifer of the object in GEOM is entry of SObject + } else { + if (anObj->_is_nil()) + MESSAGE("Result of the import operation is incorrect for file "<IsDone()) + MESSAGE("Import operation is not done for file "<DocumentModified(studyId, false); + return aResult._retn(); +} + +//================================================================================= +// function : getModifiedData +// purpose : exports all geometry of this GEOM module into one BRep file +//================================================================================= +Engines::ListOfData* GEOM_Gen_i::getModifiedData(CORBA::Long studyId) +{ + Engines::ListOfData_var aResult = new Engines::ListOfData; + + if (!_impl->DocumentModified(studyId)) { + MESSAGE("Document is not modified") + return aResult._retn(); + } + + CORBA::Object_var aSMObject = name_service->Resolve("/myStudyManager"); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow( aSMObject ); + SALOMEDS::Study_var aStudy = aStudyManager->GetStudyByID( studyId ); + SALOMEDS::SComponent_var aComponent = aStudy->FindComponent("GEOM"); + if (CORBA::is_nil(aComponent)) + return aResult._retn(); + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aComponent); // check only published shapes + TopoDS_Compound aResultComp; + BRep_Builder aBB; + aBB.MakeCompound(aResultComp); + int aNumInComp = 0; // number of shapes in resulting compound + for(; anIter->More(); anIter->Next()) { + SALOMEDS::SObject_var aSO = anIter->Value(); + SALOMEDS::SObject_var aRefSO; + // export only not referenced objects, or referenced outside of GEOM + if (!aSO->ReferencedObject(aRefSO) || aRefSO->GetFatherComponent()->GetID() != aComponent->GetID()) { + CORBA::Object_var anObj = aSO->GetObject(); + if (!CORBA::is_nil(anObj)) { + GEOM::GEOM_Object_var aCORBAMainShape = GEOM::GEOM_Object::_narrow(anObj); + if(!aCORBAMainShape->_is_nil()) { + CORBA::String_var entry = aCORBAMainShape->GetEntry(); + Handle(GEOM_Object) aMainShape = _impl->GetObject(studyId, entry); + if (!aMainShape.IsNull()) { + TopoDS_Shape aMainSh = aMainShape->GetValue(); + if (!aMainSh.IsNull()) { + aBB.Add(aResultComp, aMainSh); + aNumInComp++; + } + } + } + } + } + } + if (aNumInComp > 0) { // compund is correct, write it to the temporary file + std::string aFullPath = Kernel_Utils::GetTmpFileName() + ".brep"; + BRepTools::Write(aResultComp, aFullPath.c_str()); + MESSAGE("Write compound of "<length(1); + Engines::DataContainer_var aData = (new Engines_DataContainer_i( + aFullPath.c_str(), "", "", true))->_this(); + aResult[0] = aData; + } else { + MESSAGE("No shapes to export"); + } + + return aResult._retn(); +} + //===================================================================================== // EXPORTED METHODS //===================================================================================== diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index 021ce1bcb..c87d5031b 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -267,6 +267,11 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi // Version information virtual char* getVersion(); + virtual Engines::ListOfIdentifiers* importData(CORBA::Long studyId, + Engines::DataContainer_ptr data, + const Engines::ListOfOptions& options); + virtual Engines::ListOfData* getModifiedData(CORBA::Long studyId); + //-----------------------------------------------------------------------// // Internal methods // //-----------------------------------------------------------------------// diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index bf66f2e21..753a82494 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -218,8 +218,12 @@ def _toListOfNames(_names, _size=-1): ## @ingroup l1_geompy_auxiliary def RaiseIfFailed (Method_name, Operation): if Operation.IsDone() == 0 and Operation.GetErrorCode() != "NOT_FOUND_ANY": + Operation.AbortOperation() raise RuntimeError, Method_name + " : " + Operation.GetErrorCode() - + else: + Operation.FinishOperation() + pass + ## Return list of variables value from salome notebook ## @ingroup l1_geompy_auxiliary def ParseParameters(*parameters): @@ -4121,6 +4125,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the created compound. """ # Example: see GEOM_TestAll.py + self.ShapesOp.StartOperation() anObj = self.ShapesOp.MakeCompound(theShapes) RaiseIfFailed("MakeCompound", self.ShapesOp) self._autoPublish(anObj, theName, "compound") -- 2.39.2