X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOME_SWIG%2FSALOMEGUI_Swig.cxx;h=ff1eaf98bbbec700bfcbf2a40a0aaf50707df4e1;hb=99013c0818f44a7eb370a86ad99c1809f3ff8c5b;hp=f8103bf03f1a2cd2a8c7d1758c8574c913d199a2;hpb=e07448c48ea5b2127e34fc7b8c3427d01c7ce17b;p=modules%2Fgui.git diff --git a/src/SALOME_SWIG/SALOMEGUI_Swig.cxx b/src/SALOME_SWIG/SALOMEGUI_Swig.cxx index f8103bf03..ff1eaf98b 100644 --- a/src/SALOME_SWIG/SALOMEGUI_Swig.cxx +++ b/src/SALOME_SWIG/SALOMEGUI_Swig.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -40,16 +40,29 @@ #include #include #include -#include -#include -#include -#include -#include - #include -#include -#include -#include + +#ifndef DISABLE_SALOMEOBJECT + #include + #include +#ifndef DISABLE_OCCVIEWER + #include + #include +#endif +#ifndef DISABLE_VTKVIEWER + #include + #include + #include + + #include + #include +#endif +#ifndef DISABLE_PLOT2DVIEWER + #include +#endif +#endif + +#include /*! \class SALOMEGUI_Swig @@ -218,7 +231,7 @@ public: virtual void Execute() { if ( LightApp_Study* aStudy = getActiveStudy() ) { - myResult = aStudy->id(); + myResult = aStudy->studyName().toUtf8().constData(); } } }; @@ -471,7 +484,7 @@ void SALOMEGUI_Swig::DisplayOnly( const char* theEntry ) QStringList comps; aStudy->components( comps ); foreach( QString comp, comps ) { - LightApp_Displayer* d = LightApp_Displayer::FindDisplayer( anApp->moduleTitle( comp ), true ); + LightApp_Displayer* d = LightApp_Displayer::FindDisplayer( anApp->moduleTitle( comp ), false ); if ( d ) d->EraseAll( false, false, 0 ); } @@ -581,7 +594,7 @@ void SALOMEGUI_Swig::EraseAll() QStringList comps; aStudy->components( comps ); foreach( QString comp, comps ) { - LightApp_Displayer* d = LightApp_Displayer::FindDisplayer( anApp->moduleTitle( comp ), true ); + LightApp_Displayer* d = LightApp_Displayer::FindDisplayer( anApp->moduleTitle( comp ), false ); if ( d ) d->EraseAll( false, false, 0 ); } } @@ -611,7 +624,9 @@ public: virtual void Execute() { if ( LightApp_Application* anApp = getApplication() ) { - SUIT_ViewWindow* window = anApp->desktop()->activeWindow(); + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); if ( window ) { SALOME_View* view = dynamic_cast( window->getViewManager()->getViewModel() ); if ( view ) { @@ -639,7 +654,9 @@ void SALOMEGUI_Swig::UpdateView() virtual void Execute() { if ( LightApp_Application* anApp = getApplication() ) { - SUIT_ViewWindow* window = anApp->desktop()->activeWindow(); + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); if ( window ) { SALOME_View* view = dynamic_cast( window->getViewManager()->getViewModel() ); if ( view ) @@ -656,6 +673,7 @@ void SALOMEGUI_Swig::UpdateView() */ void SALOMEGUI_Swig::FitAll() { + MESSAGE("FitAll"); class TEvent: public SALOME_Event { public: @@ -663,14 +681,52 @@ void SALOMEGUI_Swig::FitAll() virtual void Execute() { if ( LightApp_Application* anApp = getApplication() ) { - SUIT_ViewWindow* window = anApp->desktop()->activeWindow(); + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); if ( window ) { +#ifndef DISABLE_SALOMEOBJECT +#ifndef DISABLE_VTKVIEWER if ( dynamic_cast( window ) ) ( dynamic_cast( window ) )->onFitAll(); - else if ( dynamic_cast( window ) ) - ( dynamic_cast( window ) )->onFitAll(); - else if ( dynamic_cast( window ) ) +#endif +#ifndef DISABLE_PLOT2DVIEWER + if ( dynamic_cast( window ) ) ( dynamic_cast( window ) )->onFitAll(); +#endif +#endif +#ifndef DISABLE_OCCVIEWER + if ( dynamic_cast( window ) ) + ( dynamic_cast( window ) )->onFitAll(); +#endif + } + } + } + }; + ProcessVoidEvent( new TEvent() ); +} + +void SALOMEGUI_Swig::FitSelection() +{ + class TEvent: public SALOME_Event + { + public: + TEvent() {} + virtual void Execute() + { + if ( LightApp_Application* anApp = getApplication() ) { + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); + if ( window ) { +#if !defined(DISABLE_SALOMEOBJECT) && !defined(DISABLE_VTKVIEWER) + if ( dynamic_cast( window ) ) + (dynamic_cast( window ))->onFitSelection(); +#endif +#if !defined(DISABLE_OCCVIEWER) + if ( dynamic_cast( window ) ) + (dynamic_cast( window ))->onFitSelection(); +#endif } } } @@ -678,6 +734,35 @@ void SALOMEGUI_Swig::FitAll() ProcessVoidEvent( new TEvent() ); } +void SALOMEGUI_Swig::FitIObjects(const std::list& entries) +{ + class TEvent: public SALOME_Event + { + const std::list& myEntries; + public: + TEvent( const std::list& objs ) : myEntries( objs ) {} + virtual void Execute() + { + if ( LightApp_Application* anApp = getApplication() ) { + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); + if ( window ) { + SALOME_ListIO objects; + std::list::const_iterator it; + for ( it = myEntries.begin(); it != myEntries.end(); ++it ) + objects.Append( new SALOME_InteractiveObject( (*it).c_str(), "" ) ); +#if !defined(DISABLE_SALOMEOBJECT) && !defined(DISABLE_VTKVIEWER) + if ( dynamic_cast( window ) ) + (dynamic_cast( window ))->onFitIObjects( objects ); +#endif + } + } + } + }; + ProcessVoidEvent( new TEvent( entries ) ); +} + /*! \brief Reset current view window to the default state. */ @@ -690,16 +775,26 @@ void SALOMEGUI_Swig::ResetView() virtual void Execute() { if ( LightApp_Application* anApp = getApplication() ) { - SUIT_ViewWindow* window = anApp->desktop()->activeWindow(); + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); if ( window ) { +#ifndef DISABLE_SALOMEOBJECT +#ifndef DISABLE_VTKVIEWER if ( dynamic_cast( window ) ) (dynamic_cast( window ))->onResetView(); - else if ( dynamic_cast( window ) ) - (dynamic_cast( window ))->onResetView(); - else if ( dynamic_cast( window ) ) +#endif +#ifndef DISABLE_PLOT2DVIEWER + if ( dynamic_cast( window ) ) (dynamic_cast( window ))->onFitAll(); // VSR: there is no 'ResetView' functionality for Plot2d viewer, // so we use 'FitAll' instead. +#endif +#endif +#ifndef DISABLE_OCCVIEWER + if ( dynamic_cast( window ) ) + (dynamic_cast( window ))->onResetView(); +#endif } } } @@ -736,8 +831,12 @@ static void setView( int view ) virtual void Execute() { if ( LightApp_Application* anApp = getApplication() ) { - SUIT_ViewWindow* window = anApp->desktop()->activeWindow(); + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + SUIT_ViewWindow* window = viewMgr->getActiveView(); if ( window ) { +#ifndef DISABLE_SALOMEOBJECT +#ifndef DISABLE_VTKVIEWER if ( dynamic_cast( window ) ) { switch( myView ) { case __ViewTop: @@ -756,7 +855,10 @@ static void setView( int view ) break; } } - else if ( dynamic_cast( window ) ) { +#endif +#endif +#ifndef DISABLE_OCCVIEWER + if ( dynamic_cast( window ) ) { switch( myView ) { case __ViewTop: (dynamic_cast( window ))->onTopView(); break; @@ -774,6 +876,7 @@ static void setView( int view ) break; } } +#endif } } } @@ -828,3 +931,194 @@ void SALOMEGUI_Swig::ViewBack() { setView( __ViewBack ); } + +/* + \fn bool SALOMEGUI_Swig::getViewParameters() + \brief Get camera parameters of the active view. + + NOTE: For the current moment implemented for VTK viewer only. + + \return \c string with the view parameters +*/ + +class TGetViewParameters: public SALOME_Event +{ +public: + typedef QString TResult; + TResult myResult; + TGetViewParameters() : myResult( "" ) {} + virtual void Execute() { + if ( LightApp_Application* anApp = getApplication() ) { + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + if ( SUIT_ViewWindow* window = viewMgr->getActiveView() ) { +#ifndef DISABLE_VTKVIEWER + if ( SVTK_ViewWindow* svtk = dynamic_cast( window ) ) { + if ( vtkRenderer* ren = svtk->getRenderer()) { + if ( vtkCamera* camera = ren->GetActiveCamera() ) { + double pos[3], focalPnt[3], viewUp[3], scale[3], parScale; + + // save position, focal point, viewUp, scale + camera->GetPosition( pos ); + camera->GetFocalPoint( focalPnt ); + camera->GetViewUp( viewUp ); + parScale = camera->GetParallelScale(); + svtk->GetRenderer()->GetScale( scale ); + + myResult += QString("sg.setCameraPosition( %1, %2, %3 )\n").arg(pos[0]).arg(pos[1]).arg(pos[2]); + myResult += QString("sg.setCameraFocalPoint( %1, %2, %3 )\n").arg(focalPnt[0]).arg(focalPnt[1]).arg(focalPnt[2]); + myResult += QString("sg.setCameraViewUp( %1, %2, %3 )\n").arg(viewUp[0]).arg(viewUp[1]).arg(viewUp[2]); + myResult += QString("sg.setViewScale(%1, %2, %3, %4 )\n").arg(parScale).arg(scale[0]).arg(scale[1]).arg(scale[2]); + } + } + } +#endif + } + } + } +}; + +const char* SALOMEGUI_Swig::getViewParameters() { + QString result = ProcessEvent( new TGetViewParameters() ); + return result.isEmpty() ? 0 : strdup( result.toLatin1().constData() ); +} + + +/*! + \brief View parameter type. + \internal +*/ +enum { + __CameraPosition, //!< position of the active camera + __CameraFocalPoint, //!< focal point of the active camera + __CameraViewUp, //!< view up of the active camera + __ViewScale //!< scale of the view +}; + + +/*! + \brief Change the camera parameters of the current view window. + \internal + + NOTE: For the current moment implemented for VTK viewer only. + + \param parameter type of the parameter + \param values value of the parameter +*/ +static void setViewParameter( int parameter, QList& values ) { + class TEvent: public SALOME_Event { + private: + int myParameter; + QList myValues; + public: + TEvent( int parameter , QList& values ) : myParameter(parameter), myValues( values ) {} + + virtual void Execute() { + if ( LightApp_Application* anApp = getApplication() ) { + SUIT_ViewManager* viewMgr = anApp->activeViewManager(); + if (!viewMgr) return; + if ( SUIT_ViewWindow* window = viewMgr->getActiveView() ) { +#ifndef DISABLE_VTKVIEWER + if ( SVTK_ViewWindow* svtk = dynamic_cast( window ) ) { + if ( vtkRenderer* ren = svtk->getRenderer()) { + if ( vtkCamera* camera = ren->GetActiveCamera() ) { + switch(myParameter) { + case __CameraPosition : { + if ( myValues.size() == 3 ) { + camera->SetPosition( myValues[0], myValues[1], myValues[2] ); + } + break; + } + case __CameraFocalPoint : { + if ( myValues.size() == 3 ) { + camera->SetFocalPoint( myValues[0], myValues[1], myValues[2] ); + } + break; + } + case __CameraViewUp : { + if ( myValues.size() == 3 ) { + camera->SetViewUp( myValues[0], myValues[1], myValues[2] ); + } + break; + } + case __ViewScale : { + if ( myValues.size() == 4 ) { + camera->SetParallelScale( myValues[0] ); + double scale[] = { myValues[1], myValues[2], myValues[3] }; + svtk->GetRenderer()->SetScale( scale ); + } + break; + } + default: break; + } + } + } + svtk->Repaint(); + } +#endif + } + } + } + }; + ProcessVoidEvent( new TEvent( parameter, values ) ); +} + +/*! + \brief Set camera position of the active view . + \param x - X coordinate of the camera + \param y - Y coordinate of the camera + \param z - Z coordinate of the camera +*/ +void SALOMEGUI_Swig::setCameraPosition( double x, double y, double z ) { + QList lst; + lst.push_back( x ); + lst.push_back( y ); + lst.push_back( z ); + setViewParameter( __CameraPosition, lst ); +} + +/*! + \brief Set camera focal point of the active view. + \param x - X coordinate of the focal point + \param y - Y coordinate of the focal point + \param z - Z coordinate of the focal point +*/ +void SALOMEGUI_Swig::setCameraFocalPoint( double x, double y, double z ) { + QList lst; + lst.push_back( x ); + lst.push_back( y ); + lst.push_back( z ); + setViewParameter( __CameraFocalPoint, lst ); +} + +/*! + \brief Set the view up direction for the camera. + \param x - X component of the direction vector + \param y - Y component of the direction vector + \param z - Z component of the direction vector +*/ +void SALOMEGUI_Swig::setCameraViewUp( double x, double y, double z ) { + QList lst; + lst.push_back( x ); + lst.push_back( y ); + lst.push_back( z ); + setViewParameter( __CameraViewUp, lst ); +} + +/*! + \brief Set view scale. + \param parallelScale - scaling used for a parallel projection. + \param x - X scale + \param y - Y scale + \param z - Z scale +*/ +void SALOMEGUI_Swig::setViewScale( double parallelScale, double x, double y, double z ) { + QList lst; + lst.push_back( parallelScale ); + lst.push_back( x ); + lst.push_back( y ); + lst.push_back( z ); + setViewParameter( __ViewScale, lst ); +} + +