From 2bda43c6b29609d3fce84dae90fcc2862ecc0518 Mon Sep 17 00:00:00 2001 From: mpa Date: Wed, 28 May 2014 15:06:55 +0400 Subject: [PATCH] - add new method for view - edit the work of thread --- src/DependencyTree/CMakeLists.txt | 2 +- src/DependencyTree/DependencyTree.cxx | 6 +- src/DependencyTree/DependencyTree_Arrow.cxx | 21 +- src/DependencyTree/DependencyTree_Arrow.h | 2 + src/DependencyTree/DependencyTree_Object.cxx | 42 +- src/DependencyTree/DependencyTree_Object.h | 46 +- src/DependencyTree/DependencyTree_View.cxx | 1097 ++++++++---------- src/DependencyTree/DependencyTree_View.h | 91 +- 8 files changed, 590 insertions(+), 717 deletions(-) diff --git a/src/DependencyTree/CMakeLists.txt b/src/DependencyTree/CMakeLists.txt index 36d212005..2ab2bc271 100644 --- a/src/DependencyTree/CMakeLists.txt +++ b/src/DependencyTree/CMakeLists.txt @@ -72,8 +72,8 @@ SET(_link_LIBRARIES SET(DependencyTree_HEADERS DependencyTree.h - DependencyTree_Object.h DependencyTree_Arrow.h + DependencyTree_Object.h ) # header files / to be processed by moc diff --git a/src/DependencyTree/DependencyTree.cxx b/src/DependencyTree/DependencyTree.cxx index c3de20da4..6fdc892ba 100644 --- a/src/DependencyTree/DependencyTree.cxx +++ b/src/DependencyTree/DependencyTree.cxx @@ -73,7 +73,11 @@ DependencyTree::DependencyTree() svm->setTitle("DEPENDENCY_TREE"); } else { - svm->getActiveView()->setFocus(); + if( DependencyTree_ViewModel* viewModel = dynamic_cast( svm->getViewModel() ) ) + if( DependencyTree_View* view = dynamic_cast( viewModel->getActiveViewPort() ) ) { + svm->getActiveView()->setFocus(); + view->updateModel(); + } } diff --git a/src/DependencyTree/DependencyTree_Arrow.cxx b/src/DependencyTree/DependencyTree_Arrow.cxx index 3f6925ad8..f403cd906 100644 --- a/src/DependencyTree/DependencyTree_Arrow.cxx +++ b/src/DependencyTree/DependencyTree_Arrow.cxx @@ -48,6 +48,7 @@ myEndItem( theEndItem ) myStartItem = theStartItem; myEndItem = theEndItem; + myLine = QLineF( myStartItem->pos(), myEndItem->pos() ); myArrowHead = createArrowHead( myStartItem->pos(), myEndItem->pos() ); myReverseArrowHead = createArrowHead( myEndItem->pos(), myStartItem->pos() ); @@ -79,8 +80,8 @@ QRectF DependencyTree_Arrow::boundingRect() const } else { extra = ( pen().width() + 20 ) / 2.0; - boundingRect = QRectF( line().p1(), QSizeF( line().p2().x() - line().p1().x(), - line().p2().y() - line().p1().y() ) ); + boundingRect = QRectF( myLine.p1(), QSizeF( myLine.p2().x() - myLine.p1().x(), + myLine.p2().y() - myLine.p1().y() ) ); } return boundingRect.normalized().adjusted( -extra, -extra, extra, extra ); } @@ -209,7 +210,7 @@ void DependencyTree_Arrow::paint( QPainter* painter, const QStyleOptionGraphicsI myArrowHead = createArrowHead( myStartItem->pos(), myEndItem->pos() ); myReverseArrowHead = createArrowHead( myEndItem->pos(), myStartItem->pos() ); - painter->drawLine( line() ); + painter->drawLine( myLine ); painter->drawPolygon( myArrowHead ); if( myIsBiLink ) painter->drawPolygon( myReverseArrowHead ); @@ -238,21 +239,21 @@ QPolygonF DependencyTree_Arrow::createArrowHead( QPointF theStartPoint, QPointF break; p1 = p2; } - setLine( QLineF( intersectPoint, theStartPoint ) ); + myLine = QLineF( intersectPoint, theStartPoint ); } else - setLine( QLineF( theEndPoint, theStartPoint ) ); + myLine = QLineF( theEndPoint, theStartPoint ); - double angle = acos(line().dx() / line().length()); - if( line().dy() >= 0 ) + double angle = acos(myLine.dx() / myLine.length()); + if( myLine.dy() >= 0 ) angle = ( M_PI * 2 ) - angle; - QPointF arrowP1 = line().p1() + QPointF( sin( angle + M_PI / 3 ) * arrowSize, + QPointF arrowP1 = myLine.p1() + QPointF( sin( angle + M_PI / 3 ) * arrowSize, cos( angle + M_PI / 3 ) * arrowSize ); - QPointF arrowP2 = line().p1() + QPointF( sin( angle + M_PI - M_PI / 3 ) * arrowSize, + QPointF arrowP2 = myLine.p1() + QPointF( sin( angle + M_PI - M_PI / 3 ) * arrowSize, cos( angle + M_PI - M_PI / 3 ) * arrowSize ); QPolygonF anArrowHead; - anArrowHead << line().p1() << arrowP1 << arrowP2; + anArrowHead << myLine.p1() << arrowP1 << arrowP2; return anArrowHead; } diff --git a/src/DependencyTree/DependencyTree_Arrow.h b/src/DependencyTree/DependencyTree_Arrow.h index 1518c72ea..087755651 100644 --- a/src/DependencyTree/DependencyTree_Arrow.h +++ b/src/DependencyTree/DependencyTree_Arrow.h @@ -67,6 +67,8 @@ private: QRectF mySelfDependencyArrow; + QLineF myLine; + }; #endif diff --git a/src/DependencyTree/DependencyTree_Object.cxx b/src/DependencyTree/DependencyTree_Object.cxx index 2f839df33..21d2f7971 100644 --- a/src/DependencyTree/DependencyTree_Object.cxx +++ b/src/DependencyTree/DependencyTree_Object.cxx @@ -37,8 +37,7 @@ const int itemW = 90; DependencyTree_Object::DependencyTree_Object( const std::string& theEntry, QGraphicsItem* theParent ) :GraphicsView_Object( theParent ), -myIsMainObject( false ), -myIsLongName( false ) +myIsMainObject( false ) { SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); @@ -61,6 +60,13 @@ myIsLongName( false ) myTextItem->setFont( textFont ); myEntry = theEntry; + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; + SalomeApp_Study* study = dynamic_cast(app->activeStudy()); + int studyId = GeometryGUI::ClientStudyToStudy( study->studyDS())->StudyId(); + myGeomObject = GeometryGUI::GetGeomGen()->GetObject( studyId, myEntry.c_str() ); + updateName(); addToGroup( myPolygonItem ); @@ -85,8 +91,7 @@ bool DependencyTree_Object::highlight( double theX, double theY ) myPolygonItem->setBrush( color ); myPolygonItem->setPen( getPen( color ) ); - if( myIsLongName ) - myPolygonItem->setToolTip( getName() ); + myPolygonItem->setToolTip( getName() ); } return GraphicsView_Object::highlight( theX, theY ); } @@ -146,29 +151,31 @@ std::string DependencyTree_Object::getEntry() const return myEntry; } +//================================================================================= +// function : getGeomObject() +// purpose : get geometry object of current item +//================================================================================= +GEOM::GEOM_BaseObject_var DependencyTree_Object::getGeomObject() const +{ + return myGeomObject; +} + //================================================================================= // function : updateName() // purpose : update name of current item using its entry //================================================================================= void DependencyTree_Object::updateName() { - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if ( !app ) return; - SalomeApp_Study* study = dynamic_cast(app->activeStudy()); - SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy( study->studyDS()); - int StudyId = aStudyDS->StudyId(); - GEOM::_objref_GEOM_BaseObject* object = GeometryGUI::GetGeomGen()->GetObject( StudyId, myEntry.c_str() ); - QString name = object->GetName(); - QString StudyEntry = object->GetStudyEntry(); - std::cout << "\n\n\n StudyEntry = " << StudyEntry.toStdString() << " " << StudyEntry.isEmpty() << std::endl; + QString name = myGeomObject->GetName(); + QString studyEntry = myGeomObject->GetStudyEntry(); - - if( StudyEntry.isEmpty() ) { + if( studyEntry.isEmpty() ) { if( name.isEmpty() ) name = "unpublished"; - myColor = resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ); + myColor = QColor( 255, 255, 255 ); + myPolygonItem->setBrush( myColor ); + myPolygonItem->setPen( getPen( myColor ) ); } setName( name ); @@ -181,7 +188,6 @@ void DependencyTree_Object::updateName() double polygonHeight = myPolygonItem->sceneBoundingRect().height(); if( ( textWidth - 4 ) > polygonWidth ) { - myIsLongName = true; int numberSymbol = int( polygonWidth * name.length() / textWidth ); QString newName = name.left( numberSymbol - 3 ) + "..."; myTextItem->setText( newName ); diff --git a/src/DependencyTree/DependencyTree_Object.h b/src/DependencyTree/DependencyTree_Object.h index da04b6901..a4a27b303 100644 --- a/src/DependencyTree/DependencyTree_Object.h +++ b/src/DependencyTree/DependencyTree_Object.h @@ -22,6 +22,10 @@ #include +// GEOM includes +#include +#include + #include class DependencyTree_Object: public GraphicsView_Object @@ -32,39 +36,41 @@ public: DependencyTree_Object( const std::string&, QGraphicsItem* = 0 ); ~DependencyTree_Object(); - virtual void compute() {}; + virtual void compute() {}; + + virtual bool highlight( double, double ); + virtual void unhighlight(); - virtual bool highlight( double, double ); - virtual void unhighlight(); + virtual bool select( double, double, const QRectF& ); + virtual void unselect(); - virtual bool select( double, double, const QRectF& ); - virtual void unselect(); + std::string getEntry() const; - std::string getEntry() const; + GEOM::GEOM_BaseObject_var getGeomObject() const; - void updateName(); + void updateName(); - void setColor(const QColor& ); - void setSelectColor(const QColor& ); - void setMainObjectColor(const QColor& ); + void setColor(const QColor& ); + void setSelectColor(const QColor& ); + void setMainObjectColor(const QColor& ); - void setIsMainObject( bool ); + void setIsMainObject( bool ); private: - QPen getPen( const QColor& ); + QPen getPen( const QColor& ); - QColor myColor; - QColor mySelectColor; - QColor myMainObjectColor; + QColor myColor; + QColor mySelectColor; + QColor myMainObjectColor; - QGraphicsPolygonItem* myPolygonItem; - QGraphicsSimpleTextItem* myTextItem; + QGraphicsPolygonItem* myPolygonItem; + QGraphicsSimpleTextItem* myTextItem; - std::string myEntry; + GEOM::GEOM_BaseObject_var myGeomObject; + std::string myEntry; - bool myIsMainObject; - bool myIsLongName; + bool myIsMainObject; }; diff --git a/src/DependencyTree/DependencyTree_View.cxx b/src/DependencyTree/DependencyTree_View.cxx index 4785f4101..674850696 100644 --- a/src/DependencyTree/DependencyTree_View.cxx +++ b/src/DependencyTree/DependencyTree_View.cxx @@ -28,7 +28,6 @@ // GUI includes #include #include -#include #include #include #include @@ -41,7 +40,6 @@ #include -int iter = 0; DependencyTree_View::DependencyTree_View( QWidget* theParent ) :GraphicsView_ViewPort(theParent), @@ -49,581 +47,215 @@ myMaxDownwardLevelsNumber(0), myMaxUpwardLevelsNumber(0), myLevelsNumber(0), myIsCompute(true), -myIsUpdate( true ) +myIsUpdate( true ), +myTotalCost(0), +myComputedCost(0) { SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); if ( !app ) return; - SalomeApp_Study* study = dynamic_cast(app->activeStudy()); - SALOMEDS::Study_var myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS()); + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS()); - LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); - if ( !aSelMgr ) return; + mySelectionMgr = app->selectionMgr(); + if ( !mySelectionMgr ) return; - SALOME_ListIO aSelList; - aSelMgr->selectedObjects(aSelList); - - GEOM::string_array_var ObjectIORs = new GEOM::string_array(); - ObjectIORs->length( aSelList.Extent()); - int aaa=0; - - for ( SALOME_ListIteratorOfListIO It( aSelList ); It.More(); It.Next() ) { - Handle( SALOME_InteractiveObject ) io = It.Value(); - - - GEOM::GEOM_Object_var myObject = GEOM::GEOM_Object::_nil(); - myObject = GEOMBase::ConvertIOinGEOMObject( io ); - QString ior = myObject->GetEntry(); - ObjectIORs[aaa] = ior.toLatin1().constData(); - aaa++; - - std::cout << "\n\n IOR = " << ior.toStdString() << std::endl; - } - - SALOMEDS::TMPFile_var SeqFile = - GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, ObjectIORs ); - char* buf; - buf = (char*) &SeqFile[0]; - - std::cout << "\n\n\n\n\n TREE = " << buf << std::endl; - - GEOMUtils::ConvertStringToTree( buf, myTreeModel ); - - aSelMgr->clearSelected(); + getNewTreeModel(); } DependencyTree_View::~DependencyTree_View() { - -} - -void DependencyTree_View::drawArrows() -{ - GEOMUtils::TreeModel::const_iterator i; - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - DependencyTree_Object* Main_object = myTreeMap[i->first]; - if( i->second.first.size() > 0 ) { - GEOMUtils::LevelInfo Levelup = i->second.first.at(0); - if( myDisplayAscendants ->isChecked() ) { - GEOMUtils::LevelInfo::const_iterator node; - for (node = Levelup.begin(); node != Levelup.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - DependencyTree_Arrow* arrow = Arrows[std::pair(Main_object, object)]; - if( arrow && !isItemAdded( arrow) ) - addItem( arrow ); - } - } - } - if( myDisplayAscendants ->isChecked() ) - drawWardArrows( i->second.first ); - if( myDisplayDescendants->isChecked() ) - drawWardArrows( i->second.second ); - - } -} - -void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard ) -{ - for(int j = 0; j < theWard.size(); j++ ) { - if( j >= myLevelsNumber ) - break; - GEOMUtils::LevelInfo Level = theWard.at(j); - GEOMUtils::LevelInfo::const_iterator node; - for (node = Level.begin(); node != Level.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - GEOMUtils::NodeLinks Links = node->second; - for( int link = 0; link < Links.size(); link++ ) { - DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; - if( isItemAdded( object ) && isItemAdded( LinkObject ) ) { - DependencyTree_Arrow* arrow = Arrows[std::pair(object, LinkObject)]; - if( arrow && !isItemAdded( arrow) ) - addItem( arrow ); - } - } - } - } -} - -void DependencyTree_View::parseTree() -{ - - GEOMUtils::TreeModel::const_iterator i; - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - std::string objectEntry = i->first; - addNode( objectEntry ); - parseTreeWard( i->second.first ); - if( i->second.first.size() > myMaxUpwardLevelsNumber ) - myMaxUpwardLevelsNumber = i->second.first.size(); - parseTreeWard( i->second.second ); - if( i->second.second.size() > myMaxDownwardLevelsNumber ) - myMaxDownwardLevelsNumber = i->second.second.size(); - } - - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - DependencyTree_Object* Main_object = myTreeMap[i->first]; - if( i->second.first.size() > 0 ) { - GEOMUtils::LevelInfo Levelup = i->second.first.at(0); - GEOMUtils::LevelInfo::const_iterator node; - for (node = Levelup.begin(); node != Levelup.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - addArrow( Main_object, object ); - } - } - parseTreeWardArrow( i->second.first ); - parseTreeWardArrow( i->second.second ); - } - - -} -void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard) -{ - int levelsNumber = theWard.size(); - for( int level = 0; level < levelsNumber; level++ ) { - GEOMUtils::LevelInfo levelInfo = theWard[ level ]; - GEOMUtils::LevelInfo::const_iterator node; - for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { - addNode( node->first ); - } - } -} -void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard) -{ - for(int j = 0; j < theWard.size(); j++ ) { - GEOMUtils::LevelInfo Level = theWard.at(j); - GEOMUtils::LevelInfo::const_iterator node; - for (node = Level.begin(); node != Level.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - std::vector Links = node->second; - for( int link = 0; link < Links.size(); link++ ) { - DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; - if( object && LinkObject ) - addArrow( object, LinkObject ); - } - } - } -} -//void DependencyTree_View::parseData( QString& theData ) -//{ -// int cursor = 0; -// -// while( theData.indexOf('-',cursor) != -1 ) //find next selected object -// { -// int objectIndex = theData.indexOf( '-', cursor ); -// QString objectEntry = theData.mid( cursor, objectIndex - cursor ); -// //addNode( objectEntry ); -// std::cout<<"\n\nMainObject = " << objectEntry.toStdString() < myMaxUpwardLevelsNumber ) -// myMaxUpwardLevelsNumber = upwardList.size(); -// std::cout<<" Downward:" << std::endl; -// LevelsList downwardList = parseWard( theData, cursor ); -// if( downwardList.size() > myMaxDownwardLevelsNumber ) -// myMaxDownwardLevelsNumber = downwardList.size(); -// -// myTreeModel[objectEntry] = QPair( upwardList, downwardList ); -// } -//} - -void DependencyTree_View::addNode( const std::string& theEntry ) -{ - if( !myTreeMap[theEntry] ) - myTreeMap[theEntry] = new DependencyTree_Object( theEntry ); -} - -void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem ) -{ - bool isFind = false; - - std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl; - std::map, DependencyTree_Arrow* >::const_iterator i; - for (i = Arrows.begin(); i != Arrows.end(); i++ ) { - DependencyTree_Arrow* arrow = i->second; - if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) { - isFind = true; - std::cout<<" theSame " << std::endl; - } - else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) { - arrow->setIsBiLink( true ); - std::cout<<" Bilink " << std::endl; - isFind = true; - } - } - - if( !isFind ) { - DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem); - //Arrows.append( arrow ); - //addItem(arrow); - Arrows[std::pair( startItem, endItem )] = arrow; - std::cout<<" addArrow " << std::endl; - } -} - -//DependencyTree_View::LevelsList DependencyTree_View::parseWard( const QString& theData, int& theCursor ) -//{ -// int indexStart = theData.indexOf( "{", theCursor ) + 1; -// int indexEnd = theData.indexOf( "}", indexStart ); -// -// QString ward = theData.mid( indexStart, indexEnd - indexStart ); -// QStringList levelsListStr = ward.split( ';' ); -// LevelsList levelsListData; -// for( int level = 0; level < levelsListStr.size(); level++ ) { -// std::cout<<" Level" << level + 1 << ":" << std::endl; -// QStringList namesListStr = levelsListStr[level].split( ',' ); -// LevelInfo levelInfoData; -// for( int node = 0; node < namesListStr.size(); node++ ) { -// QStringList linksListStr = namesListStr[node].split( '_' ); -// QString nodeItem = linksListStr[0]; -// if( !nodeItem.isEmpty() ) { -// //addNode( nodeItem ); -// NodeLinks linksListData; -// std::cout<<" " << nodeItem.toStdString() << " - "; -// for( int link = 1; link < linksListStr.size(); link++ ) { -// QString linkItem = linksListStr[link]; -// //addNode( linkItem ); -// linksListData.append( linkItem ); -// std::cout << linkItem.toStdString() << ", "; -// }// Links -// levelInfoData[nodeItem] = linksListData; -// std::cout << std::endl; -// } -// }// Level's objects -// levelsListData.append(levelInfoData); -// }// Levels -// -// theCursor = indexEnd + 1; -// -// return levelsListData; -//} - -void DependencyTree_View::drawTree() -{ - - int horDistance, verDistance; - myCurrentLevel = 0; - GEOMUtils::TreeModel::const_iterator i; - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - myCurrentLevel = 0; - std::string objectEntry = i->first; - DependencyTree_Object* objectItem = myTreeMap[ objectEntry ]; - horDistance = 100 + int( objectItem->boundingRect().width() ); - verDistance = 3 * int( objectItem->boundingRect().height() ); - if( isItemAdded( objectItem ) ) { - myCurrentLevel = myLevelMap[ objectEntry ]; - } - else { - addItem( objectItem ); - myLevelMap[ objectEntry ] = myCurrentLevel; - myLevelsObject[ myCurrentLevel ].push_back( objectEntry ); - } - objectItem->setIsMainObject( true ); - - int levelposition = myCurrentLevel; - if( myDisplayAscendants ->isChecked() ){ - drawWard( i->second.first, -1 ); - myCurrentLevel = levelposition; - } - if( myDisplayDescendants->isChecked() ) - drawWard( i->second.second, 1 ); - } - - std::map< int, std::vector >::const_iterator j; - for (j = myLevelsObject.begin(); j != myLevelsObject.end(); j++ ) { - int step = -horDistance*( j->second.size() - 1 )/2; - std::cout<<"\n\n LEVEL = " << j->first << std::endl; - for( int object = 0; object < j->second.size(); object++ ) { - if( myIsCompute ) { - std::cout << j->second.at( object ) << ", "; - DependencyTree_Object* anObject = myTreeMap[ j->second.at( object ) ]; - anObject->setPos( step, verDistance*j->first ); - step += horDistance; - //sleep(1); - } - } - } - centerOn( scene()->sceneRect().center() ); - fitAll( true ); - -} - -void DependencyTree_View::drawWard( const GEOMUtils::LevelsList theWard, const int theLevelStep ) -{ - std::cout << "\n\n myLevelsNumber2 = " << myLevelsNumber << std::endl; - int levelsNumber = theWard.size(); - std::cout << "\n\n levelsNumber = " << levelsNumber << std::endl; - for( int level = 0; level < levelsNumber; level++ ) { - if( level >= myLevelsNumber ) - return; - myCurrentLevel += theLevelStep; - GEOMUtils::LevelInfo levelInfo = theWard.at( level ); - GEOMUtils::LevelInfo::const_iterator node; - for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[ node->first ]; - if( !isItemAdded( object ) ) { - addItem( object ); - myLevelMap[ node->first ] = myCurrentLevel; - myLevelsObject[ myCurrentLevel ].push_back( node->first ); - } - } - } - } -void DependencyTree_View::onUpdateTree() -{ - myLevelMap.clear(); - myLevelsObject.clear(); - - - std::map::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { - DependencyTree_Object* object = myTreeMap[ i->first ]; - if( isItemAdded( object ) && object ) - removeItem( object ); - - } - - std::map, DependencyTree_Arrow* >::const_iterator j; - for (j = Arrows.begin(); j != Arrows.end(); j++ ) { - DependencyTree_Arrow* object = Arrows[ j->first ]; - if( isItemAdded( object ) && object ) - removeItem( object ); - } - - drawTree(); - drawArrows(); -} - - -int DependencyTree_View::checkMaxLevelsNumber() -{ - if( myDisplayAscendants ->isChecked() && myDisplayDescendants->isChecked() ) - return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber; - else if( myDisplayAscendants ->isChecked() ) - return myMaxUpwardLevelsNumber; - else if( myDisplayDescendants->isChecked() ) - return myMaxDownwardLevelsNumber; -} - - void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame ) { - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - - std::string Data = "MainObject1-upward{up11_up21_up22,up12_up23,up13_up24;up21_up11,up22_up21_up12,up23_up23,up24}" - "downward{down11_MainObject1,down12_MainObject1;down21_down11,down22_down12,down23_down12,down24_down24_down11,down25_down12;down31_down11_down23,down32_down25}" - "down23-upward{down12_MainObject1;MainObject1_up11_up12_up13;up11_up21_up22,up12_up23,up13_up24;up21,up22_up21_up12,up23,up24}" - "downward{down31_down11_down23}" - "MainObject2-upward{up21,newup11_newup31,newup12_newup21;newup21_newup31LongName;newup31LongName}downward{newdown11_MainObject2,newdown12_MainObject2,newdown13_MainObject2;newdown21_newdown13,down21;newdown31_newdown11}" - "MainObject3-upward{moUP1_moUP4,moUP2_moUP3;moUP4,moUP3_down23}downward{moDOWN1_MainObject3}"; - - - //GEOMUtils::ConvertStringToTree( Data, myTreeModel ); - - - -// GEOMUtils::TreeModel::const_iterator i; -// for ( i = aTreeModel.begin(); i != aTreeModel.end(); i++ ) { -// std::string objectEntry = i->first; -// std::cout << "\n\n Main object = " << objectEntry << std::endl; -// } -// parseData( Data ); - parseTree(); - + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) ); - QWidgetAction* moveNodesAction = new QWidgetAction( theViewFrame ); - moveNodesAction->setDefaultWidget( myNodesMovable ); + QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame ); + nodesMovableAction->setDefaultWidget( myNodesMovable ); - myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" )); - myDisplayAscendants ->setChecked( true ); - QWidgetAction* ShowParentsAction = new QWidgetAction(theViewFrame); + myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) ); + QWidgetAction* ShowParentsAction = new QWidgetAction( theViewFrame ); ShowParentsAction->setDefaultWidget( myDisplayAscendants ); myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS")); QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame); ShowChildrenAction->setDefaultWidget( myDisplayDescendants ); + QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) ); + QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction(theViewFrame); + hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel ); + myLevelsNumber = checkMaxLevelsNumber(); - std::cout << "\n\n myLevelsNumber1 = " << myLevelsNumber << std::endl; + myHierarchyDepth = new QSpinBox(); myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() ); + myHierarchyDepth->setSpecialValueText( tr( "SHOW_ALL" ) ); myHierarchyDepth->setValue( 0 ); - myHierarchyDepth->setSpecialValueText( "All" ); - QWidgetAction* LevelsAction = new QWidgetAction(theViewFrame); - LevelsAction->setDefaultWidget( myHierarchyDepth ); - - QLabel* LevelsLabel = new QLabel( tr("HIERARCHY_DEPTH") ); - QWidgetAction* LevelsLebelAction = new QWidgetAction(theViewFrame); - LevelsLebelAction->setDefaultWidget( LevelsLabel ); + QWidgetAction* hierarchyDepthAction = new QWidgetAction( theViewFrame ); + hierarchyDepthAction->setDefaultWidget( myHierarchyDepth ); + QPushButton* updateButton = new QPushButton( tr( "UPDATE" ) ); + QWidgetAction* updateAction = new QWidgetAction( theViewFrame ); + updateAction->setDefaultWidget( updateButton ); - QPushButton* UpdateButton = new QPushButton(tr("Update")); - QWidgetAction* UpdateAction = new QWidgetAction(theViewFrame); - UpdateAction->setDefaultWidget( UpdateButton ); - - cancelButton = new QPushButton(tr("CANCEL")); - cancelButton->setCheckable(true); - cancelButton->setVisible( false ); - cancelAction = new QWidgetAction(theViewFrame); + QPushButton* cancelButton = new QPushButton( tr( "CANCEL" ) ); + cancelButton->setCheckable( true ); + cancelAction = new QWidgetAction( theViewFrame ); cancelAction->setDefaultWidget( cancelButton ); - cancelAction->setVisible(false); + cancelAction->setVisible( false ); - progressBar = new QProgressBar(this); + QProgressBar* progressBar = new QProgressBar( this ); progressBar->setMinimum( 0 ); - progressBar->setMaximum( 1000 ); - progressBar->setFixedWidth(100); - progressAction = new QWidgetAction(theViewFrame); + progressBar->setMaximum( 100 ); + progressBar->setFixedWidth( 100 ); + progressAction = new QWidgetAction( theViewFrame ); progressAction->setDefaultWidget( progressBar ); - progressAction->setVisible(false); + progressAction->setVisible( false ); + + QAction* separator1 = theViewFrame->toolMgr()->separator( false ); + QAction* separator2 = theViewFrame->toolMgr()->separator( false ); - QAction* separator = theViewFrame->toolMgr()->separator(false); - theViewFrame->toolMgr()->append( separator, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( moveNodesAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( LevelsLebelAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( LevelsAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() ); - QAction* separator2 = theViewFrame->toolMgr()->separator(false); + theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( UpdateAction, theViewFrame->getToolBarId() ); - std::cout<<"\n\n\n\n ToolBarId = " << theViewFrame->getToolBarId() << std::endl; + theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() ); - connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel())); - + connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) ); connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) ); - connect( myDisplayAscendants , SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) ); - connect( myDisplayDescendants, SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) ); - connect( UpdateButton, SIGNAL( clicked() ), this, SLOT( updateView() ) ); - connect( myNodesMovable, SIGNAL( toggled(bool) ), this, SLOT( onMoveNodes( bool ) ) ); + connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) ); + connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) ); + connect( updateButton, SIGNAL( clicked() ), this, SLOT( updateView() ) ); + connect( cancelButton, SIGNAL( clicked() ), this, SLOT( onCancel() ) ); setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) ); setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) ); setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) ); - - -} - -void DependencyTree_View::onMoveNodes( bool theIsMoveNodes ) -{ - std::map::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { - DependencyTree_Object* object = myTreeMap[ i->first ]; - if( object ) - object->setMovable( theIsMoveNodes ); - } } -void DependencyTree_View::onHierarchyType() +void DependencyTree_View::updateModel() { - myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() ); - if( myHierarchyDepth->value() > checkMaxLevelsNumber() ) - myHierarchyDepth->setValue( checkMaxLevelsNumber() ); + getNewTreeModel(); - if( myHierarchyDepth->value() == 0 ) - myLevelsNumber = myHierarchyDepth->maximum(); - else - myLevelsNumber = myHierarchyDepth->value(); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - updateView(); + setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) ); + setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) ); + setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) ); } -void DependencyTree_View::updateView() -{ - - if( !myIsUpdate ) - return; - - myLevelMap.clear(); - myLevelsObject.clear(); - - - std::map::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { - DependencyTree_Object* object = myTreeMap[ i->first ]; - if( isItemAdded( object ) && object ) - removeItem( object ); - - } - - - std::map, DependencyTree_Arrow* >::const_iterator j; - for (j = Arrows.begin(); j != Arrows.end(); j++ ) { - DependencyTree_Arrow* object = Arrows[ j->first ]; - if( isItemAdded( object ) && object ) - removeItem( object ); - } +void DependencyTree_View::drawTree() +{ + myComputedCost = 0; + calcTotalCost(); + std::cout << "\n\n\n TOTAL COST = " << myTotalCost << std::endl; + clearSelected(); + // draw nodes on scene + std::map< std::string, int > entryLevelMap; + std::map< int, std::vector< std::string > > levelObjects; + int currentLevel; + int horDistance, verDistance; + GEOMUtils::TreeModel::const_reverse_iterator i; + for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) { + if( !myIsCompute ) + return; + currentLevel = 0; + myComputedCost++; + sleep(1); + std::string objectEntry = i->first; + DependencyTree_Object* objectItem = myTreeMap[ objectEntry ]; + horDistance = 100 + int( objectItem->boundingRect().width() ); + verDistance = 3 * int( objectItem->boundingRect().height() ); + if( isItemAdded( objectItem ) ) + currentLevel = entryLevelMap[ objectEntry ]; + else { + addItem( objectItem ); + objectItem->unselect(); + entryLevelMap[ objectEntry ] = currentLevel; + levelObjects[ currentLevel ].push_back( objectEntry ); + } + objectItem->setIsMainObject( true ); - iter = 0; - qthread = new DependencyTree_ComputeDlg_QThread(this);// = DependencyTree_ComputeDlg_QThread(this);// const_cast(this) ); - cancelAction->setVisible( true ); - progressAction->setVisible(true); - myNodesMovable->setEnabled(false); - myHierarchyDepth->setEnabled( false); - myDisplayAscendants->setEnabled( false ); - myDisplayDescendants->setEnabled( false ); - myTimer = startTimer(100); // millisecs - qthread->start(); -} + if( myDisplayAscendants->isChecked() ) + drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 ); + if( myDisplayDescendants->isChecked() ) + drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 ); + } -void DependencyTree_View::onRedrawTree() -{ - drawTree(); - drawArrows(); -} -void DependencyTree_View::onCancel() -{ - qthread->cancel(); - cancelButton->setText( tr("CANCELING")); - cancelButton->setEnabled(false); - killTimer( myTimer ); - qthread->killTimer( myTimer ); - qthread->deleteLater(); + std::map< int, std::vector< std::string > >::const_iterator level; + for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) { + int step = -horDistance * ( level->second.size() - 1 ) / 2; + std::cout<<"\n\n LEVEL = " << level->first << std::endl; + for( int objIter = 0; objIter < level->second.size(); objIter++ ) { + std::cout << level->second.at( objIter ) << ", "; + DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ]; + anObject->setPos( step, verDistance * level->first ); + step += horDistance; + } + } + // draw arrows on scene + GEOMUtils::TreeModel::const_iterator j; + for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) { + DependencyTree_Object* Main_object = myTreeMap[ j->first ]; + if( j->second.first.size() > 0 ) { + GEOMUtils::LevelInfo Levelup = j->second.first.at(0); + if( myDisplayAscendants ->isChecked() ) { + GEOMUtils::LevelInfo::const_iterator node; + for (node = Levelup.begin(); node != Levelup.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[node->first]; + DependencyTree_Arrow* arrow = myArrows[std::pair(Main_object, object)]; + if( arrow && !isItemAdded( arrow) ) + addItem( arrow ); + } + } + } + if( myDisplayAscendants->isChecked() ) + drawWardArrows( j->second.first ); + if( myDisplayDescendants->isChecked() ) + drawWardArrows( j->second.second ); + } + std::cout << "\n ComputedCost = " << myComputedCost << std::endl; + fitAll( true ); } -void DependencyTree_View::timerEvent(QTimerEvent *event) +int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend ) { - if ( !cancelButton->isChecked() ) // not yet cancelled - // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() ); - progressBar->setValue( iter++ ); - - if(!myIsCompute || qthread->isFinished()) - { - cancelAction->setVisible( false ); - progressAction->setVisible(false); - cancelButton->setText( tr("CANCEL")); - cancelButton->setEnabled(true); - myNodesMovable->setEnabled( true ); - myHierarchyDepth->setEnabled( true ); - myDisplayAscendants->setEnabled( true ); - myDisplayDescendants->setEnabled( true ); - } + GraphicsView_ViewPort::select( theRect, theIsAppend ); - event->accept(); -} + mySelectionMgr->clearSelected(); -void DependencyTree_View::closeEvent(QCloseEvent *event) -{ - if(qthread->isRunning()) - { - event->ignore(); - return; + // get selection + SALOME_ListIO listIO; + int StudyId = myStudy->StudyId(); + for( initSelected(); moreSelected(); nextSelected() ) + if( DependencyTree_Object* treeObject = dynamic_cast( selectedObject() ) ) { + CORBA::String_var studyEntry = treeObject->getGeomObject()->GetStudyEntry(); + Handle(SALOME_InteractiveObject) tmpIO = + new SALOME_InteractiveObject( studyEntry.in(), "GEOM", "TEMP_IO"); + listIO.Append( tmpIO ); } - event->accept(); + mySelectionMgr->setSelectedObjects( listIO, true ); } -void DependencyTree_View::setIsCompute( bool theIsCompute ) +void DependencyTree_View::mouseMoveEvent(QMouseEvent *event) { - myIsCompute = theIsCompute; + QGraphicsView::mouseMoveEvent( event ); + ArrowsInfo::const_iterator j; + for (j = myArrows.begin(); j != myArrows.end(); j++ ) { + DependencyTree_Arrow* arrow = myArrows[ j->first ]; + arrow->update(); + } } void DependencyTree_View::setHierarchyType( const int theType ) @@ -644,6 +276,9 @@ void DependencyTree_View::setHierarchyType( const int theType ) break; } myIsUpdate = true; + + myLevelsNumber = checkMaxLevelsNumber(); + onHierarchyType(); } @@ -665,7 +300,7 @@ void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor ) void DependencyTree_View::setNodeColor( const QColor& theColor ) { - std::map::const_iterator i; + EntryObjectMap::const_iterator i; for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setColor( theColor ); @@ -674,7 +309,7 @@ void DependencyTree_View::setNodeColor( const QColor& theColor ) void DependencyTree_View::setMainNodeColor( const QColor& theColor ) { - std::map::const_iterator i; + EntryObjectMap::const_iterator i; for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setMainObjectColor( theColor ); @@ -683,7 +318,7 @@ void DependencyTree_View::setMainNodeColor( const QColor& theColor ) void DependencyTree_View::setSelectNodeColor( const QColor& theColor ) { - std::map::const_iterator i; + EntryObjectMap::const_iterator i; for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setSelectColor( theColor ); @@ -692,60 +327,354 @@ void DependencyTree_View::setSelectNodeColor( const QColor& theColor ) void DependencyTree_View::setArrowColor( const QColor& theColor ) { - std::map, DependencyTree_Arrow* >::const_iterator j; - for (j = Arrows.begin(); j != Arrows.end(); j++ ) { - DependencyTree_Arrow* arrow = Arrows[ j->first ]; + ArrowsInfo::const_iterator j; + for (j = myArrows.begin(); j != myArrows.end(); j++ ) { + DependencyTree_Arrow* arrow = myArrows[ j->first ]; arrow->setColor( theColor ); } } void DependencyTree_View::setHighlightArrowColor( const QColor& theColor ) { - std::map, DependencyTree_Arrow* >::const_iterator j; - for (j = Arrows.begin(); j != Arrows.end(); j++ ) { - DependencyTree_Arrow* arrow = Arrows[ j->first ]; + ArrowsInfo::const_iterator j; + for (j = myArrows.begin(); j != myArrows.end(); j++ ) { + DependencyTree_Arrow* arrow = myArrows[ j->first ]; arrow->setHighlightColor( theColor ); } } void DependencyTree_View::setSelectArrowColor( const QColor& theColor ) { - std::map, DependencyTree_Arrow* >::const_iterator j; - for (j = Arrows.begin(); j != Arrows.end(); j++ ) { - DependencyTree_Arrow* arrow = Arrows[ j->first ]; + ArrowsInfo::const_iterator j; + for (j = myArrows.begin(); j != myArrows.end(); j++ ) { + DependencyTree_Arrow* arrow = myArrows[ j->first ]; arrow->setSelectColor( theColor ); } } -int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend ) +void DependencyTree_View::setIsCompute( bool theIsCompute ) +{ + myIsCompute = theIsCompute; +} + +bool DependencyTree_View::getIsCompute() +{ + return myIsCompute; +} + +void DependencyTree_View::timerEvent(QTimerEvent *event) { - GraphicsView_ViewPort::select( theRect, theIsAppend ); + QPushButton* cancelButton = dynamic_cast( cancelAction->defaultWidget() ); + QProgressBar* progressBar = dynamic_cast( progressAction->defaultWidget() ); - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + std::cout << "TIMER! " << std::endl; + if ( !cancelButton->isChecked() ) + progressBar->setValue( progressBar->maximum() * getComputeProgress() ); - LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if( !myIsCompute || qthread->isFinished() ) { + changeWidgetState( false ); + killTimer( myTimer ); + cancelButton->setChecked( false ); + progressBar->setValue(0); + } + event->accept(); +} - // get selection - SALOME_ListIO listIO; -aSelMgr->clearSelected(); - SalomeApp_Study* study = dynamic_cast(app->activeStudy()); - SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy( study->studyDS()); - int StudyId = aStudyDS->StudyId(); - for( initSelected(); moreSelected(); nextSelected() ) - if( DependencyTree_Object* aDepObject = dynamic_cast( selectedObject() ) ) { - GEOM::_objref_GEOM_BaseObject* object = GeometryGUI::GetGeomGen()->GetObject( StudyId, aDepObject->getEntry().c_str() ); - CORBA::String_var aChildEntry = object->GetStudyEntry(); - Handle(SALOME_InteractiveObject) tmpIO = - new SALOME_InteractiveObject( aChildEntry.in(), "GEOM", "TEMP_IO"); - listIO.Append(tmpIO); +void DependencyTree_View::closeEvent( QCloseEvent* event ) +{ + if(qthread->isRunning()) + { + event->ignore(); + return; + } + event->accept(); +} + +void DependencyTree_View::updateView() +{ + if( !myIsUpdate ) + return; + + clearView( false ); + + qthread = new DependencyTree_ComputeDlg_QThread( this ); + + changeWidgetState( true ); + + myTimer = startTimer( 100 ); // millisecs + qthread->start(); +} + +void DependencyTree_View::onMoveNodes( bool theIsMoveNodes ) +{ + EntryObjectMap::const_iterator i; + for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + DependencyTree_Object* object = myTreeMap[ i->first ]; + if( object ) + object->setMovable( theIsMoveNodes ); + } +} + +void DependencyTree_View::onHierarchyType() +{ + myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() ); + if( myHierarchyDepth->value() > checkMaxLevelsNumber() ) + myHierarchyDepth->setValue( checkMaxLevelsNumber() ); + + if( myHierarchyDepth->value() == 0 ) + myLevelsNumber = myHierarchyDepth->maximum(); + else + myLevelsNumber = myHierarchyDepth->value(); + + updateView(); +} + +void DependencyTree_View::onCancel() +{ + qthread->cancel(); + //qthread->deleteLater(); +} + +void DependencyTree_View::addNode( const std::string& theEntry ) +{ + if( !myTreeMap[theEntry] ) + myTreeMap[theEntry] = new DependencyTree_Object( theEntry ); +} + +void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem ) +{ + bool isFind = false; + + std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl; + ArrowsInfo::const_iterator i; + for (i = myArrows.begin(); i != myArrows.end(); i++ ) { + DependencyTree_Arrow* arrow = i->second; + if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) { + isFind = true; + std::cout<<" theSame " << std::endl; + } + else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) { + arrow->setIsBiLink( true ); + std::cout<<" Bilink " << std::endl; + isFind = true; + } + } + + if( !isFind ) { + DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem); + myArrows[std::pair( startItem, endItem )] = arrow; + std::cout<<" addArrow " << std::endl; + } +} + +void DependencyTree_View::parseTree() +{ + + GEOMUtils::TreeModel::const_iterator i; + for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { + std::string objectEntry = i->first; + addNode( objectEntry ); + parseTreeWard( i->second.first ); + if( i->second.first.size() > myMaxUpwardLevelsNumber ) + myMaxUpwardLevelsNumber = i->second.first.size(); + parseTreeWard( i->second.second ); + if( i->second.second.size() > myMaxDownwardLevelsNumber ) + myMaxDownwardLevelsNumber = i->second.second.size(); + } + + for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { + DependencyTree_Object* Main_object = myTreeMap[i->first]; + if( i->second.first.size() > 0 ) { + GEOMUtils::LevelInfo Levelup = i->second.first.at(0); + GEOMUtils::LevelInfo::const_iterator node; + for (node = Levelup.begin(); node != Levelup.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[node->first]; + addArrow( Main_object, object ); } - aSelMgr->setSelectedObjects( listIO, true ); + } + parseTreeWardArrow( i->second.first ); + parseTreeWardArrow( i->second.second ); + } + + +} +void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard) +{ + int levelsNumber = theWard.size(); + for( int level = 0; level < levelsNumber; level++ ) { + GEOMUtils::LevelInfo levelInfo = theWard[ level ]; + GEOMUtils::LevelInfo::const_iterator node; + for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { + addNode( node->first ); + } + } +} +void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard) +{ + for(int j = 0; j < theWard.size(); j++ ) { + GEOMUtils::LevelInfo Level = theWard.at(j); + GEOMUtils::LevelInfo::const_iterator node; + for (node = Level.begin(); node != Level.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[node->first]; + std::vector Links = node->second; + for( int link = 0; link < Links.size(); link++ ) { + DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; + if( object && LinkObject ) + addArrow( object, LinkObject ); + } + } + } +} + +void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard, + std::map< std::string, int >& theEntryLevelMap, + std::map< int, std::vector< std::string > >& theLevelObjects, + int theCurrentLevel, const int theLevelStep ) +{ + for( int level = 0; level < theWard.size(); level++ ) { + if( level >= myLevelsNumber || !myIsCompute ) + return; + myComputedCost++; + sleep(1); + theCurrentLevel += theLevelStep; + GEOMUtils::LevelInfo levelInfo = theWard.at( level ); + GEOMUtils::LevelInfo::const_iterator node; + for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[ node->first ]; + if( !isItemAdded( object ) ) { + addItem( object ); + object->unselect(); + theEntryLevelMap[ node->first ] = theCurrentLevel; + theLevelObjects[ theCurrentLevel ].push_back( node->first ); + } + } + } +} + +void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard ) +{ + for(int j = 0; j < theWard.size(); j++ ) { + if( j >= myLevelsNumber || !myIsCompute ) + break; + myComputedCost++; + sleep(1); + GEOMUtils::LevelInfo Level = theWard.at(j); + GEOMUtils::LevelInfo::const_iterator node; + for (node = Level.begin(); node != Level.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[node->first]; + GEOMUtils::NodeLinks Links = node->second; + for( int link = 0; link < Links.size(); link++ ) { + DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; + if( isItemAdded( object ) && isItemAdded( LinkObject ) ) { + DependencyTree_Arrow* arrow = myArrows[std::pair(object, LinkObject)]; + if( arrow && !isItemAdded( arrow) ) + addItem( arrow ); + } + } + } + } +} + +void DependencyTree_View::getNewTreeModel() +{ + clearView( true ); + + SALOME_ListIO aSelList; + mySelectionMgr->selectedObjects( aSelList ); + + // create a list of selected object entry + GEOM::string_array_var objectsEntry = new GEOM::string_array(); + objectsEntry->length( aSelList.Extent()); + int iter = 0; + for ( SALOME_ListIteratorOfListIO It( aSelList ); It.More(); It.Next(), iter++ ) { + Handle( SALOME_InteractiveObject ) io = It.Value(); + GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil(); + geomObject = GEOMBase::ConvertIOinGEOMObject( io ); + QString entry = geomObject->GetEntry(); + objectsEntry[ iter ] = entry.toLatin1().constData(); + } + + // get string which describes dependency tree structure + SALOMEDS::TMPFile_var SeqFile = + GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, objectsEntry ); + char* buf = (char*) &SeqFile[0]; + + std::cout << "\n\n\n\n\n TREE = " << buf << std::endl; + + // get dependency tree structure + GEOMUtils::ConvertStringToTree( buf, myTreeModel ); + + mySelectionMgr->clearSelected(); + + parseTree(); + } -//================================================================================ -//================================================================================ +void DependencyTree_View::clearView( bool isClearModel ) +{ + EntryObjectMap::const_iterator objectIter; + for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) { + DependencyTree_Object* object = objectIter->second; + if( isItemAdded( object ) && object ) + removeItem( object ); + } + + ArrowsInfo::const_iterator arrowIter; + for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) { + DependencyTree_Arrow* object = arrowIter->second; + if( isItemAdded( object ) && object ) + removeItem( object ); + } + if( isClearModel ) { + myTreeMap.clear(); + myArrows.clear(); + myTreeModel.clear(); + myMaxDownwardLevelsNumber = 0; + myMaxUpwardLevelsNumber = 0; + myLevelsNumber = 0; + myIsCompute = true; + myIsUpdate = true; + } +} -DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread(DependencyTree_View* theView) +int DependencyTree_View::checkMaxLevelsNumber() +{ + if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() ) + return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber; + else if( myDisplayAscendants ->isChecked() ) + return myMaxUpwardLevelsNumber; + else if( myDisplayDescendants->isChecked() ) + return myMaxDownwardLevelsNumber; +} + +void DependencyTree_View::calcTotalCost() +{ + myTotalCost = myTreeModel.size(); + GEOMUtils::TreeModel::const_iterator i; + for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { + if( myDisplayAscendants->isChecked() ) + myTotalCost += 2*( myLevelsNumber < i->second.first.size() ? myLevelsNumber : i->second.first.size() ); + if( myDisplayDescendants->isChecked() ) + myTotalCost += 2*( myLevelsNumber < i->second.second.size() ? myLevelsNumber : i->second.second.size() ); + } +} + +double DependencyTree_View::getComputeProgress() +{ + return double( myComputedCost ) / double( myTotalCost ); +} + +void DependencyTree_View::changeWidgetState( bool theIsCompute ) +{ + cancelAction->setVisible( theIsCompute ); + progressAction->setVisible( theIsCompute ); + + myHierarchyDepth->setEnabled( !theIsCompute ); + myDisplayAscendants->setEnabled( !theIsCompute ); + myDisplayDescendants->setEnabled( !theIsCompute ); +} + +DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread( DependencyTree_View* theView ) { myView = theView; } @@ -753,7 +682,7 @@ DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread(DependencyT void DependencyTree_ComputeDlg_QThread::run() { myView->setIsCompute( true ); - myView->onRedrawTree(); + myView->drawTree(); } bool DependencyTree_ComputeDlg_QThread::result() @@ -765,81 +694,3 @@ void DependencyTree_ComputeDlg_QThread::cancel() { myView->setIsCompute( false ); } - -////================================================================================ -////================================================================================ -// -//DependencyTree_ComputeDlg_QThreadQDialog::DependencyTree_ComputeDlg_QThreadQDialog(QWidget* parent, -// DependencyTree_View* theView) -// : QDialog(parent, -// Qt::WindowSystemMenuHint | -// Qt::WindowCloseButtonHint | -// Qt::Dialog | -// Qt::WindowMaximizeButtonHint), -// qthread( theView ) -//{ -// // -- -// setWindowTitle(tr("TITLE")); -// setMinimumWidth( 200 ); -// -// cancelButton = new QPushButton(tr("CANCEL")); -// cancelButton->setDefault(true); -// cancelButton->setCheckable(true); -// -// progressBar = new QProgressBar(this); -// progressBar->setMinimum( 0 ); -// progressBar->setMaximum( 1000 ); -// -// QGridLayout* layout = new QGridLayout(this); -// layout->setMargin( 11 ); -// layout->setSpacing( 6 ); -// int row = 0; -// layout->addWidget(progressBar, row++, 0, 1, 2); -// layout->addWidget(cancelButton, row++, 0, 1, 2); -// adjustSize(); -// update(); -// -// connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel())); -// // -- -// startTimer(300); // millisecs -// qthread.start(); -//} -// -//bool DependencyTree_ComputeDlg_QThreadQDialog::result() -//{ -// return qthread.result(); -//} -// -//void DependencyTree_ComputeDlg_QThreadQDialog::onCancel() -//{ -// qthread.cancel(); -// cancelButton->setText( tr("CANCELING")); -// cancelButton->setEnabled(false); -//} -// -//void DependencyTree_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event) -//{ -// if ( !cancelButton->isChecked() ) // not yet cancelled -// // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() ); -// progressBar->setValue( 10 ); -// -// if(qthread.isFinished()) -// { -// close(); -// } -// -// event->accept(); -//} -// -//void DependencyTree_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event) -//{ -// if(qthread.isRunning()) -// { -// event->ignore(); -// return; -// } -// event->accept(); -//} -// - - diff --git a/src/DependencyTree/DependencyTree_View.h b/src/DependencyTree/DependencyTree_View.h index 19c5d0b23..a640462ca 100644 --- a/src/DependencyTree/DependencyTree_View.h +++ b/src/DependencyTree/DependencyTree_View.h @@ -22,6 +22,9 @@ #include #include +#include + +#include #include @@ -55,6 +58,9 @@ private: DependencyTree_View* myView; }; +typedef std::map EntryObjectMap; +typedef std::map,DependencyTree_Arrow*> ArrowsInfo; + class DependencyTree_View: public GraphicsView_ViewPort { Q_OBJECT @@ -64,6 +70,13 @@ public: DependencyTree_View( QWidget* = 0 ); ~DependencyTree_View(); + void init( GraphicsView_ViewFrame* ); + void updateModel(); + void drawTree(); + + virtual int select( const QRectF&, bool ); + void mouseMoveEvent(QMouseEvent *event); + void setHierarchyType( const int ); void setNodesMovable( const bool ); void setPrefBackgroundColor( const QColor& ); @@ -74,58 +87,48 @@ public: void setHighlightArrowColor( const QColor& ); void setSelectArrowColor( const QColor& ); - virtual int select( const QRectF&, bool ); + void setIsCompute( bool ); + bool getIsCompute(); -// typedef QList NodeLinks; -// typedef QMap LevelInfo; -// typedef QList LevelsList; -// typedef QMap > TreeModel; - - GEOMUtils::TreeModel myTreeModel; - std::map myTreeMap; - std::map,DependencyTree_Arrow*> Arrows; - - std::map myLevelMap; - - std::map< int, std::vector > myLevelsObject; - int myCurrentLevel; - - void init( GraphicsView_ViewFrame* ); - - void onRedrawTree(); +protected: + void timerEvent( QTimerEvent* ); + void closeEvent( QCloseEvent* ); - void setIsCompute( bool theIsCompute ); - bool getIsCompute() { return myIsCompute; }; private slots: - void onUpdateTree(); void updateView(); void onMoveNodes( bool ); void onHierarchyType(); - -protected: - void timerEvent(QTimerEvent *timer); - void closeEvent(QCloseEvent *event); - -private slots: void onCancel(); +signals: + private: -// void parseData( QString& data ); + + void addNode( const std::string& ); + void addArrow( DependencyTree_Object*, DependencyTree_Object* ); void parseTree(); void parseTreeWard(const GEOMUtils::LevelsList); void parseTreeWardArrow(const GEOMUtils::LevelsList); - void addNode( const std::string& entry ); - void addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem ); - void findArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem ); -// GEOMUtils::LevelsList parseWard( const QString& data, int& cursor ); - void drawTree(); - void drawWard( GEOMUtils::LevelsList ward, const int levelStep ); - void drawArrows(); + void drawWard( const GEOMUtils::LevelsList&, std::map< std::string, int >&, + std::map< int, std::vector< std::string > >&, int, const int ); void drawWardArrows( GEOMUtils::LevelsList ); + void getNewTreeModel(); + void clearView( bool ); + int checkMaxLevelsNumber(); + void calcTotalCost(); + double getComputeProgress(); + + void changeWidgetState( bool ); + + GEOMUtils::TreeModel myTreeModel; + + EntryObjectMap myTreeMap; + ArrowsInfo myArrows; + int myLevelsNumber; int myMaxDownwardLevelsNumber; int myMaxUpwardLevelsNumber; @@ -134,23 +137,23 @@ private: QSpinBox* myHierarchyDepth; QCheckBox* myDisplayAscendants; QCheckBox* myDisplayDescendants; - - std::string myData; + QWidgetAction* cancelAction; + QWidgetAction* progressAction; int myTimer; bool myIsUpdate; - GraphicsView_ViewFrame* myViewFrame; - bool myIsCompute; + + int myTotalCost; + int myComputedCost; + DependencyTree_ComputeDlg_QThread* qthread; - QPushButton * cancelButton; - QProgressBar* progressBar; - QWidgetAction* cancelAction; - QWidgetAction* progressAction; - //SALOMEDS::Study_var myStudy; + + SALOMEDS::Study_var myStudy; + LightApp_SelectionMgr* mySelectionMgr; }; -- 2.39.2