X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOM_I%2FGEOM_Gen_i.cc;h=7ccc970dd0e14bdc1dba09a1638bdd9e876f5253;hb=2736f682fe0d63fbaf9dff49c46b4fa6c23d72ce;hp=ff48a03e9892078bdec555d998f576c0a8c15af0;hpb=bb545186fa0ae02fa021337e6ecbedaba96e620e;p=modules%2Fgeom.git diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index ff48a03e9..7ccc970dd 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,6 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #ifdef WIN32 #pragma warning( disable:4786 ) @@ -35,7 +36,6 @@ #include "Utils_ExceptHandlers.hxx" #include "utilities.h" -#include "GEOM_Object_i.hh" #include "GEOM_Object.hxx" #include "GEOM_Function.hxx" #include "GEOM_ISubShape.hxx" @@ -44,6 +44,7 @@ #include "GEOMImpl_CopyDriver.hxx" #include "GEOMImpl_IInsertOperations.hxx" #include "GEOM_wrap.hxx" +#include "GEOMUtils_XmlHandler.hxx" // Cascade headers #include @@ -58,10 +59,12 @@ #include #include #include +#include +#include +#include #include #include -#include #include #include @@ -81,7 +84,7 @@ #define UnLoadLib( handle ) FreeLibrary( handle ); #else #define LibHandle void* - #define LoadLib( name ) dlopen( name, RTLD_LAZY ) + #define LoadLib( name ) dlopen( name, RTLD_LAZY | RTLD_GLOBAL ) #define GetProc dlsym #define UnLoadLib( handle ) dlclose( handle ); #endif @@ -109,17 +112,26 @@ GEOM_Gen_i::GEOM_Gen_i(CORBA::ORB_ptr orb, { //work around PAL12004, PAL12628 //OSD::SetSignal( true ); - bool raiseFPE; -#ifdef _DEBUG_ - raiseFPE = true; - char* envDisableFPE = getenv("DISABLE_FPE"); - if (envDisableFPE && atoi(envDisableFPE)) - raiseFPE = false; -#else - raiseFPE = false; + bool raiseFPE = false; +#if defined(_DEBUG_) | defined(_DEBUG) //the Last for WIN32 default settings + char* envEnableFPE = getenv("ENABLE_FPE"); + if (envEnableFPE && atoi(envEnableFPE)) + raiseFPE = true; #endif OSD::SetSignal( raiseFPE ); } + + GEOMUtils::PluginInfo plugins = GEOMUtils::ReadPluginInfo(); + GEOMUtils::PluginInfo::const_iterator it; + for (it = plugins.begin(); it != plugins.end(); ++it) + { + try { + LoadPlugin((*it).serverLib); + } + catch (...) { + MESSAGE("Warning: can't load plugin library " << (*it).serverLib); + } + } } //============================================================================ @@ -129,6 +141,9 @@ GEOM_Gen_i::GEOM_Gen_i(CORBA::ORB_ptr orb, GEOM_Gen_i::~GEOM_Gen_i() { delete name_service; delete _impl; + std::map::const_iterator it; + for ( it = myOpCreatorMap.begin(); it != myOpCreatorMap.end(); ++it) + delete (*it).second; } @@ -163,7 +178,7 @@ char* GEOM_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, { SALOMEDS::Study_var aStudy = theSObject->GetStudy(); - Handle(GEOM_BaseObject) anObject = + Handle(::GEOM_BaseObject) anObject = _impl->GetObject(aStudy->StudyId(), aLocalPersistentID); if ( !anObject.IsNull() ) { @@ -210,7 +225,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::UseCaseBuilder_var useCaseBuilder = theStudy->GetUseCaseBuilder(); + SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder(); SALOMEDS::SComponent_var aFather = theStudy->FindComponent("GEOM"); if (aFather->_is_nil()) { @@ -242,13 +257,14 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR); TCollection_AsciiString anObjectName, aNamePrefix("Shape_"); + CORBA::Long mytype=aBaseObj->GetType(); // BEGIN: try to find existed name for current shape - if ( !aShape->_is_nil() ) + if ( !aShape->_is_nil() && mytype != GEOM_GROUP) { - // recieve current TopoDS shape + // receive current TopoDS shape CORBA::String_var entry = aShape->GetEntry(); - Handle(GEOM_Object) aGShape = Handle(GEOM_Object)::DownCast + Handle(::GEOM_Object) aGShape = Handle(::GEOM_Object)::DownCast ( _impl->GetObject( aShape->GetStudyID(), entry )); TopoDS_Shape TopoSh = aGShape->GetValue(); // find label of main shape @@ -257,7 +273,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, aMainSh = aMainSh->GetMainShape(); } entry = aMainSh->GetEntry(); - Handle(GEOM_BaseObject) anObj = _impl->GetObject( aMainSh->GetStudyID(), entry ); + Handle(::GEOM_BaseObject) anObj = _impl->GetObject( aMainSh->GetStudyID(), entry ); TDF_Label aMainLbl = anObj->GetFunction(1)->GetNamingEntry(); // check all named shapes using iterator @@ -278,7 +294,6 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, } // END: try to find existed name for current shape - CORBA::Long mytype=aBaseObj->GetType(); if ( mytype == GEOM_GROUP ) { GEOM::GEOM_IGroupOperations_var anOp = GetIGroupOperations( theStudy->StudyId() ); switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape )) { @@ -302,7 +317,27 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, } else if ( mytype == GEOM_MARKER ) { aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS"); aNamePrefix = "LocalCS_"; - } else if ( mytype > ADVANCED_BASE ) { + } else if ( mytype >= USER_TYPE_EX ) { + char buf[20]; + sprintf( buf, "%d", aBaseObj->GetType() ); + GEOM::CreationInformationSeq_var infoSeq = aBaseObj->GetCreationInformation(); + std::string plgId; + for ( size_t j = 0; j < infoSeq->length(); ++j ) + for ( size_t i = 0; i < infoSeq[j].params.length(); ++i ) { + std::string param_name = infoSeq[j].params[i].name.in(); + std::string param_value = infoSeq[j].params[i].value.in(); + if( param_name == PLUGIN_NAME) { + plgId = param_value; + break; + } + } + if(plgId.length() > 0 ) { + plgId += "::"; + } + plgId +="ICON_OBJBROWSER_"; + plgId += buf; + aResultSO->SetAttrString("AttributePixMap",plgId.c_str()); + } else if ( mytype > USER_TYPE ) { char buf[20]; sprintf( buf, "%d", aBaseObj->GetType() ); std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf; @@ -415,7 +450,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, //============================================================================ // function : CreateAndPublishGroup -// purpose : auxilary for PublishNamedShapesInStudy +// purpose : auxiliary for PublishNamedShapesInStudy //============================================================================ void GEOM_Gen_i::CreateAndPublishGroup(SALOMEDS::Study_ptr theStudy, GEOM::GEOM_Object_var theMainShape, @@ -426,7 +461,7 @@ void GEOM_Gen_i::CreateAndPublishGroup(SALOMEDS::Study_ptr theStudy, GEOM::ListOfGO_var aResList) { CORBA::String_var entry = theMainShape->GetEntry(); - //Handle(GEOM_Object) aMainShape = _impl->GetObject(theMainShape->GetStudyID(), entry); + //Handle(::GEOM_Object) aMainShape = _impl->GetObject(theMainShape->GetStudyID(), entry); Handle(TColStd_HArray1OfInteger) anArray; if(SeqS.Length()>0) { // create a group @@ -434,9 +469,9 @@ void GEOM_Gen_i::CreateAndPublishGroup(SALOMEDS::Study_ptr theStudy, GEOM::GEOM_Object_wrap GrObj = GOp->CreateGroup( theMainShape, SeqS(1).ShapeType() ); AddInStudy(theStudy, GrObj, GrName, theMainShape._retn()); //CORBA::String_var GrEntry = GrObj->GetEntry(); - //Handle(GEOM_Object) HGrObj = _impl->GetObject(GrObj->GetStudyID(), GrEntry); + //Handle(::GEOM_Object) HGrObj = _impl->GetObject(GrObj->GetStudyID(), GrEntry); // add named objects - //Handle(GEOM_Object) anObj; + //Handle(::GEOM_Object) anObj; for(int i=1; i<=SeqS.Length(); i++) { TopoDS_Shape aValue = SeqS.Value(i); //anArray = new TColStd_HArray1OfInteger(1,1); @@ -445,7 +480,7 @@ void GEOM_Gen_i::CreateAndPublishGroup(SALOMEDS::Study_ptr theStudy, GOp->AddObject(GrObj,anIndex); //anObj = GEOM_Engine::GetEngine()->AddObject(aMainShape->GetDocID(), GEOM_SUBSHAPE); //if (anObj.IsNull()) continue; - //Handle(GEOM_Function) aFunction = anObj->AddFunction(GEOM_Object::GetSubShapeID(), 1); + //Handle(::GEOM_Function) aFunction = anObj->AddFunction(GEOM_Object::GetSubShapeID(), 1); //if (aFunction.IsNull()) continue; //GEOM_ISubShape aSSI(aFunction); //aSSI.SetMainShape(aMainShape->GetLastFunction()); @@ -479,7 +514,7 @@ GEOM::ListOfGO* GEOM_Gen_i:: if(theMainShape->_is_nil()) return aResList._retn(); CORBA::String_var entry = theMainShape->GetEntry(); - Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast + Handle(::GEOM_Object) aMainShape = Handle(::GEOM_Object)::DownCast ( _impl->GetObject( theMainShape->GetStudyID(), entry )); if (aMainShape.IsNull()) return aResList._retn(); TopoDS_Shape MainSh = aMainShape->GetValue(); @@ -565,7 +600,7 @@ SALOMEDS::TMPFile* GEOM_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent, if (isMultiFile) aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath (theComponent->GetStudy()->URL())).c_str()); - aNameWithExt += TCollection_AsciiString("_GEOM.sgd"); + aNameWithExt += TCollection_AsciiString("_GEOM.cbf"); aSeq[0] = CORBA::string_dup(aNameWithExt.ToCString()); // Build a full file name of temporary file TCollection_AsciiString aFullName = TCollection_AsciiString((char*)aTmpDir.c_str()) + aNameWithExt; @@ -627,11 +662,23 @@ CORBA::Boolean GEOM_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, // Prepare a file name to open TCollection_AsciiString aNameWithExt(""); SALOMEDS::Study_var study = theComponent->GetStudy(); - if (isMultiFile) { - CORBA::String_var url = study->URL(); - aNameWithExt = (char*)SALOMEDS_Tool::GetNameFromPath(url.in()).c_str(); + + // Get the file name. + int i; + int aLength = aSeq->length(); + const char *aGeomSgd = "_GEOM.sgd"; + const char *aGeomcbf = "_GEOM.cbf"; + + for(i = 0; i < aLength; i++) { + std::string aName(aSeq[i]); + + if (aName.rfind(aGeomSgd) != std::string::npos || + aName.rfind(aGeomcbf) != std::string::npos) { + aNameWithExt = aName.c_str(); + break; + } } - aNameWithExt += "_GEOM.sgd"; + TCollection_AsciiString aFullName = (TCollection_AsciiString((char*)aTmpDir.c_str()) + aNameWithExt); // Open document @@ -647,8 +694,8 @@ CORBA::Boolean GEOM_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, useCaseBuilder->SetRootCurrent(); useCaseBuilder->Append( theComponent ); // component object is added as the top level item } - - SALOMEDS::ChildIterator_wrap it = study->NewChildIterator( theComponent ); + + SALOMEDS::ChildIterator_wrap it = study->NewChildIterator( theComponent ); for ( it->InitEx(true); it->More(); it->Next() ) { if ( !useCaseBuilder->IsUseCaseNode( it->Value() ) ) { useCaseBuilder->AppendTo( it->Value()->GetFather(), it->Value() ); @@ -766,8 +813,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream, //Create a new GEOM_Object - Handle(GEOM_Object) anObj = _impl->AddObject(aNewSO->GetStudy()->StudyId(), theObjectID); - Handle(GEOM_Function) aFunction = anObj->AddFunction(GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF); + Handle(::GEOM_Object) anObj = _impl->AddObject(aNewSO->GetStudy()->StudyId(), theObjectID); + Handle(::GEOM_Function) aFunction = anObj->AddFunction(GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF); aFunction->SetValue(aTopology); TCollection_AsciiString anEntry; @@ -1085,16 +1132,16 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr theStudy, GEOM::GEOM_Object_var anArgOTrsf = aTrsfOpSv->TransformLikeOtherCopy(anArgO, theObject); if (!CORBA::is_nil(anArgOTrsf)) { CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry(); - Handle(GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); - Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); + Handle(::GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); + Handle(::GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); anArgOTrsfFun->SetDescription(""); aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf); } /* - Handle(GEOM_Function) anOFun = theObject->GetLastFunction(); + Handle(::GEOM_Function) anOFun = theObject->GetLastFunction(); if (!anOFun.IsNull()) { CORBA::String_var entryArg = anArgO->GetEntry(); - Handle(GEOM_Object) anArgOImpl = _impl->GetObject(anArgO->GetStudyID(), entryArg); + Handle(::GEOM_Object) anArgOImpl = _impl->GetObject(anArgO->GetStudyID(), entryArg); if (!anArgOImpl.IsNull()) { TopoDS_Shape anArgOShape = anArgOImpl->GetValue(); TopoDS_Shape aMultiArgShape; @@ -1129,7 +1176,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr theStudy, {} } GEOM::GEOM_Object_var anArgOMulti = (aMultiArgShape); // TODO - Handle(GEOM_Function) anArgOMultiFun = anArgOMulti->GetLastFunction(); + Handle(::GEOM_Function) anArgOMultiFun = anArgOMulti->GetLastFunction(); anArgOMultiFun->SetDescription(""); aSubO = aShapesOp->GetInPlace(theObject, anArgOMulti); } @@ -1280,8 +1327,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr theStudy, aResParts->length(nb); if (nb > 0) { - Handle(GEOM_BaseObject) aMainObj = _impl->GetObject(theObject->GetStudyID(), theObject->GetEntry()); - Handle(GEOM_Function) aFunction = aMainObj->GetLastFunction(); + Handle(::GEOM_BaseObject) aMainObj = _impl->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(::GEOM_Function) aFunction = aMainObj->GetLastFunction(); GEOM::TPythonDump pd (aFunction, true); pd <<"["; int i = 0, j = 0; @@ -1296,8 +1343,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr theStudy, anObjEntryMap.insert(anEntry); aResParts[nbRes++] = anObj; // clear python dump of object - Handle(GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anEntry); - Handle(GEOM_Function) anObjFun = aGeomObj->GetLastFunction(); + Handle(::GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anEntry); + Handle(::GEOM_Function) anObjFun = aGeomObj->GetLastFunction(); if ( !anObjFun.IsNull() ) anObjFun->SetDescription( "" ); if ( j > 0 ) @@ -1314,7 +1361,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr theStudy, GEOM::GEOM_Object_var anObj = anOutArgs[ i ]; if (CORBA::is_nil(anObj)) continue; - Handle(GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anObj->GetEntry()); + Handle(::GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anObj->GetEntry()); if ( j > 0 ) pd << ", "; pd << aGeomObj; @@ -1406,8 +1453,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesOneLevel (SALOMEDS::Study_ptr th GEOM::GEOM_Object_var anArgOTrsf = aTrsfOpSv->TransformLikeOtherCopy(anOldSubO, theNewO); if (!CORBA::is_nil(anArgOTrsf)) { CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry(); - Handle(GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); - Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); + Handle(::GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); + Handle(::GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); anArgOTrsfFun->SetDescription(""); aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf); } @@ -1682,8 +1729,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr theStu GEOM::GEOM_Object_var anArgOTrsf = aTrsfOpSv->TransformLikeOtherCopy(anArgO, theObject); if (!CORBA::is_nil(anArgOTrsf)) { CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry(); - Handle(GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); - Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); + Handle(::GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); + Handle(::GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); anArgOTrsfFun->SetDescription(""); aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf); } @@ -1826,8 +1873,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr theStu aResParts->length(nb); if (nb > 0) { - Handle(GEOM_BaseObject) aMainObj = _impl->GetObject(theObject->GetStudyID(), theObject->GetEntry()); - Handle(GEOM_Function) aFunction = aMainObj->GetLastFunction(); + Handle(::GEOM_BaseObject) aMainObj = _impl->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + Handle(::GEOM_Function) aFunction = aMainObj->GetLastFunction(); GEOM::TPythonDump pd (aFunction, true); pd <<"["; int i = 0, j = 0; @@ -1842,8 +1889,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr theStu anObjEntryMap.insert(anEntry); aResParts[nbRes++] = anObj; // clear python dump of object - Handle(GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anEntry); - Handle(GEOM_Function) anObjFun = aGeomObj->GetLastFunction(); + Handle(::GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anEntry); + Handle(::GEOM_Function) anObjFun = aGeomObj->GetLastFunction(); if ( !anObjFun.IsNull() ) anObjFun->SetDescription( "" ); if ( j > 0 ) @@ -1858,7 +1905,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr theStu GEOM::GEOM_Object_var anObj = theArgs[ i ]; if (CORBA::is_nil(anObj)) continue; - Handle(GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anObj->GetEntry()); + Handle(::GEOM_BaseObject) aGeomObj = _impl->GetObject(anObj->GetStudyID(), anObj->GetEntry()); if ( j > 0 ) pd << ", "; pd << aGeomObj; @@ -1958,8 +2005,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesOneLevel (SALOMEDS::Study_ptr GEOM::GEOM_Object_var anArgOTrsf = aTrsfOpSv->TransformLikeOtherCopy(anOldSubO, theNewO); if (!CORBA::is_nil(anArgOTrsf)) { CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry(); - Handle(GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); - Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); + Handle(::GEOM_BaseObject) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry); + Handle(::GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction(); anArgOTrsfFun->SetDescription(""); aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf); } @@ -2404,72 +2451,85 @@ GEOM::GEOM_IOperations_ptr GEOM_Gen_i::GetPluginOperations(CORBA::Long theStudyI const char* theLibName) throw ( SALOME::SALOME_Exception ) { - std::string aPlatformLibName; -#ifdef WIN32 - aPlatformLibName = theLibName; - aPlatformLibName += ".dll" ; -#else - aPlatformLibName = "lib"; - aPlatformLibName += theLibName; - aPlatformLibName += ".so"; -#endif - Unexpect aCatch(SALOME_SalomeException); MESSAGE( "GEOM_Gen_i::GetPluginOperations" ); GEOM::GEOM_Gen_ptr engine = _this(); - GEOM_IOperations_i* aServant = 0; GEOM::GEOM_IOperations_var operations; + std::string aLibName = theLibName; + try { - // check, if corresponding operations are already created - if (myOpCreatorMap.find(std::string(theLibName)) == myOpCreatorMap.end()) { - // load plugin library - LibHandle libHandle = LoadLib( aPlatformLibName.c_str()/*theLibName*/ ); - if (!libHandle) { - // report any error, if occured -#ifndef WIN32 - const char* anError = dlerror(); - throw(SALOME_Exception(anError)); + // load plugin library + LoadPlugin(aLibName); + // create a new operations object, store its ref. in engine + if ( myOpCreatorMap.find(aLibName) != myOpCreatorMap.end() ) { + GEOM_IOperations_i* aServant = 0; + aServant = myOpCreatorMap[aLibName]->Create(_poa, theStudyID, engine, _impl); + // activate the CORBA servant + if (aServant) + operations = aServant->_this(); + } + } + catch (SALOME_Exception& S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + return operations._retn(); +} + +//============================================================================ +// function : LoadPlugin +// purpose : load plugin library and retrieve an instance of operations creator +//============================================================================ +void GEOM_Gen_i::LoadPlugin(const std::string& theLibName) +{ + std::string aPlatformLibName; +#if !defined(WIN32) + aPlatformLibName = "lib"; +#endif + aPlatformLibName += theLibName; +#if defined(WIN32) + aPlatformLibName += ".dll" ; +#elif defined(__APPLE__) + aPlatformLibName += ".dylib"; #else - throw(SALOME_Exception(LOCALIZED( "Can't load server geometry plugin library" ))); + aPlatformLibName += ".so"; #endif - } - // get method, returning operations creator - typedef GEOM_GenericOperationsCreator* (*GetOperationsCreator)(); - GetOperationsCreator procHandle = - (GetOperationsCreator)GetProc( libHandle, "GetOperationsCreator" ); - if (!procHandle) { - throw(SALOME_Exception(LOCALIZED("bad geometry plugin library"))); - UnLoadLib(libHandle); - } + // check, if corresponding operations are already created + if (myOpCreatorMap.find(theLibName) == myOpCreatorMap.end()) { + // load plugin library + LibHandle libHandle = LoadLib( aPlatformLibName.c_str() ); + if (!libHandle) { + // report any error, if occurred +#ifndef WIN32 + throw(SALOME_Exception(dlerror())); +#else + throw(SALOME_Exception(LOCALIZED( "Can't load server geometry plugin library" ))); +#endif + } - // get operations creator - GEOM_GenericOperationsCreator* aCreator = procHandle(); - if (!aCreator) { - throw(SALOME_Exception(LOCALIZED("bad geometry plugin library implementation"))); - } + // get method, returning operations creator + typedef GEOM_GenericOperationsCreator* (*GetOperationsCreator)(); + GetOperationsCreator procHandle = + (GetOperationsCreator)GetProc( libHandle, "GetOperationsCreator" ); + if (!procHandle) { + UnLoadLib(libHandle); + throw(SALOME_Exception(LOCALIZED("bad geometry plugin library"))); + } + // get operations creator + GEOM_GenericOperationsCreator* aCreator = procHandle(); + if (aCreator) { // map operations creator to a plugin name - myOpCreatorMap[std::string(theLibName)] = aCreator; + myOpCreatorMap[theLibName] = aCreator; + } + else { + throw(SALOME_Exception(LOCALIZED("bad geometry plugin library implementation"))); } - - // create a new operations object, store its ref. in engine - aServant = myOpCreatorMap[std::string(theLibName)]->Create(_poa, theStudyID, engine, _impl); - //??? aServant->SetLibName(aPlatformLibName/*theLibName*/); // for persistency assurance - } - catch (SALOME_Exception& S_ex) { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); } - - if (!aServant) - return operations._retn(); - - // activate the CORBA servant - operations = GEOM::GEOM_IOperations::_narrow( aServant->_this() ); - return operations._retn(); } //============================================================================= @@ -2483,14 +2543,14 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainSh if (CORBA::is_nil(theMainShape) || theIndices.length() < 1) return GEOM::GEOM_Object::_nil(); CORBA::String_var entry = theMainShape->GetEntry(); - Handle(GEOM_Object) aMainShape = Handle(GEOM_Object)::DownCast + Handle(::GEOM_Object) aMainShape = Handle(::GEOM_Object)::DownCast ( _impl->GetObject( theMainShape->GetStudyID(), entry )); if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil(); Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length()); for(Standard_Integer i = 0; iSetValue(i+1, theIndices[i]); - Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true); + Handle(::GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true); if(anObject.IsNull()) return GEOM::GEOM_Object::_nil(); TCollection_AsciiString anEntry; @@ -2506,7 +2566,7 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainSh void GEOM_Gen_i::RemoveObject(GEOM::GEOM_BaseObject_ptr theObject) { CORBA::String_var anEntry = theObject->GetEntry(); - Handle(GEOM_BaseObject) anObject = _impl->GetObject(theObject->GetStudyID(), anEntry, false); + Handle(::GEOM_BaseObject) anObject = _impl->GetObject(theObject->GetStudyID(), anEntry, false); if (!anObject.IsNull()) _impl->RemoveObject(anObject); } @@ -2541,7 +2601,7 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::GetIORFromString(const char* stringIOR) { GEOM::GEOM_BaseObject_ptr GEOM_Gen_i::GetObject (CORBA::Long theStudyID, const char* theEntry) { GEOM::GEOM_BaseObject_var obj; - Handle(GEOM_BaseObject) handle_object = _impl->GetObject(theStudyID, (char*)theEntry); + Handle(::GEOM_BaseObject) handle_object = _impl->GetObject(theStudyID, (char*)theEntry); if (handle_object.IsNull()) return obj._retn(); TCollection_AsciiString stringIOR = handle_object->GetIOR(); @@ -2556,12 +2616,12 @@ GEOM::GEOM_BaseObject_ptr GEOM_Gen_i::GetObject (CORBA::Long theStudyID, const c GEOM_BaseObject_i* servant = 0; switch( handle_object->GetType() ) { case GEOM_FIELD: { - servant = new GEOM_Field_i (_poa, engine, Handle(GEOM_Field)::DownCast( handle_object )); + servant = new GEOM_Field_i (_poa, engine, Handle(::GEOM_Field)::DownCast( handle_object )); break; } case GEOM_FIELD_STEP: { - Handle(GEOM_FieldStep) step = Handle(GEOM_FieldStep)::DownCast( handle_object ); - Handle(GEOM_Field) field = step->GetField(); + Handle(::GEOM_FieldStep) step = Handle(::GEOM_FieldStep)::DownCast( handle_object ); + Handle(::GEOM_Field) field = step->GetField(); int type = ( !field.IsNull() ? field->GetDataType() : 0 ); switch( type ) { case GEOM::FDT_Bool: @@ -2579,7 +2639,7 @@ GEOM::GEOM_BaseObject_ptr GEOM_Gen_i::GetObject (CORBA::Long theStudyID, const c break; } default: - servant = new GEOM_Object_i (_poa, engine, Handle(GEOM_Object)::DownCast( handle_object )); + servant = new GEOM_Object_i (_poa, engine, Handle(::GEOM_Object)::DownCast( handle_object )); } PortableServer::ObjectId_var id = _poa->activate_object(servant); @@ -2739,8 +2799,9 @@ char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry) } } - char* anInfo = new char[strlen("Module ") + strlen(ComponentDataType()) + strlen(", ") + strlen(aTypeInfo) + 3]; - sprintf(anInfo, "Module %s, %s", ComponentDataType(), aTypeInfo); + CORBA::String_var compType = ComponentDataType(); + char* anInfo = new char[strlen("Module ") + strlen(compType.in()) + strlen(", ") + strlen(aTypeInfo) + 3]; + sprintf(anInfo, "Module %s, %s", compType.in(), aTypeInfo); char* ret = CORBA::string_dup(anInfo); delete [] anInfo; @@ -2761,8 +2822,8 @@ char* GEOM_Gen_i::getVersion() // function : CreateFolder() // purpose : Creates and returns a new folder object //================================================================================= -SALOMEDS::SObject_ptr GEOM_Gen_i::CreateFolder(const char* theName, - SALOMEDS::SObject_ptr theFather) +SALOMEDS::SObject_ptr GEOM_Gen_i::CreateFolder(const char* theName, + SALOMEDS::SObject_ptr theFather) { SALOMEDS::SObject_var aFolderSO; @@ -2814,8 +2875,8 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::CreateFolder(const char* theName, // function : MoveToFolder() // purpose : Moves GEOM object to the specified folder //================================================================================= -void GEOM_Gen_i::MoveToFolder(GEOM::GEOM_Object_ptr theObject, - SALOMEDS::SObject_ptr theFolder) { +void GEOM_Gen_i::MoveToFolder(GEOM::GEOM_Object_ptr theObject, + SALOMEDS::SObject_ptr theFolder) { GEOM::object_list_var objects = new GEOM::object_list(); objects->length( 1 ); SALOMEDS::SObject_var aSO = theFolder->GetStudy()->FindObjectID( theObject->GetStudyEntry() ); @@ -2827,8 +2888,8 @@ void GEOM_Gen_i::MoveToFolder(GEOM::GEOM_Object_ptr theObject, // function : MoveListToFolder() // purpose : Moves list of GEOM objects to the specified folder //================================================================================= -void GEOM_Gen_i::MoveListToFolder (const GEOM::ListOfGO& theListOfGO, - SALOMEDS::SObject_ptr theFolder) { +void GEOM_Gen_i::MoveListToFolder (const GEOM::ListOfGO& theListOfGO, + SALOMEDS::SObject_ptr theFolder) { int aLen = theListOfGO.length(); GEOM::object_list_var objects = new GEOM::object_list(); objects->length( aLen ); @@ -2845,12 +2906,12 @@ void GEOM_Gen_i::MoveListToFolder (const GEOM::ListOfGO& theListOfGO, //================================================================================= // function : Move() -// purpose : Moves objects to the specified position. +// purpose : Moves objects to the specified position. // Is used in the drag-n-drop functionality. //================================================================================= void GEOM_Gen_i::Move( const GEOM::object_list& what, - SALOMEDS::SObject_ptr where, - CORBA::Long row ) + SALOMEDS::SObject_ptr where, + CORBA::Long row ) { if ( CORBA::is_nil( where ) ) return; @@ -2860,7 +2921,7 @@ void GEOM_Gen_i::Move( const GEOM::object_list& what, SALOMEDS::SComponent_var father = where->GetFatherComponent(); std::string dataType = father->ComponentDataType(); if ( dataType != "GEOM" ) return; // not a GEOM component - + SALOMEDS::SObject_var objAfter; if ( row >= 0 && useCaseBuilder->HasChildren( where ) ) { // insert at given row -> find insertion position @@ -2871,7 +2932,7 @@ void GEOM_Gen_i::Move( const GEOM::object_list& what, objAfter = useCaseIt->Value(); } } - + for ( int i = 0; i < what.length(); i++ ) { SALOMEDS::SObject_var sobj = what[i]; if ( CORBA::is_nil( sobj ) ) continue; // skip bad object @@ -2883,163 +2944,354 @@ void GEOM_Gen_i::Move( const GEOM::object_list& what, } } -//================================================================================= -// 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(); +//======================================================================= +// function : GetDependencyTree +// purpose : Collects dependencies of the given objects from other ones +//======================================================================= +SALOMEDS::TMPFile* GEOM_Gen_i::GetDependencyTree( SALOMEDS::Study_ptr theStudy, + const GEOM::string_array& theObjectEntries ) { + // fill in the tree structure + GEOMUtils::TreeModel tree; + + std::string entry; + for ( int i = 0; i < theObjectEntries.length(); i++ ) { + // process objects one-by-one + entry = theObjectEntries[i].in(); + GEOM::GEOM_BaseObject_var anObj = GetObject( theStudy->StudyId(), entry.c_str() ); + if ( anObj->_is_nil() ) + continue; + std::map< std::string, std::set > passedEntries; + GEOMUtils::LevelsList upLevelList; + // get objects from which current one depends on recursively + getUpwardDependency( anObj, upLevelList, passedEntries ); + GEOMUtils::LevelsList downLevelList; + // get objects that depends on current one recursively + getDownwardDependency( anObj, downLevelList, passedEntries ); + tree.insert( std::pair >(entry, std::pair( upLevelList, downLevelList ) ) ); } - // 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); - } + // translation the tree into string + std::string treeStr; + GEOMUtils::ConvertTreeToString( tree, treeStr ); - 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; + // put string into stream + char* aBuffer = (char*)CORBA::string_dup(treeStr.c_str()); + int aBufferSize = strlen((char*)aBuffer); - 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 aShapeObj; - GEOM::ListOfGO_var aSubShape = new GEOM::ListOfGO; - GEOM::ListOfGO_var aGroups = new GEOM::ListOfGO; - GEOM::ListOfFields_var aFields = new GEOM::ListOfFields; - - CORBA::Boolean isResultOK = aInsOp->ImportXAO(aFullPath.c_str(), aShapeObj.out(), aSubShape.out(), aGroups.out(), aFields.out()); - - if ( isResultOK && !aShapeObj->_is_nil() && aInsOp->IsDone() ) { - SALOMEDS::SObject_var aSO = PublishInStudy(aStudy, SALOMEDS::SObject::_nil(), aShapeObj, aShapeObj->GetName()); - aResult->length(aGroups->length() + 1); - aResult[0] = aSO->GetID(); // unioque identifer of the object in GEOM is entry of SObject - //Iteration for objects of the group. - for (int i = 0; i < aGroups->length(); i++) { - SALOMEDS::SObject_var aSOChild = AddInStudy(aStudy, aGroups[i], aGroups[i]->GetName(), aShapeObj); - aResult[i+1] = aSOChild->GetID(); - } - } - else { - if (aShapeObj->_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(); + return aStream._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(); +//======================================================================= +// function : getUpwardDependency +// purpose : Collects the entries of objects on that the given one depends +//======================================================================= +void GEOM_Gen_i::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, + GEOMUtils::LevelsList &upLevelList, + std::map< std::string, std::set > &passedEntries, + int level ) { + std::string aGboEntry = gbo->GetEntry(); + GEOMUtils::NodeLinks anEntries; + GEOMUtils::LevelInfo aLevelMap; + if ( level > 0 ) { + if ( level-1 >= upLevelList.size() ) { + // create a new map + upLevelList.push_back( aLevelMap ); + } else { + // get the existent map + aLevelMap = upLevelList.at(level-1); + if ( aLevelMap.count( aGboEntry ) > 0 ) { + anEntries = aLevelMap[ aGboEntry ]; + } + } + } + // get objects on that the current one depends + GEOM::ListOfGBO_var depList = gbo->GetDependency(); + std::string aDepEntry; + for( int j = 0; j < depList->length(); j++ ) { + if ( depList[j]->_is_nil() ) + continue; + aDepEntry = depList[j]->GetEntry(); + if ( passedEntries.count( aGboEntry ) > 0 && + passedEntries[aGboEntry].count( aDepEntry ) > 0 ) { + //avoid checking the passed objects + continue; + } + passedEntries[aGboEntry].insert( aDepEntry ); + if ( level > 0 ) { + anEntries.push_back( aDepEntry ); + } + // get dependencies recursively + getUpwardDependency(depList[j], upLevelList, passedEntries, level+1); + } + if ( level > 0 ) { + aLevelMap.insert( std::pair(aGboEntry, anEntries) ); + upLevelList[level-1] = aLevelMap; } +} - 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 - - GEOM::GEOM_Object_var shapeObj; - GEOM::ListOfGO_var groups = new GEOM::ListOfGO; - GEOM::ListOfFields_var fields = new GEOM::ListOfFields; - std::string anAuthorName = "SIMAN Author"; - - GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(aStudy->StudyId()); - GEOM::GEOM_IInsertOperations_var aInsOp = GetIInsertOperations(aStudy->StudyId()); - - int aSeqLength = 0; // the sequence length - 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 = Handle(GEOM_Object)::DownCast(_impl->GetObject(studyId, entry)); - - GEOM::shape_type aCORBAShapeType = aCORBAMainShape->GetShapeType(); - if (!aMainShape.IsNull() && !(aCORBAShapeType == GEOM::VERTEX) && !(aCORBAShapeType == GEOM::EDGE)) { - aSeqLength++; - shapeObj = aCORBAMainShape; - if (aShapesOp->_is_nil()) { - MESSAGE("No shapes operations!"); - return aResult._retn(); +//======================================================================= +// function : getDownwardDependency +// purpose : Collects the entries of objects that depends on the given one +//======================================================================= +void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, + GEOMUtils::LevelsList &downLevelList, + std::map< std::string, std::set > &passedEntries, + int level ) { + std::string aGboEntry = gbo->GetEntry(); + Handle(TDocStd_Document) aDoc = GEOM_Engine::GetEngine()->GetDocument(gbo->GetStudyID()); + Handle(TDataStd_TreeNode) aNode, aRoot; + Handle(::GEOM_Function) aFunction; + if (aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) { + // go through the whole OCAF tree + TDataStd_ChildNodeIterator Itr( aRoot ); + for (; Itr.More(); Itr.Next()) { + aNode = Itr.Value(); + aFunction = GEOM_Function::GetFunction(aNode->Label()); + if (aFunction.IsNull()) { + continue; + } + TDF_Label aLabel = aFunction->GetOwnerEntry(); + if(aLabel.IsNull()) continue; + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aLabel, anEntry); + GEOM::GEOM_BaseObject_var geomObj = GetObject( gbo->GetStudyID(), anEntry.ToCString() ); + if( CORBA::is_nil( geomObj ) ) + continue; + // get dependencies for current object in the tree + GEOM::ListOfGBO_var depList = geomObj->GetDependency(); + if( depList->length() == 0 ) + continue; + std::string aGoEntry = geomObj->GetEntry(); + // go through dependencies of current object to check whether it depends on the given object + for( int i = 0; i < depList->length(); i++ ) { + if ( depList[i]->_is_nil() ) + continue; + if ( depList[i]->_is_equivalent( gbo ) ) { + // yes, the current object depends on the given object + if ( passedEntries.count( aGoEntry ) > 0 && + passedEntries[aGoEntry].count( aGboEntry ) > 0 ) { + //avoid checking the passed objects + continue; + } + passedEntries[aGoEntry].insert( aGboEntry ); + GEOMUtils::NodeLinks anEntries; + GEOMUtils::LevelInfo aLevelMap; + anEntries.push_back( aGboEntry ); + if ( level >= downLevelList.size() ) { + downLevelList.push_back( aLevelMap ); + } else { + aLevelMap = downLevelList.at(level); + if ( aLevelMap.count( aGoEntry ) > 0 ) { + anEntries = aLevelMap[ aGoEntry ]; } - groups = aShapesOp->GetExistingSubObjects(aCORBAMainShape, true); - break; } + aLevelMap.insert( std::pair(aGoEntry, anEntries) ); + downLevelList[level] = aLevelMap; + // get dependencies of the current object recursively + getDownwardDependency(geomObj, downLevelList, passedEntries, level+1); + break; } } } } +} - if (aInsOp->_is_nil()) { - MESSAGE("No insert operations!"); - return aResult._retn(); +//============================================================================== +// function : GetEntriesToReduceStudy +// purpose : Fills 3 lists that is used to clean study of redundant objects +//============================================================================== +void GEOM_Gen_i::GetEntriesToReduceStudy(SALOMEDS::Study_ptr theStudy, + GEOM::string_array& theSelectedEntries, + GEOM::string_array& theParentEntries, + GEOM::string_array& theSubEntries, + GEOM::string_array& theOtherEntries) +{ + std::set aSelected, aParents, aChildren, anOthers; + for ( int i = 0; i < theSelectedEntries.length(); i++ ) { + aSelected.insert( CORBA::string_dup( theSelectedEntries[i] ) ); } - if (aSeqLength > 0) { // Shape is correct, write it to the temporary file + Handle(TDocStd_Document) aDoc = GEOM_Engine::GetEngine()->GetDocument(theStudy->StudyId()); + Handle(TDataStd_TreeNode) aNode, aRoot; + Handle(::GEOM_Function) aFunction; + if (aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) { + // go through the whole OCAF tree + TDF_Label aLabel; + std::string anEntry; + TCollection_AsciiString anAsciiEntry; + TDataStd_ChildNodeIterator Itr( aRoot ); + for (; Itr.More(); Itr.Next()) { + aNode = Itr.Value(); + aFunction = GEOM_Function::GetFunction(aNode->Label()); + if (aFunction.IsNull()) { + continue; + } + aLabel = aFunction->GetOwnerEntry(); + if(aLabel.IsNull()) + continue; + TDF_Tool::Entry(aLabel, anAsciiEntry); + anEntry = anAsciiEntry.ToCString(); + GEOM::GEOM_BaseObject_var geomObj = GetObject( theStudy->StudyId(), anEntry.c_str() ); + if( CORBA::is_nil( geomObj ) ) + continue; - std::string aFullXaoPath = Kernel_Utils::GetTmpFileName() + ".xao"; - CORBA::Boolean isResultOK = aInsOp->ExportXAO(shapeObj.in(), groups.in(), fields.in(), anAuthorName.c_str(), aFullXaoPath.c_str()); + if ( aSelected.count( anEntry ) > 0 && + aParents.count( anEntry ) == 0 ) { + includeParentDependencies( geomObj, aSelected, aParents, aChildren, anOthers ); + } else if ( aParents.count( anEntry ) == 0 && + aChildren.count( anEntry ) == 0 ) { + anOthers.insert( geomObj->GetEntry() ); + } + } - aResult->length(1); - Engines::DataContainer_var aData = (new Engines_DataContainer_i( - aFullXaoPath.c_str(), "", "", true))->_this(); - aResult[0] = aData; - } else { - MESSAGE("No shapes to export"); + std::set::iterator it; + std::set::iterator foundIt; + TCollection_AsciiString stringIOR; + GEOM::GEOM_Object_var geomObj; + + // filling list of sub-objects + for ( it = aSelected.begin(); it != aSelected.end(); ++it ) { + includeSubObjects( theStudy, *it, aSelected, aParents, aChildren, anOthers ); + } + + // if some selected object is not a main shape, + // we move it's main shapes into 'selected' list, + // because they could not be modified anyhow. + std::set aToBeInSelected; + for ( it = aSelected.begin(); it != aSelected.end(); ++it ) { + Handle(::GEOM_BaseObject) handle_object = _impl->GetObject( theStudy->StudyId(), (*it).c_str(), false); + if ( handle_object.IsNull() ) + continue; + + stringIOR = handle_object->GetIOR(); + if ( !stringIOR.Length() > 1 ) + continue; + + geomObj = GetIORFromString( stringIOR.ToCString() ); + while ( !geomObj->IsMainShape() ) { + geomObj = geomObj->GetMainShape(); + anEntry = geomObj->GetEntry(); + + foundIt = aParents.find( anEntry ); + if ( foundIt != aParents.end() ) + aParents.erase( foundIt ); + + foundIt = aChildren.find( anEntry ); + if ( foundIt != aChildren.end() ) + aChildren.erase( foundIt ); + + foundIt = anOthers.find( anEntry ); + if ( foundIt != anOthers.end() ) + anOthers.erase( foundIt ); + + aToBeInSelected.insert( anEntry ); + } + } + aSelected.insert( aToBeInSelected.begin(), aToBeInSelected.end() ); + + // fill the CORBA arrays with values from sets + int i; + theSelectedEntries.length( aSelected.size() ); + for ( i = 0, it = aSelected.begin(); it != aSelected.end(); ++it, i++ ) + theSelectedEntries[i] = CORBA::string_dup( (*it).c_str() ); + theParentEntries.length( aParents.size() ); + for ( i = 0, it = aParents.begin(); it != aParents.end(); ++it, i++ ) + theParentEntries[i] = CORBA::string_dup( (*it).c_str() ); + theSubEntries.length( aChildren.size() ); + for ( i = 0, it = aChildren.begin(); it != aChildren.end(); ++it, i++ ) + theSubEntries[i] = CORBA::string_dup( (*it).c_str() ); + theOtherEntries.length( anOthers.size() ); + for ( i = 0, it = anOthers.begin(); it != anOthers.end(); ++it, i++ ) + theOtherEntries[i] = CORBA::string_dup( (*it).c_str() ); + } +} + +//============================================================================== +// function : includeParentDependencies +// purpose : +//============================================================================== +void GEOM_Gen_i::includeParentDependencies(GEOM::GEOM_BaseObject_ptr geomObj, + std::set& aSelected, + std::set& aParents, + std::set& aChildren, + std::set& anOthers) +{ + std::string anEntry = geomObj->GetEntry(); + if ( aSelected.count( anEntry ) == 0 ) { + aParents.insert( anEntry ); + std::set::iterator it; + it = aChildren.find( anEntry ); + if ( it != aChildren.end() ) + aChildren.erase( it ); + it = anOthers.find( anEntry ); + if ( it != anOthers.end() ) + anOthers.erase( it ); + } + // get dependencies for current object in the tree + GEOM::ListOfGBO_var depList = geomObj->GetDependency(); + if( depList->length() == 0 ) + return; + // go through dependencies of current object to check whether it depends on the given object + std::string aDepEntry; + for( int i = 0; i < depList->length(); i++ ) { + aDepEntry = depList[i]->GetEntry(); + if ( depList[i]->_is_nil() || + aDepEntry == anEntry || // skip self-depending + aSelected.count( aDepEntry ) > 0 || // skip selected objects + aParents.count( aDepEntry ) > 0 // skip already processed objects + ) + continue; + includeParentDependencies( depList[i], aSelected, aParents, aChildren, anOthers ); } +} - return aResult._retn(); +//============================================================================== +// function : includeSubObjects +// purpose : +//============================================================================== +void GEOM_Gen_i::includeSubObjects(SALOMEDS::Study_ptr theStudy, + const std::string& aSelectedEntry, + std::set& aSelected, + std::set& aParents, + std::set& aChildren, + std::set& anOthers) +{ + std::set::iterator foundIt; + Handle(::GEOM_BaseObject) handle_object = _impl->GetObject( theStudy->StudyId(), aSelectedEntry.c_str(), false); + if ( handle_object.IsNull() ) + return; + + Handle(::GEOM_Function) aShapeFun = handle_object->GetFunction(1); + if ( aShapeFun.IsNull() || !aShapeFun->HasSubShapeReferences() ) + return; + + const TDataStd_ListOfExtendedString& aListEntries = aShapeFun->GetSubShapeReferences(); + if ( aListEntries.IsEmpty() ) + return; + + TDataStd_ListIteratorOfListOfExtendedString anIt (aListEntries); + for ( ; anIt.More(); anIt.Next() ) { + TCollection_ExtendedString aSubEntry = anIt.Value(); + Standard_Integer aStrLen = aSubEntry.LengthOfCString(); + char* aSubEntryStr = new char[aStrLen+1]; + aSubEntry.ToUTF8CString( aSubEntryStr ); + foundIt = aParents.find( aSubEntryStr ); + if ( foundIt == aParents.end() ) { // add to sub-objects if it is not in parents list + foundIt = aSelected.find( aSubEntryStr ); + if ( foundIt == aSelected.end() ) { // add to sub-objects if it is not in selected list + aChildren.insert( aSubEntryStr ); + foundIt = anOthers.find( aSubEntryStr ); + if ( foundIt != anOthers.end() ) + anOthers.erase( foundIt ); + } + } + includeSubObjects( theStudy, aSubEntryStr, aSelected, aParents, aChildren, anOthers ); + } } - //===================================================================================== // EXPORTED METHODS //=====================================================================================