]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
1st version of algorithm of collecting dependencies.
authorakl <akl@opencascade.com>
Thu, 15 May 2014 08:25:55 +0000 (12:25 +0400)
committerakl <akl@opencascade.com>
Thu, 15 May 2014 08:25:55 +0000 (12:25 +0400)
src/GEOMToolsGUI/GEOMToolsGUI.cxx
src/GEOMToolsGUI/GEOMToolsGUI.h

index daf888e2d6ff30947310255c2a7ed7ca5e9df7a2..ca6f6d3f2226b01c1f1004c8a00c20d192ae75ad 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <GeometryGUI.h>
 #include "GeometryGUI_Operations.h"
-#include <GEOMBase.h>
 #include <GEOM_Operation.h>
 #include <GEOM_Displayer.h>
 
@@ -1045,6 +1044,146 @@ void GEOMToolsGUI::deactivate()
   }
 }
 
+//=======================================================================
+// function : 
+// purpose  : 
+//=======================================================================
+std::string GEOMToolsGUI::getDependencyTree( QStringList rootObjectIORs )
+{
+  // fill in the tree structure
+  DependencyTree tree;
+  foreach( QString ior, rootObjectIORs ) {
+    GEOM::GEOM_Object_ptr anObj = GEOMBase::GetObjectFromIOR( ior );
+    QList<NodeLevel> upLevelList;
+    getUpwardDependency( anObj, upLevelList );
+    QList<NodeLevel> downLevelList;
+    getDownwardDependency( anObj, downLevelList );
+    tree.insert( ior, QPair<QList<NodeLevel>, QList<NodeLevel> >( upLevelList, downLevelList ) );
+  }
+  // translation the tree into string
+  std::string treeStr;
+  DependencyTree::iterator i;
+  for ( i = tree.begin(); i != tree.end(); ++i ) {
+    treeStr.append( i.key().toUtf8().constData() );
+    treeStr.append( "-" );
+    QList<NodeLevel> upLevelList = i.value().first;
+    treeStr.append( "upward" );
+    treeStr.append( "{" );
+    foreach( NodeLevel level, upLevelList ) {
+      NodeLevel::iterator upIter;
+      for ( upIter = level.begin(); upIter != level.end(); ++upIter ) {
+        treeStr.append( upIter.key().toUtf8().constData() );
+        treeStr.append( "_" );
+        treeStr.append( QStringList(upIter.value()).join("_").toUtf8().constData() );
+        treeStr.append( upIter+1 == level.end() ? ";" : "," );
+      }
+    }
+    treeStr.append( "}" );
+    QList<NodeLevel> downLevelList = i.value().second;
+    treeStr.append( "downward" );
+    treeStr.append( "{" );
+    foreach( NodeLevel level, downLevelList ) {
+      NodeLevel::iterator downIter;
+      for ( downIter = level.begin(); downIter != level.end(); ++downIter ) {
+        treeStr.append( downIter.key().toUtf8().constData() );
+        treeStr.append( "_" );
+        treeStr.append( QStringList(downIter.value()).join("_").toUtf8().constData() );
+        treeStr.append( downIter+1 == level.end() ? ";" : "," );
+      }
+    }
+    treeStr.append("}");
+  }
+  return treeStr;
+}
+
+//=======================================================================
+// function : 
+// purpose  : 
+//=======================================================================
+void GEOMToolsGUI::getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, 
+                                        QList<NodeLevel> &upLevelList,  
+                                        int level )
+{
+  QString aGboIOR = GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(gbo));
+  GEOM::ListOfGBO_var depList = gbo->GetDependency();
+  for( int j = 0; j < depList->length(); j++ ) {
+    if ( level > 0 ) {
+      QStringList anIORs;
+      NodeLevel aLevelMap;
+      if ( level-1 >= upLevelList.size() ) {
+        upLevelList.append( aLevelMap );
+      } else {
+        aLevelMap = upLevelList.at(level-1);
+        if ( aLevelMap.contains( aGboIOR ) )
+          anIORs = aLevelMap.value( aGboIOR );
+      }
+      anIORs << GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(depList[j]));
+      aLevelMap.insert( aGboIOR, anIORs );
+    }
+    getUpwardDependency(depList[j], upLevelList, level++);
+  }
+}
+
+//=======================================================================
+// function : 
+// purpose  : 
+//=======================================================================
+void GEOMToolsGUI::getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, 
+                                          QList<NodeLevel> &downLevelList, 
+                                          int level )
+{
+  SalomeApp_Application* app =
+    dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  if ( !app )
+    return;
+
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+  if ( !appStudy )
+    return;
+
+  _PTR(Study) aStudy = appStudy->studyDS();
+
+  // get GEOM component
+  CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() );
+  QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR.in() ) );
+
+  _PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() );
+  if ( !comp )
+    return;
+
+  _PTR(ChildIterator) it ( aStudy->NewChildIterator( comp ) );
+  for ( it->InitEx( true ); it->More(); it->Next() ) {
+    _PTR(SObject) child( it->Value() );
+    CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child );
+    GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
+    if( CORBA::is_nil( geomObj ) )
+      continue;
+
+    GEOM::ListOfGBO_var depList = geomObj->GetDependency();
+    if( depList->length() == 0 )
+      continue;
+    QString aGoIOR = GEOMBase::GetIORFromObject( geomObj );
+
+    for( int i = 0; i < depList->length(); i++ ) {
+      if ( depList[i]->IsSame( gbo ) ) {
+        QStringList anIORs;
+        NodeLevel aLevelMap;
+        if ( level >= downLevelList.size() ) {
+          aLevelMap = NodeLevel();
+          downLevelList.append( aLevelMap );
+        } else {
+          aLevelMap = downLevelList.at(level);
+          if ( aLevelMap.contains( aGoIOR ) )
+            anIORs = aLevelMap.value( aGoIOR );
+        }
+        anIORs << GEOMBase::GetIORFromObject(GEOM::GEOM_Object::_narrow(depList[i]));
+        aLevelMap.insert( aGoIOR, anIORs );
+      }
+    }
+    getDownwardDependency(geomObj, downLevelList, level++);
+  }
+}
+
 //=====================================================================================
 // EXPORTED METHODS
 //=====================================================================================
index 683fffc7c48d9a8440123866a9d7d655037119c0..4d27b0656e636bac29c67829530b9afe15f0f9c5 100644 (file)
@@ -30,6 +30,7 @@
 #include "GEOM_ToolsGUI.hxx"
 
 #include <GEOMGUI.h>
+#include <GEOMBase.h>
 #include <SALOMEDSClient.hxx>
 
 class GEOM_Displayer;
@@ -42,6 +43,11 @@ class Handle_SALOME_InteractiveObject;
 class Handle_AIS_InteractiveContext;
 
 #include <QList>
+#include <QMap>
+#include <QPair>
+
+typedef QMap< QString, QStringList > NodeLevel;
+typedef QMap< QString, QPair<QList<NodeLevel>, QList<NodeLevel> > > DependencyTree;
 
 //=================================================================================
 // class    : GEOMToolsGUI
@@ -60,6 +66,14 @@ public:
 
   enum ActionType { SHOWDLG, INCR, DECR };
 
+  std::string getDependencyTree( QStringList rootObjectIORs );
+  void getUpwardDependency( GEOM::GEOM_BaseObject_ptr gbo, 
+                            QList<NodeLevel> &upLevelList,  
+                            int level = 0 );
+  void getDownwardDependency( GEOM::GEOM_BaseObject_ptr gbo, 
+                              QList<NodeLevel> &downLevelList, 
+                              int level = 0 );
+
 private:
   // Import and export topology methods
   bool         Import();