X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSVTK%2FSVTK_ViewWindow.cxx;h=d56dde955cb163a7d2ecb1ae12e500e2f75d6d9c;hb=02904c3728214667f919cfe06072a91e1687b12f;hp=4f7091ac4c21d289fbd84f8c4a25849bc5f54d24;hpb=a48e2133ac843c24e4e25dad47c7caa538f8716d;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 4f7091ac4..d56dde955 100755 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// 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 @@ -6,7 +6,7 @@ // 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. +// 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 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,7 @@ #include "SUIT_ViewManager.h" #include "QtxActionToolMgr.h" #include "QtxMultiAction.h" +#include "QtxActionGroup.h" #include "VTKViewer_Utilities.h" #include "VTKViewer_Trihedron.h" @@ -146,12 +148,18 @@ SVTK_ViewWindow::SVTK_ViewWindow(SUIT_Desktop* theDesktop): */ void SVTK_ViewWindow::Initialize(SVTK_ViewModelBase* theModel) { + myModel = theModel; myInteractor = new SVTK_RenderWindowInteractor(this,"SVTK_RenderWindowInteractor"); - SVTK_Selector* aSelector = SVTK_Selector::New(); - aSelector->SetDynamicPreSelection( SUIT_Session::session()->resourceMgr()-> - booleanValue( "VTKViewer", "dynamic_preselection", true ) ); - + SVTK_Selector* aSelector = SVTK_Selector::New(); + int aPreselectionMode = SUIT_Session::session()->resourceMgr()-> + integerValue( "VTKViewer", "preselection", Standard_Preselection ); + aSelector->SetDynamicPreSelection( aPreselectionMode == Dynamic_Preselection ); + aSelector->SetPreSelectionEnabled( aPreselectionMode != Preselection_Disabled ); + bool isSelectionEnabled = SUIT_Session::session()->resourceMgr()-> + booleanValue( "VTKViewer", "enable_selection", true ); + aSelector->SetSelectionEnabled( isSelectionEnabled ); + SVTK_GenericRenderWindowInteractor* aDevice = SVTK_GenericRenderWindowInteractor::New(); aDevice->SetRenderWidget(myInteractor); aDevice->SetSelector(aSelector); @@ -791,9 +799,9 @@ bool SVTK_ViewWindow::isCubeAxesDisplayed() /*! Redirect the request to #SVTK_Renderer::OnViewTrihedron */ -void SVTK_ViewWindow::onViewTrihedron() +void SVTK_ViewWindow::onViewTrihedron(bool show) { - GetRenderer()->OnViewTrihedron(); + GetRenderer()->SetTrihedronVisibility(show); Repaint(); } @@ -891,12 +899,28 @@ void SVTK_ViewWindow::SetZoomingStyle(const int theStyle) } /*! - Switch dynamic preselection on / off - \param theDynPreselection - dynamic pre-selection mode + Set preselection mode. + \param theMode the mode to set (standard, dynamic or disabled) +*/ +void SVTK_ViewWindow::SetPreSelectionMode( Preselection_Mode theMode ) +{ + onSwitchPreSelectionMode( theMode ); +} + +/*! + Enables/disables selection. + \param theEnable if true - selection will be enabled */ -void SVTK_ViewWindow::SetDynamicPreSelection( bool theDynPreselection ) +void SVTK_ViewWindow::SetSelectionEnabled( bool theEnable ) { - onSwitchDynamicPreSelection( theDynPreselection ); + GetSelector()->SetSelectionEnabled( theEnable ); + QtxAction* a = getAction( EnableSelectionId ); + if ( a->isChecked() != theEnable) + a->setChecked( theEnable ); + QtxActionGroup* aPreselectionGroup = + dynamic_cast( getAction( PreselectionId ) ); + if ( aPreselectionGroup ) + aPreselectionGroup->setEnabled( theEnable ); } /*! @@ -946,16 +970,29 @@ void SVTK_ViewWindow::onSwitchZoomingStyle( bool theOn ) } /*! - Toogles dynamic preselection on/off + Switch preselection mode. + \param theMode the preselection mode */ -void SVTK_ViewWindow::onSwitchDynamicPreSelection( bool theOn ) +void SVTK_ViewWindow::onSwitchPreSelectionMode( int theMode ) { - GetSelector()->SetDynamicPreSelection( theOn ); + GetSelector()->SetDynamicPreSelection( theMode == Dynamic_Preselection ); + GetSelector()->SetPreSelectionEnabled( theMode != Preselection_Disabled ); // update action state if method is called outside - QtxAction* a = getAction( SwitchDynamicPreselectionId ); - if ( a->isChecked() != theOn ) - a->setChecked( theOn ); + QtxAction* a = getAction( StandardPreselectionId + theMode ); + if ( a && !a->isChecked() ) + a->setChecked( true ); +} + +/*! + Enables/disables selection. + \param theOn if true - selection will be enabled +*/ +void SVTK_ViewWindow::onEnableSelection( bool on ) +{ + SVTK_Viewer* aViewer = dynamic_cast(myModel); + if(aViewer) + aViewer->enableSelection(on); } /*! @@ -1829,10 +1866,11 @@ void SVTK_ViewWindow::activateSetRotationSelected(void* theData) } /*! - Set the point selected by user as a rotation point + Set the gravity center of element selected by user as a rotation point */ -void SVTK_ViewWindow::activateStartPointSelection() +void SVTK_ViewWindow::activateStartPointSelection( Selection_Mode theSelectionMode ) { + SetSelectionMode( theSelectionMode ); myEventDispatcher->InvokeEvent(SVTK::StartPointSelection,0); } @@ -2012,8 +2050,11 @@ void SVTK_ViewWindow::createActions(SUIT_ResourceMgr* theResourceMgr) anAction = new QtxAction(tr("MNU_SHOW_TRIHEDRON"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_TRIHEDRON" ) ), tr( "MNU_SHOW_TRIHEDRON" ), 0, this); + anAction->setCheckable( true ); + anAction->setChecked( true ); + anAction->setStatusTip(tr("DSC_SHOW_TRIHEDRON")); - connect(anAction, SIGNAL(activated()), this, SLOT(onViewTrihedron())); + connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onViewTrihedron(bool))); mgr->registerAction( anAction, ViewTrihedronId ); // onNonIsometric: Manage non-isometric params @@ -2094,14 +2135,51 @@ void SVTK_ViewWindow::createActions(SUIT_ResourceMgr* theResourceMgr) connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool))); mgr->registerAction( anAction, SwitchZoomingStyleId ); - // Turn on/off dynamic pre-selection - anAction = new QtxAction(tr("MNU_SVTK_DYNAMIC_PRESLECTION_SWITCH"), - theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_DYNAMIC_PRESLECTION_SWITCH" ) ), - tr( "MNU_SVTK_DYNAMIC_PRESLECTION_SWITCH" ), 0, this); - anAction->setStatusTip(tr("DSC_SVTK_DYNAMIC_PRESLECTION_SWITCH")); + // Pre-selection + QSignalMapper* aSignalMapper = new QSignalMapper( this ); + connect(aSignalMapper, SIGNAL(mapped(int)), this, SLOT(onSwitchPreSelectionMode(int))); + + anAction = new QtxAction(tr("MNU_SVTK_PRESELECTION_STANDARD"), + theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_PRESELECTION_STANDARD" ) ), + tr( "MNU_SVTK_PRESELECTION_STANDARD" ), 0, this); + anAction->setStatusTip(tr("DSC_SVTK_PRESELECTION_STANDARD")); + anAction->setCheckable(true); + connect(anAction, SIGNAL(activated()), aSignalMapper, SLOT(map())); + aSignalMapper->setMapping( anAction, Standard_Preselection ); + mgr->registerAction( anAction, StandardPreselectionId ); + + anAction = new QtxAction(tr("MNU_SVTK_PRESELECTION_DYNAMIC"), + theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_PRESELECTION_DYNAMIC" ) ), + tr( "MNU_SVTK_PRESELECTION_DYNAMIC" ), 0, this); + anAction->setStatusTip(tr("DSC_SVTK_PRESELECTION_DYNAMIC")); anAction->setCheckable(true); - connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchDynamicPreSelection(bool))); - mgr->registerAction( anAction, SwitchDynamicPreselectionId ); + connect(anAction, SIGNAL(activated()), aSignalMapper, SLOT(map())); + aSignalMapper->setMapping( anAction, Dynamic_Preselection ); + mgr->registerAction( anAction, DynamicPreselectionId ); + + anAction = new QtxAction(tr("MNU_SVTK_PRESELECTION_DISABLED"), + theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_PRESELECTION_DISABLED" ) ), + tr( "MNU_SVTK_PRESELECTION_DISABLED" ), 0, this); + anAction->setStatusTip(tr("DSC_SVTK_PRESELECTION_DISABLED")); + anAction->setCheckable(true); + connect(anAction, SIGNAL(activated()), aSignalMapper, SLOT(map())); + aSignalMapper->setMapping( anAction, Preselection_Disabled ); + mgr->registerAction( anAction, DisablePreselectionId ); + + QtxActionGroup* aPreselectionAction = new QtxActionGroup( this, true ); + aPreselectionAction->add( getAction( StandardPreselectionId ) ); + aPreselectionAction->add( getAction( DynamicPreselectionId ) ); + aPreselectionAction->add( getAction( DisablePreselectionId ) ); + mgr->registerAction( aPreselectionAction, PreselectionId ); + + // Selection + anAction = new QtxAction(tr("MNU_SVTK_ENABLE_SELECTION"), + theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_SELECTION" ) ), + tr( "MNU_SVTK_ENABLE_SELECTION" ), 0, this); + anAction->setStatusTip(tr("DSC_SVTK_ENABLE_SELECTION")); + anAction->setCheckable(true); + connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onEnableSelection(bool))); + mgr->registerAction( anAction, EnableSelectionId ); // Start recording myStartAction = new QtxAction(tr("MNU_SVTK_RECORDING_START"), @@ -2149,7 +2227,14 @@ void SVTK_ViewWindow::createToolBar() mgr->append( DumpId, myToolBar ); mgr->append( SwitchInteractionStyleId, myToolBar ); mgr->append( SwitchZoomingStyleId, myToolBar ); - mgr->append( SwitchDynamicPreselectionId, myToolBar ); + + mgr->append( mgr->separator(), myToolBar ); + + mgr->append( PreselectionId, myToolBar ); + mgr->append( EnableSelectionId, myToolBar ); + + mgr->append( mgr->separator(), myToolBar ); + mgr->append( ViewTrihedronId, myToolBar ); QtxMultiAction* aScaleAction = new QtxMultiAction( this ); @@ -2409,22 +2494,22 @@ SUIT_CameraProperties SVTK_ViewWindow::cameraProperties() double anAxialScale[3]; aCamera->OrthogonalizeViewUp(); - aCamera->GetFocalPoint(aFocalPoint); - aCamera->GetPosition(aPosition); - aCamera->GetViewUp(aViewUp); + aCamera->GetFocalPoint( aFocalPoint ); + aCamera->GetPosition( aPosition ); + aCamera->GetViewUp( aViewUp ); - aProps.setFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]); - aProps.setPosition(aPosition[0], aPosition[1], aPosition[2]); - aProps.setViewUp(aViewUp[0], aViewUp[1], aViewUp[2]); - aProps.setMappingScale(aCamera->GetParallelScale()); + aProps.setFocalPoint( aFocalPoint[0], aFocalPoint[1], aFocalPoint[2] ); + aProps.setPosition( aPosition[0], aPosition[1], aPosition[2] ); + aProps.setViewUp( aViewUp[0], aViewUp[1], aViewUp[2] ); + aProps.setMappingScale( aCamera->GetParallelScale() * 2.0 ); - if (aProps.getProjection() == SUIT_CameraProperties::PrjPerspective) + if ( aProps.getProjection() == SUIT_CameraProperties::PrjPerspective ) { - aProps.setViewAngle(aCamera->GetViewAngle()); + aProps.setViewAngle( aCamera->GetViewAngle() ); } - GetRenderer()->GetScale(anAxialScale); - aProps.setAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]); + GetRenderer()->GetScale( anAxialScale ); + aProps.setAxialScale( anAxialScale[0], anAxialScale[1], anAxialScale[2] ); return aProps; } @@ -2454,26 +2539,26 @@ void SVTK_ViewWindow::synchronize( SUIT_ViewWindow* theView ) double anAxialScale[3]; // get common properties - aProps.getViewUp(aViewUp[0], aViewUp[1], aViewUp[2]); - aProps.getPosition(aPosition[0], aPosition[1], aPosition[2]); - aProps.getFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]); - aProps.getAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]); + aProps.getViewUp( aViewUp[0], aViewUp[1], aViewUp[2] ); + aProps.getPosition( aPosition[0], aPosition[1], aPosition[2] ); + aProps.getFocalPoint( aFocalPoint[0], aFocalPoint[1], aFocalPoint[2] ); + aProps.getAxialScale( anAxialScale[0], anAxialScale[1], anAxialScale[2] ); // restore properties to the camera - aCamera->SetViewUp(aViewUp); - aCamera->SetPosition(aPosition); - aCamera->SetFocalPoint(aFocalPoint); - aCamera->SetParallelScale(aProps.getMappingScale()); + aCamera->SetViewUp( aViewUp ); + aCamera->SetPosition( aPosition ); + aCamera->SetFocalPoint( aFocalPoint ); + aCamera->SetParallelScale( aProps.getMappingScale() / 2.0 ); - if (aProps.getProjection() == SUIT_CameraProperties::PrjPerspective) + if ( aProps.getProjection() == SUIT_CameraProperties::PrjPerspective ) { - aCamera->SetViewAngle(aProps.getViewAngle()); + aCamera->SetViewAngle( aProps.getViewAngle() ); } - GetRenderer()->SetScale(anAxialScale); + GetRenderer()->SetScale( anAxialScale ); getRenderer()->ResetCameraClippingRange(); - Repaint(false); + Repaint( false ); blockSignals( blocked ); }