OPTION(SALOME_USE_PV3DVIEWER "Enable ParaView3D visualization (Optionally in classic configurations)" ON)
OPTION(SALOME_USE_GLVIEWER "Enable OpenGL visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_GRAPHICSVIEW "Enable GraphicsView visualization (Mandatory in classic configurations)" ON)
+OPTION(SALOME_USE_QTVIEWER "Enable Qt viewer visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PYVIEWER "Enable Python viewer (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PLOT2DVIEWER "Enable Plot2D visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PYCONSOLE "Enable Python GUI interface (Mandatory in classic configurations)" ON)
CMAKE_DEPENDENT_OPTION(SALOME_USE_SALOMEOBJECT "Enable Salome Object (Mandatory in classic configurations)" ON
"SALOME_LIGHT_ONLY" ON)
-MARK_AS_ADVANCED(SALOME_LIGHT_ONLY SALOME_USE_VTKVIEWER SALOME_USE_GRAPHICSVIEW SALOME_USE_PVVIEWER)
+MARK_AS_ADVANCED(SALOME_LIGHT_ONLY SALOME_USE_VTKVIEWER SALOME_USE_GRAPHICSVIEW SALOME_USE_QTVIEWER SALOME_USE_PVVIEWER)
MARK_AS_ADVANCED(SALOME_USE_SALOMEOBJECT SALOME_USE_OCCVIEWER SALOME_USE_GLVIEWER SALOME_USE_PLOT2DVIEWER)
MARK_AS_ADVANCED(SALOME_USE_PYCONSOLE SALOME_USE_QXGRAPHVIEWER SALOME_USE_PYVIEWER SALOME_USE_PV3DVIEWER)
ADD_DEFINITIONS("-DDISABLE_GRAPHICSVIEW")
ENDIF()
+# - Qt viewer: no prereqs
+IF (NOT SALOME_USE_QTVIEWER)
+ ADD_DEFINITIONS("-DDISABLE_QTVIEWER")
+ENDIF()
+
# - Python editor: no prereqs
IF (NOT SALOME_USE_PYVIEWER)
ADD_DEFINITIONS("-DDISABLE_PYVIEWER")
GraphicsView)
ENDIF(SALOME_USE_GRAPHICSVIEW)
+# QtViewer specific targets:
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _${PROJECT_NAME}_exposed_targets
+ QtViewer)
+ENDIF(SALOME_USE_QTVIEWER)
+
# PyEditor/Viewer specific targets:
IF(SALOME_USE_PYVIEWER)
LIST(APPEND _${PROJECT_NAME}_exposed_targets
SET(SALOME_USE_PV3DVIEWER @SALOME_USE_PV3DVIEWER@)
SET(SALOME_USE_PLOT2DVIEWER @SALOME_USE_PLOT2DVIEWER@)
SET(SALOME_USE_GRAPHICSVIEW @SALOME_USE_GRAPHICSVIEW@)
+SET(SALOME_USE_QTVIEWER @SALOME_USE_QTVIEWER@)
SET(SALOME_USE_QXGRAPHVIEWER @SALOME_USE_QXGRAPHVIEWER@)
SET(SALOME_USE_PVVIEWER @SALOME_USE_PVVIEWER@)
SET(SALOME_USE_PYVIEWER @SALOME_USE_PYVIEWER@)
IF (NOT SALOME_USE_GRAPHICSVIEW)
LIST(APPEND GUI_DEFINITIONS "-DDISABLE_GRAPHICSVIEW")
ENDIF()
+IF (NOT SALOME_USE_QTVIEWER)
+ LIST(APPEND GUI_DEFINITIONS "-DDISABLE_QTVIEWER")
+ENDIF()
IF (NOT SALOME_USE_PVVIEWER)
LIST(APPEND GUI_DEFINITIONS "-DDISABLE_PVVIEWER")
ENDIF()
ADD_SUBDIRECTORY(GraphicsView)
ENDIF(SALOME_USE_GRAPHICSVIEW)
+# Qt viewer
+##
+IF(SALOME_USE_QTVIEWER)
+ ADD_SUBDIRECTORY(QtViewer)
+ENDIF(SALOME_USE_QTVIEWER)
+
# ParaView Viewer
IF(SALOME_USE_PVVIEWER)
ADD_SUBDIRECTORY(PVViewer)
IF(SALOME_USE_GRAPHICSVIEW)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/GraphicsView)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/QtViewer)
+ENDIF()
IF(SALOME_USE_PYVIEWER)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/PyEditor)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/PyViewer)
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _link_LIBRARIES GraphicsView)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _link_LIBRARIES QtViewer)
+ENDIF()
IF(SALOME_USE_PYVIEWER)
LIST(APPEND _link_LIBRARIES PyEditor PyViewer)
ENDIF()
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _moc_HEADERS LightApp_GVSelector.h)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _moc_HEADERS LightApp_QTVSelector.h)
+ENDIF()
IF(SALOME_USE_OCCVIEWER)
LIST(APPEND _moc_HEADERS LightApp_OCCSelector.h)
ENDIF()
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _other_SOURCES LightApp_GVSelector.cxx)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _other_SOURCES LightApp_QTVSelector.cxx)
+ENDIF()
IF(SALOME_USE_OCCVIEWER)
LIST(APPEND _other_SOURCES LightApp_OCCSelector.cxx)
ENDIF()
#include "LightApp_GVSelector.h"
#endif
+#ifndef DISABLE_QTVIEWER
+ #include "QtViewer_Viewer.h"
+ #include "QtViewer_ViewManager.h"
+ #include "LightApp_QTVSelector.h"
+#endif
+
#ifndef DISABLE_PVVIEWER
#include "PVViewer_ViewManager.h"
#include "PVViewer_ViewWindow.h"
#ifndef DISABLE_PV3DVIEWER
createActionForViewer( NewPV3DViewId, newWinMenu, QString::number( 8 ) );
#endif
+#ifndef DISABLE_QTVIEWER
+ createActionForViewer( NewQtViewId, newWinMenu, QString::number( 9 ) );
+#endif
createAction( RenameId, desk, false /*toggle*/, "/PRP_RENAME",
tr( "TOT_RENAME" ), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ), QIcon(),
type = GraphicsView_Viewer::Type();
break;
#endif
+#ifndef DISABLE_QTVIEWER
+ case NewQtViewId:
+ type = QtViewer_Viewer::Type();
+ break;
+#endif
#ifndef DISABLE_PVVIEWER
case NewPVViewId:
type = PVViewer_Viewer::Type();
a->setEnabled( activeStudy() );
#endif
+#ifndef DISABLE_QTVIEWER
+ a = action( NewQtViewId );
+ if( a )
+ a->setEnabled( activeStudy() );
+#endif
+
#ifndef DISABLE_PVVIEWER
a = action( NewPVViewId );
if( a )
new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
}
#endif
+#ifndef DISABLE_QTVIEWER
+ if( vmType == QtViewer_Viewer::Type() )
+ {
+ viewMgr = new QtViewer_ViewManager( activeStudy(), desktop() );
+ new LightApp_QTVSelector( (QtViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
+ }
+#endif
#ifndef DISABLE_PVVIEWER
if( vmType == PVViewer_Viewer::Type() )
{
CloseId, CloseAllId, GroupAllId,
PreferencesId, MRUId, ModulesListId,
NewGLViewId, NewPlot2dId, NewOCCViewId, NewVTKViewId,
- NewQxSceneViewId, NewGraphicsViewId, NewPVViewId, NewPyViewerId, NewPV3DViewId, StyleId, FullScreenId,
+ NewQxSceneViewId, NewGraphicsViewId, NewQtViewId, NewPVViewId, NewPyViewerId, NewPV3DViewId, StyleId, FullScreenId,
WebSiteId, ForumId, VideosId, TutorialsId,
UserID };
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "LightApp_QTVSelector.h"
+
+#include "LightApp_DataOwner.h"
+
+#include <QtViewer_Object.h>
+#include <QtViewer_ViewPort.h>
+#include <QtViewer_Viewer.h>
+
+LightApp_QTVSelector::LightApp_QTVSelector( QtViewer_Viewer* theViewer,
+ SUIT_SelectionMgr* theSelMgr )
+: SUIT_Selector( theSelMgr, theViewer ),
+ myViewer( theViewer )
+{
+ connect( theViewer, SIGNAL( selectionChanged() ),
+ this, SLOT( onSelectionChanged() ) );
+}
+
+LightApp_QTVSelector::~LightApp_QTVSelector()
+{
+}
+
+QString LightApp_QTVSelector::type() const
+{
+ return QtViewer_Viewer::Type();
+}
+
+void LightApp_QTVSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const
+{
+ if ( !myViewer )
+ return;
+
+ if( QtViewer_ViewPort* aViewport = myViewer->getActiveViewPort() )
+ {
+ foreach (QGraphicsItem *item, aViewport->scene()->selectedItems())
+ {
+ if (QtViewer_Object* obj = dynamic_cast<QtViewer_Object*>(item))
+ {
+ LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+ if ( owner )
+ theList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( owner->entry() ) ) );
+ }
+ }
+ }
+}
+
+void LightApp_QTVSelector::setSelection( const SUIT_DataOwnerPtrList& theList)
+{
+ if ( !myViewer )
+ return;
+
+ QMap<QString, int> aSelected;
+ for ( SUIT_DataOwnerPtrList::const_iterator itr = theList.begin(); itr != theList.end(); ++itr )
+ {
+ const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*itr).operator->() );
+
+ if ( owner )
+ aSelected.insert( owner->entry(), 0 );
+ }
+
+ if( QtViewer_ViewPort* aViewport = myViewer->getActiveViewPort() )
+ {
+ aViewport->scene()->clearSelection();
+ foreach (QGraphicsItem *item, aViewport->items())
+ {
+ if (QtViewer_Object* obj = dynamic_cast<QtViewer_Object*>(item))
+ {
+ LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+ bool sel = owner && aSelected.contains(owner->entry());
+ obj->setSelected(sel);
+ }
+ }
+ }
+}
+
+void LightApp_QTVSelector::onSelectionChanged()
+{
+ selectionChanged();
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef LIGHTAPP_QTVSELECTOR_H
+#define LIGHTAPP_QTVSELECTOR_H
+
+#include "LightApp.h"
+
+#include <QObject>
+#include <SUIT_Selector.h>
+#include <SUIT_DataOwner.h>
+
+class QtViewer_Viewer;
+
+class LIGHTAPP_EXPORT LightApp_QTVSelector : public QObject, public SUIT_Selector
+{
+ Q_OBJECT
+
+public:
+ LightApp_QTVSelector( QtViewer_Viewer*, SUIT_SelectionMgr* );
+ virtual ~LightApp_QTVSelector();
+
+ virtual QString type() const;
+
+protected:
+ virtual void getSelection( SUIT_DataOwnerPtrList& ) const;
+ virtual void setSelection( const SUIT_DataOwnerPtrList& );
+
+protected slots:
+ void onSelectionChanged();
+
+protected:
+ QtViewer_Viewer* myViewer;
+};
+
+#endif
<parameter name="SPlot2d" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="GLViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="GraphicsView" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
+ <parameter name="QtViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="OCCViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="VTKViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="PVViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="PRP_CREATE_NEW_WINDOW_FOR_VIEWER_7" value="Alt+Y"/>
<parameter name="PRP_DESK_FIND_ACTION" value="Ctrl+Shift+Space"/>
<parameter name="PRP_CREATE_NEW_WINDOW_FOR_VIEWER_8" value="Alt+3"/>
+ <parameter name="PRP_CREATE_NEW_WINDOW_FOR_VIEWER_9" value="Alt+Q"/>
<parameter name="#General/Object(s)/Show" value="Ctrl+Alt+S"/>
<parameter name="#General/Object(s)/Hide" value="Ctrl+Alt+H"/>
<parameter name="#Viewers/View/Set X+" value="Ctrl+Alt+B"/>
<source>NEW_WINDOW_8</source>
<translation>ParaView&3D view</translation>
</message>
+ <message>
+ <source>NEW_WINDOW_9</source>
+ <translation>Q&t view</translation>
+ </message>
<message>
<source>CREATING_NEW_WINDOW</source>
<translation>Create new %1</translation>
<source>NEW_WINDOW_7</source>
<translation>Vue P&ython</translation>
</message>
+ <message>
+ <source>NEW_WINDOW_8</source>
+ <translation>ParaView&3D view</translation>
+ </message>
+ <message>
+ <source>NEW_WINDOW_9</source>
+ <translation>Q&t view</translation>
+ </message>
<message>
<source>CREATING_NEW_WINDOW</source>
<translation>Créer une nouvelle %1</translation>
Quantity_Color qCol1( c1.red()/255., c1.green()/255., c1.blue()/255., Quantity_TOC_RGB );
Quantity_Color qCol2( c2.red()/255., c2.green()/255., c2.blue()/255., Quantity_TOC_RGB );
activeView()->SetBgImageStyle( Aspect_FM_NONE ); // cancel texture background
+#if OCC_VERSION_LARGE > 0x07070000
switch ( type ) {
case OCCViewer_Viewer::HorizontalGradient:
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GradientFillMethod_Horizontal, Standard_True );
default:
break;
}
+#else
+ switch ( type ) {
+ case OCCViewer_Viewer::HorizontalGradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_HOR, Standard_True );
+ break;
+ case OCCViewer_Viewer::VerticalGradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_VER, Standard_True );
+ break;
+ case OCCViewer_Viewer::Diagonal1Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG1, Standard_True );
+ break;
+ case OCCViewer_Viewer::Diagonal2Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG2, Standard_True );
+ break;
+ case OCCViewer_Viewer::Corner1Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER1, Standard_True );
+ break;
+ case OCCViewer_Viewer::Corner2Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER2, Standard_True );
+ break;
+ case OCCViewer_Viewer::Corner3Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER3, Standard_True );
+ break;
+ case OCCViewer_Viewer::Corner4Gradient:
+ activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER4, Standard_True );
+ break;
+ default:
+ break;
+ }
+#endif
}
break;
}
#include "OCCViewer_ViewSketcher.h"
#include "OCCViewer_ViewWindow.h"
#include "OCCViewer_ViewPort3d.h"
+#include "ViewerTools_ScreenScaling.h"
#include "QtxRubberBand.h"
{
OCCViewer_ViewPort3d* avp = mypViewWindow->getViewPort();
+ // We need to downscale only non-system events here
+ if (!e->spontaneous())
+ {
+ // Make a copy event with updated coordinates
+ e = ViewerTools_ScreenScaling::getDpiAwareEvent(e, false);
+ }
+
QMouseEvent* me = (QMouseEvent*)e;
SketchState state = EnTrain;
bool ignore = false;
#include "OCCViewer_EnvTextureDlg.h"
#include "OCCViewer_LightSourceDlg.h"
#include "OCCViewer_Utilities.h"
+#include "ViewerTools_ScreenScaling.h"
#include <SUIT_Desktop.h>
#include <SUIT_Session.h>
bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )
{
if ( watched == myViewPort ) {
+ // Makes a copy event with updated coordinates if we need so
+ e = ViewerTools_ScreenScaling::getDpiAwareEvent(e);
+
int aType = e->type();
switch(aType) {
case QEvent::MouseButtonPress:
emit mouseReleased(this, theEvent);
if(theEvent->button() == Qt::RightButton && prevState == -1)
{
+ // We need to pass unscaled coordinates to get a menu painted in a right place.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
QContextMenuEvent aEvent( QContextMenuEvent::Mouse,
- theEvent->pos(), theEvent->globalPos() );
+ theEvent->pos() / pixelRatio, theEvent->globalPos() / pixelRatio );
emit contextMenuRequested( &aEvent );
}
}
{
Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
bool append = mypSketcher->isHasShift();
+
+ // Sketcher uses unscaled coordinates to draw a rubber band,
+ // then we need to scale them here for proper selection.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+
switch( mypSketcher->type() )
{
case Rect:
QRect* aRect = (QRect*)mypSketcher->data();
if ( aRect )
{
- int aLeft = aRect->left();
- int aRight = aRect->right();
- int aTop = aRect->top();
- int aBottom = aRect->bottom();
+ int aLeft = aRect->left() * pixelRatio;
+ int aRight = aRect->right() * pixelRatio;
+ int aTop = aRect->top() * pixelRatio;
+ int aBottom = aRect->bottom() * pixelRatio;
// myRect = aRect;
if( append )
for (int index = 1; it != itEnd; ++it, index++)
{
QPoint aPoint = *it;
- anArray.SetValue(index, gp_Pnt2d(aPoint.x(), aPoint.y()));
+ anArray.SetValue(index, gp_Pnt2d(aPoint.x() * pixelRatio, aPoint.y() * pixelRatio));
}
if (append)
--- /dev/null
+# Copyright (C) 2012-2023 CEA, EDF, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+INCLUDE(UseQtExt)
+
+# --- options ---
+
+# additional include directories
+INCLUDE_DIRECTORIES(
+ ${QT_INCLUDES}
+ ${PROJECT_SOURCE_DIR}/src/Qtx
+ ${PROJECT_SOURCE_DIR}/src/SUIT
+ ${PROJECT_SOURCE_DIR}/src/ImageComposer
+)
+
+# additional preprocessor / compiler flags
+ADD_DEFINITIONS(${QT_DEFINITIONS})
+
+# libraries to link to
+SET(_link_LIBRARIES ${QT_LIBRARIES} qtx suit ImageComposer)
+
+# --- headers ---
+
+# header files / to be processed by moc
+SET(_moc_HEADERS
+ QtViewer_Scene.h
+ QtViewer_Selector.h
+ QtViewer_ViewFrame.h
+ QtViewer_ViewManager.h
+ QtViewer_ViewPort.h
+ QtViewer_Viewer.h
+)
+
+# header files / no moc processing
+SET(_other_HEADERS
+ QtViewer.h
+ QtViewer_Object.h
+ QtViewer_PainterObject.h
+)
+
+# header files / to install
+SET(QtViewer_HEADERS ${_moc_HEADERS} ${_other_HEADERS})
+
+# --- resources ---
+
+# resource files / to be processed by lrelease
+SET(_ts_RESOURCES
+ resources/QtViewer_images.ts
+ resources/QtViewer_msg_en.ts
+ resources/QtViewer_msg_fr.ts
+ resources/QtViewer_msg_ja.ts
+)
+
+# resource files / static
+SET(_other_RESOURCES
+ resources/qtviewer_cursor_zoom.png
+ resources/qtviewer_dump.png
+ resources/qtviewer_fitall.png
+ resources/qtviewer_fitarea.png
+ resources/qtviewer_fitselect.png
+ resources/qtviewer_glpan.png
+ resources/qtviewer_pan.png
+ resources/qtviewer_reset.png
+ resources/qtviewer_rotate.png
+ resources/qtviewer_zoom.png
+)
+
+# --- sources ---
+
+# sources / moc wrappings
+QT_WRAP_MOC(_moc_SOURCES ${_moc_HEADERS})
+
+# sources / static
+SET(_other_SOURCES
+ QtViewer_Object.cxx
+ QtViewer_PainterObject.cxx
+ QtViewer_Scene.cxx
+ QtViewer_Selector.cxx
+ QtViewer_ViewFrame.cxx
+ QtViewer_ViewManager.cxx
+ QtViewer_ViewPort.cxx
+ QtViewer_Viewer.cxx
+)
+
+# sources / to compile
+SET(QtViewer_SOURCES ${_other_SOURCES} ${_moc_SOURCES})
+
+# --- rules ---
+
+ADD_LIBRARY(QtViewer ${QtViewer_SOURCES})
+TARGET_LINK_LIBRARIES(QtViewer ${_link_LIBRARIES})
+INSTALL(TARGETS QtViewer EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS})
+
+INSTALL(FILES ${QtViewer_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS})
+QT_INSTALL_TS_RESOURCES("${_ts_RESOURCES}" "${SALOME_GUI_INSTALL_RES_DATA}")
+
+INSTALL(FILES ${_other_RESOURCES} DESTINATION ${SALOME_GUI_INSTALL_RES_DATA})
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifdef WIN32
+
+#if defined QTVIEWER_EXPORTS || defined QtViewer_EXPORTS
+#define QTVIEWER_API __declspec(dllexport)
+#else
+#define QTVIEWER_API __declspec(dllimport)
+#endif
+
+#else
+#define QTVIEWER_API
+#endif // WIN32
+
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Object.h"
+
+//=======================================================================
+// Name : QtViewer_Object
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Object::QtViewer_Object( QGraphicsItem* theParent )
+: QGraphicsItem( theParent )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Object
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Object::~QtViewer_Object()
+{
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_OBJECT_H
+#define QTVIEWER_OBJECT_H
+
+#include "QtViewer.h"
+#include <QGraphicsItem>
+
+class SUIT_DataOwner;
+/*
+ Class : QtViewer_Object
+ Description : Base class for all objects displayed at the scene
+*/
+class QTVIEWER_API QtViewer_Object : public QGraphicsItem
+{
+public:
+ QtViewer_Object( QGraphicsItem* theParent = nullptr );
+ ~QtViewer_Object();
+
+ const QString& getName() const { return myName; }
+ virtual void setName( const QString& theName ) { myName = theName; }
+
+ SUIT_DataOwner* owner() const { return myOwner; }
+ void setOwner( SUIT_DataOwner* owner ) { myOwner = owner; }
+
+protected:
+ SUIT_DataOwner* myOwner;
+ QString myName;
+};
+
+#endif
--- /dev/null
+#include "QtViewer_PainterObject.h"
+
+
+QtViewer_PainterObject::QtViewer_PainterObject()
+{
+}
+
+QtViewer_PainterObject::~QtViewer_PainterObject()
+{
+}
+
+void QtViewer_PainterObject::draw(QPainter* painter)
+{
+}
--- /dev/null
+#ifndef QTVIEWER_PAINTEROBJECT_H
+#define QTVIEWER_PAINTEROBJECT_H
+
+#include "QtViewer.h"
+#include <QPainter>
+
+class QTVIEWER_API QtViewer_PainterObject
+{
+public:
+
+ QtViewer_PainterObject();
+ ~QtViewer_PainterObject();
+
+ virtual void draw(QPainter* painter);
+};
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Scene.h"
+
+//=======================================================================
+// Name : QtViewer_Scene
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Scene::QtViewer_Scene( QObject* theParent )
+: QGraphicsScene( theParent )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Scene
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Scene::~QtViewer_Scene()
+{
+}
+
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_SCENE_H
+#define QTVIEWER_SCENE_H
+
+#include "QtViewer.h"
+#include <QGraphicsScene>
+
+class QGraphicsRectItem;
+
+/*
+ Class : QtViewer_Scene
+ Description : Scene of the graphics view
+*/
+class QTVIEWER_API QtViewer_Scene : public QGraphicsScene
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Scene( QObject* theParent = 0 );
+ ~QtViewer_Scene();
+};
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Selector.h"
+#include "QtViewer_Viewer.h"
+
+//=======================================================================
+// Name : QtViewer_Selector
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Selector::QtViewer_Selector(QtViewer_Viewer* theViewer)
+: QObject( nullptr ),
+ myViewer(theViewer)
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Selector
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Selector::~QtViewer_Selector()
+{
+}
+
+//================================================================
+// Function : select
+// Purpose :
+//================================================================
+void QtViewer_Selector::select( const QRectF& selRect)
+{
+ emit selSelectionDone();
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_SELECTOR_H
+#define QTVIEWER_SELECTOR_H
+
+#include "QtViewer.h"
+
+#include <QObject>
+#include <QRectF>
+
+class QtViewer_Viewer;
+
+/*
+ Class : QtViewer_Selector
+ Description : Selector of the graphics view
+*/
+class QTVIEWER_API QtViewer_Selector : public QObject
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Selector(QtViewer_Viewer*);
+ ~QtViewer_Selector();
+
+public:
+
+ virtual void select(const QRectF&);
+
+signals:
+ void selSelectionDone();
+
+protected:
+ QtViewer_Viewer* myViewer;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewFrame.h"
+
+#include "QtViewer_Viewer.h"
+#include "QtViewer_ViewPort.h"
+
+#include <QtxAction.h>
+#include <QtxActionToolMgr.h>
+#include <QtxMultiAction.h>
+#include <QtxToolBar.h>
+
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
+#include <QColor>
+#include <QFrame>
+#include <QFileDialog>
+
+#include <QWheelEvent>
+#include <QHBoxLayout>
+#include <QImage>
+#include <QMouseEvent>
+#include <QString>
+#include <QWheelEvent>
+
+//=======================================================================
+// Name : QtViewer_ViewFrame
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewFrame::QtViewer_ViewFrame( SUIT_Desktop* d, QtViewer_Viewer* vw, QWidget* w )
+: SUIT_ViewWindow( d ),
+ myViewer( vw )
+{
+ QFrame* aFrame = new QFrame( this );
+ setCentralWidget( aFrame );
+
+ QBoxLayout* aLayout = new QHBoxLayout( aFrame );
+ aLayout->setMargin( 0 );
+ aLayout->setSpacing( 0 );
+
+ if( w )
+ myViewPort = dynamic_cast<QtViewer_ViewPort*>(w);
+ else
+ myViewPort = new QtViewer_ViewPort( aFrame );
+
+ aLayout->addWidget( myViewPort );
+ createActions();
+ createToolBar();
+
+ connect( myViewPort, SIGNAL( vpKeyEvent( QKeyEvent* ) ),
+ this, SLOT( keyEvent( QKeyEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpMouseEvent( QMouseEvent* ) ),
+ this, SLOT( mouseEvent( QMouseEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpWheelEvent( QWheelEvent* ) ),
+ this, SLOT( wheelEvent( QWheelEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpContextMenuEvent( QContextMenuEvent* ) ),
+ this, SLOT( contextMenuEvent( QContextMenuEvent* ) ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewFrame
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewFrame::~QtViewer_ViewFrame()
+{
+}
+
+//================================================================
+// Function : createActions
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::createActions()
+{
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ QtxAction* anAction;
+
+ // Dump view
+ anAction = new QtxAction( tr( "MNU_DUMP_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_DUMP" ) ),
+ tr( "MNU_DUMP_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_DUMP_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onDumpView() ) );
+ toolMgr()->registerAction( anAction, DumpId );
+
+ // FitAll
+ anAction = new QtxAction( tr( "MNU_FITALL" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITALL" ) ),
+ tr( "MNU_FITALL" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITALL" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitAll() ) );
+ toolMgr()->registerAction( anAction, FitAllId );
+
+ // FitRect
+ anAction = new QtxAction( tr( "MNU_FITRECT" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITAREA" ) ),
+ tr( "MNU_FITRECT" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITRECT" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitArea() ) );
+ toolMgr()->registerAction( anAction, FitRectId );
+
+ // FitSelect
+ anAction = new QtxAction( tr( "MNU_FITSELECT" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITSELECT" ) ),
+ tr( "MNU_FITSELECT" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITSELECT" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitSelect() ) );
+ toolMgr()->registerAction( anAction, FitSelectId );
+
+ // Zoom
+ anAction = new QtxAction( tr( "MNU_ZOOM_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_ZOOM" ) ),
+ tr( "MNU_ZOOM_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_ZOOM_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewZoom() ) );
+ toolMgr()->registerAction( anAction, ZoomId );
+
+ // Panning
+ anAction = new QtxAction( tr( "MNU_PAN_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_PAN" ) ),
+ tr( "MNU_PAN_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_PAN_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewPan() ) );
+ toolMgr()->registerAction( anAction, PanId );
+
+ // Global Panning
+ anAction = new QtxAction( tr( "MNU_GLOBALPAN_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_GLOBALPAN" ) ),
+ tr( "MNU_GLOBALPAN_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_GLOBALPAN_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewGlobalPan() ) );
+ toolMgr()->registerAction( anAction, GlobalPanId );
+}
+
+//================================================================
+// Function : createToolBar
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::createToolBar()
+{
+ int tid = toolMgr()->createToolBar( tr("LBL_TOOLBAR_LABEL"), // title (language-dependant)
+ QString( "QtViewerViewOperations" ), // name (language-independant)
+ false ); // disable floatable toolbar
+ toolMgr()->append( DumpId, tid );
+
+ QtxMultiAction* aScaleAction = new QtxMultiAction( this );
+ aScaleAction->insertAction( toolMgr()->action( FitAllId ) );
+ aScaleAction->insertAction( toolMgr()->action( FitRectId ) );
+ aScaleAction->insertAction( toolMgr()->action( FitSelectId ) );
+ aScaleAction->insertAction( toolMgr()->action( ZoomId ) );
+ toolMgr()->append( aScaleAction, tid );
+
+ QtxMultiAction* aPanAction = new QtxMultiAction( this );
+ aPanAction->insertAction( toolMgr()->action( PanId ) );
+ aPanAction->insertAction( toolMgr()->action( GlobalPanId ) );
+ toolMgr()->append( aPanAction, tid );
+
+ toolMgr()->append( toolMgr()->action( ResetId ), tid );
+}
+
+//================================================================
+// Function : dumpView
+// Purpose :
+//================================================================
+QImage QtViewer_ViewFrame::dumpView()
+{
+ return myViewPort->dumpView();
+}
+
+//================================================================
+// Function : dumpViewToFormat
+// Purpose :
+//================================================================
+bool QtViewer_ViewFrame::dumpViewToFormat( const QImage& image, const QString& fileName, const QString& format )
+{
+ bool isOK = myViewPort->dumpViewToFormat(fileName, format);
+ if( !isOK )
+ isOK = SUIT_ViewWindow::dumpViewToFormat( image, fileName, format );
+ return isOK;
+}
+
+//================================================================
+// Function : getVisualParameters
+// Purpose :
+//================================================================
+QString QtViewer_ViewFrame::getVisualParameters()
+{
+ QTransform aTransform = myViewPort->transform();
+
+ QString aString;
+ aString.asprintf( "%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f",
+ aTransform.m11(), aTransform.m12(), aTransform.m13(),
+ aTransform.m21(), aTransform.m22(), aTransform.m23(),
+ aTransform.m31(), aTransform.m32(), aTransform.m33() );
+ return aString;
+}
+
+//================================================================
+// Function : setVisualParameters
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::setVisualParameters( const QString& theParameters )
+{
+ QStringList aList = theParameters.split( '*' );
+ if( aList.size() < 9 )
+ return;
+
+ bool anIsOk[9];
+ QTransform aTransform( aList[0].toDouble( &anIsOk[0] ),
+ aList[1].toDouble( &anIsOk[1] ),
+ aList[2].toDouble( &anIsOk[2] ),
+ aList[3].toDouble( &anIsOk[3] ),
+ aList[4].toDouble( &anIsOk[4] ),
+ aList[5].toDouble( &anIsOk[5] ),
+ aList[6].toDouble( &anIsOk[6] ),
+ aList[7].toDouble( &anIsOk[7] ),
+ aList[8].toDouble( &anIsOk[8] ) );
+ for( int i = 0; i < 9; i++ )
+ if( !anIsOk[ i ] )
+ return;
+
+ myViewPort->setTransform(aTransform);
+}
+
+//================================================================
+// Function : onViewPan
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewPan()
+{
+ myViewer->pan();
+}
+
+//================================================================
+// Function : onViewZoom
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewZoom()
+{
+ myViewer->zoom();
+}
+
+//================================================================
+// Function : onViewFitAll
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitAll()
+{
+ myViewer->fitAll();
+}
+
+//================================================================
+// Function : onViewFitArea
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitArea()
+{
+ myViewer->fitArea();
+}
+
+//================================================================
+// Function : onViewFitSelect
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitSelect()
+{
+ myViewer->fitSelect();
+}
+
+//================================================================
+// Function : onViewGlobalPan
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewGlobalPan()
+{
+ myViewer->globalPan();
+}
+
+//================================================================
+// Function : onViewReset
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewReset()
+{
+}
+
+//================================================================
+// Function : keyEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::keyEvent( QKeyEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::KeyPress:
+ emit keyPressed( e );
+ break;
+ case QEvent::KeyRelease:
+ emit keyReleased( e );
+ break;
+ default:
+ break;
+ }
+}
+
+//================================================================
+// Function : mouseEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::mouseEvent( QMouseEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ emit mousePressed( e );
+ break;
+ case QEvent::MouseMove:
+ emit mouseMoving( e );
+ break;
+ case QEvent::MouseButtonRelease:
+ emit mouseReleased( e );
+ break;
+ case QEvent::MouseButtonDblClick:
+ emit mouseDoubleClicked( e );
+ break;
+ default:
+ break;
+ }
+}
+//================================================================
+// Function : wheelEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::wheelEvent( QWheelEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::Wheel:
+ emit wheeling( e );
+ break;
+ default:
+ break;
+ }
+}
+
+//================================================================
+// Function : contextMenuEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::contextMenuEvent( QContextMenuEvent* e )
+{
+ emit contextMenuRequested(e);
+}
+
+/*!
+ \brief Handle show event.
+
+ Emits Show() signal.
+
+ \param theEvent show event
+*/
+void QtViewer_ViewFrame::showEvent( QShowEvent* theEvent )
+{
+ emit Show( theEvent );
+}
+
+/*!
+ \brief Handle hide event.
+
+ Emits Hide() signal.
+
+ \param theEvent hide event
+*/
+void QtViewer_ViewFrame::hideEvent( QHideEvent* theEvent )
+{
+ emit Hide( theEvent );
+}
+
+/*!
+ \return filters for image files
+*/
+QString QtViewer_ViewFrame::filter() const
+{
+ QStringList filters = SUIT_ViewWindow::filter().split( ";;", QString::SkipEmptyParts );
+ filters << tr("POSTSCRIPT_FILES");
+ return filters.join( ";;" );
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWFRAME_H
+#define QTVIEWER_VIEWFRAME_H
+
+#include "QtViewer.h"
+
+#include <SUIT_ViewWindow.h>
+#include <QPainterPath>
+
+class QContextMenuEvent;
+
+class QAction;
+
+class SUIT_Desktop;
+
+class QtViewer_Viewer;
+class QtViewer_ViewPort;
+
+/*
+ Class : QtViewer_ViewFrame
+ Description : View frame of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewFrame : public SUIT_ViewWindow
+{
+ Q_OBJECT
+
+public:
+ enum { DumpId, FitAllId, FitRectId, FitSelectId, ZoomId, PanId, GlobalPanId, ResetId };
+
+public:
+ QtViewer_ViewFrame( SUIT_Desktop*, QtViewer_Viewer*, QWidget* w = nullptr );
+ ~QtViewer_ViewFrame();
+
+ QtViewer_Viewer* getViewer() const { return myViewer; }
+ QtViewer_ViewPort* getViewPort() const { return myViewPort; }
+
+ virtual QImage dumpView();
+
+ virtual QString getVisualParameters();
+ virtual void setVisualParameters( const QString& theParameters );
+
+public slots:
+ virtual void showEvent( QShowEvent* );
+ virtual void hideEvent( QHideEvent* );
+
+protected slots:
+ void onViewPan();
+ void onViewZoom();
+ void onViewFitAll();
+ void onViewFitArea();
+ void onViewFitSelect();
+ void onViewGlobalPan();
+ void onViewReset();
+
+private slots:
+ void keyEvent( QKeyEvent* );
+ void mouseEvent( QMouseEvent* );
+ void wheelEvent( QWheelEvent* );
+ void contextMenuEvent( QContextMenuEvent* );
+
+signals:
+ void keyPressed( QKeyEvent* );
+ void keyReleased( QKeyEvent* );
+ void mousePressed( QMouseEvent* );
+ void mouseMoving( QMouseEvent* );
+ void mouseReleased( QMouseEvent* );
+ void mouseDoubleClicked( QMouseEvent* );
+ void wheeling( QWheelEvent* );
+
+ void sketchingFinished( QPainterPath );
+
+ void Show( QShowEvent* );
+ void Hide( QHideEvent* );
+
+protected:
+ virtual void createActions();
+ virtual void createToolBar();
+ virtual QString filter() const;
+ virtual bool dumpViewToFormat( const QImage&, const QString& fileName, const QString& format );
+
+private:
+ QtViewer_Viewer* myViewer;
+ QtViewer_ViewPort* myViewPort;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewManager.h"
+#include "QtViewer_Viewer.h"
+
+//=======================================================================
+// Name : QtViewer_ViewManager
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewManager::QtViewer_ViewManager( SUIT_Study* theStudy,
+ SUIT_Desktop* theDesktop,
+ SUIT_ViewModel* theModel )
+: SUIT_ViewManager( theStudy, theDesktop,
+ theModel ? theModel : new QtViewer_Viewer("QtViewer") )
+{
+ setTitle( tr( "QTVIEWER_TITLE" ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewManager
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewManager::~QtViewer_ViewManager()
+{
+}
+
+//================================================================
+// Function : getViewer
+// Purpose :
+//================================================================
+QtViewer_Viewer* QtViewer_ViewManager::getViewer()
+{
+ return dynamic_cast<QtViewer_Viewer*>( getViewModel() );
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWMANAGER_H
+#define QTVIEWER_VIEWMANAGER_H
+
+#include "QtViewer.h"
+#include <SUIT_ViewManager.h>
+
+class QtViewer_Viewer;
+
+/*
+ Class : QtViewer_ViewManager
+ Description : View manager of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewManager : public SUIT_ViewManager
+{
+ Q_OBJECT
+
+public:
+ QtViewer_ViewManager( SUIT_Study* theStudy,
+ SUIT_Desktop* theDesktop,
+ SUIT_ViewModel* theModel = 0 );
+ virtual ~QtViewer_ViewManager();
+
+ QtViewer_Viewer* getViewer();
+};
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewPort.h"
+#include "QtViewer_Scene.h"
+#include <QGraphicsItem>
+#include <QRubberBand>
+#include <QMouseEvent>
+#include <QCursor>
+#include <QScrollBar>
+#include <QPainter>
+#include <QPrinter>
+
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include "QtViewer_PainterObject.h"
+
+//=======================================================================
+// Name : QtViewer_ViewPort
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewPort::QtViewer_ViewPort( QWidget* theParent )
+: QGraphicsView( theParent )
+{
+ setScene(new QtViewer_Scene(this));
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
+
+ setMouseTracking( true );
+ setFocusPolicy( Qt::StrongFocus );
+
+ myFitAllGap = 40;
+
+ myRectBand = nullptr;
+ myRectBandStart = QPoint();
+ myRectBandEnd = QPoint();
+ fittingArea = false;
+
+ zooming = false;
+ previousPos = QPoint();
+
+ panning = false;
+ globalPanning = false;
+
+ SUIT_ResourceMgr* rmgr = SUIT_Session::session()->resourceMgr();
+ zoomCursor = new QCursor( rmgr->loadPixmap( "QtViewer", tr( "ICON_QTV_CURSOR_ZOOM" ) ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewPort
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewPort::~QtViewer_ViewPort()
+{
+ delete zoomCursor;
+ zoomCursor = nullptr;
+}
+
+void QtViewer_ViewPort::resetForeground()
+{
+ for (QSharedPointer<QtViewer_PainterObject> obj : foregroundObjects)
+ obj.reset();
+
+ foregroundObjects.clear();
+}
+
+void QtViewer_ViewPort::drawForeground(QPainter *painter, const QRectF &rect)
+{
+ Q_UNUSED(rect);
+
+ for (QSharedPointer<QtViewer_PainterObject> obj : foregroundObjects)
+ obj->draw(painter);
+}
+
+void QtViewer_ViewPort::addItem( QGraphicsItem* theItem )
+{
+ scene()->addItem(theItem);
+}
+
+void QtViewer_ViewPort::fitAll()
+{
+ QRectF aRect;
+ foreach (QGraphicsItem* item, scene()->items())
+ {
+ if (item->isVisible())
+ aRect = aRect.united(item->boundingRect());
+ }
+
+ fitInView( aRect.adjusted(-myFitAllGap, -myFitAllGap, myFitAllGap, myFitAllGap), Qt::KeepAspectRatio);
+}
+
+void QtViewer_ViewPort::fitSelect()
+{
+ if (scene()->selectedItems().isEmpty())
+ return;
+
+ QRectF selectionRect;
+ foreach (QGraphicsItem *item, scene()->selectedItems())
+ selectionRect = selectionRect.united(item->sceneBoundingRect());
+
+ if(!selectionRect.isNull())
+ fitInView(selectionRect.adjusted(-myFitAllGap, -myFitAllGap, myFitAllGap, myFitAllGap), Qt::KeepAspectRatio);
+}
+
+void QtViewer_ViewPort::fitRect(const QRectF& theRect)
+{
+ fitInView(theRect, Qt::KeepAspectRatio);
+}
+
+QRect QtViewer_ViewPort::selectionRect()
+{
+ if (myRectBand)
+ {
+ QRect aRect;
+ aRect.setLeft(qMin( myRectBandStart.x(), myRectBandEnd.x()));
+ aRect.setTop(qMin( myRectBandStart.y(), myRectBandEnd.y()));
+ aRect.setRight(qMax( myRectBandStart.x(), myRectBandEnd.x()));
+ aRect.setBottom(qMax( myRectBandStart.y(), myRectBandEnd.y()));
+ return aRect;
+ }
+ return QRect();
+}
+
+void QtViewer_ViewPort::startDrawingRect( int x, int y )
+{
+ myRectBandStart = QPoint(x,y);
+
+ if (!myRectBand)
+ {
+ myRectBand = new QRubberBand(QRubberBand::Rectangle, this);
+ myRectBand->setGeometry(QRect(myRectBandStart, QSize()));
+ myRectBand->show();
+ }
+}
+
+void QtViewer_ViewPort::drawingRect( int x, int y )
+{
+ myRectBandEnd = QPoint(x,y);
+ myRectBand->setGeometry(QRect(myRectBandStart, myRectBandEnd).normalized());
+}
+
+void QtViewer_ViewPort::finishDrawingRect()
+{
+ myRectBand->hide();
+
+ QRectF selectionRect = mapToScene(myRectBand->geometry()).boundingRect();
+
+ if (fittingArea)
+ fitInView(selectionRect, Qt::KeepAspectRatio);
+ else
+ {
+ QList<QGraphicsItem *> selectedItems = scene()->items(selectionRect, Qt::IntersectsItemShape);
+ for (QGraphicsItem *item : selectedItems)
+ item->setSelected(true);
+ }
+
+ myRectBandStart = QPoint();
+ myRectBandEnd = QPoint();
+ delete myRectBand;
+ myRectBand = nullptr;
+}
+
+void QtViewer_ViewPort::updateSceneRect(const QRectF &rect)
+{
+}
+
+void QtViewer_ViewPort::mousePressEvent(QMouseEvent *event)
+{
+ if (!zooming && !panning && !globalPanning && items(event->pos()).count()==0 && (event->buttons() & Qt::LeftButton))
+ {
+ startDrawingRect(event->pos().x(), event->pos().y());
+ }
+
+ if (globalPanning)
+ {
+ QPoint p0 = viewport()->rect().center();
+ QPoint p1 = event->pos();
+ double deltaX = p0.x() - p1.x();
+ double deltaY = p0.y() - p1.y();
+
+ pan(deltaX, -deltaY);
+ }
+ QGraphicsView::mousePressEvent(event);
+ emit vpMouseEvent(event);
+}
+
+
+void QtViewer_ViewPort::mouseMoveEvent(QMouseEvent *event)
+{
+ if ((event->modifiers() & Qt::ShiftModifier) && (event->buttons() & Qt::LeftButton))
+ activateZoomAction();
+
+ if (event->buttons() & Qt::MiddleButton)
+ activatePanAction();
+
+ if (panning && event->buttons() & (Qt::LeftButton | Qt::MiddleButton))
+ {
+ QPoint currentPos = event->pos();
+
+ if (!previousPos.isNull())
+ {
+ double deltaX = currentPos.x() - previousPos.x();
+ double deltaY = currentPos.y() - previousPos.y();
+
+ pan(deltaX, -deltaY);
+
+ }
+ previousPos = currentPos;
+ viewport()->update();
+ }
+ else if (zooming && (event->buttons() & Qt::LeftButton))
+ {
+ QPoint currentPos = event->pos();
+ if (!previousPos.isNull())
+ {
+ int deltaX = currentPos.x() - previousPos.x();
+ double scaleFactor = deltaX>0 ? 1.1 : 0.9;
+ scale(scaleFactor, scaleFactor);
+ }
+ previousPos = currentPos;
+ }
+ else if (myRectBand)
+ drawingRect(event->pos().x(), event->pos().y());
+
+ QGraphicsView::mouseMoveEvent(event);
+ emit vpMouseEvent(event);
+}
+
+void QtViewer_ViewPort::mouseReleaseEvent(QMouseEvent *event)
+{
+ if (myRectBand)
+ finishDrawingRect();
+
+ clearActions();
+ QGraphicsView::mouseReleaseEvent(event);
+ emit vpMouseEvent(event);
+}
+
+void QtViewer_ViewPort::resizeEvent(QResizeEvent *event)
+{
+ QSize oldSize = event->oldSize();
+ QSize newSize = event->size();
+
+ qreal w = static_cast<qreal>(newSize.width());
+ qreal h = static_cast<qreal>(newSize.height());
+
+ qreal w0 = static_cast<qreal>(oldSize.width());
+ qreal h0 = static_cast<qreal>(oldSize.height());
+
+ qreal widthRatio = w/w0;
+ qreal heightRatio = h/h0;
+
+ if (widthRatio>0 && heightRatio>0)
+ {
+ qreal scaleFactor = w<h ? widthRatio : heightRatio;
+ scale(scaleFactor, scaleFactor);
+ }
+
+ QGraphicsView::resizeEvent(event);
+}
+
+void QtViewer_ViewPort::wheelEvent(QWheelEvent *event)
+{
+ int delta = event->angleDelta().y();
+ double scaleFactor = delta>0 ? 1.1 : 0.9;
+ scale(scaleFactor, scaleFactor);
+}
+
+void QtViewer_ViewPort::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_Escape)
+ clearActions();
+
+ QGraphicsView::keyPressEvent(event);
+}
+
+void QtViewer_ViewPort::clearActions()
+{
+ setCursor(Qt::ArrowCursor);
+ fittingArea = false;
+ zooming = false;
+ panning = false;
+ globalPanning = false;
+ previousPos = QPoint();
+}
+
+void QtViewer_ViewPort::activateZoomAction()
+{
+ zooming = true;
+ fittingArea = false;
+ panning = false;
+ globalPanning = false;
+ setCursor(*zoomCursor);
+}
+
+void QtViewer_ViewPort::activateFitAreaAction()
+{
+ fittingArea = true;
+ zooming = false;
+ panning = false;
+ globalPanning = false;
+ setCursor(Qt::PointingHandCursor);
+}
+
+void QtViewer_ViewPort::activatePanAction()
+{
+ panning = true;
+ fittingArea = false;
+ zooming = false;
+ globalPanning = false;
+ setCursor(Qt::SizeAllCursor);
+ viewport()->update();
+}
+
+void QtViewer_ViewPort::activateGlobalPanAction()
+{
+ globalPanning = true;
+ panning = false;
+ fittingArea = false;
+ zooming = false;
+ setCursor(Qt::CrossCursor);
+}
+
+void QtViewer_ViewPort::pan( double theDX, double theDY )
+{
+ if( QScrollBar* aHBar = horizontalScrollBar() )
+ {
+ int aNewValue = aHBar->value() - theDX;
+ if( aNewValue < aHBar->minimum() )
+ aHBar->setMinimum( aNewValue );
+ if( aNewValue > aHBar->maximum() )
+ aHBar->setMaximum( aNewValue );
+
+ aHBar->setValue( aHBar->value() - theDX );
+ }
+ if( QScrollBar* aVBar = verticalScrollBar() )
+ {
+ int aNewValue = aVBar->value() + theDY;
+ if( aNewValue < aVBar->minimum() )
+ aVBar->setMinimum( aNewValue );
+ if( aNewValue > aVBar->maximum() )
+ aVBar->setMaximum( aNewValue );
+ aVBar->setValue( aVBar->value() + theDY );
+ }
+}
+
+//================================================================
+// Function : dumpView
+// Purpose :
+//================================================================
+QImage QtViewer_ViewPort::dumpView( bool theWholeScene,
+ QSizeF theSize )
+{
+ QPixmap screenshot = viewport()->grab();
+ return screenshot.toImage();
+}
+
+bool QtViewer_ViewPort::dumpViewToFormat(const QString& fileName, const QString& format)
+{
+ if( format!="PS" && format!="EPS" )
+ return false;
+
+ QPrinter printer(QPrinter::ScreenResolution);
+ printer.setOutputFormat(QPrinter::NativeFormat);
+ printer.setOutputFileName(fileName);
+
+ QPainter painter;
+ if (!painter.begin(&printer))
+ return false;
+
+ render(&painter);
+ if (!painter.end())
+ return false;
+
+ return true;
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWPORT_H
+#define QTVIEWER_VIEWPORT_H
+
+#include "QtViewer.h"
+#include <QGraphicsView>
+
+class QtViewer_PainterObject;
+class QRubberBand;
+
+/*
+ Class : QtViewer_ViewPort
+ Description : View port of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewPort : public QGraphicsView
+{
+ Q_OBJECT
+
+public:
+ QtViewer_ViewPort(QWidget* theParent);
+ ~QtViewer_ViewPort();
+
+ void addItem(QGraphicsItem* theItem);
+
+ void fitAll();
+ void fitSelect();
+ void fitRect(const QRectF& theRect);
+ void pan(double theDX, double theDY);
+
+ // rectangle selection
+ void startDrawingRect(int x, int y);
+ void drawingRect(int x, int y);
+ void finishDrawingRect();
+ QRect selectionRect();
+
+ void activateZoomAction();
+ void activateFitAreaAction();
+ void activatePanAction();
+ void activateGlobalPanAction();
+
+ QImage dumpView(bool theWholeScene = false, QSizeF theSize = QSizeF());
+ bool dumpViewToFormat(const QString& fileName, const QString& format);
+
+ void addForegroundObject( QSharedPointer<QtViewer_PainterObject> obj) { foregroundObjects.append(obj); }
+ void resetForeground();
+
+signals:
+ void vpMouseEvent(QMouseEvent*);
+
+
+public slots:
+ virtual void updateSceneRect(const QRectF &rect);
+
+protected:
+
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void mouseReleaseEvent(QMouseEvent *event);
+ virtual void resizeEvent(QResizeEvent *event);
+ virtual void wheelEvent(QWheelEvent *event);
+ virtual void keyPressEvent(QKeyEvent *event);
+
+ virtual void drawForeground(QPainter *painter, const QRectF &rect);
+
+ void clearActions();
+
+private:
+
+ double myFitAllGap;
+ QRubberBand* myRectBand;
+ QPoint myRectBandStart;
+ QPoint myRectBandEnd;
+
+ bool fittingArea;
+ bool zooming;
+ bool panning;
+ bool globalPanning;
+ QPoint previousPos;
+ QCursor* zoomCursor;
+
+ QList<QSharedPointer<QtViewer_PainterObject> > foregroundObjects;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Viewer.h"
+
+#include "QtViewer_Selector.h"
+#include "QtViewer_Scene.h"
+#include "QtViewer_ViewFrame.h"
+#include "QtViewer_ViewPort.h"
+
+#include <SUIT_ViewManager.h>
+
+#include <QColorDialog>
+#include <QWheelEvent>
+#include <QKeyEvent>
+#include <QMenu>
+
+
+//=======================================================================
+// Name : QtViewer_Viewer
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Viewer::QtViewer_Viewer( const QString& /*title*/, QWidget* widget )
+: SUIT_ViewModel(),
+ mySelector( 0 ),
+ myWidget( widget )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Viewer
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Viewer::~QtViewer_Viewer()
+{
+ delete mySelector;
+}
+
+QtViewer_ViewFrame* QtViewer_Viewer::createViewFrame( SUIT_Desktop* theDesktop, QWidget* theWidget )
+{
+ return new QtViewer_ViewFrame( theDesktop, this, theWidget );
+}
+
+//================================================================
+// Function : createView
+// Purpose :
+//================================================================
+SUIT_ViewWindow* QtViewer_Viewer::createView( SUIT_Desktop* theDesktop )
+{
+ QtViewer_ViewFrame* aViewFrame = createViewFrame( theDesktop, myWidget );
+
+ connect( aViewFrame, SIGNAL( keyPressed( QKeyEvent* ) ),
+ this, SLOT( onKeyEvent( QKeyEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( keyReleased( QKeyEvent* ) ),
+ this, SLOT( onKeyEvent( QKeyEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mousePressed( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mouseMoving( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mouseReleased( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+ return aViewFrame;
+}
+
+//================================================================
+// Function : contextMenuPopup
+// Purpose :
+//================================================================
+void QtViewer_Viewer::contextMenuPopup( QMenu* thePopup )
+{
+ if( thePopup->actions().count() > 0 )
+ thePopup->addSeparator();
+
+ thePopup->addAction(tr("CHANGE_BGCOLOR"), this, SLOT(onChangeBgColor()));
+}
+
+//================================================================
+// Function : getSelector
+// Purpose :
+//================================================================
+QtViewer_Selector* QtViewer_Viewer::getSelector()
+{
+ if( !mySelector )
+ {
+ mySelector = new QtViewer_Selector( this );
+ if( mySelector )
+ connect( mySelector, SIGNAL(selSelectionDone()), this, SLOT( onSelectionDone()));
+ }
+ return mySelector;
+}
+
+//================================================================
+// Function : getActiveView
+// Purpose :
+//================================================================
+QtViewer_ViewFrame* QtViewer_Viewer::getActiveView() const
+{
+ if( SUIT_ViewManager* aViewManager = getViewManager() )
+ return dynamic_cast<QtViewer_ViewFrame*>( aViewManager->getActiveView() );
+ return nullptr;
+}
+
+//================================================================
+// Function : getActiveViewPort
+// Purpose :
+//================================================================
+QtViewer_ViewPort* QtViewer_Viewer::getActiveViewPort() const
+{
+ if( QtViewer_ViewFrame* aViewFrame = getActiveView() )
+ return aViewFrame->getViewPort();
+ return nullptr;
+}
+
+//================================================================
+// Function : getActiveScene
+// Purpose :
+//================================================================
+QtViewer_Scene* QtViewer_Viewer::getActiveScene() const
+{
+ if( QtViewer_ViewPort* aViewPort = getActiveViewPort() )
+ return dynamic_cast<QtViewer_Scene*>( aViewPort->scene() );
+ return nullptr;
+}
+
+//================================================================
+// Function : onKeyEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onKeyEvent( QKeyEvent* e )
+{
+ switch( e->type() )
+ {
+ case QEvent::KeyPress:
+ handleKeyPress( e );
+ break;
+ case QEvent::KeyRelease:
+ handleKeyRelease( e );
+ break;
+ default: break;
+ }
+}
+
+//================================================================
+// Function : onMouseEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onMouseEvent(QMouseEvent* e)
+{
+ switch( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ handleMousePress(e);
+ break;
+ case QEvent::MouseMove:
+ handleMouseMove(e);
+ break;
+ case QEvent::MouseButtonRelease:
+ handleMouseRelease(e);
+ break;
+ default: break;
+ }
+}
+//================================================================
+// Function : onWheelEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onWheelEvent(QWheelEvent* e)
+{
+ switch(e->type())
+ {
+ case QEvent::Wheel:
+ handleWheel(e);
+ break;
+ default: break;
+ }
+}
+
+//================================================================
+// Function : handleKeyPress
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleKeyPress( QKeyEvent* e )
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleKeyRelease
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleKeyRelease(QKeyEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMousePress
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMousePress(QMouseEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+void QtViewer_Viewer::handleWheel(QWheelEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMouseMove
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMouseMove(QMouseEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMouseRelease
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMouseRelease(QMouseEvent* e)
+{
+ QtViewer_ViewPort* aViewPort = getActiveViewPort();
+ if ( getSelector() )
+ getSelector()->select(aViewPort->selectionRect());
+}
+
+//================================================================
+// Function : onChangeBgColor
+// Purpose :
+//================================================================
+
+void QtViewer_Viewer::onChangeBgColor()
+{
+ if( QtViewer_ViewPort* aViewPort = getActiveViewPort() )
+ {
+ QColor aColor = QColorDialog::getColor( aColor, aViewPort );
+
+ if (aColor.isValid())
+ aViewPort->setBackgroundBrush(QBrush(aColor));
+ }
+}
+
+//================================================================
+// Function : onSelectionDone
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onSelectionDone()
+{
+ emit selectionChanged();
+}
+
+//================================================================
+// Function : fitAll
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitAll()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->fitAll();
+}
+
+//================================================================
+// Function : fitSelect
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitSelect()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->fitSelect();
+}
+
+//================================================================
+// Function : fitArea
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitArea()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activateFitAreaAction();
+}
+
+//================================================================
+// Function : zoom
+// Purpose :
+//================================================================
+void QtViewer_Viewer::zoom()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activateZoomAction();
+}
+
+//================================================================
+// Function : pan
+// Purpose :
+//================================================================
+void QtViewer_Viewer::pan()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activatePanAction();
+}
+
+//================================================================
+// Function : globalPan
+// Purpose :
+//================================================================
+void QtViewer_Viewer::globalPan()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ {
+ aViewPort->fitAll();
+ aViewPort->activateGlobalPanAction();
+ }
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWER_H
+#define QTVIEWER_VIEWER_H
+
+#include "QtViewer.h"
+#include <SUIT_ViewModel.h>
+
+class QKeyEvent;
+class QMouseEvent;
+class QWheelEvent;
+
+class SUIT_ViewWindow;
+
+class QtViewer_Selector;
+class QtViewer_Scene;
+class QtViewer_ViewFrame;
+class QtViewer_ViewPort;
+
+/*
+ Class : QtViewer_Viewer
+ Description : View model of the graphics view
+*/
+class QTVIEWER_API QtViewer_Viewer: public SUIT_ViewModel
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Viewer(const QString& title, QWidget* widget = nullptr);
+ ~QtViewer_Viewer();
+
+public:
+ virtual SUIT_ViewWindow* createView(SUIT_Desktop*);
+
+ virtual QString getType() const { return Type(); }
+ static QString Type() { return "QtViewer"; }
+
+ virtual void contextMenuPopup(QMenu*);
+
+public:
+ QtViewer_Selector* getSelector();
+
+ QtViewer_ViewFrame* getActiveView() const;
+ QtViewer_ViewPort* getActiveViewPort() const;
+ QtViewer_Scene* getActiveScene() const;
+
+ void fitAll();
+ void fitSelect();
+ void fitArea();
+ void zoom();
+ void pan();
+ void globalPan();
+
+signals:
+ void selectionChanged();
+
+protected:
+
+ virtual QtViewer_ViewFrame* createViewFrame(SUIT_Desktop* theDesktop, QWidget* theWidget);
+
+protected slots:
+ virtual void onKeyEvent(QKeyEvent*);
+ virtual void onMouseEvent(QMouseEvent*);
+ virtual void onWheelEvent(QWheelEvent*);
+
+ virtual void onSelectionDone();
+ virtual void onChangeBgColor();
+
+protected:
+ virtual void handleKeyPress(QKeyEvent*);
+ virtual void handleKeyRelease(QKeyEvent*);
+ virtual void handleMouseMove(QMouseEvent*);
+ virtual void handleMousePress(QMouseEvent*);
+ virtual void handleMouseRelease(QMouseEvent*);
+ virtual void handleWheel(QWheelEvent*);
+
+protected:
+ QtViewer_Selector* mySelector;
+ QWidget* myWidget;
+};
+
+#endif
--- /dev/null
+<!DOCTYPE TS><TS>
+<context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>ICON_QTV_DUMP</source>
+ <translation>qtviewer_dump.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_ZOOM</source>
+ <translation>qtviewer_zoom.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_PAN</source>
+ <translation>qtviewer_pan.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_GLOBALPAN</source>
+ <translation>qtviewer_glpan.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITALL</source>
+ <translation>qtviewer_fitall.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITSELECT</source>
+ <translation>qtviewer_fitselect.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_RESET</source>
+ <translation>qtviewer_reset.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITAREA</source>
+ <translation>qtviewer_fitarea.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_ROTATE</source>
+ <translation>qtviewer_rotate.png</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_ViewPort</name>
+ <message>
+ <source>ICON_QTV_CURSOR_ZOOM</source>
+ <translation>qtviewer_cursor_zoom.png</translation>
+ </message>
+</context>
+</TS>
--- /dev/null
+<!DOCTYPE TS>
+<TS>
+ <context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>Saves the active view in the image file</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>Fit all objects inside the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>Fit area within the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>Fit area of selection within the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>Selection of a new center of the view</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>Pan the view</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>Reset view point</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>Zoom the view</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>View Operations</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>Dump</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>Fit All</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>Fit Area</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>Fit Selection</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>Global Pan</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>Pan</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>PostScript files (*.ps *.eps)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>Change background...</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>Add image</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>Remove image(s)</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>Bring to front</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>Send to back</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>Bring forward</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>Send backward</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>Properties</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>Test Fuse operator</translation>
+ </message>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>Test Crop operator</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation>Qt scene:%M - viewer:%V</translation>
+ </message>
+ </context>
+</TS>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>Sauver la scène actuelle au fichier image</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>Redimensionner la scène pour montrer tous les objets </translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>Redimensionner la scène pour ne montrer que sa partie choisie par l'encadré</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>Redimensionner la scène pour montrer la sélection.</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>Sélection d'un nouveau centre de la vue</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>Redimensionner la vue</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>Restaurer le point de vue</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>Opérations de visualisation</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>Sauver la scène</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>Montrer tout</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>Montrer l'encadré</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>Ajuster la sélection</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>Panoramique Globale</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>Redimensionner la vue</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>Restaurer</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>Fichiers PostScript (*.ps *.eps)</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>Test Crop operator</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>Test Fuse operator</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>Propriétés</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>Afficher derrière</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>Afficher devant</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>Afficher au fond</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>Afficher au premier plan</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>Supprimer image(s)</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>Ajouter une image</translation>
+ </message>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>Changer l'arrière-plan...</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation> Scène Qt:%M - visualisation:%V</translation>
+ </message>
+</context>
+</TS>
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE TS>
+<TS language="ja" sourcelanguage="en">
+ <context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>アクティブビューの画像を保存</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>ビューの枠内にすべてのオブジェクトをフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>領域をビューの枠内にフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>選択領域をビューの枠内にフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>ビューの新しい中心の選択</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>ビューの回転</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>ビューのリセット</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>ビューの拡大</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>ビューの操作</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>表示状態の保存</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>全表示</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>領域にフィット</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>選択範囲をズーム</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>グローバル回転</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>回転</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>リセット</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>ズーム</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>PostScript files (*.ps *.eps)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>背景の変更.</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>画像の追加</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>画像の削除</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>最前面へ移動</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>最背面へ移動</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>前面へ移動</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>背面へ移動</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>プロパティ</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>結合のテスト</translation>
+ </message>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>トリムのテスト</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation>グラフィックシーン:%M - ビューワ:%V</translation>
+ </message>
+ </context>
+</TS>
#include <vtkSMRepresentationProxy.h>
#include <vtkPVDataSetAttributesInformation.h>
+#include <QDebug>
+
+#include "SPV3D_Prs.h"
+
+
+
//-----------------------------------------------------------------------------
SPV3D_CADSelection::SPV3D_CADSelection(QObject *parent,
pqRenderView* view, SelectionMode mode):QObject(parent)
{
this->fastSelection(true);
}
+
+ // get preselected id here
+ vtkSMProxy* proxyRepresentation = this->Representation->getProxy();
+ if (!proxyRepresentation)
+ {
+ qWarning()<< "There is no representation in the active view for the Geometry Source.";
+ return;
+ }
+
+
+ // Retrieve the wanted information property
+ vtkSMProperty* PreselectedIDProperty =
+ proxyRepresentation->GetProperty("PreSelectedID");
+ if (!PreselectedIDProperty)
+ {
+ qWarning()<< "The representation named '" << proxyRepresentation->GetXMLName()<< "' didn't have a property named 'SelectedIDInfo'.";
+ return;
+ }
+
+ // Force to update the information property
+ proxyRepresentation->UpdatePropertyInformation(PreselectedIDProperty);
+
+ vtkIdType PreSelectedID =
+ vtkSMPropertyHelper(proxyRepresentation,"PreSelectedID").GetAsInt(0);
+ qInfo() << "entry from client: "<< SPV3D_Prs::FromVtkIdToEntry(PreSelectedID);
+
}
//-----------------------------------------------------------------------------
#include "SPV3D_Prs.h"
#include "SPV3D_ViewWindow.h"
+#include <vtkAppendPolyData.h>
#include "vtkActor.h"
#include "vtkPolyData.h"
#include "vtkCellData.h"
#include "vtkPVTrivialProducer.h"
#include <pqDataRepresentation.h>
+#include <QDebug>
+
+vtkIdType SPV3D_Prs::cellid = 0;
+vtkIdType SPV3D_Prs::nbsolid = 0;
+
+SPV3D_EXPORTSPV3DData::SPV3D_EXPORTSPV3DData()
+{
+ nbsolid = 0;
+ _multiGEOMData = vtkSmartPointer<vtkMultiBlockDataSet>::New();
+ pqServer *serv(pqApplicationCore::instance()->getServerManagerModel()->findServer(pqServerResource("builtin:")));
+ pqObjectBuilder *builder(pqApplicationCore::instance()->getObjectBuilder());
+ _sourceProducer = builder->createSource("sources","PVTrivialProducer",serv);
+}
+void SPV3D_EXPORTSPV3DData::SetPolyData(vtkPolyData* ds)
+{
+ _multiGEOMData->SetBlock(nbsolid , ds);
+ nbsolid++;
+}
+
+void SPV3D_EXPORTSPV3DData::SetPrs(vtkPolyData* ds, const char* entry)
+{
+ unsigned int id;
+ if (havePrs(entry, id))
+ return;
+ auto nbCells( ds->GetNumberOfCells() );
+
+ vtkNew<vtkIdTypeArray> solidIdArray;
+ qInfo() << "nb of cells: " << nbCells;
+ solidIdArray->SetNumberOfComponents(1);
+ solidIdArray->SetNumberOfTuples( nbCells );
+ solidIdArray->SetName("Solid id");
+
+// vtkNew<vtkIdTypeArray> cellIdArray;
+// cellIdArray->SetNumberOfComponents(1);
+// cellIdArray->SetNumberOfTuples( nbCells );
+// cellIdArray->SetName("Edge id");
+
+ vtkIdType *pt( solidIdArray->GetPointer(0) );
+ vtkIdType solidid = SPV3D_Prs::FromEntryToVtkId(entry);
+ std::for_each(pt,pt+nbCells,[solidid](vtkIdType& elt) { elt = solidid;});
+// pt = cellIdArray->GetPointer(0);
+// std::for_each(pt,pt+nbCells,[](vtkIdType& elt) { elt = SPV3D_Prs::cellid;SPV3D_Prs::cellid++; });
+
+ ds->GetCellData()->AddArray( solidIdArray );
+// ->GetCellData()->AddArray( cellIdArray );
+ SetPolyData(ds);
+ updateSource_for_display();
+}
+
+void SPV3D_EXPORTSPV3DData::RemovePrs(const char* entry)
+{
+ unsigned int id;
+ if (!havePrs(entry, id))
+ {
+ qWarning() << "Can not find solid with entry: " << entry;
+ return;
+ }
+ _multiGEOMData->RemoveBlock(id);
+ updateSource_for_display();
+}
+
+void SPV3D_EXPORTSPV3DData::updateSource_for_display()
+{
+ vtkNew<vtkAppendPolyData> appendFilter;
+ nbsolid = _multiGEOMData->GetNumberOfBlocks();
+ qInfo() <<"number of block: " << nbsolid;
+ for (unsigned int i = 0; i < nbsolid; ++i)
+ {
+ vtkPolyData* polyData = vtkPolyData::SafeDownCast(_multiGEOMData->GetBlock(i));
+ if (polyData)
+ {
+ vtkIdTypeArray* retrievedArray = vtkIdTypeArray::SafeDownCast(polyData->GetCellData()->GetArray("Solid id"));
+ if (retrievedArray)
+ appendFilter->AddInputData(polyData);
+ }
+ }
+ appendFilter->Update();
+ vtkNew<vtkPolyData> ds;
+ ds->ShallowCopy(appendFilter->GetOutput());
+
+ vtkSMProxy* producerBase = _sourceProducer->getProxy();
+ vtkSMSourceProxy *producer(vtkSMSourceProxy::SafeDownCast(producerBase));
+ vtkObjectBase *clientSideObject(producer->GetClientSideObject());
+ vtkPVTrivialProducer *clientSideObjectCast = vtkPVTrivialProducer::SafeDownCast(clientSideObject);
+ clientSideObjectCast->SetOutput(ds);
+ _sourceProducer->updatePipeline();
+
+ //pqServerManagerModel* smmodel = pqApplicationCore::instance()->getServerManagerModel();
+ //pqProxy *producerBase2( smmodel->findItem<pqProxy*>(producerBase) );
+ //if(producerBase2 && !_name.empty())
+ // producerBase2->rename( _name.c_str() );
+}
+
bool SPV3D_EXPORTSPV3DData::IsVisible() const
{
if( IsNull() )
return GetRepresentation()->isVisible();
}
+bool SPV3D_EXPORTSPV3DData::havePrs(const char* entry, unsigned int & id)
+{
+ vtkIdType solid_id = SPV3D_Prs::FromEntryToVtkId(entry);
+ id = 0;
+ while (id < _multiGEOMData->GetNumberOfBlocks())
+ {
+ vtkPolyData* polyData = vtkPolyData::SafeDownCast(_multiGEOMData->GetBlock(id));
+ if (polyData)
+ {
+ vtkIdTypeArray* retrievedArray = vtkIdTypeArray::SafeDownCast(polyData->GetCellData()->GetArray("Solid id"));
+ if (retrievedArray && retrievedArray->GetValue(0) == solid_id)
+ break;
+ }
+ id++;
+ }
+
+ return id < _multiGEOMData->GetNumberOfBlocks();
+}
+
void SPV3D_EXPORTSPV3DData::Hide() const
{
if( GetRepresentation() )
{
}
+vtkIdType SPV3D_Prs::FromEntryToVtkId (const char* entry)
+{
+ char *str = new char[strlen(entry)+1];
+ strcpy(str, entry);
+
+ const char delimiter[2] = ":";
+
+ char* token;
+ token = strtok(str, delimiter);
+
+ std::uint32_t ret(atoi(token));
+ token = strtok(NULL, delimiter);
+
+ while (token != NULL) {
+ ret <<=8;
+ ret |= atoi(token);
+ token = strtok(NULL, delimiter);
+ }
+
+ return static_cast<vtkIdType> (ret);
+}
+
+const char* SPV3D_Prs::FromVtkIdToEntry(vtkIdType id)
+{
+ int d = id & 0xFF;
+ std::uint32_t c_work = ( id & 0xFF00 ); int c = c_work >> 8;
+ std::uint32_t b_work = ( id & 0xFF0000 ); int b = b_work >> 16;
+ std::uint32_t a_work = ( id & 0xFF000000 ); int a = a_work >> 24;
+ std::string ret = std::to_string(a) + ":" + std::to_string(b) + ":" + std::to_string(c)+ ":" + std::to_string(d);
+ return ret.c_str();
+}
+
SPV3D_Prs *SPV3D_Prs::deepCopy() const
{
SPV3D_Prs *ret = new SPV3D_Prs( *this );
return smmodel->findItem<pqProxy*>(proxy);
}
-void SPV3D_Prs::FillUsingActor(vtkActor *actor) const
-{
- SPV3D_EXPORTSPV3DData *alreadyExistingSrc = nullptr;
- alreadyExistingSrc = _view->isEntryAlreadyExist( GetEntry() );
- if(alreadyExistingSrc && !alreadyExistingSrc->GetSourceProducer())
- {
- actor->GetMapper()->Update();
- vtkDataObject *ds = actor->GetMapper()->GetInput();
- vtkPolyData *ds3 = vtkPolyData::SafeDownCast(ds);
- vtkNew<vtkPolyData> ds4;
- if(ds3)
- {
- ds4->ShallowCopy( ds3 );
- vtkNew<vtkIdTypeArray> solidIdArray;
- auto nbCells( ds4->GetNumberOfCells() );
- solidIdArray->SetNumberOfComponents(1);
- solidIdArray->SetNumberOfTuples( nbCells );
- solidIdArray->SetName("Solid id");
- vtkIdType *pt( solidIdArray->GetPointer(0) );
- std::for_each(pt,pt+nbCells,[](vtkIdType& elt) { elt = 0; });
- ds4->GetCellData()->AddArray( solidIdArray );
- }
- //
- pqServer *serv(pqApplicationCore::instance()->getServerManagerModel()->findServer(pqServerResource("builtin:")));
- pqObjectBuilder *builder(pqApplicationCore::instance()->getObjectBuilder());
- pqPipelineSource *mySourceProducer(builder->createSource("sources","PVTrivialProducer",serv));
- vtkSMProxy *producerBase = mySourceProducer->getProxy();
- vtkSMSourceProxy *producer(vtkSMSourceProxy::SafeDownCast(producerBase));
- vtkObjectBase *clientSideObject(producer->GetClientSideObject());
- vtkPVTrivialProducer *clientSideObjectCast = vtkPVTrivialProducer::SafeDownCast(clientSideObject);
- clientSideObjectCast->SetOutput(ds4);
- mySourceProducer->updatePipeline();
- pqProxy *producerBase2( getPQProxy(producerBase) );
- if(producerBase2 && !_name.empty())
- producerBase2->rename( _name.c_str() );
- this->SetSourceProducer( mySourceProducer );
- }
- else
- {
- this->CopyInfo( alreadyExistingSrc );
- }
-}
-
SPV3D_Prs:: ~SPV3D_Prs()
{
}
SALOME_PV3DPrs::DisplayIn(v);
}
-void SPV3D_Prs::CopyInfo(SPV3D_EXPORTSPV3DData *info) const
-{
- if(!_pvRendInfo || !info)
- return ;
- if(_pvRendInfo == info)
- return ;
- *_pvRendInfo = *info;
-}
-
bool SPV3D_Prs::IsNull() const
{
if(_pvRendInfo)
- return _pvRendInfo->IsNull();
+ {
+ unsigned int id;
+ return !_pvRendInfo->havePrs(GetEntry(),id);
+ }
return true;
}
+void SPV3D_Prs::FillUsingActor(vtkActor *actor) const
+{
+ std::cout << "Hello FillUsingActor"<<std::endl;
+ int id = _view->isEntryAlreadyExist( GetEntry() );
+ if(id == -1) // not exist
+ {
+ actor->GetMapper()->Update();
+ vtkDataObject *ds = actor->GetMapper()->GetInput();
+ vtkPolyData *ds2 = vtkPolyData::SafeDownCast(ds);
+ if(ds2)
+ {
+ _view->ExportToSPV3D(ds2, GetEntry());
+ }
+ }
+ else
+ {
+ qWarning() << "Geometry Object is already in viewer window";
+ }
+}
#include "SPV3D.h"
#include "SALOME_Prs.h"
+#include "vtkPolyData.h"
+#include "vtkCellData.h"
+#include <vtkMultiBlockDataSet.h>
+#include <vtkSmartPointer.h>
+
+#include <set>
class vtkActor;
class pqPipelineSource;
class pqDataRepresentation;
class SPV3D_EXPORTSPV3DData
{
public:
- SPV3D_EXPORTSPV3DData() = default;
+ SPV3D_EXPORTSPV3DData();
SPV3D_EXPORTSPV3DData *deepCopy() { return new SPV3D_EXPORTSPV3DData(*this); }
- void SetSourceProducer(pqPipelineSource *sourceProducer) const { _sourceProducer = sourceProducer; }
+ void SetPrs(vtkPolyData* ds, const char* entry);
+ void SetPolyData(vtkPolyData* ds);
+ void RemovePrs(const char* entry);
+
+ // the source producer is initialized in the instantiation of SPV3D_EXPORTSPV3DData
+ // Normaly, we shouldn't copy another src in SPV3D_EXPORTSPV3DData
+ //void SetSourceProducer(pqPipelineSource *sourceProducer) const { _sourceProducer = sourceProducer; }
pqPipelineSource *GetSourceProducer() const { return _sourceProducer; }
void SetRepresentation(pqDataRepresentation *repr) const { _repr = repr; }
pqDataRepresentation *GetRepresentation() const { return _repr; }
+ void updateSource_for_display();
bool IsNull() const { return !_sourceProducer && !_repr; }
bool IsVisible() const;
+ bool havePrs(const char* entry, unsigned int & id);
void Hide() const;
+
private:
SPV3D_EXPORTSPV3DData(const SPV3D_EXPORTSPV3DData& other) = default;
private:
+ vtkSmartPointer<vtkMultiBlockDataSet> _multiGEOMData;
+ vtkIdType nbsolid;
mutable pqPipelineSource *_sourceProducer = nullptr;
mutable pqDataRepresentation *_repr = nullptr;
};
void DisplayIn( SALOME_View* v ) const override;
- void CopyInfo(SPV3D_EXPORTSPV3DData *info) const;
-
void SetPVRenderInfo(SPV3D_EXPORTSPV3DData *pvRendInfo) { _pvRendInfo = pvRendInfo; }
- void SetSourceProducer(pqPipelineSource *sourceProducer) const { if(_pvRendInfo) _pvRendInfo->SetSourceProducer(sourceProducer); }
+ // the source producer is initialized in the instantiation of SPV3D_EXPORTSPV3DData
+ // Normaly, we shouldn't copy another src in SPV3D_EXPORTSPV3DData
+ //void SetSourceProducer(pqPipelineSource *sourceProducer) const { if(_pvRendInfo) _pvRendInfo->SetSourceProducer(sourceProducer); }
pqPipelineSource *GetSourceProducer() const { if(_pvRendInfo) return _pvRendInfo->GetSourceProducer(); return nullptr; }
void SetRepresentation(pqDataRepresentation *repr) const { if(_pvRendInfo) _pvRendInfo->SetRepresentation(repr); }
pqDataRepresentation *GetRepresentation() const { if(_pvRendInfo) return _pvRendInfo->GetRepresentation(); return nullptr; }
bool IsNull() const override;
+ static vtkIdType FromEntryToVtkId (const char*);
+ static const char* FromVtkIdToEntry (vtkIdType);
private:
SPV3D_Prs(const SPV3D_Prs& other) = default;
public:
- void hide() const { if(_pvRendInfo) return _pvRendInfo->Hide(); }
+ void hide() const { if(_pvRendInfo) return _pvRendInfo->RemovePrs(GetEntry()); }
bool isVisible() const { if(_pvRendInfo) return _pvRendInfo->IsVisible(); return false; }
private:
SPV3D_ViewWindow *_view = nullptr;
//! Name attached to the displayable object in the study
std::string _name;
+ static vtkIdType cellid;
+ static vtkIdType nbsolid;
+
};
#include <QColorDialog>
#include <QToolBar>
#include <QTimer>
+#include <QDebug>
#include <vtkActorCollection.h>
#include "SPV3D_ViewModel.h"
#include "SPV3D_ViewWindow.h"
-#include "SPV3D_Prs.h"
#include "PVViewer_Core.h"
#include <pqActiveObjects.h>
return _view;
}
+void SPV3D_ViewModel::updatePVPrsPipeline(const SPV3D_Prs* aPrs)
+{
+ if (aPrs->GetRepresentation())
+ {
+ aPrs->GetRepresentation()->setVisible(0);
+ delete(aPrs->GetRepresentation());
+ }
+ pqObjectBuilder *builder(pqApplicationCore::instance()->getObjectBuilder());
+ pqActiveObjects::instance().setActiveView(getView());
+ pqPipelineSource *mySourceProducer = aPrs->GetSourceProducer();
+ pqDataRepresentation* myRepr(builder->createDataRepresentation(mySourceProducer->getOutputPort(0),getView(),"CADRepresentation"));//"GeometryRepresentation"
+ vtkSMViewProxy::RepresentationVisibilityChanged(myRepr->getViewProxy(), myRepr->getProxy(), true);
+ aPrs->SetRepresentation(myRepr);
+ myRepr->setVisible(1);
+ vtkSMPVRepresentationProxy* proxy(dynamic_cast<vtkSMPVRepresentationProxy*>(myRepr->getProxy()));
+ if(proxy)
+ {
+ vtkSMPropertyHelper inputHelper(proxy, "Input");
+ vtkSMSourceProxy* input = vtkSMSourceProxy::SafeDownCast(inputHelper.GetAsProxy());
+ input->UpdatePipeline();
+ }
+}
/*!
Display presentation
\param prs - presentation
{
if(const SPV3D_Prs* aPrs = dynamic_cast<const SPV3D_Prs*>( prs ))
{
- if( !aPrs->GetRepresentation() )
- {
- pqObjectBuilder *builder(pqApplicationCore::instance()->getObjectBuilder());
- pqActiveObjects::instance().setActiveView(getView());
- pqPipelineSource *mySourceProducer = aPrs->GetSourceProducer();
- aPrs->SetSourceProducer( mySourceProducer );
- pqDataRepresentation* myRepr(builder->createDataRepresentation(mySourceProducer->getOutputPort(0),getView(),"CADRepresentation"));//"GeometryRepresentation"
- vtkSMViewProxy::RepresentationVisibilityChanged(myRepr->getViewProxy(), myRepr->getProxy(), true);
- aPrs->SetRepresentation(myRepr);
- }
- pqDataRepresentation* myRepr = aPrs->GetRepresentation();
- myRepr->setVisible(1);
- vtkSMPVRepresentationProxy* proxy(dynamic_cast<vtkSMPVRepresentationProxy*>(myRepr->getProxy()));
- if(proxy)
- {
- vtkSMPropertyHelper inputHelper(proxy, "Input");
- vtkSMSourceProxy* input = vtkSMSourceProxy::SafeDownCast(inputHelper.GetAsProxy());
- input->UpdatePipeline();
- }
+ updatePVPrsPipeline(aPrs);
getView()->resetDisplay();
getView()->render();
}
+ else
+ {
+ qWarning()<< "SPV3D_ViewModel::Display: Something wrong";
+ }
}
/*!
if(const SPV3D_Prs* aPrs = dynamic_cast<const SPV3D_Prs*>( prs )){
if(aPrs->IsNull())
return;
- aPrs->GetRepresentation()->setVisible(0);
+ aPrs->hide();
+ updatePVPrsPipeline(aPrs);
+ getView()->resetDisplay();
getView()->render();
- //pqObjectBuilder* builder = pqApplicationCore::instance()->getObjectBuilder();
- //pqServer* activeServer = pqActiveObjects::instance().activeServer();
- //builder->destroySources(activeServer);
}
}
#include <SALOME_InteractiveObject.hxx>
#include <SALOME_ListIO.hxx>
+#include "SPV3D_Prs.h"
+
+
class QMouseEvent;
class pqPipelineSource;
class pqView;
public:
void enableSelection(bool isEnabled);
bool isSelectionEnabled() const { return mySelectionEnabled; }
-
+ void updatePVPrsPipeline( const SPV3D_Prs* aPrs);
/* Reimplemented from SALOME_View */
//! See #SALOME_View::Display( const SALOME_Prs* )
QAction *selectionAction = toolMgr()->toolBar(myToolBar)->addAction(SUIT_Session::session()->resourceMgr()->loadPixmap( "VTKViewer", tr( "ICON_SVTK_PRESELECTION_STANDARD" ) ), tr( "MNU_SVTK_PRESELECTION_STANDARD" ) );
selectionAction->setCheckable(true);
QObject::connect(selectionAction, &QAction::toggled, this, &SPV3D_ViewWindow::goSelect);
+
+ SPV3D_EXPORTSPV3DData* rawPtr = new SPV3D_EXPORTSPV3DData();
+ myPrs.reset(rawPtr);
}
void SPV3D_ViewWindow::goSelect(bool val)
{
return;
}
- for(const auto& elt : myPrs)
+ pqPipelineSource *geometrySource = myPrs->GetSourceProducer();
+ if(geometrySource)
{
- pqPipelineSource *geometrySource = elt.second->GetSourceProducer();
- if(geometrySource)
- {
- vtkSMProxy* repr = activeView->getViewProxy()->FindRepresentation(
- geometrySource->getSourceProxy(), 0);
- repr->InvokeCommand("Reset");
- }
+ vtkSMProxy* repr = activeView->getViewProxy()->FindRepresentation(
+ geometrySource->getSourceProxy(), 0);
+ repr->InvokeCommand("Reset");
}
activeView->forceRender();
activeView->render();
renderView->render();
}
+
SPV3D_Prs *SPV3D_ViewWindow::findOrCreatePrs( const char* entry )
-{
- std::string entryCpp( entry );
+{//en cours
SPV3D_Prs *prsOut( new SPV3D_Prs( entry, this ) );
- for(auto& prs : myPrs)
- {
- if(entryCpp == prs.first)
- {
- prsOut->SetPVRenderInfo( prs.second.get() );
- return prsOut;
- }
- }
- std::unique_ptr<SPV3D_EXPORTSPV3DData> data(new SPV3D_EXPORTSPV3DData);
- prsOut->SetPVRenderInfo( data.get() );
- std::pair<std::string, std::unique_ptr<SPV3D_EXPORTSPV3DData> > p(entryCpp,std::move(data));
- myPrs.emplace_back( std::move(p) );
+ prsOut->SetPVRenderInfo( myPrs.get() );
return prsOut;
}
-SPV3D_EXPORTSPV3DData *SPV3D_ViewWindow::isEntryAlreadyExist( const char* entry ) const
+unsigned int SPV3D_ViewWindow::isEntryAlreadyExist( const char* entry ) const
{
- std::string entryCpp( entry );
- for(const auto& prs : myPrs)
- {
- if(entryCpp == prs.first)
- return prs.second.get();
- }
- return nullptr;
+ unsigned int id;
+ if(myPrs->havePrs(entry, id))
+ return id;
+ else
+ return -1;
+}
+
+void SPV3D_ViewWindow::ExportToSPV3D(vtkPolyData* ds, const char* entry)
+{
+ myPrs->SetPrs(ds, entry);
}
/*!
bool SPV3D_ViewWindow::isVisible(const Handle(SALOME_InteractiveObject)& theIObject)
{
- std::string entryCpp( theIObject->getEntry() );
- for(auto& prs : myPrs)
+ auto entry = theIObject->getEntry();
+ unsigned int id;
+ if (myPrs->havePrs(entry, id))
{
- if(entryCpp == prs.first )
- return prs.second->IsVisible();
+ return true;
}
return false;
}
*/
void SPV3D_ViewWindow::EraseAll()
{
- for(auto& prs : myPrs)
- {
- prs.second->Hide();
- }
+ myPrs->Hide();
if(myModel)
myModel->render();
}
SPV3D_Prs *findOrCreatePrs( const char* entry );
- SPV3D_EXPORTSPV3DData *isEntryAlreadyExist( const char* entry ) const;
+ unsigned int isEntryAlreadyExist( const char* entry ) const;
+
+ void ExportToSPV3D(vtkPolyData* ds, const char*);
void init();
SPV3D_CADSelection *mySelection = nullptr;
int myToolBar = -1;
SPV3D_ViewModel* myModel;
- std::list< std::pair<std::string, std::unique_ptr<SPV3D_EXPORTSPV3DData> > > myPrs;
+ //std::list< std::pair<std::string, std::unique_ptr<SPV3D_EXPORTSPV3DData> > > myPrs;
+ std::list< std::pair<std::string, SPV3D_Prs* > > Prs;
+ std::unique_ptr<SPV3D_EXPORTSPV3DData> myPrs;
};
#ifdef WIN32
}
}
},
+ "/PRP_CREATE_NEW_WINDOW_FOR_VIEWER_9": {
+ "iconPath": "",
+ "langDependentAssets": {
+ "en": {
+ "name": "QtView view",
+ "tooltip": "Create new QtView view"
+ },
+ "fr": {
+ "name": "QtView view",
+ "tooltip": "Créer une nouvelle QtView view"
+ },
+ "ja": {
+ "name": "QtView view",
+ "tooltip": "新しい QtView view を作成します。"
+ }
+ }
+ },
"/PRP_DESK_CATALOG_GENERATOR": {
"iconPath": "",
"langDependentAssets": {
}
}
}
-}
\ No newline at end of file
+}
#include "SUIT_Tools.h"
#include "SALOME_Actor.h"
+#include "ViewerTools_ScreenScaling.h"
#include <vtkObjectFactory.h>
#include <vtkMath.h>
{
myShiftState = shift;
if( myPoligonState == InProcess ) { // add a new point of polygon
- myPolygonPoints.append( QPoint( x, y ) );
+ // The mouse events were already scaled up with a pixel ratio for a proper selection,
+ // but rubber band's implemented with QPainter scales them on its own.
+ // So, we need to pass unscaled coordinates to get a polygon painted in a right place.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+
+ myPolygonPoints.append(QPoint(x / pixelRatio, y / pixelRatio));
this->Interactor->GetEventPosition( mySelectionEvent->myX, mySelectionEvent->myY );
mySelectionEvent->myPolygonPoints.append( QPoint( mySelectionEvent->myX, mySelectionEvent->myY ) );
return;
myRectBand = new QtxRectRubberBand( GetRenderWidget() );
myRectBand->setUpdatesEnabled ( false );
- QRect aRect = SUIT_Tools::makeRect(myPoint.x(), myPoint.y(), myOtherPoint.x(), myOtherPoint.y());
+
+ // The mouse events were already scaled up with a pixel ratio for a proper selection,
+ // but rubber band's implemented with QPainter scales them on its own.
+ // So, we need to pass unscaled coordinates to get a rectangle painted in a right place.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+ QRect aRect = SUIT_Tools::makeRect(
+ myPoint.x() / pixelRatio,
+ myPoint.y() / pixelRatio,
+ myOtherPoint.x() / pixelRatio,
+ myOtherPoint.y() / pixelRatio);
+
myRectBand->initGeometry( aRect );
if ( !myRectBand->isVisible() )
*/
void SVTK_InteractorStyle::drawPolygon()
{
+ // The mouse events were already scaled up with a pixel ratio for a proper selection,
+ // but rubber band's implemented with QPainter scales them on its own.
+ // So, we need to pass unscaled coordinates to get a polygon painted in a right place.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+ const QPoint myPointCopy(myPoint.x() / pixelRatio, myPoint.y() / pixelRatio);
+ const QPoint myOtherPointCopy(myOtherPoint.x() / pixelRatio, myOtherPoint.y() / pixelRatio);
+
QSize aToler( 5, 5 );
if ( !myPolygonBand ) {
myPolygonBand = new QtxPolyRubberBand( GetRenderWidget() );
QPalette palette;
palette.setColor( myPolygonBand->foregroundRole(), Qt::white );
myPolygonBand->setPalette( palette );
- myPolygonPoints.append( QPoint( myPoint.x(), myPoint.y() ) );
+ myPolygonPoints.append(myPointCopy);
}
myPolygonBand->hide();
bool closed = false;
- bool valid = GetRenderWidget()->rect().contains( QPoint( myOtherPoint.x(), myOtherPoint.y() ) );
+ bool valid = GetRenderWidget()->rect().contains(myOtherPointCopy);
if ( !myPolygonPoints.at(0).isNull() )
{
QRect aRect( myPolygonPoints.at(0).x() - aToler.width(), myPolygonPoints.at(0).y() - aToler.height(),
2 * aToler.width(), 2 * aToler.height() );
- closed = aRect.contains( QPoint( myOtherPoint.x(), myOtherPoint.y() ) );
+ closed = aRect.contains(myOtherPointCopy);
}
QPolygon* points = new QPolygon( myPolygonPoints );
- valid = valid && isValid( points, QPoint( myOtherPoint.x(), myOtherPoint.y() ) );
+ valid = valid && isValid(points, myOtherPointCopy);
myPoligonState = valid ? InProcess : NotValid;
delete points;
if ( closed && !valid )
else
GetRenderWidget()->setCursor( Qt::ForbiddenCursor );
- myPolygonPoints.append( QPoint( myOtherPoint.x(), myOtherPoint.y() ) );
+ myPolygonPoints.append(myOtherPointCopy);
QPolygon aPolygon( myPolygonPoints );
myPolygonBand->initGeometry( aPolygon );
#include "SVTK_Renderer.h"
#include "SVTK_Functor.h"
#include "SALOME_Actor.h"
+#include "ViewerTools_ScreenScaling.h"
// QT Includes
// Put Qt includes before the X11 includes which #define the symbol None
::polish()
{
// Final initialization just before the widget is displayed
- GetDevice()->SetSize(width(),height());
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+ GetDevice()->SetSize(width() * pixelRatio, height() * pixelRatio);
if(!GetDevice()->GetInitialized() && GetDevice()->GetRenderWindow()){
GetDevice()->Initialize();
GetDevice()->ConfigureEvent();
*/
void
QVTK_RenderWindowInteractor
-::resizeEvent( QResizeEvent* /*theEvent*/ )
+::resizeEvent( QResizeEvent* /* theEvent */ )
{
+
int* aSize = getRenderWindow()->GetSize();
int aWidth = aSize[0];
int aHeight = aSize[1];
- GetDevice()->UpdateSize(width(),height());
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+ GetDevice()->UpdateSize(width() * pixelRatio, height() * pixelRatio);
if(isVisible() && aWidth && aHeight){
if( aWidth != width() || aHeight != height() ) {
SVTK_RenderWindowInteractor
::mouseMoveEvent( QMouseEvent* event )
{
+ event = static_cast<QMouseEvent*>(ViewerTools_ScreenScaling::getDpiAwareEvent(event));
QVTK_RenderWindowInteractor::mouseMoveEvent(event);
if(GENERATE_SUIT_EVENTS)
SVTK_RenderWindowInteractor
::mousePressEvent( QMouseEvent* event )
{
+ event = static_cast<QMouseEvent*>(ViewerTools_ScreenScaling::getDpiAwareEvent(event));
QVTK_RenderWindowInteractor::mousePressEvent(event);
if(GENERATE_SUIT_EVENTS)
isOperation = style->CurrentState() != VTK_INTERACTOR_STYLE_CAMERA_NONE;
}
+ event = static_cast<QMouseEvent*>(ViewerTools_ScreenScaling::getDpiAwareEvent(event));
QVTK_RenderWindowInteractor::mouseReleaseEvent(event);
if ( style ) {
if ( aRightBtn && !isOperation && !isPolygonalSelection &&
!( event->modifiers() & Qt::ControlModifier ) &&
!( event->modifiers() & Qt::ShiftModifier ) ) {
+ // We need to pass unscaled coordinates to get a menu painted in a right place.
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
QContextMenuEvent aEvent( QContextMenuEvent::Mouse,
- event->pos(), event->globalPos() );
+ event->pos() / pixelRatio, event->globalPos() / pixelRatio);
emit contextMenuRequested( &aEvent );
}
if(GENERATE_SUIT_EVENTS)
SVTK_RenderWindowInteractor
::mouseDoubleClickEvent( QMouseEvent* event )
{
+ event = static_cast<QMouseEvent*>(ViewerTools_ScreenScaling::getDpiAwareEvent(event));
+
if( GetInteractorStyle() && event->button() == Qt::LeftButton ) {
SVTK_InteractorStyle* style = dynamic_cast<SVTK_InteractorStyle*>( GetInteractorStyle() );
if ( style )
SVTK_RenderWindowInteractor
::wheelEvent( QWheelEvent* event )
{
+ event = static_cast<QWheelEvent*>(ViewerTools_ScreenScaling::getDpiAwareEvent(event));
+
QVTK_RenderWindowInteractor::wheelEvent(event);
if(event->delta() > 0)
QApplication::setApplicationName("salome");
QApplication::setApplicationVersion(salomeVersion());
+ // supports HDPI
+ MESSAGE("Set QApplication attributes to supports HDPI...");
+
+ // Make QIcon::pixmap() generate high-dpi pixmaps that can be larger than the requested size.
+ // Such pixmaps will have devicePixelRatio() set to a value higher than 1.
+ // After setting this attribute, application code that uses pixmap sizes in layout geometry calculations
+ // should typically divide by devicePixelRatio() to get device-independent layout geometry.
+ QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
+
+ // The lines below do the same - enables automatic scaling, based on the monitor's pixel density.
+ // This won't change the size of point-sized fonts, since point is a physical measurement unit.
+ // Using them can make an impression of large icons among small fonts.
+ // qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
+ // QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // Doesn't scale fonts
+
+ // Keep this line as an example of using explicit scale factor.
+ // Defines a global scale factor for the whole application, including point-sized fonts.
+ // qputenv("QT_SCALE_FACTOR", "1.5"); // Scales everything
+
// Install Qt debug messages handler
MsgHandler msgHandler;
qInstallMessageHandler(QtxMsgHandler);
ADD_DEFINITIONS(${QT_DEFINITIONS})
# libraries to link to
-SET(_link_LIBRARIES ${QT_LIBRARIES} qtx)
+SET(_link_LIBRARIES
+ ${QT_LIBRARIES}
+ ${KERNEL_SALOMELocalTrace}
+ qtx)
# --- headers ---
ViewerTools_CubeAxesDlgBase.h
ViewerTools_DialogBase.h
ViewerTools_FontWidgetBase.h
+ ViewerTools_ScreenScaling.h
)
# header files / no moc processing
ViewerTools_CubeAxesDlgBase.cxx
ViewerTools_DialogBase.cxx
ViewerTools_FontWidgetBase.cxx
+ ViewerTools_ScreenScaling.cxx
)
# sources / to compile
--- /dev/null
+// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "ViewerTools_ScreenScaling.h"
+
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QWheelEvent>
+
+#include "utilities.h"
+
+/*!
+ * Namespace : ViewerTools_ScreenScaling
+ * Description : Tools for handle UI on screens with different scaling
+ */
+namespace ViewerTools_ScreenScaling
+{
+ // Returns pixel ratio for the current screen
+ double getPR()
+ {
+ auto getPixelRatio = []() -> double
+ {
+ // Returns the device pixel ratio for the device as a floating point number.
+ // Common values are 1 for normal-dpi displays and 2 for high-dpi "retina" displays.
+ // Returns QT_SCALE_FACTOR if QT_SCALE_FACTOR was set.
+ // Returns 2 on HDPI if QApplication::setAttribute(Qt::AA_EnableHighDpiScaling) was set.
+ // Returns 2 * QT_SCALE_FACTOR if both of the features above were set.
+ // NOTE. QT_SCALE_FACTOR breaks UI in a set (-1.0, 0.0) and (0.0, 1.0).
+ // Negative values don't scale or break UI down, but end up with 1.0 pixel ratio.
+ const double pixelRatio = QApplication::desktop()->devicePixelRatioF();
+ MESSAGE("pixelRatio: " << pixelRatio);
+
+ // Keep commented block here for a test case where we use QT_SCALE_FACTOR value instead.
+ // QByteArray scaleFactorArr = qgetenv("QT_SCALE_FACTOR");
+ // const QString scaleFactorStr = QString::fromLocal8Bit(scaleFactorArr);
+
+ // bool isScale = false;
+ // const double scaleFactor = scaleFactorStr.toDouble(&isScale);
+ // if (isScale)
+ // {
+ // MESSAGE("scaleFactor: " << scaleFactor);
+ // return scaleFactor;
+ // }
+
+ return pixelRatio;
+ };
+
+ // TODO: check if we need to get it out of static to handle moving to another screen
+ static const double pixelRatio = getPixelRatio();
+ return pixelRatio;
+ }
+
+ // Check if we have pixel ratio != 1.0
+ bool isScaledPixelRatio()
+ {
+ auto isScaledPR = []() -> bool
+ {
+ // This an arbitrary value that seems to be meaningful for UI scaling.
+ // It's not clear if we need smaller values.
+ const double epsilon = 0.01;
+ const double pixelRatio = ViewerTools_ScreenScaling::getPR();
+
+ const bool isScaled = std::abs(pixelRatio - 1.0) > epsilon;
+ MESSAGE("isScaled: " << isScaled);
+
+ return isScaled;
+ };
+
+ static const bool isScaled = isScaledPR();
+ return isScaled;
+ }
+
+
+ // Returns a copy of the given event with the local coordinates
+ // updated with the current pixel ratio.
+ QEvent* getDpiAwareEvent(QEvent* e, bool toMultiply/* = true */)
+ {
+ // Calculate a new position
+ auto getNewPos = [toMultiply](const QPointF& pos) -> QPointF
+ {
+ double pixelRatio = ViewerTools_ScreenScaling::getPR();
+ if (!toMultiply)
+ {
+ pixelRatio = 1.0 / pixelRatio;
+ }
+
+ const double x = pos.x() * pixelRatio;
+ const double y = pos.y() * pixelRatio;
+
+ // Commented because of bloated output for casual debug
+ // MESSAGE("New pos: " << x << ", " << y);
+
+ return QPointF(x, y);
+ };
+
+ // Scales mouse event
+ auto makeMouseEvent = [&getNewPos](QMouseEvent* e) -> QEvent*
+ {
+ const QPointF pos = e->localPos();
+ const QPointF newPos = getNewPos(pos);
+
+ const QPointF globalPos = e->globalPos();
+ const QPointF globalNewPos = getNewPos(globalPos);
+
+ // Commented because of bloated output for casual debug
+ // MESSAGE("type: " << e->type() << "; old: " << pos.x() << ", " << pos.y() << "; new: " << newPos.x() << ", " << newPos.y());
+
+ return new QMouseEvent(e->type(), newPos, globalNewPos, e->button(), e->buttons(), e->modifiers());
+ };
+
+ // Scales wheel event
+ auto makeWheelEvent = [&getNewPos](QWheelEvent* e) -> QEvent*
+ {
+ const QPointF pos = e->posF();
+
+ // Commented because of bloated output for casual debug
+ // MESSAGE("Old pos: " << pos.x() << ", " << pos.y());
+
+ return new QWheelEvent(
+ getNewPos(pos), e->globalPosF(), e->pixelDelta(), e->angleDelta(), e->buttons(), e->modifiers(), e->phase(), e->inverted(), e->source());
+ };
+
+ // Return on start if we don't have any scaling
+ if (!isScaledPixelRatio())
+ return e;
+
+ // Make a copy of the event with the new position
+ const int aType = e->type();
+ switch(aType)
+ {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonDblClick:
+ return makeMouseEvent((QMouseEvent*)e);
+
+ case QEvent::Wheel:
+ return makeWheelEvent((QWheelEvent*)e);
+
+ default:
+ break;
+ }
+
+ return e;
+ }
+};
--- /dev/null
+// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef VIEWERTOOLS_SCREENSCALING_H
+#define VIEWERTOOLS_SCREENSCALING_H
+
+#include "ViewerTools.h"
+
+class QEvent;
+
+/*!
+ * Namespace : ViewerTools_ScreenScaling
+ * Description : Tools for handle UI on screens with different scaling
+ */
+namespace ViewerTools_ScreenScaling
+{
+ // Returns pixel ratio for the current screen
+ VIEWERTOOLS_EXPORT double getPR();
+
+ // Check if we have pixel ratio != 1.0
+ VIEWERTOOLS_EXPORT bool isScaledPixelRatio();
+
+ // Returns a copy of the given event with the local coordinates
+ // updated with the current pixel ratio.
+ VIEWERTOOLS_EXPORT QEvent* getDpiAwareEvent(QEvent* e, bool toMultiply = true);
+}
+
+#endif