From c9e9b3c209b2b3c599dd3d9186832a7285f92bf7 Mon Sep 17 00:00:00 2001 From: caremoli Date: Fri, 18 Jun 2010 12:15:50 +0000 Subject: [PATCH] CCAR:synchronize with V5_1_main head --- adm_local/cmake_files/FindCAS.cmake | 7 + adm_local/unix/config_files/Makefile.am | 1 - adm_local/unix/config_files/check_vtk.m4 | 236 ----- doc/salome/gui/images/pref12.png | Bin 85479 -> 73726 bytes doc/salome/gui/images/pref32.png | Bin 0 -> 26893 bytes doc/salome/gui/input/postpro_preferences.doc | 12 + doc/salome/gui/input/salome_preferences.doc | 2 + doc/salome/gui/input/using_input_widgets.doc | 55 +- src/LightApp/LightApp_Application.cxx | 28 + src/LightApp/resources/LightApp.xml | 1 + src/LightApp/resources/LightApp_msg_en.ts | 4 + src/OpenGLUtils/OpenGLUtils_FrameBuffer.cxx | 2 +- src/Qtx/QtxDoubleSpinBox.cxx | 7 + src/Qtx/QtxResourceMgr.cxx | 78 +- src/Qtx/QtxResourceMgr.h | 4 + src/Qtx/QtxTreeView.cxx | 16 + src/Qtx/QtxTreeView.h | 1 + src/SUIT/SUIT_DataBrowser.cxx | 4 +- src/SUIT/SUIT_Study.h | 2 +- src/SUIT/SUIT_TreeModel.cxx | 2 - src/SVTK/Makefile.am | 4 +- src/SVTK/SVTK_ViewModel.cxx | 27 + src/SVTK/SVTK_ViewModel.h | 7 + src/SVTK/SVTK_ViewWindow.cxx | 38 + src/SVTK/SVTK_ViewWindow.h | 10 + src/SVTK/vtkPVAxesActor.cxx | 812 +++++++++++++++++ src/SVTK/vtkPVAxesActor.h | 293 +++++++ src/SVTK/vtkPVAxesWidget.cxx | 869 +++++++++++++++++++ src/SVTK/vtkPVAxesWidget.h | 159 ++++ src/SalomeApp/SalomeApp_Study.cxx | 22 +- src/SalomeApp/SalomeApp_Study.h | 1 + src/SalomeApp/resources/SalomeApp.xml | 1 + src/VTKViewer/VTKViewer_MarkerDlg.cxx | 50 ++ src/VTKViewer/VTKViewer_MarkerDlg.h | 12 + src/VTKViewer/VTKViewer_PolyDataMapper.cxx | 21 +- src/VTKViewer/VTKViewer_PolyDataMapper.h | 5 +- 36 files changed, 2503 insertions(+), 290 deletions(-) delete mode 100644 adm_local/unix/config_files/check_vtk.m4 create mode 100755 doc/salome/gui/images/pref32.png create mode 100644 src/SVTK/vtkPVAxesActor.cxx create mode 100644 src/SVTK/vtkPVAxesActor.h create mode 100644 src/SVTK/vtkPVAxesWidget.cxx create mode 100644 src/SVTK/vtkPVAxesWidget.h diff --git a/adm_local/cmake_files/FindCAS.cmake b/adm_local/cmake_files/FindCAS.cmake index aa7b8abba..97e4835fb 100644 --- a/adm_local/cmake_files/FindCAS.cmake +++ b/adm_local/cmake_files/FindCAS.cmake @@ -33,6 +33,13 @@ SET(CAS_CPPFLAGS ${CAS_CPPFLAGS} -DHAVE_CONFIG_H) SET(CAS_CPPFLAGS ${CAS_CPPFLAGS} -DHAVE_LIMITS_H) SET(CAS_CPPFLAGS ${CAS_CPPFLAGS} -I${CASROOT}/inc) +IF(NOT WINDOWS) + FIND_LIBRARY(Xmu Xmu) + IF(Xmu) + SET(CAS_LDPATH ${Xmu}) + ENDIF(Xmu) +ENDIF(NOT WINDOWS) + IF(WINDOWS) IF(CMAKE_BUILD_TYPE STREQUAL Debug) SET(CASROOT_LIBDIR ${CASROOT}/win32/libd) diff --git a/adm_local/unix/config_files/Makefile.am b/adm_local/unix/config_files/Makefile.am index ae39d272f..8e01139bb 100644 --- a/adm_local/unix/config_files/Makefile.am +++ b/adm_local/unix/config_files/Makefile.am @@ -37,7 +37,6 @@ check_qwt.m4 \ check_SalomeObject.m4 \ check_sip.m4 \ check_SupervGraphViewer.m4 \ -check_vtk.m4 \ check_VTKViewer.m4 \ check_QxGraphViewer.m4 \ check_TestRecorder.m4 diff --git a/adm_local/unix/config_files/check_vtk.m4 b/adm_local/unix/config_files/check_vtk.m4 deleted file mode 100644 index 1da864219..000000000 --- a/adm_local/unix/config_files/check_vtk.m4 +++ /dev/null @@ -1,236 +0,0 @@ -dnl Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE -dnl -dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -dnl -dnl This library is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Lesser General Public -dnl License as published by the Free Software Foundation; either -dnl version 2.1 of the License. -dnl -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Lesser General Public License for more details. -dnl -dnl You should have received a copy of the GNU Lesser General Public -dnl License along with this library; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -dnl - -dnl OPTIONS_VTK -dnl ------------------------------------------------------------------------ -dnl Adds the --with-vtk=path and --with-vtk-version configure options -dnl -AC_DEFUN([OPTIONS_VTK], [ - AC_ARG_WITH([vtk], - [AC_HELP_STRING([--with-vtk], [The prefix where VTK is installed (default "" means taking from environment variable)])], - [with_vtk=$withval], [with_vtk=""]) - - AC_ARG_WITH([vtk-version], - [AC_HELP_STRING([--with-vtk-version], [VTK include directory name is vtk-suffix, e.g. vtk-5.0/. What is the suffix? (Default "yes" means taking from environment variable)])], - [vtk_suffix=$withval], [vtk_suffix="yes"]) - - AC_ARG_WITH([paraview], - [AC_HELP_STRING([--with-paraview], [ParaView from the specified location is used instead of VTK (default "" means ParaView should not be used)])]) -]) - -dnl -dnl CHECK_VTK -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([CHECK_VTK], [ -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_CXX])dnl -AC_REQUIRE([AC_PROG_CPP])dnl -AC_REQUIRE([AC_PROG_CXXCPP])dnl -AC_REQUIRE([AC_LINKER_OPTIONS])dnl - -AC_REQUIRE([OPTIONS_VTK])dnl - -AC_CHECKING(for VTK) - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - -AC_SUBST(VTK_INCLUDES) -AC_SUBST(VTK_LIBS) -AC_SUBST(VTKPY_MODULES) - -VTK_INCLUDES="" -VTK_LIBS="" -VTKPY_MODULES="" - -vtk_ok=no - -if test "x$OpenGL_ok" != "xyes" ; then - AC_MSG_WARN(VTK needs OpenGL correct configuration, check configure output) -fi - -AC_PATH_X -if test "x$x_libraries" != "x" -then - LXLIB="-L$x_libraries" -else - LXLIB="" -fi - -if test "x$x_libraries" = "x/usr/lib" -then - LXLIB="" -fi - -if test "x$x_libraries" = "x/usr/lib${LIB_LOCATION_SUFFIX}" -then - LXLIB="" -fi - -LOCAL_INCLUDES="$OGL_INCLUDES -DVTK_EXCLUDE_STRSTREAM_HEADERS" -LOCAL_LIBS="-lvtkCommon -lvtkGraphics -lvtkImaging -lvtkFiltering -lvtkIO -lvtkRendering -lvtkHybrid -lvtkParallel -lvtkWidgets $LXLIB -lX11 -lXt" -TRY_LINK_LIBS="-lvtkCommon $LXLIB -lX11 -lXt" - -dnl VTK version suffix -if test -z $vtk_suffix ; then - vtk_suffix="yes" -fi -if test "x$vtk_suffix" == "xno" ; then - dnl in case user wrote --with-vtk-version=no, use empty suffix - vtk_suffix="" -fi -if test "x$vtk_suffix" != "xyes" ; then - VTKSUFFIX="$vtk_suffix" -else - dnl in case user wrote --with-vtk-version=yes, get the suffix from env - if test -z $VTKSUFFIX ; then - VTKSUFFIX="-5.0" - fi -fi - -dnl VTK install dir -if test -z $with_vtk ; then - with_vtk="" -fi -if test "x$with_vtk" = "xyes" ; then - dnl in case user wrote --with-vtk=yes - with_vtk="" -fi -if test "x$with_vtk" = "xno" ; then - dnl in case user wrote --with-vtk=no - with_vtk="" - AC_MSG_WARN(Value "no", specified for option --with-vtk, is not supported) -fi - -if test "x$with_vtk" != "x" ; then - VTKHOME="$with_vtk" -else - if test -z $VTKHOME ; then - AC_MSG_WARN(undefined VTKHOME variable which specify where vtk was compiled) - for d in /usr/local /usr ; do - if test -f ${d}/include/vtk${VTKSUFFIX}/vtkPlane.h ; then - AC_MSG_RESULT(trying ${d}) - VTKHOME="${d}" - break - fi - if test -f ${d}/include/vtk-5.0/vtkPlane.h ; then - AC_MSG_RESULT(trying ${d}) - VTKHOME="${d}" - VTKSUFFIX="-5.0" - break - fi - if test -f ${d}/include/vtk-5.2/vtkPlane.h ; then - AC_MSG_RESULT(trying ${d}) - VTKHOME="${d}" - VTKSUFFIX="-5.2" - break - fi - if test -f ${d}/include/vtk/vtkPlane.h ; then - AC_MSG_RESULT(trying ${d}) - VTKHOME="${d}" - VTKSUFFIX="" - break - fi - done - fi -fi - -# Using regular VTK installation -if test "x$with_paraview" = "x" ; then - LOCAL_INCLUDES="-I$VTKHOME/include/vtk${VTKSUFFIX} $LOCAL_INCLUDES" - LOCAL_LIBS="-L$VTKHOME/lib${LIB_LOCATION_SUFFIX}/vtk${VTKSUFFIX} $LOCAL_LIBS" - TRY_LINK_LIBS="-L$VTKHOME/lib${LIB_LOCATION_SUFFIX} -L$VTKHOME/lib${LIB_LOCATION_SUFFIX}/vtk${VTKSUFFIX} $TRY_LINK_LIBS" - if test "x$VTKHOME" != "x/usr" ; then - LOCAL_LIBS="-L$VTKHOME/lib${LIB_LOCATION_SUFFIX} $LOCAL_LIBS" - fi -else -# VTK from ParaView overrides other VTK versions - if test "${with_paraview}" = "yes" ; then - if test -z $PVHOME ; then - PVHOME="/usr" - fi - else - PVHOME=${with_paraview} - fi - - - LOCAL_INCLUDES="-I$PVHOME/include/paraview-$PVVERSION $LOCAL_INCLUDES" - - LOCAL_LIBS="-L$PVHOME/lib/paraview-$PVVERSION -lvtksys -lvtkzlib -lvtkpng -lvtkjpeg -lvtktiff -lvtkexpat -lvtksqlite -lvtkmetaio -lvtkverdict -lvtkNetCDF -lvtkDICOMParser -lvtkfreetype -lvtkftgl -lvtkexoIIc $LOCAL_LIBS" - TRY_LINK_LIBS="-L$PVHOME/lib/paraview-$PVVERSION -lvtksys $TRY_LINK_LIBS" -fi - -dnl vtk headers -CPPFLAGS_old="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $LOCAL_INCLUDES" - -AC_CHECK_HEADER(vtkPlane.h,vtk_ok="yes",vtk_ok="no") - -CPPFLAGS="$CPPFLAGS_old" - -if test "x$vtk_ok" = "xyes" -then - VTK_INCLUDES="$LOCAL_INCLUDES" - - dnl vtk libraries - - AC_MSG_CHECKING(linking VTK library) - - LIBS_old="$LIBS" - LIBS="$LIBS $TRY_LINK_LIBS" - #LIBS="$LIBS $LOCAL_LIBS" - CPPFLAGS_old="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $VTK_INCLUDES" - - dnl VTKPY_MODULES="$VTKHOME/python" - - AC_CACHE_VAL(salome_cv_lib_vtk,[ - AC_TRY_LINK([#include "vtkPlane.h" - ], - [vtkPlane::New()], - [salome_cv_lib_vtk=yes], - [salome_cv_lib_vtk=no]) - ]) - vtk_ok="$salome_cv_lib_vtk" - LIBS="$LIBS_old" - CPPFLAGS="$CPPFLAGS_old" -fi - -if test "x$vtk_ok" = "xno" -then - AC_MSG_RESULT(no) - AC_MSG_WARN(unable to link with vtk library) -else - AC_MSG_RESULT(yes) - VTK_LIBS="$LOCAL_LIBS" - VTK_MT_LIBS="$LOCAL_LIBS" -fi - -AC_MSG_RESULT(for VTK: $vtk_ok) - -AC_LANG_RESTORE - -# Save cache -AC_CACHE_SAVE - -])dnl diff --git a/doc/salome/gui/images/pref12.png b/doc/salome/gui/images/pref12.png index b14da29b71e40d6b815f55a9fc4ea5de00e0a699..5bea82dc130751062dc605345e67f6c66499b088 100755 GIT binary patch literal 73726 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 diff --git a/doc/salome/gui/images/pref32.png b/doc/salome/gui/images/pref32.png new file mode 100755 index 0000000000000000000000000000000000000000..b2f2d50e2005e22151e573737bc944bfb78fa46a GIT binary patch literal 26893 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≻l4M>p$Yz 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�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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/input/postpro_preferences.doc b/doc/salome/gui/input/postpro_preferences.doc index 54036ef32..6e2755a6b 100644 --- a/doc/salome/gui/input/postpro_preferences.doc +++ b/doc/salome/gui/input/postpro_preferences.doc @@ -122,6 +122,18 @@ structure of the study and can be visualized in a XY plot. +

Stream Lines Preferences

+ +\image html pref32.png + +
    +
  • Stream Lines Preferences
  • +
      +
    • Used points - allows to define a default value of percentage +of points used for building the Stream Lines presentation.
    • +
    +
+

Sweep and Animation Preferences

\image html ppref3.png diff --git a/doc/salome/gui/input/salome_preferences.doc b/doc/salome/gui/input/salome_preferences.doc index 17d91caa3..a560371d1 100644 --- a/doc/salome/gui/input/salome_preferences.doc +++ b/doc/salome/gui/input/salome_preferences.doc @@ -102,6 +102,8 @@ which the speed increases or respectively decreases after pressing [+] or [-] keyboard buttons.
  • Modification Mode - allows choosing between \b Arithmetic and \b Geometrical progression used for zooming
  • +
  • Show static trihedron - allows to show/hide static trihedron +located in the bottom-left corner of the viewer.
  • Spacemouse - a mouse-like manipulator device specially designed for working with 3D presentations, objects, etc. You can reassign the diff --git a/doc/salome/gui/input/using_input_widgets.doc b/doc/salome/gui/input/using_input_widgets.doc index 2d0cb9bcb..fcb04f032 100755 --- a/doc/salome/gui/input/using_input_widgets.doc +++ b/doc/salome/gui/input/using_input_widgets.doc @@ -8,58 +8,57 @@ with SALOME GUI input widgets.

    Spin boxes

    This type of widgets is used for numeric (integer or floating-point) -data input. Spin boxes are used in standard \b SALOME modules in case -if an input value has clearly defined input range (and precision in -case of floating-point value). +data input. Spin boxes are used in standard \b SALOME modules if the +input value has a clearly defined input range (and precision in +case of a floating-point value). -Input precision has specific semantics in \b SALOME floating-point +Input precision has a specific semantics in \b SALOME floating-point spin boxes: -- Positive value means that a number in a fixed-point format -(corresponding to "f" format specifier for C printf function) is +- Positive precision value means that a number in the fixed-point format +(corresponding to the "f" format specifier for C printf function) is expected. Positive precision value is the maximum allowed number of digits after the decimal separator. -- Negative precision value means that a number either in a fixed-point -or scientific (exponetial) format is expected. This is similar to -behavior of "g" format specifier for C printf function. Absolute +- Negative precision value means that a number either in the fixed-point +or the scientific (exponetial) format is expected. This is similar to the +behavior of the "g" format specifier for C printf function. Negative precision value is the maximum allowed number of significant digits in mantissa (note that one digit is always before the decimal separator). To make the user aware of an input value constraints applied by some -\b SALOME operation, the following basic capabilties are provided by +\b SALOME operations, the following basic capabilties are provided by spin boxes: -- Text entered manually into a spin box by the user is checked to be a +- The text input manually in a spin box by the user is checked to be a number of valid type (integer or floating-point). -- The text is converted to a number and checked against the valid +- The text is converted to a number and checked to be within the valid range. - Additionally, for floating-point data the input text is checked against the precision rules described above. -In case if the input text in a spin box does not satisfy the -constraints, the user is informed about this by a message shown in a +If the input text in a spin box does not meet the +constraints, the user is shown a message in a tooltip near the spin box just as he types in it. The tooltip contains -information about valid data range. For floating-point input, the -tooltip also contains information about expected precision. +information about the valid data range. For a floating-point input, the +tooltip also contains information about the expected precision. -In standard \bSALOME modules precision value can be adjusted through -\ref setting_preferences_page "user preferences" of correspodning modules, and the tooltip contains a -reference to corresponding parameter in the preferences. +In standard \bSALOME modules the precision value can be adjusted through +\ref setting_preferences_page "user preferences" of the correspodning modules, and the tooltip contains a +reference to the corresponding parameter in the preferences. On-line documentation for each standard SALOME module contains the list of user preferences that can be used for tuning floating-point -precision for different type of input quantities. +precision for different types of input quantities.

    Spin boxes and SALOME Notebook

    -Apart from numeric input, spin boxes in some \b SALOME modules accept -names of \b Notebook variables (see \ref using_notebook "Using Notebook" +Apart from the numeric input, spin boxes in some \b SALOME modules accept +the names of \b Notebook variables (see \ref using_notebook "Using Notebook" page for more details about \b Notebook). -If some spin box accepts variable names, then it is -additionally checked whether the manual input text represents a variable name. Variable -names should satisfy common naming rules for \b Python variables. -In case if the input is neither a valid number nor a variable name, -the tooltip is shown informing the user that variable names are -also acceptable in this spin box. +If a spin box accepts variable names, then it is +additionally checked whether the manually input text represents a variable name. Variable +names should comply with the common naming rules for \b Python variables. +If the input is neither a valid number nor a variable name, +the tooltip informs the user that variable names are also acceptable in this spin box. */ diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index ccfe56574..a429da373 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -1375,6 +1375,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType vm->setBackgroundColor( resMgr->colorValue( "VTKViewer", "background", vm->backgroundColor() ) ); vm->setTrihedronSize( resMgr->doubleValue( "VTKViewer", "trihedron_size", vm->trihedronSize() ), resMgr->booleanValue( "VTKViewer", "relative_size", vm->trihedronRelative() ) ); + vm->setStaticTrihedronVisible( resMgr->booleanValue( "VTKViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) ); vm->setInteractionStyle( resMgr->integerValue( "VTKViewer", "navigation_mode", vm->interactionStyle() ) ); vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ), resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) ); @@ -1980,6 +1981,8 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "strings", aSpeedModeList, vtkSpeedMode ); pref->setItemProperty( "indexes", aModeIndexesList, vtkSpeedMode ); + pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), vtkGen, LightApp_Preferences::Bool, "VTKViewer", "show_static_trihedron" ); + int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox ); pref->setItemProperty( "columns", 2, vtkSM ); int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM, @@ -2301,6 +2304,31 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } #endif +#ifndef DISABLE_VTKVIEWER + if ( sec == QString( "VTKViewer" ) && param == QString( "show_static_trihedron" ) ) + { + bool isVisible = resMgr->booleanValue( "VTKViewer", "show_static_trihedron", true ); + QList lst; +#ifndef DISABLE_SALOMEOBJECT + viewManagers( SVTK_Viewer::Type(), lst ); + QListIterator it( lst ); + while ( it.hasNext() ) + { + SUIT_ViewModel* vm = it.next()->getViewModel(); + if ( !vm || !vm->inherits( "SVTK_Viewer" ) ) + continue; + + SVTK_Viewer* vtkVM = dynamic_cast( vm ); + if( vtkVM ) + { + vtkVM->setStaticTrihedronVisible( isVisible ); + vtkVM->Repaint(); + } + } +#endif + } +#endif + #ifndef DISABLE_VTKVIEWER if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) || param == QString( "spacemouse_func2_btn" ) || diff --git a/src/LightApp/resources/LightApp.xml b/src/LightApp/resources/LightApp.xml index 2ae4f774c..db336784e 100644 --- a/src/LightApp/resources/LightApp.xml +++ b/src/LightApp/resources/LightApp.xml @@ -130,6 +130,7 @@ + diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index 2c9178de5..1d391cd0f 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -170,6 +170,10 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITASPREF_FRAME_SPACEMOUSE Spacemouse + + PREF_SHOW_STATIC_TRIHEDRON + Show static trihedron + PREF_SPACEMOUSE_FUNC_1 Decrease speed increment diff --git a/src/OpenGLUtils/OpenGLUtils_FrameBuffer.cxx b/src/OpenGLUtils/OpenGLUtils_FrameBuffer.cxx index a5e81e813..e227f2642 100755 --- a/src/OpenGLUtils/OpenGLUtils_FrameBuffer.cxx +++ b/src/OpenGLUtils/OpenGLUtils_FrameBuffer.cxx @@ -132,7 +132,7 @@ bool OpenGLUtils_FrameBuffer::init( const GLsizei& xSize, const GLsizei& ySize ) if( !IsEXTInitialized || strstr( ext, "GL_EXT_framebuffer_object" ) == NULL ) { - INFOS( "Initializing OpenGL FrameBuffer extension failed" ); + MESSAGE( "Initializing OpenGL FrameBuffer extension failed" ); return false; } diff --git a/src/Qtx/QtxDoubleSpinBox.cxx b/src/Qtx/QtxDoubleSpinBox.cxx index f0560db9b..87120b243 100644 --- a/src/Qtx/QtxDoubleSpinBox.cxx +++ b/src/Qtx/QtxDoubleSpinBox.cxx @@ -28,6 +28,8 @@ #include +const double PSEUDO_ZERO = 1.e-20; + /*! \class QtxDoubleSpinBox \brief Enhanced version of the Qt's double spin box. @@ -263,6 +265,11 @@ void QtxDoubleSpinBox::stepBy( int steps ) myCleared = false; QDoubleSpinBox::stepBy( steps ); + double tmpval = value(); + if ( qAbs( tmpval ) < PSEUDO_ZERO ) tmpval = 0.; + if ( tmpval < minimum() ) tmpval = minimum(); + else if ( tmpval > maximum() ) tmpval = maximum(); + setValue( tmpval ); } /*! diff --git a/src/Qtx/QtxResourceMgr.cxx b/src/Qtx/QtxResourceMgr.cxx index f68c292bc..cc2189b11 100644 --- a/src/Qtx/QtxResourceMgr.cxx +++ b/src/Qtx/QtxResourceMgr.cxx @@ -2096,6 +2096,63 @@ QStringList QtxResourceMgr::sections() const return map.keys(); } +/*! + \brief Get all sections names matching specified regular expression. + \param re searched regular expression + \return list of sections names +*/ +QStringList QtxResourceMgr::sections(const QRegExp& re) const +{ + return sections().filter( re ); +} + +/*! + \brief Get all sections names with the prefix specified by passed + list of parent sections names. + + Sub-sections are separated inside the section name by the sections + separator token, for example "splash:color:label". + + \param names parent sub-sections names + \return list of sections names +*/ +QStringList QtxResourceMgr::sections(const QStringList& names) const +{ + QStringList nm = names; + nm << ".+"; + QRegExp re( QString( "^%1$" ).arg( nm.join( sectionsToken() ) ) ); + return sections( re ); +} + +/*! + \brief Get list of sub-sections names for the specified parent section name. + + Sub-sections are separated inside the section name by the sections + separator token, for example "splash:color:label". + + \param section parent sub-section name + \param full if \c true return full names of child sub-sections, if \c false, + return only top-level sub-sections names + \return list of sub-sections names +*/ +QStringList QtxResourceMgr::subSections(const QString& section, const bool full) const +{ + QStringList names = sections( QStringList() << section ); + QMutableListIterator it( names ); + while ( it.hasNext() ) { + QString name = it.next().mid( section.size() ).trimmed(); + if ( name.isEmpty() ) { + it.remove(); + continue; + } + if ( !full ) name = name.split( sectionsToken() ).first(); + it.setValue( name ); + } + names.removeDuplicates(); + names.sort(); + return names; +} + /*! \brief Get all parameters name in specified section. \param sec section name @@ -2163,7 +2220,7 @@ QString QtxResourceMgr::path( const QString& sect, const QString& prefix, const \brief Get application resources section name. By default, application resources section name is "resources" but - it can be changed by setting the corresponding resources manager option. + it can be changed by setting the "res_section_name" resources manager option. \return section corresponding to the resources directories \sa option(), setOption() @@ -2180,7 +2237,7 @@ QString QtxResourceMgr::resSection() const \brief Get application language section name. By default, application language section name is "language" but - it can be changed by setting the corresponding resources manager option. + it can be changed by setting the "lang_section_name" resources manager option. \return section corresponding to the application language settings \sa option(), setOption() @@ -2193,6 +2250,23 @@ QString QtxResourceMgr::langSection() const return res; } +/*! + \brief Get sections separator token. + + By default, sections separator token is colon symbol ":" but + it can be changed by setting the "section_token" resources manager option. + + \return string corresponding to the current section separator token + \sa option(), setOption() +*/ +QString QtxResourceMgr::sectionsToken() const +{ + QString res = option( "section_token" ); + if ( res.isEmpty() ) + res = QString( ":" ); + return res; +} + /*! \brief Get default pixmap. diff --git a/src/Qtx/QtxResourceMgr.h b/src/Qtx/QtxResourceMgr.h index 5c9970777..a15205bc2 100644 --- a/src/Qtx/QtxResourceMgr.h +++ b/src/Qtx/QtxResourceMgr.h @@ -143,6 +143,7 @@ public: QString resSection() const; QString langSection() const; + QString sectionsToken() const; QPixmap loadPixmap( const QString&, const QString& ) const; QPixmap loadPixmap( const QString&, const QString&, const bool ) const; @@ -161,6 +162,9 @@ public: bool save(); QStringList sections() const; + QStringList sections(const QRegExp&) const; + QStringList sections(const QStringList&) const; + QStringList subSections(const QString&, const bool = true) const; QStringList parameters( const QString& ) const; void refresh(); diff --git a/src/Qtx/QtxTreeView.cxx b/src/Qtx/QtxTreeView.cxx index ef551abc4..d86270d85 100644 --- a/src/Qtx/QtxTreeView.cxx +++ b/src/Qtx/QtxTreeView.cxx @@ -319,6 +319,22 @@ void QtxTreeView::selectionChanged( const QItemSelection& selected, emit( selectionChanged() ); } +/*! + \brief Called when rows are about to be removed. + \param parent model index + \param start first row to remove + \param end last row to remove +*/ +void QtxTreeView::rowsAboutToBeRemoved( const QModelIndex& parent, int start, int end ) +{ + QModelIndex curIndex = currentIndex(); + while ( curIndex.isValid() && curIndex.parent() != parent ) + curIndex = curIndex.parent(); + if ( curIndex.isValid() && curIndex.row() >= start && curIndex.row() <= end ) + setCurrentIndex( QModelIndex() ); + QTreeView::rowsAboutToBeRemoved( parent, start, end ); +} + /*! \brief Expand/collapse the specified item (recursively). \param index model index diff --git a/src/Qtx/QtxTreeView.h b/src/Qtx/QtxTreeView.h index af16b8284..d63c9bdad 100644 --- a/src/Qtx/QtxTreeView.h +++ b/src/Qtx/QtxTreeView.h @@ -57,6 +57,7 @@ public: protected slots: void onHeaderClicked( int ); + void rowsAboutToBeRemoved( const QModelIndex&, int, int ); void selectionChanged( const QItemSelection&, const QItemSelection& ); void onAppropriate( Qt::Orientation, int, int ); diff --git a/src/SUIT/SUIT_DataBrowser.cxx b/src/SUIT/SUIT_DataBrowser.cxx index 3a974b4b3..d4ec696a8 100644 --- a/src/SUIT/SUIT_DataBrowser.cxx +++ b/src/SUIT/SUIT_DataBrowser.cxx @@ -25,7 +25,6 @@ #include #include -#include /*! \class SUIT_DataBrowser @@ -124,8 +123,7 @@ void SUIT_DataBrowser::setAutoUpdate( const bool on ) \param autoOpen if \c true automatically open branches */ void SUIT_DataBrowser::updateTree( SUIT_DataObject* obj, const bool autoOpen ) -{ - //std::cerr << " updateTree from SUIT_DataBrowser" << std::endl; +{ SUIT_ProxyModel* m = qobject_cast( model() ); if ( m ) { m->updateTree( obj ); diff --git a/src/SUIT/SUIT_Study.h b/src/SUIT/SUIT_Study.h index d269c0be6..bd2ec1342 100755 --- a/src/SUIT/SUIT_Study.h +++ b/src/SUIT/SUIT_Study.h @@ -48,7 +48,7 @@ public: virtual int id() const; SUIT_DataObject* root() const; - QString studyName() const; + virtual QString studyName() const; SUIT_Application* application() const; virtual bool isSaved() const; diff --git a/src/SUIT/SUIT_TreeModel.cxx b/src/SUIT/SUIT_TreeModel.cxx index 0a46c9073..b0c56c498 100755 --- a/src/SUIT/SUIT_TreeModel.cxx +++ b/src/SUIT/SUIT_TreeModel.cxx @@ -1180,7 +1180,6 @@ SUIT_DataObject* SUIT_TreeModel::object( const SUIT_TreeModel::TreeItem* item ) return myItems.contains( obj ) ? obj : 0; } -#include /*! \brief Create an item corresponding to the data object. \param obj source data object @@ -1508,7 +1507,6 @@ QAbstractItemDelegate* SUIT_ProxyModel::delegate() const \param index starting index for the updating \sa setAutoUpdate() */ -#include void SUIT_ProxyModel::updateTree( const QModelIndex& index ) { //std::cerr << "updateTree with QModelIndex from SUIT_ProxyModel" << std::endl; diff --git a/src/SVTK/Makefile.am b/src/SVTK/Makefile.am index 1b078781e..6f626d02f 100755 --- a/src/SVTK/Makefile.am +++ b/src/SVTK/Makefile.am @@ -93,7 +93,9 @@ dist_libSVTK_la_SOURCES= \ SVTK_Recorder.cxx \ SVTK_RecorderDlg.cxx \ SVTK_ImageWriter.cxx \ - SVTK_ImageWriterMgr.cxx + SVTK_ImageWriterMgr.cxx \ + vtkPVAxesActor.cxx \ + vtkPVAxesWidget.cxx # internal headers diff --git a/src/SVTK/SVTK_ViewModel.cxx b/src/SVTK/SVTK_ViewModel.cxx index c34ce6ac7..35c168563 100644 --- a/src/SVTK/SVTK_ViewModel.cxx +++ b/src/SVTK/SVTK_ViewModel.cxx @@ -75,6 +75,7 @@ SVTK_Viewer::SVTK_Viewer() { myTrihedronSize = 105; myTrihedronRelative = true; + myIsStaticTrihedronVisible = true; myIncrementSpeed = 10; myIncrementMode = 0; myProjMode = 0; @@ -130,6 +131,7 @@ SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop ) aViewWindow->setBackgroundColor( backgroundColor() ); aViewWindow->SetTrihedronSize( trihedronSize(), trihedronRelative() ); + aViewWindow->SetStaticTrihedronVisible( isStaticTrihedronVisible() ); aViewWindow->SetProjectionMode( projectionMode() ); aViewWindow->SetInteractionStyle( interactionStyle() ); aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() ); @@ -179,6 +181,31 @@ void SVTK_Viewer::setTrihedronSize( const vtkFloatingPointType theSize, const bo } } +/*! + \return visibility status of the static trihedron +*/ +bool SVTK_Viewer::isStaticTrihedronVisible() const +{ + return myIsStaticTrihedronVisible; +} + +/*! + Sets visibility status of the static trihedron + \param theIsVisible - new visibility status +*/ +void SVTK_Viewer::setStaticTrihedronVisible( const bool theIsVisible ) +{ + myIsStaticTrihedronVisible = theIsVisible; + + if (SUIT_ViewManager* aViewManager = getViewManager()) { + QVector aViews = aViewManager->getViews(); + for ( uint i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetStaticTrihedronVisible( theIsVisible ); + } + } +} /*! \return projection mode diff --git a/src/SVTK/SVTK_ViewModel.h b/src/SVTK/SVTK_ViewModel.h index f6a717a0a..cf4ca31fe 100644 --- a/src/SVTK/SVTK_ViewModel.h +++ b/src/SVTK/SVTK_ViewModel.h @@ -78,6 +78,12 @@ public: //! Set size of trihedron of the viewer (see #SVTK_Renderer::SetTrihedronSize) void setTrihedronSize( const vtkFloatingPointType, const bool = true ); + //! Get visibility status of the static trihedron + bool isStaticTrihedronVisible() const; + + //! Set visibility status of the static trihedron + void setStaticTrihedronVisible( const bool ); + //! Gets projection mode int projectionMode() const; @@ -162,6 +168,7 @@ private: QColor myBgColor; vtkFloatingPointType myTrihedronSize; bool myTrihedronRelative; + bool myIsStaticTrihedronVisible; bool mySelectionEnabled; bool myMultiSelectionEnabled; int myIncrementSpeed; diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index d88d66d8b..10c16646e 100755 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -44,6 +44,7 @@ #include #include #include +#include #include "QtxAction.h" @@ -78,6 +79,9 @@ #include "SVTK_Recorder.h" #include "SVTK_RecorderDlg.h" +#include "vtkPVAxesWidget.h" +#include "vtkPVAxesActor.h" + #include "SALOME_ListIteratorOfListIO.hxx" #include "VTKViewer_Algorithm.h" @@ -180,6 +184,24 @@ void SVTK_ViewWindow::Initialize(SVTK_ViewModelBase* theModel) setCentralWidget(myInteractor); + myAxesWidget = vtkPVAxesWidget::New(); + myAxesWidget->SetParentRenderer(aRenderer->GetDevice()); + myAxesWidget->SetViewport(0, 0, 0.25, 0.25); + myAxesWidget->SetInteractor(myInteractor->GetDevice()); + myAxesWidget->SetEnabled(1); + myAxesWidget->SetInteractive(0); + + vtkPVAxesActor* anAxesActor = myAxesWidget->GetAxesActor(); + anAxesActor->GetXAxisTipProperty()->SetColor( 1.0, 0.0, 0.0 ); + anAxesActor->GetXAxisShaftProperty()->SetColor( 1.0, 0.0, 0.0 ); + anAxesActor->GetXAxisLabelProperty()->SetColor( 1.0, 0.0, 0.0 ); + anAxesActor->GetYAxisTipProperty()->SetColor( 0.0, 1.0, 0.0 ); + anAxesActor->GetYAxisShaftProperty()->SetColor( 0.0, 1.0, 0.0 ); + anAxesActor->GetYAxisLabelProperty()->SetColor( 0.0, 1.0, 0.0 ); + anAxesActor->GetZAxisTipProperty()->SetColor( 0.0, 0.0, 1.0 ); + anAxesActor->GetZAxisShaftProperty()->SetColor( 0.0, 0.0, 1.0 ); + anAxesActor->GetZAxisLabelProperty()->SetColor( 0.0, 0.0, 1.0 ); + myView = new SVTK_View(this); Initialize(myView,theModel); @@ -957,6 +979,22 @@ void SVTK_ViewWindow::SetSelectionTolerance(const double& theTolNodes, myView->SetSelectionTolerance(theTolNodes, theTolItems, theTolObjects); } +/*! + Get visibility status of the static trihedron +*/ +bool SVTK_ViewWindow::IsStaticTrihedronVisible() const +{ + return (bool)myAxesWidget->GetEnabled(); +} + +/*! + Set visibility status of the static trihedron +*/ +void SVTK_ViewWindow::SetStaticTrihedronVisible( const bool theIsVisible ) +{ + myAxesWidget->SetEnabled( (int)theIsVisible ); +} + /*! Performs action \param accelAction - action diff --git a/src/SVTK/SVTK_ViewWindow.h b/src/SVTK/SVTK_ViewWindow.h index ac1a5f122..9d6e24707 100755 --- a/src/SVTK/SVTK_ViewWindow.h +++ b/src/SVTK/SVTK_ViewWindow.h @@ -63,6 +63,8 @@ class SVTK_KeyFreeInteractorStyle; class SVTK_ViewParameterDlg; class SVTK_Recorder; +class vtkPVAxesWidget; + class vtkObject; class QtxAction; @@ -238,6 +240,12 @@ class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow const double& theTolCell = 0.001, const double& theTolObjects = 0.025); + //! Get visibility status of the static trihedron + bool IsStaticTrihedronVisible() const; + + //! Set visibility status of the static trihedron + virtual void SetStaticTrihedronVisible( const bool ); + //! Methods to save/restore visual parameters of a view (pan, zoom, etc.) virtual QString getVisualParameters(); @@ -397,6 +405,8 @@ protected: int myToolBar; int myRecordingToolBar; + vtkPVAxesWidget* myAxesWidget; + private: QImage myDumpImage; }; diff --git a/src/SVTK/vtkPVAxesActor.cxx b/src/SVTK/vtkPVAxesActor.cxx new file mode 100644 index 000000000..25f471f24 --- /dev/null +++ b/src/SVTK/vtkPVAxesActor.cxx @@ -0,0 +1,812 @@ +/*========================================================================= + + Program: ParaView + Module: $RCSfile$ + + Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. + All rights reserved. + + ParaView is a free software; you can redistribute it and/or modify it + under the terms of the ParaView license version 1.2. + + See License_v1.2.txt for the full ParaView license. + A copy of this license can be obtained by contacting + Kitware Inc. + 28 Corporate Drive + Clifton Park, NY 12065 + USA + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +#include "vtkPVAxesActor.h" +#include "vtkObject.h" +#include "vtkObjectFactory.h" + +#include "vtkActor.h" +#include "vtkPropCollection.h" +#include "vtkProperty.h" +#include "vtkRenderWindow.h" +#include "vtkTransform.h" +#include "vtkCylinderSource.h" +#include "vtkPolyDataMapper.h" +#include "vtkLineSource.h" +#include "vtkPolyData.h" +#include "vtkConeSource.h" +#include "vtkSphereSource.h" +#include "vtkVectorText.h" +#include "vtkFollower.h" +#include "vtkRenderer.h" + +#include + +vtkCxxRevisionMacro(vtkPVAxesActor, "$Revision$"); +vtkStandardNewMacro(vtkPVAxesActor); + +vtkCxxSetObjectMacro( vtkPVAxesActor, UserDefinedTip, vtkPolyData ); +vtkCxxSetObjectMacro( vtkPVAxesActor, UserDefinedShaft, vtkPolyData ); + +//----------------------------------------------------------------------------- +vtkPVAxesActor::vtkPVAxesActor() +{ + this->XAxisLabelText = NULL; + this->YAxisLabelText = NULL; + this->ZAxisLabelText = NULL; + + this->SetXAxisLabelText("X"); + this->SetYAxisLabelText("Y"); + this->SetZAxisLabelText("Z"); + + //colors chosen to match the output of vtkAxes.cxx's LUT. + this->XAxisShaft = vtkActor::New(); + this->XAxisShaft->GetProperty()->SetColor(1, 0, 0); + this->YAxisShaft = vtkActor::New(); + this->YAxisShaft->GetProperty()->SetColor(1, 1, 0); + this->ZAxisShaft = vtkActor::New(); + this->ZAxisShaft->GetProperty()->SetColor(0, 1, 0); + + this->XAxisTip = vtkActor::New(); + this->XAxisTip->GetProperty()->SetColor(1, 0, 0); + this->YAxisTip = vtkActor::New(); + this->YAxisTip->GetProperty()->SetColor(1, 1, 0); + this->ZAxisTip = vtkActor::New(); + this->ZAxisTip->GetProperty()->SetColor(0, 1, 0); + + this->CylinderSource = vtkCylinderSource::New(); + this->CylinderSource->SetHeight(1.0); + + this->LineSource = vtkLineSource::New(); + this->LineSource->SetPoint1( 0.0, 0.0, 0.0 ); + this->LineSource->SetPoint2( 0.0, 1.0, 0.0 ); + + this->ConeSource = vtkConeSource::New(); + this->ConeSource->SetDirection( 0, 1, 0 ); + this->ConeSource->SetHeight( 1.0 ); + + this->SphereSource = vtkSphereSource::New(); + + vtkPolyDataMapper *shaftMapper = vtkPolyDataMapper::New(); + + this->XAxisShaft->SetMapper( shaftMapper ); + this->YAxisShaft->SetMapper( shaftMapper ); + this->ZAxisShaft->SetMapper( shaftMapper ); + + shaftMapper->Delete(); + + vtkPolyDataMapper *tipMapper = vtkPolyDataMapper::New(); + + this->XAxisTip->SetMapper( tipMapper ); + this->YAxisTip->SetMapper( tipMapper ); + this->ZAxisTip->SetMapper( tipMapper ); + + tipMapper->Delete(); + + this->TotalLength[0] = 1.0; + this->TotalLength[1] = 1.0; + this->TotalLength[2] = 1.0; + + this->NormalizedShaftLength[0] = 0.8; + this->NormalizedShaftLength[1] = 0.8; + this->NormalizedShaftLength[2] = 0.8; + + this->NormalizedTipLength[0] = 0.2; + this->NormalizedTipLength[1] = 0.2; + this->NormalizedTipLength[2] = 0.2; + + this->ConeResolution = 16; + this->SphereResolution = 16; + this->CylinderResolution = 16; + + this->ConeRadius = 0.4; + this->SphereRadius = 0.5; + this->CylinderRadius = 0.05; + + this->XAxisLabelPosition = 1; + this->YAxisLabelPosition = 1; + this->ZAxisLabelPosition = 1; + + this->ShaftType = vtkPVAxesActor::LINE_SHAFT; + this->TipType = vtkPVAxesActor::CONE_TIP; + + this->UserDefinedTip = NULL; + this->UserDefinedShaft = NULL; + + this->XAxisVectorText = vtkVectorText::New(); + this->YAxisVectorText = vtkVectorText::New(); + this->ZAxisVectorText = vtkVectorText::New(); + + this->XAxisLabel = vtkFollower::New(); + this->YAxisLabel = vtkFollower::New(); + this->ZAxisLabel = vtkFollower::New(); + + vtkPolyDataMapper *xmapper = vtkPolyDataMapper::New(); + vtkPolyDataMapper *ymapper = vtkPolyDataMapper::New(); + vtkPolyDataMapper *zmapper = vtkPolyDataMapper::New(); + + xmapper->SetInput( this->XAxisVectorText->GetOutput() ); + ymapper->SetInput( this->YAxisVectorText->GetOutput() ); + zmapper->SetInput( this->ZAxisVectorText->GetOutput() ); + + this->XAxisLabel->SetMapper( xmapper ); + this->YAxisLabel->SetMapper( ymapper ); + this->ZAxisLabel->SetMapper( zmapper ); + + xmapper->Delete(); + ymapper->Delete(); + zmapper->Delete(); + + this->UpdateProps(); +} + +//----------------------------------------------------------------------------- +vtkPVAxesActor::~vtkPVAxesActor() +{ + this->CylinderSource->Delete(); + this->LineSource->Delete(); + this->ConeSource->Delete(); + this->SphereSource->Delete(); + + this->XAxisShaft->Delete(); + this->YAxisShaft->Delete(); + this->ZAxisShaft->Delete(); + + this->XAxisTip->Delete(); + this->YAxisTip->Delete(); + this->ZAxisTip->Delete(); + + this->SetUserDefinedTip( NULL ); + this->SetUserDefinedShaft( NULL ); + + this->SetXAxisLabelText( NULL ); + this->SetYAxisLabelText( NULL ); + this->SetZAxisLabelText( NULL ); + + this->XAxisVectorText->Delete(); + this->YAxisVectorText->Delete(); + this->ZAxisVectorText->Delete(); + + this->XAxisLabel->Delete(); + this->YAxisLabel->Delete(); + this->ZAxisLabel->Delete(); +} + +//----------------------------------------------------------------------------- +// Shallow copy of an actor. +void vtkPVAxesActor::ShallowCopy(vtkProp *prop) +{ + vtkPVAxesActor *a = vtkPVAxesActor::SafeDownCast(prop); + if ( a != NULL ) + { + } + + // Now do superclass + this->vtkProp3D::ShallowCopy(prop); +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::GetActors(vtkPropCollection *ac) +{ + ac->AddItem(this->XAxisShaft); + ac->AddItem(this->YAxisShaft); + ac->AddItem(this->ZAxisShaft); + ac->AddItem(this->XAxisTip); + ac->AddItem(this->YAxisTip); + ac->AddItem(this->ZAxisTip); + ac->AddItem(this->XAxisLabel); + ac->AddItem(this->YAxisLabel); + ac->AddItem(this->ZAxisLabel); + +} + +//----------------------------------------------------------------------------- +int vtkPVAxesActor::RenderOpaqueGeometry(vtkViewport *vp) +{ + int renderedSomething = 0; + + vtkRenderer *ren = vtkRenderer::SafeDownCast( vp ); + + this->UpdateProps(); + + this->XAxisLabel->SetCamera( ren->GetActiveCamera() ); + this->YAxisLabel->SetCamera( ren->GetActiveCamera() ); + this->ZAxisLabel->SetCamera( ren->GetActiveCamera() ); + + this->XAxisShaft->RenderOpaqueGeometry(vp); + this->YAxisShaft->RenderOpaqueGeometry(vp); + this->ZAxisShaft->RenderOpaqueGeometry(vp); + + this->XAxisTip->RenderOpaqueGeometry(vp); + this->YAxisTip->RenderOpaqueGeometry(vp); + this->ZAxisTip->RenderOpaqueGeometry(vp); + + this->XAxisLabel->RenderOpaqueGeometry(vp); + this->YAxisLabel->RenderOpaqueGeometry(vp); + this->ZAxisLabel->RenderOpaqueGeometry(vp); + + return renderedSomething; +} + +//----------------------------------------------------------------------------- +#if (VTK_MINOR_VERSION>=2) +// porting to VTK 5.0.x +int vtkPVAxesActor::RenderTranslucentPolygonalGeometry(vtkViewport *vp) +{ + int renderedSomething=0; + + this->UpdateProps(); + + renderedSomething += this->XAxisShaft->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->YAxisShaft->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->ZAxisShaft->RenderTranslucentPolygonalGeometry(vp); + + renderedSomething += this->XAxisTip->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->YAxisTip->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->ZAxisTip->RenderTranslucentPolygonalGeometry(vp); + + renderedSomething += this->XAxisLabel->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->YAxisLabel->RenderTranslucentPolygonalGeometry(vp); + renderedSomething += this->ZAxisLabel->RenderTranslucentPolygonalGeometry(vp); + + return renderedSomething; +} + +//----------------------------------------------------------------------------- +// porting to VTK 5.0.x +int vtkPVAxesActor::HasTranslucentPolygonalGeometry() +{ + int result = 0; + + this->UpdateProps(); + + result |= this->XAxisShaft->HasTranslucentPolygonalGeometry(); + result |= this->YAxisShaft->HasTranslucentPolygonalGeometry(); + result |= this->ZAxisShaft->HasTranslucentPolygonalGeometry(); + + result |= this->XAxisTip->HasTranslucentPolygonalGeometry(); + result |= this->YAxisTip->HasTranslucentPolygonalGeometry(); + result |= this->ZAxisTip->HasTranslucentPolygonalGeometry(); + + result |= this->XAxisLabel->HasTranslucentPolygonalGeometry(); + result |= this->YAxisLabel->HasTranslucentPolygonalGeometry(); + result |= this->ZAxisLabel->HasTranslucentPolygonalGeometry(); + + return result; +} + +#else +//----------------------------------------------------------------------------- +// porting to VTK 5.0.x +int vtkPVAxesActor::RenderTranslucentGeometry(vtkViewport *vp) +{ + int renderedSomething=0; + + this->UpdateProps(); + + renderedSomething += this->XAxisShaft->RenderTranslucentGeometry(vp); + renderedSomething += this->YAxisShaft->RenderTranslucentGeometry(vp); + renderedSomething += this->ZAxisShaft->RenderTranslucentGeometry(vp); + + renderedSomething += this->XAxisTip->RenderTranslucentGeometry(vp); + renderedSomething += this->YAxisTip->RenderTranslucentGeometry(vp); + renderedSomething += this->ZAxisTip->RenderTranslucentGeometry(vp); + + renderedSomething += this->XAxisLabel->RenderTranslucentGeometry(vp); + renderedSomething += this->YAxisLabel->RenderTranslucentGeometry(vp); + renderedSomething += this->ZAxisLabel->RenderTranslucentGeometry(vp); + + return renderedSomething; +} +#endif + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::ReleaseGraphicsResources(vtkWindow *win) +{ + this->XAxisShaft->ReleaseGraphicsResources( win ); + this->YAxisShaft->ReleaseGraphicsResources( win ); + this->ZAxisShaft->ReleaseGraphicsResources( win ); + + this->XAxisTip->ReleaseGraphicsResources( win ); + this->YAxisTip->ReleaseGraphicsResources( win ); + this->ZAxisTip->ReleaseGraphicsResources( win ); + + this->XAxisLabel->ReleaseGraphicsResources( win ); + this->YAxisLabel->ReleaseGraphicsResources( win ); + this->ZAxisLabel->ReleaseGraphicsResources( win ); +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::GetBounds(double bounds[6]) +{ + double *bds = this->GetBounds(); + bounds[0] = bds[0]; + bounds[1] = bds[1]; + bounds[2] = bds[2]; + bounds[3] = bds[3]; + bounds[4] = bds[4]; + bounds[5] = bds[5]; +} + +//----------------------------------------------------------------------------- +// Get the bounds for this Actor as (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax). +double *vtkPVAxesActor::GetBounds() +{ + double bounds[6]; + int i; + + this->XAxisShaft->GetBounds(this->Bounds); + + this->YAxisShaft->GetBounds(bounds); + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (bounds[2*i+1]>this->Bounds[2*i+1])?(bounds[2*i+1]):(this->Bounds[2*i+1]); + } + + this->ZAxisShaft->GetBounds(bounds); + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (bounds[2*i+1]>this->Bounds[2*i+1])?(bounds[2*i+1]):(this->Bounds[2*i+1]); + } + + this->XAxisTip->GetBounds(bounds); + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (bounds[2*i+1]>this->Bounds[2*i+1])?(bounds[2*i+1]):(this->Bounds[2*i+1]); + } + + this->YAxisTip->GetBounds(bounds); + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (bounds[2*i+1]>this->Bounds[2*i+1])?(bounds[2*i+1]):(this->Bounds[2*i+1]); + } + + this->ZAxisTip->GetBounds(bounds); + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (bounds[2*i+1]>this->Bounds[2*i+1])?(bounds[2*i+1]):(this->Bounds[2*i+1]); + } + + double dbounds[6]; + (vtkPolyDataMapper::SafeDownCast(this->YAxisShaft->GetMapper()))-> + GetInput()->GetBounds( dbounds ); + + for (i=0; i<3; i++) + { + this->Bounds[2*i+1] = + (dbounds[2*i+1]>this->Bounds[2*i+1])?(dbounds[2*i+1]):(this->Bounds[2*i+1]); + } + + // We want this actor to rotate / re-center about the origin, so give it + // the bounds it would have if the axes were symmetrical. + for (i = 0; i < 3; i++) + { + this->Bounds[2*i] = -this->Bounds[2*i+1]; + } + + return this->Bounds; +} + +//----------------------------------------------------------------------------- +unsigned long int vtkPVAxesActor::GetMTime() +{ + unsigned long mTime=this->Superclass::GetMTime(); + + + return mTime; +} + +//----------------------------------------------------------------------------- +unsigned long int vtkPVAxesActor::GetRedrawMTime() +{ + unsigned long mTime=this->GetMTime(); + + return mTime; +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetXAxisTipProperty() +{ + return this->XAxisTip->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetYAxisTipProperty() +{ + return this->YAxisTip->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetZAxisTipProperty() +{ + return this->ZAxisTip->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetXAxisShaftProperty() +{ + return this->XAxisShaft->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetYAxisShaftProperty() +{ + return this->YAxisShaft->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetZAxisShaftProperty() +{ + return this->ZAxisShaft->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetXAxisLabelProperty() +{ + return this->XAxisLabel->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetYAxisLabelProperty() +{ + return this->YAxisLabel->GetProperty(); +} + +//----------------------------------------------------------------------------- +vtkProperty *vtkPVAxesActor::GetZAxisLabelProperty() +{ + return this->ZAxisLabel->GetProperty(); +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::SetTotalLength( float x, float y, float z ) +{ + if ( this->TotalLength[0] != x || + this->TotalLength[1] != y || + this->TotalLength[2] != z ) + { + this->TotalLength[0] = x; + this->TotalLength[1] = y; + this->TotalLength[2] = z; + + this->Modified(); + + this->UpdateProps(); + } +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::SetNormalizedShaftLength( float x, float y, float z ) +{ + if ( this->NormalizedShaftLength[0] != x || + this->NormalizedShaftLength[1] != y || + this->NormalizedShaftLength[2] != z ) + { + this->NormalizedShaftLength[0] = x; + this->NormalizedShaftLength[1] = y; + this->NormalizedShaftLength[2] = z; + + this->Modified(); + + this->UpdateProps(); + } +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::SetNormalizedTipLength( float x, float y, float z ) +{ + if ( this->NormalizedTipLength[0] != x || + this->NormalizedTipLength[1] != y || + this->NormalizedTipLength[2] != z ) + { + this->NormalizedTipLength[0] = x; + this->NormalizedTipLength[1] = y; + this->NormalizedTipLength[2] = z; + + this->Modified(); + + this->UpdateProps(); + } +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::SetShaftType( int type ) +{ + if ( this->ShaftType != type ) + { + this->ShaftType = type; + + this->Modified(); + + this->UpdateProps(); + } +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::SetTipType( int type ) +{ + if ( this->TipType != type ) + { + this->TipType = type; + + this->Modified(); + + this->UpdateProps(); + } +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::UpdateProps() +{ + this->CylinderSource->SetRadius(this->CylinderRadius); + this->CylinderSource->SetResolution(this->CylinderResolution); + + + this->ConeSource->SetResolution(this->ConeResolution); + this->ConeSource->SetRadius(this->ConeRadius); + + this->SphereSource->SetThetaResolution( this->SphereResolution ); + this->SphereSource->SetPhiResolution( this->SphereResolution ); + this->SphereSource->SetRadius(this->SphereRadius); + + switch ( this->ShaftType ) + { + case vtkPVAxesActor::CYLINDER_SHAFT: + (vtkPolyDataMapper::SafeDownCast(this->XAxisShaft->GetMapper()))-> + SetInput( this->CylinderSource->GetOutput() ); + break; + case vtkPVAxesActor::LINE_SHAFT: + (vtkPolyDataMapper::SafeDownCast(this->XAxisShaft->GetMapper()))-> + SetInput( this->LineSource->GetOutput() ); + break; + case vtkPVAxesActor::USER_DEFINED_SHAFT: + (vtkPolyDataMapper::SafeDownCast(this->XAxisShaft->GetMapper()))-> + SetInput( this->UserDefinedShaft ); + } + + switch ( this->TipType ) + { + case vtkPVAxesActor::CONE_TIP: + (vtkPolyDataMapper::SafeDownCast(this->XAxisTip->GetMapper()))-> + SetInput( this->ConeSource->GetOutput() ); + break; + case vtkPVAxesActor::SPHERE_TIP: + (vtkPolyDataMapper::SafeDownCast(this->XAxisTip->GetMapper()))-> + SetInput( this->SphereSource->GetOutput() ); + break; + case vtkPVAxesActor::USER_DEFINED_TIP: + (vtkPolyDataMapper::SafeDownCast(this->XAxisTip->GetMapper()))-> + SetInput( this->UserDefinedTip ); + } + + (vtkPolyDataMapper::SafeDownCast(this->XAxisTip->GetMapper()))-> + GetInput()->Update(); + (vtkPolyDataMapper::SafeDownCast(this->XAxisShaft->GetMapper()))-> + GetInput()->Update(); + + + + float scale[3]; + double bounds[6]; + + (vtkPolyDataMapper::SafeDownCast(this->XAxisShaft->GetMapper()))-> + GetInput()->GetBounds( bounds ); + + int i; + for ( i = 0; i < 3; i++ ) + { + scale[i] = + this->NormalizedShaftLength[i]*this->TotalLength[i] / + (bounds[3] - bounds[2]); + } + + vtkTransform *xTransform = vtkTransform::New(); + vtkTransform *yTransform = vtkTransform::New(); + vtkTransform *zTransform = vtkTransform::New(); + + xTransform->RotateZ( -90 ); + zTransform->RotateX( 90 ); + + xTransform->Scale( scale[0], scale[0], scale[0] ); + yTransform->Scale( scale[1], scale[1], scale[1] ); + zTransform->Scale( scale[2], scale[2], scale[2] ); + + xTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + yTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + zTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + + + + this->XAxisShaft->SetUserTransform( xTransform ); + this->YAxisShaft->SetUserTransform( yTransform ); + this->ZAxisShaft->SetUserTransform( zTransform ); + + xTransform->Delete(); + yTransform->Delete(); + zTransform->Delete(); + + (vtkPolyDataMapper::SafeDownCast(this->XAxisTip->GetMapper()))-> + GetInput()->GetBounds( bounds ); + + xTransform = vtkTransform::New(); + yTransform = vtkTransform::New(); + zTransform = vtkTransform::New(); + + xTransform->RotateZ( -90 ); + zTransform->RotateX( 90 ); + + xTransform->Scale( this->TotalLength[0], this->TotalLength[0], this->TotalLength[0] ); + yTransform->Scale( this->TotalLength[1], this->TotalLength[1], this->TotalLength[1] ); + zTransform->Scale( this->TotalLength[2], this->TotalLength[2], this->TotalLength[2] ); + + xTransform->Translate( 0, (1.0 - this->NormalizedTipLength[0]), 0 ); + yTransform->Translate( 0, (1.0 - this->NormalizedTipLength[1]), 0 ); + zTransform->Translate( 0, (1.0 - this->NormalizedTipLength[2]), 0 ); + + xTransform->Scale( this->NormalizedTipLength[0], + this->NormalizedTipLength[0], + this->NormalizedTipLength[0] ); + + yTransform->Scale( this->NormalizedTipLength[1], + this->NormalizedTipLength[1], + this->NormalizedTipLength[1] ); + + zTransform->Scale( this->NormalizedTipLength[2], + this->NormalizedTipLength[2], + this->NormalizedTipLength[2] ); + + xTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + yTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + zTransform->Translate( -(bounds[0]+bounds[1])/2, + -bounds[2], + -(bounds[4]+bounds[5])/2 ); + + + this->XAxisTip->SetUserTransform( xTransform ); + this->YAxisTip->SetUserTransform( yTransform ); + this->ZAxisTip->SetUserTransform( zTransform ); + + xTransform->Delete(); + yTransform->Delete(); + zTransform->Delete(); + + this->XAxisVectorText->SetText( this->XAxisLabelText ); + this->YAxisVectorText->SetText( this->YAxisLabelText ); + this->ZAxisVectorText->SetText( this->ZAxisLabelText ); + + + float avgScale = + (this->TotalLength[0] + this->TotalLength[1] + this->TotalLength[2])/15; + + this->XAxisShaft->GetBounds(bounds); + this->XAxisLabel->SetScale( avgScale, avgScale, avgScale ); + this->XAxisLabel->SetPosition( bounds[0] + this->XAxisLabelPosition * + (bounds[1]-bounds[0]), + bounds[2] - (bounds[3]-bounds[2])*2.0, + bounds[5] + (bounds[5]-bounds[4])/2.0 ); + + this->YAxisShaft->GetBounds(bounds); + this->YAxisLabel->SetScale( avgScale, avgScale, avgScale ); + this->YAxisLabel->SetPosition( (bounds[0]+bounds[1])/2, + bounds[2] + this->YAxisLabelPosition * + (bounds[3]-bounds[2]), + bounds[5] + (bounds[5]-bounds[4])/2.0 ); + + this->ZAxisShaft->GetBounds(bounds); + this->ZAxisLabel->SetScale( avgScale, avgScale, avgScale ); + this->ZAxisLabel->SetPosition( bounds[0], + bounds[2] - (bounds[3]-bounds[2])*2.0, + bounds[4] + this->ZAxisLabelPosition * + (bounds[5]-bounds[4]) ); +} + +//----------------------------------------------------------------------------- +void vtkPVAxesActor::PrintSelf(ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os,indent); + + os << indent << "UserDefinedShaft: "; + if (this->UserDefinedShaft) + { + os << this->UserDefinedShaft << endl; + } + else + { + os << "(none)" << endl; + } + + os << indent << "UserDefinedTip: "; + if (this->UserDefinedTip) + { + os << this->UserDefinedTip << endl; + } + else + { + os << "(none)" << endl; + } + + os << indent << "XAxisLabelText: " << (this->XAxisLabelText ? + this->XAxisLabelText : "(none)") + << endl; + os << indent << "YAxisLabelText: " << (this->YAxisLabelText ? + this->YAxisLabelText : "(none)") + << endl; + os << indent << "ZAxisLabelText: " << (this->ZAxisLabelText ? + this->ZAxisLabelText : "(none)") + << endl; + os << indent << "XAxisLabelPosition: " << this->XAxisLabelPosition << endl; + os << indent << "YAxisLabelPosition: " << this->YAxisLabelPosition << endl; + os << indent << "ZAxisLabelPosition: " << this->ZAxisLabelPosition << endl; + + os << indent << "SphereRadius: " << this->SphereRadius << endl; + os << indent << "SphereResolution: " << this->SphereResolution << endl; + os << indent << "CylinderRadius: " << this->CylinderRadius << endl; + os << indent << "CylinderResolution: " << this->CylinderResolution << endl; + os << indent << "ConeRadius: " << this->ConeRadius << endl; + os << indent << "ConeResolution: " << this->ConeResolution << endl; + + os << indent << "NormalizedShaftLength: " + << this->NormalizedShaftLength[0] << "," + << this->NormalizedShaftLength[1] << "," + << this->NormalizedShaftLength[2] << endl; + os << indent << "NormalizedTipLength: " + << this->NormalizedTipLength[0] << "," + << this->NormalizedTipLength[1] << "," + << this->NormalizedTipLength[2] << endl; + os << indent << "TotalLength: " + << this->TotalLength[0] << "," + << this->TotalLength[1] << "," + << this->TotalLength[2] << endl; +} + +//----------------------------------------------------------------------------- +// porting to VTK 5.0.x +void vtkPVAxesActor::AddToRender( vtkRenderer* theRenderer ) +{ + theRenderer->AddActor(this->XAxisLabel); + theRenderer->AddActor(this->YAxisLabel); + theRenderer->AddActor(this->ZAxisLabel); +} diff --git a/src/SVTK/vtkPVAxesActor.h b/src/SVTK/vtkPVAxesActor.h new file mode 100644 index 000000000..8b9d329cc --- /dev/null +++ b/src/SVTK/vtkPVAxesActor.h @@ -0,0 +1,293 @@ +/*========================================================================= + + Program: ParaView + Module: $RCSfile$ + + Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. + All rights reserved. + + ParaView is a free software; you can redistribute it and/or modify it + under the terms of the ParaView license version 1.2. + + See License_v1.2.txt for the full ParaView license. + A copy of this license can be obtained by contacting + Kitware Inc. + 28 Corporate Drive + Clifton Park, NY 12065 + USA + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +// .NAME vtkPVAxesActor - a 3D axes representation +// .SECTION Description +// +// vtkPVAxesActor is used to represent 3D axes in the scene. The user can +// define the geometry to use for the shaft and the tip, and the user can +// set the text for the three axes. The text will follow the camera. + + +#ifndef __vtkPVAxesActor_h +#define __vtkPVAxesActor_h + +#include "SVTK.h" +#include "vtkProp3D.h" + +class vtkRenderer; +class vtkPropCollection; +class vtkMapper; +class vtkProperty; +class vtkActor; +class vtkFollower; +class vtkCylinderSource; +class vtkLineSource; +class vtkConeSource; +class vtkSphereSource; +class vtkPolyData; +class vtkVectorText; + +class SVTK_EXPORT vtkPVAxesActor : public vtkProp3D +{ +public: + static vtkPVAxesActor *New(); + vtkTypeRevisionMacro(vtkPVAxesActor,vtkProp3D); + void PrintSelf(ostream& os, vtkIndent indent); + + + // Description: + // For some exporters and other other operations we must be + // able to collect all the actors or volumes. These methods + // are used in that process. + virtual void GetActors(vtkPropCollection *); + + // Description: + // Support the standard render methods. + virtual int RenderOpaqueGeometry(vtkViewport *viewport); +#if (VTK_MINOR_VERSION>=2) + virtual int RenderTranslucentPolygonalGeometry(vtkViewport *viewport); // porting to VTK 5.0.x + virtual int HasTranslucentPolygonalGeometry(); // porting to VTK 5.0.x +#else + virtual int RenderTranslucentGeometry(vtkViewport *viewport); // porting to VTK 5.0.x +#endif + + // Description: + // Shallow copy of an axes actor. Overloads the virtual vtkProp method. + void ShallowCopy(vtkProp *prop); + + // Description: + // Release any graphics resources that are being consumed by this actor. + // The parameter window could be used to determine which graphic + // resources to release. + void ReleaseGraphicsResources(vtkWindow *); + + // Description: + // Get the bounds for this Actor as (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax). (The + // method GetBounds(double bounds[6]) is available from the superclass.) + void GetBounds(double bounds[6]); + double *GetBounds(); + + // Description: + // Get the actors mtime plus consider its properties and texture if set. + unsigned long int GetMTime(); + + // Description: + // Return the mtime of anything that would cause the rendered image to + // appear differently. Usually this involves checking the mtime of the + // prop plus anything else it depends on such as properties, textures + // etc. + virtual unsigned long GetRedrawMTime(); + + // Description: + // Set the total length of the axes in 3 dimensions. + void SetTotalLength( float v[3] ) + { this->SetTotalLength( v[0], v[1], v[2] ); } + void SetTotalLength( float x, float y, float z ); + vtkGetVectorMacro( TotalLength, float, 3 ); + + // Description: + // Set the normalized (0-1) length of the shaft. + void SetNormalizedShaftLength( float v[3] ) + { this->SetNormalizedShaftLength( v[0], v[1], v[2] ); } + void SetNormalizedShaftLength( float x, float y, float z ); + vtkGetVectorMacro( NormalizedShaftLength, float, 3 ); + + // Description: + // Set the normalized (0-1) length of the tip. + void SetNormalizedTipLength( float v[3] ) + { this->SetNormalizedTipLength( v[0], v[1], v[2] ); } + void SetNormalizedTipLength( float x, float y, float z ); + vtkGetVectorMacro( NormalizedTipLength, float, 3 ); + + // Description: + // Set/get the resolution of the pieces of the axes actor + vtkSetClampMacro(ConeResolution, int, 3, 128); + vtkGetMacro(ConeResolution, int); + vtkSetClampMacro(SphereResolution, int, 3, 128); + vtkGetMacro(SphereResolution, int); + vtkSetClampMacro(CylinderResolution, int, 3, 128); + vtkGetMacro(CylinderResolution, int); + + // Description: + // Set/get the radius of the pieces of the axes actor + vtkSetClampMacro(ConeRadius, float, 0, VTK_LARGE_FLOAT); + vtkGetMacro(ConeRadius, float); + vtkSetClampMacro(SphereRadius, float, 0, VTK_LARGE_FLOAT); + vtkGetMacro(SphereRadius, float); + vtkSetClampMacro(CylinderRadius, float, 0, VTK_LARGE_FLOAT); + vtkGetMacro(CylinderRadius, float); + + // Description: + // Set/get the positions of the axis labels + vtkSetClampMacro(XAxisLabelPosition, float, 0, 1); + vtkGetMacro(XAxisLabelPosition, float); + vtkSetClampMacro(YAxisLabelPosition, float, 0, 1); + vtkGetMacro(YAxisLabelPosition, float); + vtkSetClampMacro(ZAxisLabelPosition, float, 0, 1); + vtkGetMacro(ZAxisLabelPosition, float); + + // Description: + // Set the type of the shaft to a cylinder, line, or user defined geometry. + void SetShaftType( int type ); + void SetShaftTypeToCylinder() + { this->SetShaftType( vtkPVAxesActor::CYLINDER_SHAFT ); } + void SetShaftTypeToLine() + { this->SetShaftType( vtkPVAxesActor::LINE_SHAFT ); } + void SetShaftTypeToUserDefined() + { this->SetShaftType( vtkPVAxesActor::USER_DEFINED_SHAFT ); } + + // Description: + // Set the type of the tip to a cone, sphere, or user defined geometry. + void SetTipType( int type ); + void SetTipTypeToCone() + { this->SetTipType( vtkPVAxesActor::CONE_TIP ); } + void SetTipTypeToSphere() + { this->SetTipType( vtkPVAxesActor::SPHERE_TIP ); } + void SetTipTypeToUserDefined() + { this->SetTipType( vtkPVAxesActor::USER_DEFINED_TIP ); } + + //BTX + // Description: + // Set the user defined tip polydata. + void SetUserDefinedTip( vtkPolyData * ); + vtkGetObjectMacro( UserDefinedTip, vtkPolyData ); + + // Description: + // Set the user defined shaft polydata. + void SetUserDefinedShaft( vtkPolyData * ); + vtkGetObjectMacro( UserDefinedShaft, vtkPolyData ); + + // Description: + // Get the tip properties. + vtkProperty *GetXAxisTipProperty(); + vtkProperty *GetYAxisTipProperty(); + vtkProperty *GetZAxisTipProperty(); + + // Description: + // Get the shaft properties. + vtkProperty *GetXAxisShaftProperty(); + vtkProperty *GetYAxisShaftProperty(); + vtkProperty *GetZAxisShaftProperty(); + + // Description: + // Get the label properties. + vtkProperty *GetXAxisLabelProperty(); + vtkProperty *GetYAxisLabelProperty(); + vtkProperty *GetZAxisLabelProperty(); + //ETX + // + // Description: + // Set the label text. + vtkSetStringMacro( XAxisLabelText ); + vtkSetStringMacro( YAxisLabelText ); + vtkSetStringMacro( ZAxisLabelText ); + +//BTX + enum + { + CYLINDER_SHAFT, + LINE_SHAFT, + USER_DEFINED_SHAFT + }; + + + enum + { + CONE_TIP, + SPHERE_TIP, + USER_DEFINED_TIP + }; + +//ETX + + void AddToRender( vtkRenderer* theRenderer ); // porting to VTK 5.0.x + +protected: + vtkPVAxesActor(); + ~vtkPVAxesActor(); + + vtkCylinderSource *CylinderSource; + vtkLineSource *LineSource; + vtkConeSource *ConeSource; + vtkSphereSource *SphereSource; + + vtkActor *XAxisShaft; + vtkActor *YAxisShaft; + vtkActor *ZAxisShaft; + + vtkActor *XAxisTip; + vtkActor *YAxisTip; + vtkActor *ZAxisTip; + + void UpdateProps(); + + float TotalLength[3]; + float NormalizedShaftLength[3]; + float NormalizedTipLength[3]; + + int ShaftType; + int TipType; + + vtkPolyData *UserDefinedTip; + vtkPolyData *UserDefinedShaft; + + char *XAxisLabelText; + char *YAxisLabelText; + char *ZAxisLabelText; + + vtkVectorText *XAxisVectorText; + vtkVectorText *YAxisVectorText; + vtkVectorText *ZAxisVectorText; + + vtkFollower *XAxisLabel; + vtkFollower *YAxisLabel; + vtkFollower *ZAxisLabel; + + int ConeResolution; + int SphereResolution; + int CylinderResolution; + + float ConeRadius; + float SphereRadius; + float CylinderRadius; + + float XAxisLabelPosition; + float YAxisLabelPosition; + float ZAxisLabelPosition; + +private: + vtkPVAxesActor(const vtkPVAxesActor&); // Not implemented. + void operator=(const vtkPVAxesActor&); // Not implemented. +}; + +#endif + diff --git a/src/SVTK/vtkPVAxesWidget.cxx b/src/SVTK/vtkPVAxesWidget.cxx new file mode 100644 index 000000000..42d80002b --- /dev/null +++ b/src/SVTK/vtkPVAxesWidget.cxx @@ -0,0 +1,869 @@ +/*========================================================================= + + Program: ParaView + Module: $RCSfile$ + + Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. + All rights reserved. + + ParaView is a free software; you can redistribute it and/or modify it + under the terms of the ParaView license version 1.2. + + See License_v1.2.txt for the full ParaView license. + A copy of this license can be obtained by contacting + Kitware Inc. + 28 Corporate Drive + Clifton Park, NY 12065 + USA + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +#include "vtkPVAxesWidget.h" + +#include "vtkActor2D.h" +#include "vtkCallbackCommand.h" +#include "vtkCamera.h" +#include "vtkCoordinate.h" +#include "vtkObjectFactory.h" +#include "vtkPoints.h" +#include "vtkPolyData.h" +#include "vtkPolyDataMapper2D.h" +#include "vtkProperty.h" +#include "vtkProperty2D.h" +#include "vtkPVAxesActor.h" +#include "vtkRenderer.h" +#include "vtkRenderWindow.h" +#include "vtkRenderWindowInteractor.h" + +vtkStandardNewMacro(vtkPVAxesWidget); +vtkCxxRevisionMacro(vtkPVAxesWidget, "$Revision$"); + +vtkCxxSetObjectMacro(vtkPVAxesWidget, AxesActor, vtkPVAxesActor); +vtkCxxSetObjectMacro(vtkPVAxesWidget, ParentRenderer, vtkRenderer); + +//---------------------------------------------------------------------------- +class vtkPVAxesWidgetObserver : public vtkCommand +{ +public: + static vtkPVAxesWidgetObserver *New() + {return new vtkPVAxesWidgetObserver;}; + + vtkPVAxesWidgetObserver() + { + this->AxesWidget = 0; + } + + virtual void Execute(vtkObject* wdg, unsigned long event, void *calldata) + { + if (this->AxesWidget) + { + this->AxesWidget->ExecuteEvent(wdg, event, calldata); + } + } + + vtkPVAxesWidget *AxesWidget; +}; + +//---------------------------------------------------------------------------- +vtkPVAxesWidget::vtkPVAxesWidget() +{ + this->StartEventObserverId = 0; + + this->EventCallbackCommand->SetCallback(vtkPVAxesWidget::ProcessEvents); + + this->Observer = vtkPVAxesWidgetObserver::New(); + this->Observer->AxesWidget = this; + this->Renderer = vtkRenderer::New(); + this->Renderer->SetViewport(0.0, 0.0, 0.2, 0.2); + this->Renderer->SetLayer(1); + this->Renderer->InteractiveOff(); + this->Priority = 0.55; + this->AxesActor = vtkPVAxesActor::New(); + this->Renderer->AddActor(this->AxesActor); + this->AxesActor->AddToRender(this->Renderer); // tmp + + this->ParentRenderer = NULL; + + this->Moving = 0; + this->MouseCursorState = vtkPVAxesWidget::Outside; + + this->StartTag = 0; + + this->Interactive = 1; + + this->Outline = vtkPolyData::New(); + this->Outline->Allocate(); + vtkPoints *points = vtkPoints::New(); + vtkIdType ptIds[5]; + ptIds[4] = ptIds[0] = points->InsertNextPoint(1, 1, 0); + ptIds[1] = points->InsertNextPoint(2, 1, 0); + ptIds[2] = points->InsertNextPoint(2, 2, 0); + ptIds[3] = points->InsertNextPoint(1, 2, 0); + this->Outline->SetPoints(points); + this->Outline->InsertNextCell(VTK_POLY_LINE, 5, ptIds); + vtkCoordinate *tcoord = vtkCoordinate::New(); + tcoord->SetCoordinateSystemToDisplay(); + vtkPolyDataMapper2D *mapper = vtkPolyDataMapper2D::New(); + mapper->SetInput(this->Outline); + mapper->SetTransformCoordinate(tcoord); + this->OutlineActor = vtkActor2D::New(); + this->OutlineActor->SetMapper(mapper); + this->OutlineActor->SetPosition(0, 0); + this->OutlineActor->SetPosition2(1, 1); + + points->Delete(); + mapper->Delete(); + tcoord->Delete(); +} + +//---------------------------------------------------------------------------- +vtkPVAxesWidget::~vtkPVAxesWidget() +{ + this->Observer->Delete(); + this->AxesActor->Delete(); + this->OutlineActor->Delete(); + this->Outline->Delete(); + this->SetParentRenderer(NULL); + this->Renderer->Delete(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetEnabled(int enabling) +{ + if (!this->Interactor) + { + vtkErrorMacro("The interactor must be set prior to enabling/disabling widget"); + } + + if (enabling) + { + if (this->Enabled) + { + return; + } + if (!this->ParentRenderer) + { + vtkErrorMacro("The parent renderer must be set prior to enabling this widget"); + return; + } + + this->Enabled = 1; + + if ( this->EventCallbackCommand ) + { + vtkRenderWindowInteractor *i = this->Interactor; + i->AddObserver(vtkCommand::MouseMoveEvent, + this->EventCallbackCommand, this->Priority); + i->AddObserver(vtkCommand::LeftButtonPressEvent, + this->EventCallbackCommand, this->Priority); + i->AddObserver(vtkCommand::LeftButtonReleaseEvent, + this->EventCallbackCommand, this->Priority); + } + + this->ParentRenderer->GetRenderWindow()->AddRenderer(this->Renderer); + if (this->ParentRenderer->GetRenderWindow()->GetNumberOfLayers() < 2) + { + this->ParentRenderer->GetRenderWindow()->SetNumberOfLayers(2); + } + this->AxesActor->SetVisibility(1); + // We need to copy the camera before the compositing observer is called. + // Compositing temporarily changes the camera to display an image. + this->StartEventObserverId = + this->ParentRenderer->AddObserver(vtkCommand::StartEvent,this->Observer,1); + this->InvokeEvent(vtkCommand::EnableEvent, NULL); + } + else + { + if (!this->Enabled) + { + return; + } + + this->Enabled = 0; + this->Interactor->RemoveObserver(this->EventCallbackCommand); + + this->AxesActor->SetVisibility(0); + if (this->ParentRenderer) + { + if (this->ParentRenderer->GetRenderWindow()) + { + this->ParentRenderer->GetRenderWindow()->RemoveRenderer(this->Renderer); + this->AxesActor->ReleaseGraphicsResources(this->ParentRenderer->GetRenderWindow()); + } + if (this->StartEventObserverId != 0) + { + this->ParentRenderer->RemoveObserver(this->StartEventObserverId); + } + } + + this->InvokeEvent(vtkCommand::DisableEvent, NULL); + } +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ExecuteEvent(vtkObject *vtkNotUsed(o), + unsigned long vtkNotUsed(event), + void *vtkNotUsed(calldata)) +{ + if (!this->ParentRenderer) + { + return; + } + + vtkCamera *cam = this->ParentRenderer->GetActiveCamera(); + double pos[3], fp[3], viewup[3]; + cam->GetPosition(pos); + cam->GetFocalPoint(fp); + cam->GetViewUp(viewup); + + cam = this->Renderer->GetActiveCamera(); + cam->SetPosition(pos); + cam->SetFocalPoint(fp); + cam->SetViewUp(viewup); + this->Renderer->ResetCamera(); + + this->SquareRenderer(); +} + +void vtkPVAxesWidget::UpdateCursorIcon() +{ + if (!this->Enabled) + { + this->SetMouseCursor(vtkPVAxesWidget::Outside); + return; + } + + if (this->Moving) + { + return; + } + + int *parentSize = this->ParentRenderer->GetSize(); + + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + double xNorm = x / (double)parentSize[0]; + double yNorm = y / (double)parentSize[1]; + + double pos[4]; + this->Renderer->GetViewport(pos); + + int pState = this->MouseCursorState; + + if (xNorm > pos[0] && xNorm < pos[2] && yNorm > pos[1] && yNorm < pos[3]) + { + this->MouseCursorState = vtkPVAxesWidget::Inside; + } + else if (fabs(xNorm-pos[0]) < .02 && fabs(yNorm-pos[3]) < .02) + { + this->MouseCursorState = vtkPVAxesWidget::TopLeft; + } + else if (fabs(xNorm-pos[2]) < .02 && fabs(yNorm-pos[3]) < .02) + { + this->MouseCursorState = vtkPVAxesWidget::TopRight; + } + else if (fabs(xNorm-pos[0]) < .02 && fabs(yNorm-pos[1]) < .02) + { + this->MouseCursorState = vtkPVAxesWidget::BottomLeft; + } + else if (fabs(xNorm-pos[2]) < .02 && fabs(yNorm-pos[1]) < .02) + { + this->MouseCursorState = vtkPVAxesWidget::BottomRight; + } + else + { + this->MouseCursorState = vtkPVAxesWidget::Outside; + } + + if (pState == this->MouseCursorState) + { + return; + } + + if (this->MouseCursorState == vtkPVAxesWidget::Outside) + { + this->Renderer->RemoveActor(this->OutlineActor); + } + else + { + this->Renderer->AddActor(this->OutlineActor); + } + this->Interactor->Render(); + + this->SetMouseCursor(this->MouseCursorState); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetMouseCursor(int cursorState) +{ + switch (cursorState) + { + case vtkPVAxesWidget::Outside: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_DEFAULT); + break; + case vtkPVAxesWidget::Inside: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_SIZEALL); + break; + case vtkPVAxesWidget::TopLeft: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_SIZENW); + break; + case vtkPVAxesWidget::TopRight: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_SIZENE); + break; + case vtkPVAxesWidget::BottomLeft: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_SIZESW); + break; + case vtkPVAxesWidget::BottomRight: + this->Interactor->GetRenderWindow()->SetCurrentCursor(VTK_CURSOR_SIZESE); + break; + } +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ProcessEvents(vtkObject* vtkNotUsed(object), + unsigned long event, + void *clientdata, + void* vtkNotUsed(calldata)) +{ + vtkPVAxesWidget *self = + reinterpret_cast(clientdata); + + if (!self->GetInteractive()) + { + return; + } + + switch (event) + { + case vtkCommand::LeftButtonPressEvent: + self->OnButtonPress(); + break; + case vtkCommand::MouseMoveEvent: + self->OnMouseMove(); + break; + case vtkCommand::LeftButtonReleaseEvent: + self->OnButtonRelease(); + break; + } +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::OnButtonPress() +{ + if (this->MouseCursorState == vtkPVAxesWidget::Outside) + { + return; + } + + this->SetMouseCursor(this->MouseCursorState); + + this->StartPosition[0] = this->Interactor->GetEventPosition()[0]; + this->StartPosition[1] = this->Interactor->GetEventPosition()[1]; + + this->Moving = 1; + this->EventCallbackCommand->SetAbortFlag(1); + this->StartInteraction(); + this->InvokeEvent(vtkCommand::StartInteractionEvent, NULL); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::OnButtonRelease() +{ + if (this->MouseCursorState == vtkPVAxesWidget::Outside) + { + return; + } + + this->Moving = 0; + this->EndInteraction(); + this->InvokeEvent(vtkCommand::EndInteractionEvent, NULL); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::OnMouseMove() +{ + if (this->Moving) + { + switch (this->MouseCursorState) + { + case vtkPVAxesWidget::Inside: + this->MoveWidget(); + break; + case vtkPVAxesWidget::TopLeft: + this->ResizeTopLeft(); + break; + case vtkPVAxesWidget::TopRight: + this->ResizeTopRight(); + break; + case vtkPVAxesWidget::BottomLeft: + this->ResizeBottomLeft(); + break; + case vtkPVAxesWidget::BottomRight: + this->ResizeBottomRight(); + break; + } + + this->UpdateCursorIcon(); + this->EventCallbackCommand->SetAbortFlag(1); + this->InvokeEvent(vtkCommand::InteractionEvent, NULL); + } + else + { + this->UpdateCursorIcon(); + } +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::MoveWidget() +{ + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + + int dx = x - this->StartPosition[0]; + int dy = y - this->StartPosition[1]; + + this->StartPosition[0] = x; + this->StartPosition[1] = y; + + int *size = this->ParentRenderer->GetSize(); + double dxNorm = dx / (double)size[0]; + double dyNorm = dy / (double)size[1]; + + double *vp = this->Renderer->GetViewport(); + + double newPos[4]; + newPos[0] = vp[0] + dxNorm; + newPos[1] = vp[1] + dyNorm; + newPos[2] = vp[2] + dxNorm; + newPos[3] = vp[3] + dyNorm; + + if (newPos[0] < 0) + { + this->StartPosition[0] = 0; + newPos[0] = 0; + newPos[2] = vp[2] - vp[0]; + } + if (newPos[1] < 0) + { + this->StartPosition[1] = 0; + newPos[1] = 0; + newPos[3] = vp[3] - vp[1]; + } + if (newPos[2] > 1) + { + this->StartPosition[0] = (int)(size[0] - size[0] * (vp[2]-vp[0])); + newPos[0] = 1 - (vp[2]-vp[0]); + newPos[2] = 1; + } + if (newPos[3] > 1) + { + this->StartPosition[1] = (int)(size[1] - size[1]*(vp[3]-vp[1])); + newPos[1] = 1 - (vp[3]-vp[1]); + newPos[3] = 1; + } + + this->Renderer->SetViewport(newPos); + this->Interactor->Render(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ResizeTopLeft() +{ + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + + int dx = x - this->StartPosition[0]; + int dy = y - this->StartPosition[1]; + + int *size = this->ParentRenderer->GetSize(); + double dxNorm = dx / (double)size[0]; + double dyNorm = dy / (double)size[1]; + + int useX; + double change; + double absDx = fabs(dxNorm); + double absDy = fabs(dyNorm); + + if (absDx > absDy) + { + change = dxNorm; + useX = 1; + } + else + { + change = dyNorm; + useX = 0; + } + + double *vp = this->Renderer->GetViewport(); + + this->StartPosition[0] = x; + this->StartPosition[1] = y; + + double newPos[4]; + newPos[0] = useX ? vp[0] + change : vp[0] - change; + newPos[1] = vp[1]; + newPos[2] = vp[2]; + newPos[3] = useX ? vp[3] - change : vp[3] + change; + + if (newPos[0] < 0) + { + this->StartPosition[0] = 0; + newPos[0] = 0; + } + if (newPos[0] >= newPos[2]-0.01) + { + newPos[0] = newPos[2] - 0.01; + } + if (newPos[3] > 1) + { + this->StartPosition[1] = size[1]; + newPos[3] = 1; + } + if (newPos[3] <= newPos[1]+0.01) + { + newPos[3] = newPos[1] + 0.01; + } + + this->Renderer->SetViewport(newPos); + this->Interactor->Render(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ResizeTopRight() +{ + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + + int dx = x - this->StartPosition[0]; + int dy = y - this->StartPosition[1]; + + int *size = this->ParentRenderer->GetSize(); + double dxNorm = dx / (double)size[0]; + double dyNorm = dy / (double)size[1]; + + double change; + double absDx = fabs(dxNorm); + double absDy = fabs(dyNorm); + + if (absDx > absDy) + { + change = dxNorm; + } + else + { + change = dyNorm; + } + + double *vp = this->Renderer->GetViewport(); + + this->StartPosition[0] = x; + this->StartPosition[1] = y; + + double newPos[4]; + newPos[0] = vp[0]; + newPos[1] = vp[1]; + newPos[2] = vp[2] + change; + newPos[3] = vp[3] + change; + + if (newPos[2] > 1) + { + this->StartPosition[0] = size[0]; + newPos[2] = 1; + } + if (newPos[2] <= newPos[0]+0.01) + { + newPos[2] = newPos[0] + 0.01; + } + if (newPos[3] > 1) + { + this->StartPosition[1] = size[1]; + newPos[3] = 1; + } + if (newPos[3] <= newPos[1]+0.01) + { + newPos[3] = newPos[1] + 0.01; + } + + this->Renderer->SetViewport(newPos); + this->Interactor->Render(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ResizeBottomLeft() +{ + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + + int dx = x - this->StartPosition[0]; + int dy = y - this->StartPosition[1]; + + int *size = this->ParentRenderer->GetSize(); + double dxNorm = dx / (double)size[0]; + double dyNorm = dy / (double)size[1]; + double *vp = this->Renderer->GetViewport(); + + double change; + double absDx = fabs(dxNorm); + double absDy = fabs(dyNorm); + + if (absDx > absDy) + { + change = dxNorm; + } + else + { + change = dyNorm; + } + + this->StartPosition[0] = x; + this->StartPosition[1] = y; + + double newPos[4]; + newPos[0] = vp[0] + change; + newPos[1] = vp[1] + change; + newPos[2] = vp[2]; + newPos[3] = vp[3]; + + if (newPos[0] < 0) + { + this->StartPosition[0] = 0; + newPos[0] = 0; + } + if (newPos[0] >= newPos[2]-0.01) + { + newPos[0] = newPos[2] - 0.01; + } + if (newPos[1] < 0) + { + this->StartPosition[1] = 0; + newPos[1] = 0; + } + if (newPos[1] >= newPos[3]-0.01) + { + newPos[1] = newPos[3] - 0.01; + } + + this->Renderer->SetViewport(newPos); + this->Interactor->Render(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::ResizeBottomRight() +{ + int x = this->Interactor->GetEventPosition()[0]; + int y = this->Interactor->GetEventPosition()[1]; + + int dx = x - this->StartPosition[0]; + int dy = y - this->StartPosition[1]; + + int *size = this->ParentRenderer->GetSize(); + double dxNorm = dx / (double)size[0]; + double dyNorm = dy / (double)size[1]; + + double *vp = this->Renderer->GetViewport(); + + int useX; + double change; + double absDx = fabs(dxNorm); + double absDy = fabs(dyNorm); + + if (absDx > absDy) + { + change = dxNorm; + useX = 1; + } + else + { + change = dyNorm; + useX = 0; + } + + this->StartPosition[0] = x; + this->StartPosition[1] = y; + + double newPos[4]; + newPos[0] = vp[0]; + newPos[1] = useX ? vp[1] - change : vp[1] + change; + newPos[2] = useX ? vp[2] + change : vp[2] - change; + newPos[3] = vp[3]; + + if (newPos[2] > 1) + { + this->StartPosition[0] = size[0]; + newPos[2] = 1; + } + if (newPos[2] <= newPos[0]+0.01) + { + newPos[2] = newPos[0] + 0.01; + } + if (newPos[1] < 0) + { + this->StartPosition[1] = 0; + newPos[1] = 0; + } + if (newPos[1] >= newPos[3]-0.01) + { + newPos[1] = newPos[3]-0.01; + } + + this->Renderer->SetViewport(newPos); + this->Interactor->Render(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SquareRenderer() +{ + int *size = this->Renderer->GetSize(); + if (size[0] == 0 || size[1] == 0) + { + return; + } + + double vp[4]; + this->Renderer->GetViewport(vp); + + double deltaX = vp[2] - vp[0]; + double newDeltaX = size[1] * deltaX / (double)size[0]; + double deltaY = vp[3] - vp[1]; + double newDeltaY = size[0] * deltaY / (double)size[1]; + + if (newDeltaX > 1) + { + if (newDeltaY > 1) + { + if (size[0] > size[1]) + { + newDeltaX = size[1] / (double)size[0]; + newDeltaY = 1; + } + else + { + newDeltaX = 1; + newDeltaY = size[0] / (double)size[1]; + } + vp[0] = vp[1] = 0; + vp[2] = newDeltaX; + vp[3] = newDeltaY; + } + else + { + vp[3] = vp[1] + newDeltaY; + if (vp[3] > 1) + { + vp[3] = 1; + vp[1] = vp[3] - newDeltaY; + } + } + } + else + { + vp[2] = vp[0] + newDeltaX; + if (vp[2] > 1) + { + vp[2] = 1; + vp[0] = vp[2] - newDeltaX; + } + } + + this->Renderer->SetViewport(vp); + + this->Renderer->NormalizedDisplayToDisplay(vp[0], vp[1]); + this->Renderer->NormalizedDisplayToDisplay(vp[2], vp[3]); + + vtkPoints *points = this->Outline->GetPoints(); + points->SetPoint(0, vp[0]+1, vp[1]+1, 0); + points->SetPoint(1, vp[2]-1, vp[1]+1, 0); + points->SetPoint(2, vp[2]-1, vp[3]-1, 0); + points->SetPoint(3, vp[0]+1, vp[3]-1, 0); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetInteractive(int state) +{ + if (this->Interactive != state) + { + this->Interactive = state; + } + + if (!state) + { + this->OnButtonRelease(); + this->MouseCursorState = vtkPVAxesWidget::Outside; + this->Renderer->RemoveActor(this->OutlineActor); + if (this->Interactor) + { + this->SetMouseCursor(this->MouseCursorState); + // this->Interactor->Render(); + } + } +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetOutlineColor(double r, double g, double b) +{ + this->OutlineActor->GetProperty()->SetColor(r, g, b); + if (this->Interactor) + { +// this->Interactor->Render(); + } +} + +//---------------------------------------------------------------------------- +double* vtkPVAxesWidget::GetOutlineColor() +{ + return this->OutlineActor->GetProperty()->GetColor(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetAxisLabelColor(double r, double g, double b) +{ + this->AxesActor->GetXAxisLabelProperty()->SetColor(r, g, b); + this->AxesActor->GetYAxisLabelProperty()->SetColor(r, g, b); + this->AxesActor->GetZAxisLabelProperty()->SetColor(r, g, b); +} + +//---------------------------------------------------------------------------- +double* vtkPVAxesWidget::GetAxisLabelColor() +{ + return this->AxesActor->GetXAxisLabelProperty()->GetColor(); +} + +//---------------------------------------------------------------------------- +vtkRenderer* vtkPVAxesWidget::GetParentRenderer() +{ + return this->ParentRenderer; +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::SetViewport(double minX, double minY, + double maxX, double maxY) +{ + this->Renderer->SetViewport(minX, minY, maxX, maxY); +} + +//---------------------------------------------------------------------------- +double* vtkPVAxesWidget::GetViewport() +{ + return this->Renderer->GetViewport(); +} + +//---------------------------------------------------------------------------- +void vtkPVAxesWidget::PrintSelf(ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + + os << indent << "AxesActor: " << this->AxesActor << endl; + os << indent << "Interactive: " << this->Interactive << endl; +} diff --git a/src/SVTK/vtkPVAxesWidget.h b/src/SVTK/vtkPVAxesWidget.h new file mode 100644 index 000000000..35c152a94 --- /dev/null +++ b/src/SVTK/vtkPVAxesWidget.h @@ -0,0 +1,159 @@ +/*========================================================================= + + Program: ParaView + Module: $RCSfile$ + + Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. + All rights reserved. + + ParaView is a free software; you can redistribute it and/or modify it + under the terms of the ParaView license version 1.2. + + See License_v1.2.txt for the full ParaView license. + A copy of this license can be obtained by contacting + Kitware Inc. + 28 Corporate Drive + Clifton Park, NY 12065 + USA + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +// .NAME vtkPVAxesWidget - A widget to manipulate an axe +// +// .SECTION Description +// This widget creates and manages its own vtkPVAxesActor. + + +#ifndef __vtkPVAxesWidget_h +#define __vtkPVAxesWidget_h + +#include "SVTK.h" +#include "vtkInteractorObserver.h" + +class vtkActor2D; +class vtkKWApplication; +class vtkPolyData; +class vtkPVAxesActor; +class vtkPVAxesWidgetObserver; +class vtkRenderer; + +class SVTK_EXPORT vtkPVAxesWidget : public vtkInteractorObserver +{ +public: + static vtkPVAxesWidget* New(); + vtkTypeRevisionMacro(vtkPVAxesWidget, vtkInteractorObserver); + void PrintSelf(ostream& os, vtkIndent indent); + + // Description: + // Set/get the axes actor to be displayed in this 3D widget. + void SetAxesActor(vtkPVAxesActor *actor); + vtkGetObjectMacro(AxesActor, vtkPVAxesActor); + + // Description: + // Enable the 3D widget. + virtual void SetEnabled(int); + + //BTX + // Description: + // Set the renderer this 3D widget will be contained in. + void SetParentRenderer(vtkRenderer *ren); + vtkRenderer* GetParentRenderer(); + //ETX + + // Description: + // Callback to keep the camera for the axes actor up to date with the + // camera in the parent renderer + void ExecuteEvent(vtkObject *o, unsigned long event, void *calldata); + + // Description: + // Set/get whether to allow this 3D widget to be interactively moved/scaled. + void SetInteractive(int state); + vtkGetMacro(Interactive, int); + vtkBooleanMacro(Interactive, int); + + // Description: + // Set/get the color of the outline of this widget. The outline is visible + // when (in interactive mode) the cursor is over this 3D widget. + void SetOutlineColor(double r, double g, double b); + double *GetOutlineColor(); + + // Description: + // Set/get the color of the axis labels of this widget. + void SetAxisLabelColor(double r, double g, double b); + double *GetAxisLabelColor(); + + // Description: + // Set/get the viewport to position/size this 3D widget. + void SetViewport(double minX, double minY, double maxX, double maxY); + double* GetViewport(); + +protected: + vtkPVAxesWidget(); + ~vtkPVAxesWidget(); + + vtkRenderer *Renderer; + vtkRenderer *ParentRenderer; + + vtkPVAxesActor *AxesActor; + vtkPolyData *Outline; + vtkActor2D *OutlineActor; + + static void ProcessEvents(vtkObject *object, unsigned long event, + void *clientdata, void *calldata); + + vtkPVAxesWidgetObserver *Observer; + int StartTag; + + int MouseCursorState; + int Moving; + int StartPosition[2]; + + int Interactive; + + void UpdateCursorIcon(); + void SetMouseCursor(int cursorState); + +//BTX + int State; + + enum AxesWidgetState + { + Outside = 0, + Inside, + TopLeft, + TopRight, + BottomLeft, + BottomRight + }; +//ETX + + void OnButtonPress(); + void OnMouseMove(); + void OnButtonRelease(); + + void MoveWidget(); + void ResizeTopLeft(); + void ResizeTopRight(); + void ResizeBottomLeft(); + void ResizeBottomRight(); + + void SquareRenderer(); + + unsigned long StartEventObserverId; +private: + vtkPVAxesWidget(const vtkPVAxesWidget&); // Not implemented + void operator=(const vtkPVAxesWidget&); // Not implemented +}; + +#endif diff --git a/src/SalomeApp/SalomeApp_Study.cxx b/src/SalomeApp/SalomeApp_Study.cxx index ada147aa1..14270610c 100644 --- a/src/SalomeApp/SalomeApp_Study.cxx +++ b/src/SalomeApp/SalomeApp_Study.cxx @@ -203,11 +203,30 @@ SalomeApp_Study::~SalomeApp_Study() int SalomeApp_Study::id() const { int id = -1; - if ( myStudyDS ) + if ( studyDS() ) id = studyDS()->StudyId(); return id; } +/*! + Get study name. +*/ +QString SalomeApp_Study::studyName() const +{ + // redefined from SUIT_Study to update study name properly since + // it can be changed outside of GUI + // TEMPORARILY SOLUTION: better to be implemented with help of SALOMEDS observers + if ( studyDS() ) { + QString newName = studyDS()->Name().c_str(); + if ( LightApp_Study::studyName() != newName ) { + SalomeApp_Study* that = const_cast( this ); + that->setStudyName( newName ); + ((SalomeApp_Application*)application())->updateDesktopTitle(); + } + } + return LightApp_Study::studyName(); +} + /*! Gets studyDS pointer. */ @@ -862,6 +881,7 @@ void SalomeApp_Study::removeSavePoint(int savePoint) } /*! + \return a name of save point */ QString SalomeApp_Study::getNameOfSavePoint(int savePoint) { diff --git a/src/SalomeApp/SalomeApp_Study.h b/src/SalomeApp/SalomeApp_Study.h index f5a34e5bc..ff383532a 100644 --- a/src/SalomeApp/SalomeApp_Study.h +++ b/src/SalomeApp/SalomeApp_Study.h @@ -43,6 +43,7 @@ public: virtual ~SalomeApp_Study(); virtual int id() const; + virtual QString studyName() const; virtual bool createDocument( const QString& ); virtual bool openDocument( const QString& ); diff --git a/src/SalomeApp/resources/SalomeApp.xml b/src/SalomeApp/resources/SalomeApp.xml index 0dab05727..46ab023a5 100644 --- a/src/SalomeApp/resources/SalomeApp.xml +++ b/src/SalomeApp/resources/SalomeApp.xml @@ -144,6 +144,7 @@ + diff --git a/src/VTKViewer/VTKViewer_MarkerDlg.cxx b/src/VTKViewer/VTKViewer_MarkerDlg.cxx index baa4a1fda..5484bad62 100644 --- a/src/VTKViewer/VTKViewer_MarkerDlg.cxx +++ b/src/VTKViewer/VTKViewer_MarkerDlg.cxx @@ -20,8 +20,14 @@ #include "VTKViewer_MarkerDlg.h" #include "VTKViewer_MarkerWidget.h" +#include +#include +#include +#include + #include #include +#include /*! * Class : VTKViewer_MarkerDlg @@ -42,6 +48,8 @@ VTKViewer_MarkerDlg::VTKViewer_MarkerDlg( QWidget* theParent ) aTopLayout->setSpacing( 0 ); aTopLayout->setMargin( 0 ); aTopLayout->addWidget( myMarkerWidget ); + + connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); } /*! @@ -51,6 +59,48 @@ VTKViewer_MarkerDlg::~VTKViewer_MarkerDlg() { } +void VTKViewer_MarkerDlg::setHelpData( const QString& theModuleName, + const QString& theHelpFileName ) +{ + myModuleName = theModuleName; + myHelpFileName = theHelpFileName; +} + +void VTKViewer_MarkerDlg::keyPressEvent( QKeyEvent* e ) +{ + QtxDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + onHelp(); + } +} + +void VTKViewer_MarkerDlg::onHelp() +{ + if( myModuleName.isNull() || myHelpFileName.isNull() ) + return; + + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (app) + app->onHelpContextModule(myModuleName, myHelpFileName); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); + } +} + void VTKViewer_MarkerDlg::setCustomMarkerMap( VTK::MarkerMap theMarkerMap ) { myMarkerWidget->setCustomMarkerMap( theMarkerMap ); diff --git a/src/VTKViewer/VTKViewer_MarkerDlg.h b/src/VTKViewer/VTKViewer_MarkerDlg.h index 8cbe935e6..7e40c6131 100644 --- a/src/VTKViewer/VTKViewer_MarkerDlg.h +++ b/src/VTKViewer/VTKViewer_MarkerDlg.h @@ -39,6 +39,9 @@ public: VTKViewer_MarkerDlg( QWidget* = 0 ); virtual ~VTKViewer_MarkerDlg(); + void setHelpData( const QString& theModuleName, + const QString& theHelpFileName ); + void setCustomMarkerMap( VTK::MarkerMap ); VTK::MarkerMap getCustomMarkerMap(); @@ -48,8 +51,17 @@ public: VTK::MarkerScale getStandardMarkerScale() const; int getCustomMarkerID() const; +protected: + void keyPressEvent( QKeyEvent* ); + +private slots: + void onHelp(); + private: VTKViewer_MarkerWidget* myMarkerWidget; + + QString myModuleName; + QString myHelpFileName; }; #endif diff --git a/src/VTKViewer/VTKViewer_PolyDataMapper.cxx b/src/VTKViewer/VTKViewer_PolyDataMapper.cxx index 50ea7c8e3..2a0458d22 100644 --- a/src/VTKViewer/VTKViewer_PolyDataMapper.cxx +++ b/src/VTKViewer/VTKViewer_PolyDataMapper.cxx @@ -126,7 +126,7 @@ VTKViewer_PolyDataMapper::VTKViewer_PolyDataMapper() { Q_INIT_RESOURCE( VTKViewer ); - this->ExtensionsInitialized = 0; + this->ExtensionsInitialized = ES_None; this->PointSpriteTexture = 0; @@ -220,24 +220,18 @@ int VTKViewer_PolyDataMapper::GetMarkerTexture() } //----------------------------------------------------------------------------- -bool VTKViewer_PolyDataMapper::InitExtensions() +int VTKViewer_PolyDataMapper::InitExtensions() { - if( this->ExtensionsInitialized ) - return true; - - InitializeBufferExtensions(); - char* ext = (char*)glGetString( GL_EXTENSIONS ); if( !IsBufferExtensionsInitialized || strstr( ext, "GL_ARB_point_sprite" ) == NULL || strstr( ext, "GL_ARB_vertex_buffer_object" ) == NULL ) { - INFOS("Initializing ARB extensions failed"); - return false; + MESSAGE("Initializing ARB extensions failed"); + return ES_Error; } - this->ExtensionsInitialized = 1; - return true; + return ES_Ok; } //----------------------------------------------------------------------------- @@ -296,7 +290,8 @@ void VTKViewer_PolyDataMapper::RenderPiece( vtkRenderer* ren, vtkActor* act ) bool isUsePointSprites = this->MarkerEnabled && this->MarkerType != VTK::MT_NONE; if( isUsePointSprites ) { - this->InitExtensions(); + if( this->ExtensionsInitialized == ES_None ) + this->ExtensionsInitialized = this->InitExtensions(); this->InitPointSprites(); this->InitTextures(); } @@ -542,7 +537,7 @@ int VTKViewer_PolyDataMapper::Draw( vtkRenderer* ren, vtkActor* act ) delete aColorFunctor; } - if( this->ExtensionsInitialized ) { + if( this->ExtensionsInitialized == ES_Ok ) { GLuint aBufferObjectID = 0; vglGenBuffersARB( 1, &aBufferObjectID ); vglBindBufferARB( GL_ARRAY_BUFFER_ARB, aBufferObjectID ); diff --git a/src/VTKViewer/VTKViewer_PolyDataMapper.h b/src/VTKViewer/VTKViewer_PolyDataMapper.h index 38b4838fb..9b936f8f9 100644 --- a/src/VTKViewer/VTKViewer_PolyDataMapper.h +++ b/src/VTKViewer/VTKViewer_PolyDataMapper.h @@ -55,6 +55,9 @@ class vtkImageData; */ class VTKVIEWER_EXPORT VTKViewer_PolyDataMapper : public MAPPER_SUPERCLASS { +public: + enum ExtensionsState { ES_None = 0, ES_Error, ES_Ok }; + public: static VTKViewer_PolyDataMapper* New(); vtkTypeRevisionMacro( VTKViewer_PolyDataMapper, MAPPER_SUPERCLASS ); @@ -88,7 +91,7 @@ protected: ~VTKViewer_PolyDataMapper(); //! Initializing OpenGL extensions. - bool InitExtensions(); + int InitExtensions(); //! Activate Point Sprites. void InitPointSprites(); -- 2.39.2