X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSPlot2d%2FSPlot2d_ViewModel.cxx;h=c811b9680b6d0d0bf30b865d25231c07ec76c06b;hb=8d54f199bd9ead3c2f0c704322975198e65264d6;hp=b90fe2b5cfe1df65aedd8245408ba76616102a39;hpb=2e750f9ded92337bc3c44e9d7388180974cc4a43;p=modules%2Fgui.git diff --git a/src/SPlot2d/SPlot2d_ViewModel.cxx b/src/SPlot2d/SPlot2d_ViewModel.cxx index b90fe2b5c..c811b9680 100644 --- a/src/SPlot2d/SPlot2d_ViewModel.cxx +++ b/src/SPlot2d/SPlot2d_ViewModel.cxx @@ -1,34 +1,63 @@ +// Copyright (C) 2007-2014 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 +// +// 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + // File : SPlot2d_Viewer.cxx // Author : Sergey RUIN // Module : SUIT - +// #include "SPlot2d_ViewModel.h" +#include "SPlot2d_ViewWindow.h" + #include "SPlot2d_Prs.h" +#include "SPlot2d_Histogram.h" #include "SUIT_Session.h" #include "SUIT_Application.h" +#include "SUIT_ViewManager.h" + +#include "SALOME_ListIO.hxx" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include +#include +#include +#include +#include -#include "utilities.h" -#include "qapplication.h" -#include -#include -#include -#include -#include +//#include #include +#include #include -#include "utilities.h" -using namespace std; +//ASL: Temporary commented in order to avoir dependency on SALOMEDS -#include "SALOMEDSClient.hxx" -#include "SALOMEDS_StudyManager.hxx" +//#include "SALOMEDSClient.hxx" +//#include "SALOMEDS_StudyManager.hxx" // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study. // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from // SALOMEDS::StudyManager - no linkage with SalomeApp. -static _PTR(Study) getStudyDS() +/*static _PTR(Study) getStudyDS() { SALOMEDSClient_Study* aStudy = NULL; _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() ); @@ -42,17 +71,14 @@ static _PTR(Study) getStudyDS() const int id = stud->id(); // virtual method, must return SALOMEDS_Study id // get SALOMEDS_Study with this id from StudyMgr return aMgr->GetStudyByID( id ); -} - -//================================================================================= -// SPlot2d_Viewer implementation -//================================================================================= +} */ /*! Constructor */ SPlot2d_Viewer::SPlot2d_Viewer( bool theAutoDel ) -: Plot2d_Viewer( theAutoDel ) +: Plot2d_Viewer( theAutoDel ), + myDeselectAnalytical(true) { } @@ -66,17 +92,46 @@ SPlot2d_Viewer::~SPlot2d_Viewer() /*! Renames curve if it is found */ -void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName ) +void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject, + const QString& newName, Plot2d_ViewFrame* fr ) { - Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); - if(aViewFrame == NULL) return; + Plot2d_ViewFrame* aViewFrame = fr ? fr : getActiveViewFrame(); + if( !aViewFrame ) + return; + + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) + { + SPlot2d_Curve* aCurve = dynamic_cast( it.value() ); + if( aCurve && aCurve->hasIO() && aCurve->getIO()->isSame( IObject ) ) + { + aCurve->setVerTitle( newName ); + it.key()->setTitle( newName ); + } - Plot2d_Curve* curve = getCurveByIO( IObject ); - if ( curve ) { - curve->setVerTitle( newName ); - int key = aViewFrame->hasCurve( curve ); - if ( key ) { - aViewFrame->setCurveTitle( key, newName ); + if( aCurve && aCurve->hasTableIO() && aCurve->getTableIO()->isSame( IObject ) ) + aCurve->getTableIO()->setName( newName.toLatin1() ); + } + aViewFrame->updateTitles(); +} + +/*! + Renames all copies of object in all view windows + \param IObj - object to be renamed + \param name - new name +*/ +void SPlot2d_Viewer::renameAll( const Handle(SALOME_InteractiveObject)& IObj, const QString& name ) +{ + SUIT_ViewManager* vm = getViewManager(); + if ( vm ) + { + const QVector& wnds = vm->getViews(); + + for ( uint i = 0; i < wnds.size(); i++ ) + { + Plot2d_ViewWindow* pwnd = dynamic_cast( wnds.at( i ) ); + rename( IObj, name, pwnd->getViewFrame() ); } } } @@ -93,11 +148,12 @@ bool SPlot2d_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& IObject return 1; else{ if(!IObject.IsNull()){ - QIntDictIterator it(aViewFrame->getCurves()); - for(; it.current();++it) { - SPlot2d_Curve* aCurve = dynamic_cast(it.current()); - if(aCurve->hasIO() && aCurve->getTableIO()->isSame(IObject)) - return 1; + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + SPlot2d_Curve* aCurve = dynamic_cast( it.value() ); + if(aCurve && aCurve->hasIO() && aCurve->getTableIO()->isSame(IObject)) + return 1; } } } @@ -128,9 +184,10 @@ void SPlot2d_Viewer::DisplayOnly( const Handle(SALOME_InteractiveObject)& IObjec if(aViewFrame == NULL) return; Plot2d_Curve* curve = getCurveByIO( IObject ); - QIntDictIterator it( aViewFrame->getCurves() ); - for ( ; it.current(); ++it ) { - if(it.current() != curve) + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + if(it.value() != curve) aViewFrame->eraseCurve( curve ); else aViewFrame->updateCurve( curve, false ); @@ -152,7 +209,8 @@ void SPlot2d_Viewer::Erase( const Handle(SALOME_InteractiveObject)& IObject, boo aViewFrame->eraseCurve( curve, update ); // it can be table or container object selected - _PTR(Study) aStudy = getStudyDS(); + //ASL: Temporary commented in order to avoid dependency on SALOMEDS +/* _PTR(Study) aStudy = getStudyDS(); _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); if ( aSO ) { _PTR(ChildIterator) aIter = aStudy->NewChildIterator( aSO ); @@ -160,13 +218,13 @@ void SPlot2d_Viewer::Erase( const Handle(SALOME_InteractiveObject)& IObject, boo _PTR(SObject) aChildSO = aIter->Value(); _PTR(SObject) refSO; if ( aChildSO->ReferencedObject( refSO ) && refSO ) - aChildSO = refSO; + aChildSO = refSO; curve = getCurveByIO( new SALOME_InteractiveObject( aChildSO->GetID().c_str(), "") ); if ( curve ) - aViewFrame->eraseCurve( curve, update ); + aViewFrame->eraseCurve( curve, update ); } } - +*/ } @@ -188,12 +246,9 @@ void SPlot2d_Viewer::Repaint() if(aViewFrame) aViewFrame->Repaint(); } -//========================================================== /*! - * SPlot2d_Viewer::Display - * Display presentation - */ -//========================================================== + Display presentation +*/ void SPlot2d_Viewer::Display( const SALOME_Prs2d* prs ) { Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); @@ -201,12 +256,9 @@ void SPlot2d_Viewer::Display( const SALOME_Prs2d* prs ) if(aViewFrame && aPrs) aViewFrame->Display(aPrs); } -//========================================================== /*! - * SPlot2d_Viewer::Erase - * Erase presentation - */ -//========================================================== + Erase presentation +*/ void SPlot2d_Viewer::Erase( const SALOME_Prs2d* prs, const bool ) { Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); @@ -214,42 +266,32 @@ void SPlot2d_Viewer::Erase( const SALOME_Prs2d* prs, const bool ) if(aViewFrame && aPrs) aViewFrame->Erase(aPrs); } -//========================================================== /*! - * SPlot2d_Viewer::CreatePrs - * Create presentation by entry - */ -//========================================================== + Create presentation by entry +*/ SALOME_Prs* SPlot2d_Viewer::CreatePrs( const char* entry ) { Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); - if(aViewFrame) { - return new SPlot2d_Prs(aViewFrame->CreatePrs(entry)); + SPlot2d_Prs *prs = new SPlot2d_Prs(); + if(aViewFrame) + { + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + SPlot2d_Curve* aCurve = dynamic_cast(it.value()); + OwnerSet owners = aCurve->getOwners(); + if(aCurve) { + if ( + (aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), entry )) || + (aCurve->hasTableIO() && !strcmp( aCurve->getTableIO()->getEntry(), entry )) || + owners.contains(entry) + ) { + prs->AddObject(aCurve); + } + } + } } - - return NULL; -} - -//========================================================== -/*! - * SPlot2d_Viewer::BeforeDisplay - * Axiluary method called before displaying of objects - */ -//========================================================== -void SPlot2d_Viewer::BeforeDisplay( SALOME_Displayer* d ) -{ - d->BeforeDisplay( this, SALOME_Plot2dViewType() ); -} - -//========================================================== -/*! - * SPlot2d_Viewer::AfterDisplay - * Axiluary method called after displaying of objects - */ -//========================================================== -void SPlot2d_Viewer::AfterDisplay( SALOME_Displayer* d ) -{ - d->AfterDisplay( this, SALOME_Plot2dViewType() ); + return prs; } /*! @@ -264,6 +306,23 @@ bool SPlot2d_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& IObject return aViewFrame->isVisible( curve ); } +/*! + \Collect objects visible in viewer + \param theList - visible objects collection +*/ +void SPlot2d_Viewer::GetVisible( SALOME_ListIO& theList ) +{ + Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); + if(aViewFrame == NULL) return; + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + SPlot2d_Curve* aCurve = dynamic_cast(it.value()); + if ( aCurve && aCurve->hasIO() && aViewFrame->isVisible( aCurve ) ) + theList.Append( aCurve->getIO() ); + } +} + /*! Return interactive obeject if is presented in the viewer */ @@ -273,10 +332,11 @@ Handle(SALOME_InteractiveObject) SPlot2d_Viewer::FindIObject( const char* Entry Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); if(aViewFrame == NULL) return anIO; - QIntDictIterator it( aViewFrame->getCurves() ); - for ( ; it.current(); ++it ) { - SPlot2d_Curve* aCurve = dynamic_cast(it.current()); - if ( aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), Entry ) ) { + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + SPlot2d_Curve* aCurve = dynamic_cast(it.value()); + if ( aCurve && aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), Entry ) ) { anIO = aCurve->getIO(); break; } @@ -284,12 +344,9 @@ Handle(SALOME_InteractiveObject) SPlot2d_Viewer::FindIObject( const char* Entry return anIO; } -//========================================================== /*! - * SPlot2d_Viewer::getActiveViewFrame - * Returns an active Plot2d ViewFrame or NULL - */ -//========================================================== + Returns an active Plot2d ViewFrame or NULL +*/ Plot2d_ViewFrame* SPlot2d_Viewer::getActiveViewFrame() { SUIT_ViewManager* aViewMgr = getViewManager(); @@ -302,21 +359,141 @@ Plot2d_ViewFrame* SPlot2d_Viewer::getActiveViewFrame() return NULL; } -SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject ) +/*! + \return curve by object and viewframe + \param theIObject - object + \param fr - viewframe +*/ +SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject, + Plot2d_ViewFrame* fr ) { if ( !theIObject.IsNull() ) { - Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); + Plot2d_ViewFrame* aViewFrame = fr ? fr : getActiveViewFrame(); if(aViewFrame) { - QIntDictIterator it( aViewFrame->getCurves() ); - for ( ; it.current(); ++it ) { - SPlot2d_Curve* aCurve = dynamic_cast(it.current()); - if(aCurve) { - if ( aCurve->hasIO() && aCurve->getIO()->isSame( theIObject ) ) - return aCurve; - } + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { + SPlot2d_Curve* aCurve = dynamic_cast( it.value() ); + if(aCurve) { + if ( aCurve->hasIO() && aCurve->getIO()->isSame( theIObject ) ) + return aCurve; + } } } } return NULL; } +/*! + create SPlot2d_ViewWindow +*/ +SUIT_ViewWindow* SPlot2d_Viewer::createView( SUIT_Desktop* theDesktop ) +{ + SPlot2d_ViewWindow* aPlot2dView = new SPlot2d_ViewWindow(theDesktop, this); + aPlot2dView->initLayout(); + if (getPrs()) + aPlot2dView->getViewFrame()->Display(getPrs()); + return aPlot2dView; +} + +/*! + SLOT: called when action "Legend Clicked" is activated. + override "onLegendClicked" method from Plot2d_ViewModel. +*/ +void SPlot2d_Viewer::onLegendClicked( QwtPlotItem* plotItem ) +{ + Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); + if(aViewFrame == NULL) return; + + bool isAnalytical = false; + AnalyticalCurveList curves = aViewFrame->getAnalyticalCurves(); + foreach ( Plot2d_AnalyticalCurve* curve, curves ) { + if(plotItem == curve->plotItem()) { + isAnalytical = true; + curve->setSelected(true); + } else { + curve->setSelected(false); + } + } + if(isAnalytical) { + myDeselectAnalytical = false; + emit clearSelected(); + aViewFrame->updateAnalyticalCurves(); + myDeselectAnalytical = true; + return; + } + + Plot2d_Object* anObject = aViewFrame->getPlotObject(plotItem); + + if(anObject) { + + // Highlight object in Object Browser + QString anEntry; + if(SPlot2d_Curve* aSCurve = dynamic_cast(anObject)) { + if(aSCurve->hasIO()) + anEntry = aSCurve->getIO()->getEntry(); + } else if( SPlot2d_Histogram* aSHisto = dynamic_cast(anObject)) { + if(aSHisto->hasIO()) + anEntry = aSHisto->getIO()->getEntry(); + } + + if(!anEntry.isEmpty()) + emit legendSelected( anEntry ); + } +} + +/*! + +*/ +void SPlot2d_Viewer::setObjectsSelected( SALOME_ListIO& theList ) { + Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); + if(aViewFrame) { + + objectList allObjects; + aViewFrame->getObjects( allObjects ); + + bool isSelected = false; + SPlot2d_Histogram* h = 0; + SPlot2d_Curve* c =0; + + foreach ( Plot2d_Object* o, allObjects ) { + isSelected = false; + + Handle(SALOME_InteractiveObject) io; + if( (h = dynamic_cast(o)) && h->hasIO() ) { + io = h->getIO(); + } else if((c = dynamic_cast(o)) && c->hasIO()) { + io = c->getIO(); + } else { + continue; + } + + SALOME_ListIteratorOfListIO anIter( theList ); + + for( ; anIter.More(); anIter.Next() ) { + if ( anIter.Value()->hasEntry() ) { + if( io->isSame(anIter.Value()) ) { + isSelected = o->isSelected(); + if( !isSelected ) { + o->setSelected(true); + aViewFrame->updateObject(o); + theList.Remove(anIter); + isSelected = true; + break; + } else + break; + } + } + } + if( !isSelected && o->isSelected() != false ) { + o->setSelected(false); + aViewFrame->updateObject(o); + } + } + if( myDeselectAnalytical ) { + aViewFrame->deselectAnalyticalCurves(); + aViewFrame->updateAnalyticalCurves(); + } + aViewFrame->Repaint(); + } +}