X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSPlot2d%2FSPlot2d_ViewModel.cxx;h=c811b9680b6d0d0bf30b865d25231c07ec76c06b;hb=8d54f199bd9ead3c2f0c704322975198e65264d6;hp=527a8a135209102df824e0c2c7442265b3444b83;hpb=f830c97c748d8f8a6a7eccc8e3a58e19066a1181;p=modules%2Fgui.git diff --git a/src/SPlot2d/SPlot2d_ViewModel.cxx b/src/SPlot2d/SPlot2d_ViewModel.cxx index 527a8a135..c811b9680 100644 --- a/src/SPlot2d/SPlot2d_ViewModel.cxx +++ b/src/SPlot2d/SPlot2d_ViewModel.cxx @@ -1,45 +1,53 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// +// 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. -// -// 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 +// 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 +// 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 "utilities.h" -#include "qapplication.h" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include + +//#include #include +#include #include -using namespace std; - //ASL: Temporary commented in order to avoir dependency on SALOMEDS //#include "SALOMEDSClient.hxx" @@ -69,7 +77,8 @@ using namespace std; Constructor */ SPlot2d_Viewer::SPlot2d_Viewer( bool theAutoDel ) -: Plot2d_Viewer( theAutoDel ) +: Plot2d_Viewer( theAutoDel ), + myDeselectAnalytical(true) { } @@ -84,26 +93,25 @@ SPlot2d_Viewer::~SPlot2d_Viewer() Renames curve if it is found */ void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject, - const QString& newName, Plot2d_ViewFrame* fr ) + const QString& newName, Plot2d_ViewFrame* fr ) { Plot2d_ViewFrame* aViewFrame = fr ? fr : getActiveViewFrame(); if( !aViewFrame ) return; - QIntDictIterator it( aViewFrame->getCurves() ); - for( ; it.current(); ++it ) + CurveDict aCurves = aViewFrame->getCurves(); + CurveDict::Iterator it = aCurves.begin(); + for( ; it != aCurves.end(); ++it ) { - SPlot2d_Curve* aCurve = dynamic_cast( it.current() ); + SPlot2d_Curve* aCurve = dynamic_cast( it.value() ); if( aCurve && aCurve->hasIO() && aCurve->getIO()->isSame( IObject ) ) { aCurve->setVerTitle( newName ); - int key = aViewFrame->hasCurve( aCurve ); - if( key ) - aViewFrame->setCurveTitle( key, newName ); + it.key()->setTitle( newName ); } if( aCurve && aCurve->hasTableIO() && aCurve->getTableIO()->isSame( IObject ) ) - aCurve->getTableIO()->setName( newName.latin1() ); + aCurve->getTableIO()->setName( newName.toLatin1() ); } aViewFrame->updateTitles(); } @@ -118,7 +126,8 @@ void SPlot2d_Viewer::renameAll( const Handle(SALOME_InteractiveObject)& IObj, co SUIT_ViewManager* vm = getViewManager(); if ( vm ) { - const QPtrVector& wnds = vm->getViews(); + const QVector& wnds = vm->getViews(); + for ( uint i = 0; i < wnds.size(); i++ ) { Plot2d_ViewWindow* pwnd = dynamic_cast( wnds.at( i ) ); @@ -139,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; } } } @@ -174,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 ); @@ -207,10 +218,10 @@ 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 ); } } */ @@ -261,30 +272,26 @@ void SPlot2d_Viewer::Erase( const SALOME_Prs2d* prs, const bool ) SALOME_Prs* SPlot2d_Viewer::CreatePrs( const char* entry ) { Plot2d_ViewFrame* aViewFrame = getActiveViewFrame(); + SPlot2d_Prs *prs = new SPlot2d_Prs(); if(aViewFrame) { - Plot2d_Prs* prs = aViewFrame->CreatePrs(entry); - if( prs ) - return new SPlot2d_Prs( prs ); + 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; -} - -/*! - Axiluary method called before displaying of objects -*/ -void SPlot2d_Viewer::BeforeDisplay( SALOME_Displayer* d ) -{ - d->BeforeDisplay( this, SALOME_Plot2dViewType() ); -} - -/*! - Axiluary method called after displaying of objects -*/ -void SPlot2d_Viewer::AfterDisplay( SALOME_Displayer* d ) -{ - d->AfterDisplay( this, SALOME_Plot2dViewType() ); + return prs; } /*! @@ -299,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 */ @@ -308,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; } @@ -340,18 +365,19 @@ Plot2d_ViewFrame* SPlot2d_Viewer::getActiveViewFrame() \param fr - viewframe */ SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject, - Plot2d_ViewFrame* fr ) + Plot2d_ViewFrame* fr ) { if ( !theIObject.IsNull() ) { 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; + } } } } @@ -359,36 +385,115 @@ SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObje } /*! - SLOT: called when action "Clone view" is activated + create SPlot2d_ViewWindow */ -void SPlot2d_Viewer::onCloneView( Plot2d_ViewFrame* clonedVF, Plot2d_ViewFrame* newVF ) +SUIT_ViewWindow* SPlot2d_Viewer::createView( SUIT_Desktop* theDesktop ) { - if( !clonedVF || !newVF ) - return; - - // 1) Copy all properties of view - - newVF->copyPreferences( clonedVF ); + SPlot2d_ViewWindow* aPlot2dView = new SPlot2d_ViewWindow(theDesktop, this); + aPlot2dView->initLayout(); + if (getPrs()) + aPlot2dView->getViewFrame()->Display(getPrs()); + return aPlot2dView; +} - // 2) Display all curves displayed in cloned view +/*! + 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; - QList aCurves; - clonedVF->getCurves( aCurves ); - QList::const_iterator anIt = aCurves.begin(), aLast = aCurves.end(); + 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; + } - for( ; anIt!=aLast; anIt++ ) - if( clonedVF->isVisible( *anIt ) ) - newVF->displayCurve( *anIt, false ); - newVF->Repaint(); + 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 ); + } } /*! - create SPlot2d_ViewWindow + */ -SUIT_ViewWindow* SPlot2d_Viewer::createView( SUIT_Desktop* theDesktop ) -{ - SPlot2d_ViewWindow* aPlot2dView = new SPlot2d_ViewWindow(theDesktop, this); - if (getPrs()) - aPlot2dView->getViewFrame()->Display(getPrs()); - return aPlot2dView; +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(); + } }