-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "OCCViewer_ViewWindow.h"
#include "OCCViewer_ViewModel.h"
-#include <Basics_OCCTVersion.hxx>
-
#include <SUIT_ViewManager.h>
#include <SUIT_ViewModel.h>
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
#include <QColor>
#include <QFileInfo>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QApplication>
+#include <QTimer>
+
+#if OCC_VERSION_MAJOR < 7
+ #include <Visual3d_View.hxx>
+#endif
-#include <Visual3d_View.hxx>
-#include <V3d_Viewer.hxx>
+#if OCC_VERSION_LARGE > 0x06070100
+#include <V3d_View.hxx>
+#else
#include <V3d_PerspectiveView.hxx>
#include <V3d_OrthographicView.hxx>
+#endif
#include "utilities.h"
-#if defined WNT
+#if defined WIN32
#include <WNT_Window.hxx>
#else
-#include <Xw_Window.hxx>
+//#include <Xw_Window.hxx>
#endif
static double rx = 0.;
OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_Viewer)& viewer, V3d_TypeOfView type )
: OCCViewer_ViewPort( parent ),
myScale( 1.0 ),
- myDegenerated( true ),
- myAnimate( false ),
myBusy( true ),
myIsAdvancedZoomingEnabled( false )
{
// VSR: 01/07/2010 commented to avoid SIGSEGV at SALOME exit
//selectVisualId();
+#if OCC_VERSION_LARGE > 0x06070100
+ myActiveView = new V3d_View( viewer, type );
+#else
if ( type == V3d_ORTHOGRAPHIC ) {
myOrthoView = new V3d_OrthographicView( viewer );
myActiveView = myOrthoView;
myPerspView = new V3d_PerspectiveView( viewer );
myActiveView = myPerspView;
}
- if ( myDegenerated )
- activeView()->SetDegenerateModeOn();
- setBackground( Qtx::BackgroundData( Qt::black ) ); // set default background
+#endif
+
+ setDefaultParams();
+
+ myCursor = NULL;
}
/*!
*/
OCCViewer_ViewPort3d::~OCCViewer_ViewPort3d()
{
- emit vpClosed();
+ if ( myCursor )
+ {
+ delete myCursor;
+ myCursor = NULL;
+ }
+
+ emit vpClosed(this);
Handle(V3d_View) aView = activeView();
if (!aView.IsNull())
aView->Remove();
view->View()->Deactivate();
}
- /* create static trihedron (16551: EDF PAL 501) */
- OCCViewer_ViewWindow* aVW = dynamic_cast<OCCViewer_ViewWindow*>( parentWidget()->parentWidget()->parentWidget() );
- if ( aVW ) {
- OCCViewer_Viewer* aViewModel = dynamic_cast<OCCViewer_Viewer*>( aVW->getViewManager()->getViewModel() );
- if ( aViewModel && aViewModel->isStaticTrihedronDisplayed() ){
- view->ZBufferTriedronSetup();
- view->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER );
- }
- }
+ emit( vpMapped(this) );
+
return true;
}
view->SetBackgroundColor( oldView->BackgroundColor() );
}
- if ( myDegenerated )
- view->SetDegenerateModeOn();
- else
- view->SetDegenerateModeOff();
-
view->View()->Activate();
activeView() = view;
return oldView;
refView->Up( x, y, z ); tgtView->SetUp( x, y, z );
refView->Eye( x, y, z ); tgtView->SetEye( x, y, z );
refView->Proj( x, y, z ); tgtView->SetProj( x, y, z );
+#if OCC_VERSION_LARGE <= 0x06070100
refView->Center( x, y ); tgtView->SetCenter( x, y );
+#endif
tgtView->SetScale( refView->Scale() );
tgtView->SetTwist( refView->Twist() );
/* update */
tgtView->Update();
tgtView->SetImmediateUpdate( Standard_True );
+ tgtView->ZFitAll();
return true;
}
if ( activeView().IsNull() ) return;
if ( !myBackground.isValid() ) return;
- // VSR: Important note on below code.
- // In OCCT (in version 6.5.2), things about the background drawing
- // are not straightforward and not clearly understandable:
- // - Horizontal gradient is drawn vertically (!), well ok, from top side to bottom one.
- // - Vertical gradient is drawn horizontally (!), from right side to left one (!!!).
- // - First and second diagonal gradients are confused.
- // - Image texture, once set, can not be removed (!).
- // - Texture image fill mode Aspect_FM_NONE is not taken into account (and means the same
- // as Aspect_FM_CENTERED).
- // - The only way to cancel gradient background (and get back to single colored) is to
- // set gradient background style to Aspect_GFM_NONE while passing two colors is also needed
- // (see V3d_View::SetBgGradientColors() function).
- // - Also, it is impossible to draw texture image above the gradiented background (only above
- // single-colored).
- // In OCCT 6.5.3 all above mentioned problems are fixed; so, above comment should be removed as soon
- // as SALOME is migrated to OCCT 6.5.3. The same concerns #ifdef statements in the below code
switch ( myBackground.mode() ) {
case Qtx::ColorBackground:
{
// Unset texture should be done here
// ...
Quantity_Color qCol( c.red()/255., c.green()/255., c.blue()/255., Quantity_TOC_RGB );
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
activeView()->SetBgGradientStyle( Aspect_GFM_NONE ); // cancel gradient background
activeView()->SetBgImageStyle( Aspect_FM_NONE ); // cancel texture background
-#else
- // cancel gradient background (in OCC before v6.5.3 the only way to do this is to set it to NONE type passing arbitrary colors as parameters)
- activeView()->SetBgGradientColors( qCol, qCol, Aspect_GFM_NONE );
-#endif
// then change background color
activeView()->SetBackgroundColor( qCol );
// update viewer
activeView()->SetBgImageStyle( Aspect_FM_NONE ); // cancel texture background
switch ( type ) {
case OCCViewer_Viewer::HorizontalGradient:
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_HOR, Standard_True );
-#else
- // in OCCT before v6.5.3, to draw horizontal gradient it's necessary to use Aspect_GFM_VER type
- // and interchange the colors
- activeView()->SetBgGradientColors( qCol2, qCol1, Aspect_GFM_VER, Standard_True );
-#endif
break;
case OCCViewer_Viewer::VerticalGradient:
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_VER, Standard_True );
-#else
- // in OCCT before v6.5.3, to draw vertical gradient it's necessary to use Aspect_GFM_HOR type
- activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_HOR, Standard_True );
-#endif
break;
case OCCViewer_Viewer::Diagonal1Gradient:
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG1, Standard_True );
-#else
- // in OCCT before v6.5.3, to draw 1st dialognal gradient it's necessary to use Aspect_GFM_DIAG2 type
- // and interchange the colors
- activeView()->SetBgGradientColors( qCol2, qCol1, Aspect_GFM_DIAG2, Standard_True );
-#endif
break;
case OCCViewer_Viewer::Diagonal2Gradient:
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG2, Standard_True );
-#else
- // in OCCT before v6.5.3, to draw 2nd dialognal gradient it's necessary to use Aspect_GFM_DIAG1 type
- activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_DIAG1, Standard_True );
-#endif
break;
case OCCViewer_Viewer::Corner1Gradient:
activeView()->SetBgGradientColors( qCol1, qCol2, Aspect_GFM_CORNER1, Standard_True );
default:
break;
}
-#if OCC_VERSION_LARGE > 0x06050200 // available since OCCT 6.5.3
- // VSR: In OCCT before v6.5.3 below code can't be used because of very ugly bug - it has been impossible to
- // clear the background texture image as soon as it was once set to the viewer.
if ( myBackground.isTextureShown() ) {
QString fileName;
int textureMode = myBackground.texture( fileName );
activeView()->Update();
}
}
-#endif
-}
-
-/*!
- Set animation mode
- \param theDegenerated - degenerated mode
-*/
-void OCCViewer_ViewPort3d::setAnimationMode(bool theDegenerated)
-{
- if ( !activeView().IsNull() ) {
- myAnimate = theDegenerated;
- activeView()->SetAnimationMode(true, theDegenerated);
- }
}
/*!
*/
void OCCViewer_ViewPort3d::startZoomAtPoint( int x, int y )
{
-#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
if ( !activeView().IsNull() && isAdvancedZoomingEnabled() )
activeView()->StartZoomAtPoint( x, y );
-#endif
}
/*!
// as OCCT respects a sign of only dx,
// but we want both signes to be taken into account
//activeView()->Zoom( x0, y0, x, y );
-#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
if ( isAdvancedZoomingEnabled() )
activeView()->ZoomAtPoint( x0, y0, x, y );
else
-#endif
activeView()->Zoom( x0 + y0, 0, x + y, 0 );
emit vpTransformed( this );
}
const gp_Pnt& theSelectedPoint )
{
if ( !activeView().IsNull() ) {
- myDegenerated = activeView()->DegenerateModeIsOn();
- activeView()->SetDegenerateModeOn();
- if (myAnimate) activeView()->SetAnimationModeOn();
-
//double gx, gy, gz;
//double gx = activeView()->gx;
//activeView()->Gravity(gx,gy,gz);
default:
break;
}
- activeView()->DepthFitAll();
+ // VSR: 10.06.2015: next line commented out - causes ugly blinking on starting rotation with Perspective projection mode
+ //activeView()->DepthFitAll();
}
}
void OCCViewer_ViewPort3d::endRotation()
{
if ( !activeView().IsNull() ) {
- if (myAnimate) activeView()->SetAnimationModeOff();
- if ( !myDegenerated )
- activeView()->SetDegenerateModeOff();
- activeView()->ZFitAll(1.);
- activeView()->SetZSize(0.);
+ activeView()->ZFitAll( 1.0 );
+#if OCC_VERSION_LARGE <= 0x06070100
+ activeView()->SetZSize( 0.0 );
+#endif
activeView()->Update();
emit vpTransformed( this );
}
*/
void OCCViewer_ViewPort3d::paintEvent( QPaintEvent* e )
{
-#ifndef WNT
+#ifndef WIN32
/* X11 : map before show doesn't work */
if ( !mapped( activeView() ) )
mapView( activeView() );
#endif
if ( !myWindow.IsNull() ) {
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
QApplication::syncX();
- QRect rc = e->rect();
- if ( !myPaintersRedrawing )
+#endif
+ if ( !myPaintersRedrawing ) {
+#if OCC_VERSION_MAJOR < 7
+ QRect rc = e->rect();
activeView()->Redraw( rc.x(), rc.y(), rc.width(), rc.height() );
+#else
+ activeView()->Redraw();
+#endif
+ }
}
OCCViewer_ViewPort::paintEvent( e );
myBusy = false;
*/
void OCCViewer_ViewPort3d::resizeEvent( QResizeEvent* e )
{
-#ifdef WNT
+#if defined WIN32 || QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
/* Win32 : map before first show to avoid flicker */
if ( !mapped( activeView() ) )
mapView( activeView() );
#endif
- QApplication::syncX();
- if ( !activeView().IsNull() )
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
+ QApplication::syncX();
+#endif
+ QTimer::singleShot( 0, this, SLOT( repaintViewAfterMove() ) );
+}
+
+/*!
+ Moved the viewport
+*/
+void OCCViewer_ViewPort3d::repaintViewAfterMove( )
+{
+ if ( !activeView().IsNull() ){
activeView()->MustBeResized();
+ }
}
/*!
myScale = activeView()->Scale();
Standard_Real margin = 0.01;
+
+#if OCC_VERSION_LARGE > 0x06070100
+ activeView()->FitAll( margin, upd );
+ if(withZ)
+ activeView()->ZFitAll();
+#else
activeView()->FitAll( margin, withZ, upd );
+#endif
activeView()->SetZSize(0.);
emit vpTransformed( this );
}
if ( view.IsNull() )
return false;
- int hwnd = (int)winId();
- if ( !hwnd )
- return false;
-
- /* set this widget as the drawing window */
- short lo = (short)hwnd;
- short hi = (short)( hwnd >> 16 );
-
- attachWindow( view, OCCViewer_VService::CreateWindow( view, (int)hi, (int)lo, Xw_WQ_SAMEQUALITY ) );
+ attachWindow( view, OCCViewer_VService::CreateWindow( view, winId() ) );
myWindow = view->Window();
return !myWindow.IsNull();
Handle(V3d_View) aView3d = getView();
Handle(V3d_View) aRefView3d = vp3d->getView();
aView3d->SetImmediateUpdate( Standard_False );
+#if OCC_VERSION_LARGE > 0x06070100
+ aView3d->Camera()->Copy( aRefView3d->Camera() );
+#else
aView3d->SetViewMapping( aRefView3d->ViewMapping() );
aView3d->SetViewOrientation( aRefView3d->ViewOrientation() );
+#endif
aView3d->ZFitAll();
aView3d->SetImmediateUpdate( Standard_True );
aView3d->Update();
/*
* Show/Hide static triedron
*/
-void OCCViewer_ViewPort3d::updateStaticTriedronVisibility() {
- OCCViewer_ViewWindow* aVW = dynamic_cast<OCCViewer_ViewWindow*>( parentWidget()->parentWidget()->parentWidget() );
- if ( aVW ) {
- OCCViewer_Viewer* aViewModel = dynamic_cast<OCCViewer_Viewer*>( aVW->getViewManager()->getViewModel() );
- Handle(V3d_View) aView = activeView();
- if ( aViewModel ){
- if(aViewModel->isStaticTrihedronDisplayed()) {
- aView->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER );
- } else {
- aView->TriedronErase();
- }
- aView->Update();
- }
+void OCCViewer_ViewPort3d::showStaticTrihedron( bool on )
+{
+ Handle(V3d_View) aView = activeView();
+ if ( !aView ) return;
+
+ if ( on ) {
+ aView->ZBufferTriedronSetup();
+ aView->TriedronDisplay( Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.05, V3d_ZBUFFER );
+ } else {
+ aView->TriedronErase();
}
+ aView->Update();
+}
+
+/*
+ * Create default cursor with a specific shape
+ */
+void OCCViewer_ViewPort3d::setDefaultCursor( Qt::CursorShape theCursorShape )
+{
+ if ( !myCursor )
+ myCursor = new QCursor();
+
+ myCursor->setShape( theCursorShape );
+}
+
+/*
+ * Get default cursor with a specific shape
+ */
+QCursor* OCCViewer_ViewPort3d::getDefaultCursor() const
+{
+ return myCursor;
+}
+
+/*
+ * Set default parameters from preferences
+ */
+void OCCViewer_ViewPort3d::setDefaultParams()
+{
+ setBackground( Qtx::BackgroundData( Qt::black ) ); // set default background
+
+ // get ray tracing parameters from preferences
+ int aDepth = SUIT_Session::session()->resourceMgr()->integerValue( "OCCViewer", "rt_depth", 3 );
+ bool aReflection = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_reflection", true );
+ bool anAntialiasing = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_antialiasing", false );
+ bool aShadow = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_shadow", true );
+ bool aTransparentShadow = SUIT_Session::session()->resourceMgr()->booleanValue( "OCCViewer", "rt_trans_shadow", true );
+
+ Graphic3d_RenderingParams& aParams = myActiveView->ChangeRenderingParams();
+ aParams.RaytracingDepth = aDepth;
+ aParams.IsReflectionEnabled = aReflection;
+ aParams.IsAntialiasingEnabled = anAntialiasing;
+ aParams.IsShadowEnabled = aShadow;
+ aParams.IsTransparentShadowEnabled = aTransparentShadow;
+ myActiveView->Redraw();
}