mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-25 17:00:35 +05:00
Implementation of 'GetEntriesToCleanStudy' function to get categorized lists of objects.
This commit is contained in:
parent
de86b94fd5
commit
b70248e90b
@ -5100,6 +5100,24 @@ module GEOM
|
||||
SALOMEDS::TMPFile GetDependencyTree(in SALOMEDS::Study theStudy,
|
||||
in string_array theListOfEntries);
|
||||
|
||||
/*!
|
||||
* \brief Fills 3 lists that is used to clean study of redundant objects:
|
||||
* - dependencies of the given objects from other ones;
|
||||
* - children of the given objects;
|
||||
* - all other objects in study.
|
||||
* \param theStudy The study in which the object was published
|
||||
* \param theSelectedEntries List of GEOM object entries in OCAF tree
|
||||
* \param theParentEntries List of GEOM object entries on which the given objects depend
|
||||
* \param theSubEntries Children entries list of the given objects
|
||||
* \param theOtherEntries List of GEOM object entries which are in the study, but not in parents and children lists
|
||||
* \note This method is supposed to be used by GUI only.
|
||||
*/
|
||||
void GetEntriesToCleanStudy(in SALOMEDS::Study theStudy,
|
||||
inout string_array theSelectedEntries,
|
||||
inout string_array theParentEntries,
|
||||
inout string_array theSubEntries,
|
||||
inout string_array theOtherEntries);
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -36,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"
|
||||
@ -62,6 +61,7 @@
|
||||
#include <OSD.hxx>
|
||||
#include <TDataStd_ChildNodeIterator.hxx>
|
||||
#include <TDocStd_Owner.hxx>
|
||||
#include <TDataStd_ListIteratorOfListOfExtendedString.hxx>
|
||||
|
||||
#include <SALOMEDS_Tool.hxx>
|
||||
#include <SALOMEDS_wrap.hxx>
|
||||
@ -3197,6 +3197,172 @@ void GEOM_Gen_i::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo,
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// function : GetEntriesToCleanStudy
|
||||
// purpose : Fills 3 lists that is used to clean study of redundant objects
|
||||
//==============================================================================
|
||||
void GEOM_Gen_i::GetEntriesToCleanStudy(SALOMEDS::Study_ptr theStudy,
|
||||
GEOM::string_array& theSelectedEntries,
|
||||
GEOM::string_array& theParentEntries,
|
||||
GEOM::string_array& theSubEntries,
|
||||
GEOM::string_array& theOtherEntries)
|
||||
{
|
||||
std::set<std::string> aSelected, aParents, aChildren, anOthers;
|
||||
for ( int i = 0; i < theSelectedEntries.length(); i++ ) {
|
||||
aSelected.insert( CORBA::string_dup( theSelectedEntries[i] ) );
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if ( aSelected.count( anEntry ) > 0 &&
|
||||
aParents.count( anEntry ) == 0 ) {
|
||||
getParentDependencies( geomObj, aSelected, aParents, aChildren, anOthers );
|
||||
} else if ( aParents.count( anEntry ) == 0 &&
|
||||
aChildren.count( anEntry ) == 0 ) {
|
||||
anOthers.insert( geomObj->GetEntry() );
|
||||
}
|
||||
}
|
||||
|
||||
std::set<std::string>::iterator it;
|
||||
std::set<std::string>::iterator foundIt;
|
||||
TCollection_AsciiString stringIOR;
|
||||
GEOM::GEOM_Object_var geomObj;
|
||||
|
||||
// filling list of sub-objects
|
||||
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;
|
||||
|
||||
Handle(GEOM_Function) aShapeFun = handle_object->GetFunction(1);
|
||||
if ( aShapeFun.IsNull() || !aShapeFun->HasSubShapeReferences() )
|
||||
continue;
|
||||
|
||||
const TDataStd_ListOfExtendedString& aListEntries = aShapeFun->GetSubShapeReferences();
|
||||
if ( aListEntries.IsEmpty() )
|
||||
continue;
|
||||
|
||||
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
|
||||
aChildren.insert( aSubEntryStr );
|
||||
}
|
||||
}
|
||||
|
||||
// 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<std::string> 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() );
|
||||
}
|
||||
}
|
||||
|
||||
void GEOM_Gen_i::getParentDependencies(GEOM::GEOM_BaseObject_ptr geomObj,
|
||||
std::set<std::string>& aSelected,
|
||||
std::set<std::string>& aParents,
|
||||
std::set<std::string>& aChildren,
|
||||
std::set<std::string>& anOthers)
|
||||
{
|
||||
std::string anEntry = geomObj->GetEntry();
|
||||
if ( aSelected.count( anEntry ) == 0 ) {
|
||||
aParents.insert( anEntry );
|
||||
std::set<std::string>::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;
|
||||
getParentDependencies( depList[i], aSelected, aParents, aChildren, anOthers );
|
||||
}
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// EXPORTED METHODS
|
||||
//=====================================================================================
|
||||
|
@ -324,6 +324,15 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi
|
||||
// SIMAN-related functions (check out/check in) : get modified data
|
||||
virtual Engines::ListOfData* getModifiedData(CORBA::Long studyId);
|
||||
|
||||
/*! \brief Fills 3 lists that is used to clean study of redundant objects.
|
||||
* To be used from GUI.
|
||||
*/
|
||||
void GetEntriesToCleanStudy(SALOMEDS::Study_ptr theStudy,
|
||||
GEOM::string_array& theSelectedEntries,
|
||||
GEOM::string_array& theParentEntries,
|
||||
GEOM::string_array& theSubEntries,
|
||||
GEOM::string_array& theOtherEntries);
|
||||
|
||||
//-----------------------------------------------------------------------//
|
||||
// Internal methods //
|
||||
//-----------------------------------------------------------------------//
|
||||
@ -382,6 +391,12 @@ class GEOM_I_EXPORT GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual publi
|
||||
std::map< std::string, std::set<std::string> > &passedEntries,
|
||||
int level = 0 );
|
||||
|
||||
void getParentDependencies(GEOM::GEOM_BaseObject_ptr gbo,
|
||||
std::set<std::string>& aSelected,
|
||||
std::set<std::string>& aParents,
|
||||
std::set<std::string>& aChildren,
|
||||
std::set<std::string>& anOthers);
|
||||
|
||||
private:
|
||||
|
||||
::GEOMImpl_Gen* _impl;
|
||||
|
Loading…
Reference in New Issue
Block a user