X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCCViewer%2FOCCViewer_ViewWindow.cxx;h=a0e96792bba525452df09cffa38363629dd3dc4c;hb=654c59e37e65eebf198dacecb7379ef4607840c3;hp=7d357e1927336db0bbba59fc5ca8ce5f87dc91e4;hpb=720b79f28e41eaee78ad3c1a4d4b12e1e7005eea;p=modules%2Fgui.git diff --git a/src/OCCViewer/OCCViewer_ViewWindow.cxx b/src/OCCViewer/OCCViewer_ViewWindow.cxx index 7d357e192..a0e96792b 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.cxx +++ b/src/OCCViewer/OCCViewer_ViewWindow.cxx @@ -35,8 +35,6 @@ #include "OCCViewer_CubeAxesDlg.h" #include "OCCViewer_ClippingDlg.h" -#include - #include #include #include @@ -49,7 +47,7 @@ #include #include -#include +#include #include #include @@ -57,6 +55,7 @@ #include #include #include +#include #include #include @@ -69,10 +68,20 @@ #include #include +#include +#include +#include +#include + #include #include #include #include +#if OCC_VERSION_LARGE > 0x06090000 +#include +#include +#endif + #include #include @@ -83,9 +92,6 @@ #include #include -#include -#include - #include #include @@ -104,6 +110,12 @@ static QEvent* l_mbPressEvent = 0; #include +// To avoid conflict between KeyPress from the X.h (define KeyPress 2) +// and QEvent::KeyPress (qevent.h) +#ifdef KeyPress +#undef KeyPress +#endif + const char* imageZoomCursor[] = { "32 32 3 1", ". c None", @@ -231,12 +243,13 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop* theDesktop, myModel = theModel; myRestoreFlag = 0; myEnableDrawMode = false; + myDrawRectEnabled = true; myDrawRect=false; updateEnabledDrawMode(); myScalingDlg = 0; mySetRotationPointDlg = 0; myRectBand = 0; - + IsSketcherStyle = false; myIsKeyFree = false; @@ -251,7 +264,6 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop* theDesktop, myCursorIsHand = false; clearViewAspects(); - } /*! @@ -300,7 +312,7 @@ void OCCViewer_ViewWindow::initLayout() QtxAction* anAction = dynamic_cast( toolMgr()->action( GraduatedAxesId ) ); myCubeAxesDlg = new OCCViewer_CubeAxesDlg( anAction, this, "OCCViewer_CubeAxesDlg" ); myCubeAxesDlg->initialize(); - + connect( myViewPort, SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), this, SLOT( emitViewModified() ) ); } @@ -364,7 +376,7 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e ) case QEvent::Wheel: { QWheelEvent* aEvent = (QWheelEvent*) e; - + if ( aEvent->modifiers().testFlag(Qt::ControlModifier) ) { Handle(AIS_InteractiveContext) ic = myModel->getAISContext(); if ( isPreselectionEnabled() && ic->HasOpenedContext() ) { @@ -374,7 +386,9 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e ) ic->HilightPreviousDetected( myViewPort->getView() ); } } - } else { + } + else { + emit vpTransformationStarted ( ZOOMVIEW ); myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() ); double delta = (double)( aEvent->delta() ) / ( 15 * 8 ); int x = aEvent->x(); @@ -383,6 +397,7 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e ) int y1 = (int)( aEvent->y() + height()*delta/100 ); myViewPort->zoom( x, y, x1, y1 ); myViewPort->getView()->ZFitAll(); + emit vpTransformationFinished ( ZOOMVIEW ); } } return true; @@ -406,13 +421,25 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e ) return SUIT_ViewWindow::eventFilter(watched, e); } +/*! + \brief Enable / disable draw rect (rubber band) mode +*/ +bool OCCViewer_ViewWindow::enableDrawMode( bool on ) +{ + bool prev = myDrawRectEnabled; + myDrawRectEnabled = on; + updateEnabledDrawMode(); + return prev; +} + /*! \brief Update state of enable draw mode state. */ void OCCViewer_ViewWindow::updateEnabledDrawMode() { + myEnableDrawMode = myDrawRectEnabled; if ( myModel ) - myEnableDrawMode = myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled(); + myEnableDrawMode = myEnableDrawMode && myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled(); } /*! @@ -426,10 +453,10 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent ) int anInteractionStyle = interactionStyle(); // in "key free" interaction style zoom operation is activated by two buttons (simultaneously pressed), - // which are assigned for pan and rotate - these operations are activated immediately after pressing + // which are assigned for pan and rotate - these operations are activated immediately after pressing // of the first button, so it is necessary to switch to zoom when the second button is pressed bool aSwitchToZoom = false; - if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE && + if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE && ( myOperation == PANVIEW || myOperation == ROTATE ) ) { aSwitchToZoom = getButtonState( theEvent, anInteractionStyle ) == ZOOMVIEW; } @@ -551,7 +578,7 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent ) } /* notify that we start a transformation */ if ( transformRequested() ) - emit vpTransformationStarted ( myOperation ); + emit vpTransformationStarted ( myOperation ); } if ( transformRequested() ) setTransformInProcess( true ); @@ -660,9 +687,8 @@ bool OCCViewer_ViewWindow::computeGravityCenter( double& theX, double& theY, dou for( ; aStructureIt.More(); aStructureIt.Next() ) { const Handle(Graphic3d_Structure)& aStructure = aStructureIt.Key(); - if ( aStructure->IsEmpty() ) { + if ( aStructure->IsEmpty() || !aStructure->IsVisible() || aStructure->CStructure()->IsForHighlight ) continue; - } #if OCC_VERSION_LARGE > 0x06070100 Bnd_Box aBox = aStructure->MinMaxValues(); @@ -870,7 +896,7 @@ bool OCCViewer_ViewWindow::setTransformRequested( OperationType op ) { bool ok = transformEnabled( op ); myOperation = ok ? op : NOTHING; - myViewPort->setMouseTracking( myOperation == NOTHING ); + myViewPort->setMouseTracking( myOperation == NOTHING ); return ok; } @@ -1106,7 +1132,7 @@ void OCCViewer_ViewWindow::drawRect() //myRectBand->setPalette(palette); } //myRectBand->hide(); - + myRectBand->setUpdatesEnabled ( false ); QRect aRect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY); myRectBand->initGeometry( aRect ); @@ -1146,7 +1172,7 @@ void OCCViewer_ViewWindow::createActions() { if( !toolMgr()->isEmpty() ) return; - + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QtxAction* aAction; @@ -1171,7 +1197,7 @@ void OCCViewer_ViewWindow::createActions() aAction->setStatusTip(tr("DSC_FITRECT")); connect(aAction, SIGNAL(triggered()), this, SLOT(activateWindowFit())); toolMgr()->registerAction( aAction, FitRectId ); - + // FitSelection aAction = new QtxAction(tr("MNU_FITSELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITSELECTION" ) ), tr( "MNU_FITSELECTION" ), 0, this); @@ -1243,7 +1269,7 @@ void OCCViewer_ViewWindow::createActions() connect(aAction, SIGNAL(triggered()), this, SLOT(onBottomView())); this->addAction(aAction); toolMgr()->registerAction( aAction, BottomId ); - + aAction = new QtxAction(tr("MNU_LEFT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_LEFT" ) ), tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view"); aAction->setStatusTip(tr("DSC_LEFT_VIEW")); @@ -1274,6 +1300,36 @@ void OCCViewer_ViewWindow::createActions() this->addAction(aAction); toolMgr()->registerAction( aAction, ClockWiseId ); + // Projection mode group + + // - orthographic projection + aAction = new QtxAction(tr("MNU_ORTHOGRAPHIC_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ORTHOGRAPHIC" ) ), + tr( "MNU_ORTHOGRAPHIC_MODE" ), 0, this); + aAction->setStatusTip(tr("DSC_ORTHOGRAPHIC_MODE")); + aAction->setCheckable(true); + toolMgr()->registerAction( aAction, OrthographicId ); + + // - perspective projection + aAction = new QtxAction(tr("MNU_PERSPECTIVE_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PERSPECTIVE" ) ), + tr( "MNU_PERSPECTIVE_MODE" ), 0, this); + aAction->setStatusTip(tr("DSC_PERSPECTIVE_MODE")); + aAction->setCheckable(true); + toolMgr()->registerAction( aAction, PerspectiveId ); +#if OCC_VERSION_LARGE > 0x06090000 + // - stereo projection + aAction = new QtxAction(tr("MNU_STEREO_MODE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STEREO" ) ), + tr( "MNU_STEREO_MODE" ), 0, this); + aAction->setStatusTip(tr("DSC_STEREO_MODE")); + aAction->setCheckable(true); + toolMgr()->registerAction( aAction, StereoId ); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onStereoType(bool))); +#endif + // - add exclusive action group + QActionGroup* aProjectionGroup = new QActionGroup( this ); + aProjectionGroup->addAction( toolMgr()->action( OrthographicId ) ); + aProjectionGroup->addAction( toolMgr()->action( PerspectiveId ) ); + connect(aProjectionGroup, SIGNAL(triggered(QAction*)), this, SLOT(onProjectionType(QAction*))); + // Reset aAction = new QtxAction(tr("MNU_RESET_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RESET" ) ), tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view"); @@ -1342,7 +1398,7 @@ void OCCViewer_ViewWindow::createActions() connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchSelection(bool))); toolMgr()->registerAction( aAction, SwitchSelectionId ); - // Graduated axes + // Graduated axes aAction = new QtxAction(tr("MNU_GRADUATED_AXES"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_GRADUATED_AXES" ) ), tr( "MNU_GRADUATED_AXES" ), 0, this); aAction->setStatusTip(tr("DSC_GRADUATED_AXES")); @@ -1388,7 +1444,7 @@ void OCCViewer_ViewWindow::createActions() toolMgr()->registerAction( aAction, ReturnTo3dViewId ); } - // Synchronize View + // Synchronize View toolMgr()->registerAction( synchronizeAction(), SynchronizeId ); } @@ -1454,6 +1510,12 @@ void OCCViewer_ViewWindow::createToolBar() toolMgr()->append( AntiClockWiseId, tid ); toolMgr()->append( ClockWiseId, tid ); + toolMgr()->append( OrthographicId, tid ); + toolMgr()->append( PerspectiveId, tid ); +#if OCC_VERSION_LARGE > 0x06090000 + toolMgr()->append( StereoId, tid ); +#endif + toolMgr()->append( ResetId, tid ); } @@ -1464,7 +1526,7 @@ void OCCViewer_ViewWindow::createToolBar() toolMgr()->append( toolMgr()->separator(), tid ); toolMgr()->append( CloneId, tid ); - + toolMgr()->append( toolMgr()->separator(), tid ); toolMgr()->append( ClippingId, tid ); toolMgr()->append( AxialScaleId, tid ); @@ -1587,10 +1649,173 @@ void OCCViewer_ViewWindow::onResetView() myViewPort->getView()->Reset( false ); myViewPort->fitAll( false, true, false ); myViewPort->getView()->SetImmediateUpdate( upd ); + onProjectionType(); // needed to apply projection type properly after reset myViewPort->getView()->Update(); emit vpTransformationFinished( RESETVIEW ); } +/*! + \brief Set the given projection mode. + + Set the given projection mode: Orthographic or Perspective. +*/ +void OCCViewer_ViewWindow::onProjectionType( QAction* theAction ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + if (theAction == toolMgr()->action( OrthographicId )) { + myModel->setProjectionType(Orthographic); + aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Orthographic ); + aCamera->SetFOVy(45.0); + } + else if (theAction == toolMgr()->action( PerspectiveId )) { + myModel->setProjectionType(Perspective); + aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Perspective ); + aCamera->SetFOVy(30.0); + } +#if OCC_VERSION_LARGE > 0x06090000 + if (toolMgr()->action( StereoId )->isChecked()) { + aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Stereo ); + aCamera->SetFOVy(30.0); + } +#endif + aView3d->Redraw(); + onViewFitAll(); + } +} + +/*! + \brief Sets Stereo projection mode. + + Sets Stereo projection mode. +*/ +void OCCViewer_ViewWindow::onStereoType( bool activate ) +{ +#if OCC_VERSION_LARGE > 0x06090000 + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + if (activate) { + toolMgr()->action( PerspectiveId )->setChecked(true); + aCamera->SetProjectionType(Graphic3d_Camera::Projection_Perspective); + toolMgr()->action( PerspectiveId )->actionGroup()->setEnabled(false); + + aCamera->SetProjectionType ( Graphic3d_Camera::Projection_Stereo ); + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + setStereoType( aResMgr->integerValue( "OCCViewer", "stereo_type", 0 ) ); + setAnaglyphFilter( aResMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 ) ); + setReverseStereo( aResMgr->booleanValue( "OCCViewer", "reverse_stereo", false ) ); + setVSync( aResMgr->booleanValue( "OCCViewer", "enable_vsync", true ) ); + setQuadBufferSupport( aResMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false ) ); + } + else { + toolMgr()->action( PerspectiveId )->actionGroup()->setEnabled(true); + if (myModel->projectionType() == Orthographic) { + toolMgr()->action( OrthographicId )->setChecked(true); + aCamera->SetProjectionType(Graphic3d_Camera::Projection_Orthographic); + } + else if (myModel->projectionType() == Perspective) { + toolMgr()->action( PerspectiveId )->setChecked(true); + aCamera->SetProjectionType(Graphic3d_Camera::Projection_Perspective); + } + } + aView3d->Redraw(); + onViewFitAll(); + } + + if ( isQuadBufferSupport() && !isOpenGlStereoSupport() && stereoType() == QuadBuffer && + toolMgr()->action( StereoId )->isChecked() ) + SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ), tr( "WRN_SUPPORT_QUAD_BUFFER" ) ); +#endif +} + +/*! + \brief Restore the view. + + Restore the projection mode based on tool-buttons states. +*/ +void OCCViewer_ViewWindow::onProjectionType() +{ + emit vpTransformationStarted( PROJECTION ); + if (toolMgr()->action( OrthographicId )->isChecked()) + setProjectionType( Orthographic ); + if (toolMgr()->action( PerspectiveId )->isChecked()) + setProjectionType( Perspective ); +#if OCC_VERSION_LARGE > 0x06090000 + if (toolMgr()->action( StereoId )->isChecked()) + setProjectionType( Stereo ); +#endif + emit vpTransformationFinished( PROJECTION ); +} + +void OCCViewer_ViewWindow::setProjectionType( int mode ) +{ + QtxAction* anOrthographicAction = dynamic_cast( toolMgr()->action( OrthographicId ) ); + QtxAction* aPerspectiveAction = dynamic_cast( toolMgr()->action( PerspectiveId ) ); +#if OCC_VERSION_LARGE > 0x06090000 + QtxAction* aStereoAction = dynamic_cast( toolMgr()->action( StereoId ) ); +#endif + switch ( mode ) { + case Orthographic: + onProjectionType( anOrthographicAction ); + break; + case Perspective: + onProjectionType( aPerspectiveAction ); + break; + case Stereo: + onStereoType( true ); + break; + } + // update action state if method is called outside + if ( mode == Orthographic && !anOrthographicAction->isChecked() ) { + anOrthographicAction->setChecked( true ); + #if OCC_VERSION_LARGE > 0x06090000 + aStereoAction->setChecked( false ); + #endif + } + if ( mode == Perspective && !aPerspectiveAction->isChecked() ) { + aPerspectiveAction->setChecked( true ); + #if OCC_VERSION_LARGE > 0x06090000 + aStereoAction->setChecked( false ); + #endif + } +#if OCC_VERSION_LARGE > 0x06090000 + if ( mode == Stereo ) { + aStereoAction->setChecked( true ); + if ( anOrthographicAction->isEnabled() ) { + anOrthographicAction->setEnabled( false ); + anOrthographicAction->setChecked( false ); + aStereoAction->setChecked( false ); + } + else { + anOrthographicAction->setEnabled( true ); + aStereoAction->setChecked( false ); + anOrthographicAction->setChecked(myModel->projectionType() == Orthographic); + } + if ( aPerspectiveAction->isEnabled() ) { + aPerspectiveAction->setEnabled( false ); + aPerspectiveAction->setChecked( true ); + if ( isQuadBufferSupport() && !isOpenGlStereoSupport() && stereoType() == QuadBuffer && + toolMgr()->action( StereoId )->isChecked() ) + SUIT_MessageBox::warning( 0, tr( "WRN_WARNING" ), tr( "WRN_SUPPORT_QUAD_BUFFER" ) ); + } + else { + aPerspectiveAction->setEnabled( true ); + aStereoAction->setChecked( false ); + aPerspectiveAction->setChecked(myModel->projectionType() == Perspective); + onProjectionType(); + } + } + else { + if ( !anOrthographicAction->isEnabled() ) + anOrthographicAction->setEnabled( true ); + if ( !aPerspectiveAction->isEnabled() ) + aPerspectiveAction->setEnabled( true ); + } +#endif +} + /*! \brief Perform "fit all" transformation. */ @@ -1663,7 +1888,7 @@ void OCCViewer_ViewWindow::onAxialScale() { if ( !myScalingDlg ) myScalingDlg = new OCCViewer_AxialScaleDlg( this ); - + if ( !myScalingDlg->isVisible() ) { myScalingDlg->Update(); @@ -1766,7 +1991,7 @@ void OCCViewer_ViewWindow::performRestoring( const viewAspect& anItem, bool base myModel->setTrihedronShown( anItem.isVisible ); myModel->setTrihedronSize( anItem.size ); - + // graduated trihedron bool anIsVisible = anItem.gtIsVisible; OCCViewer_AxisWidget::AxisData anAxisData[3]; @@ -1861,7 +2086,7 @@ void OCCViewer_ViewWindow::onSwitchSelection( bool on ) { mySelectionEnabled = on; myModel->setSelectionOptions( myModel->isPreselectionEnabled(), isSelectionEnabled() ); - + // update action state if method is called outside // preselection @@ -1948,22 +2173,23 @@ QImage OCCViewer_ViewWindow::dumpView() Handle(V3d_View) view = myViewPort->getView(); if ( view.IsNull() ) return QImage(); - + int aWidth = myViewPort->width(); int aHeight = myViewPort->height(); // rnv: An old approach to dump the OCCViewer content // Now used OCCT built-in procedure. - /* + /* QApplication::syncX(); view->Redraw(); // In order to reactivate GL context //view->Update(); +#ifndef DISABLE_GLVIEWER OpenGLUtils_FrameBuffer aFrameBuffer; if( aFrameBuffer.init( aWidth, aHeight ) ) { QImage anImage( aWidth, aHeight, QImage::Format_RGB32 ); - + glPushAttrib( GL_VIEWPORT_BIT ); glViewport( 0, 0, aWidth, aHeight ); aFrameBuffer.bind(); @@ -1991,8 +2217,9 @@ QImage OCCViewer_ViewWindow::dumpView() glReadPixels( p.x(), p.y(), aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, data); +#endif */ - + Image_PixMap aPix; view->ToPixMap(aPix,aWidth, aHeight,Graphic3d_BT_RGBA); @@ -2001,8 +2228,8 @@ QImage OCCViewer_ViewWindow::dumpView() return anImage; } -bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img, - const QString& fileName, +bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img, + const QString& fileName, const QString& format ) { if ( format != "PS" && format != "EPS") @@ -2052,7 +2279,7 @@ void OCCViewer_ViewWindow::setCuttingPlane( bool on, const double x, const doub gp_Pln pln (gp_Pnt(x, y, z), gp_Dir(dx, dy, dz)); double a, b, c, d; pln.Coefficients(a, b, c, d); - + Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes(); if(aPlanes.Size() > 0 ) { Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes); @@ -2459,7 +2686,7 @@ void OCCViewer_ViewWindow::setVisualParameters( const QString& parameters ) params.isVisible = data.count() > idx ? data[idx++].toInt() : 1; params.size = data.count() > idx ? data[idx++].toDouble() : 100.0; } - performRestoring( params ); + performRestoring( params ); setBackground( bgData ); myModel->setClipPlanes(aClipPlanes); } @@ -2703,8 +2930,8 @@ void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal) QAction* anAction2 = toolMgr()->action( ReturnTo3dViewId ); SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); if ( toMaximize ) { - anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) ); - anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) ); + anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) ); + anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) ); anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ) ); anAction->setStatusTip( tr( "DSC_MINIMIZE_VIEW" ) ); if ( anAction2 && my2dMode != No2dMode ) toolMgr()->show( ReturnTo3dViewId ); @@ -2713,8 +2940,8 @@ void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal) } } else { - anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) ); - anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) ); + anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) ); + anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) ); anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MAXIMIZE" ) ) ); anAction->setStatusTip( tr( "DSC_MAXIMIZE_VIEW" ) ); if ( anAction2 && my2dMode != No2dMode ) toolMgr()->hide( ReturnTo3dViewId ); @@ -2730,13 +2957,13 @@ bool OCCViewer_ViewWindow::isMaximized() const } void OCCViewer_ViewWindow::setSketcherStyle( bool enable ) -{ - IsSketcherStyle = enable; +{ + IsSketcherStyle = enable; } -bool OCCViewer_ViewWindow::isSketcherStyle() const -{ - return IsSketcherStyle; +bool OCCViewer_ViewWindow::isSketcherStyle() const +{ + return IsSketcherStyle; } @@ -2745,12 +2972,248 @@ void OCCViewer_ViewWindow::set2dMode(Mode2dType theType) my2dMode = theType; } -// obsolete +int OCCViewer_ViewWindow::projectionType() const +{ + int mode = Orthographic; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Perspective) + mode = Perspective; + if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Orthographic) + mode = Orthographic; + #if OCC_VERSION_LARGE > 0x06090000 + if (aCamera->ProjectionType() == Graphic3d_Camera::Projection_Stereo) + mode = Stereo; + #endif + } + return mode; +} + +void OCCViewer_ViewWindow::setStereoType( int type ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + aParams->StereoMode = (Graphic3d_StereoMode)type; + #endif + } +} + +int OCCViewer_ViewWindow::stereoType() const +{ + int type = QuadBuffer; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + type = (OCCViewer_ViewWindow::StereoType)aParams->StereoMode; + #endif + } + return type; +} + +void OCCViewer_ViewWindow::setAnaglyphFilter( int type ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + if (type == RedCyan) + aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized; + if (type == YellowBlue) + aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized; + if (type == GreenMagenta) + aParams->AnaglyphFilter = Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple; + #endif + } +} + +int OCCViewer_ViewWindow::anaglyphFilter() const +{ + int type = RedCyan; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized) + type = RedCyan; + if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized) + type = YellowBlue; + if (aParams->AnaglyphFilter == Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple) + type = GreenMagenta; + #endif + } + return type; +} + +void OCCViewer_ViewWindow::setStereographicFocus( int type, double value ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + aCamera->SetZFocus( (Graphic3d_Camera::FocusType) type, value ); + #endif + } +} + +int OCCViewer_ViewWindow::stereographicFocusType() const +{ + int type = Relative; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + type = (OCCViewer_ViewWindow::FocusIODType)aCamera->ZFocusType(); + #endif + } + return type; +} + +double OCCViewer_ViewWindow::stereographicFocusValue() const +{ + double value = 1.0; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + value = aCamera->ZFocus(); + #endif + } + return value; +} + +void OCCViewer_ViewWindow::setInterocularDistance( int type, double value ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + aCamera->SetIOD( (Graphic3d_Camera::IODType) type, value ); + #endif + } +} + +int OCCViewer_ViewWindow::interocularDistanceType() const +{ + int type = Relative; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + type = (OCCViewer_ViewWindow::FocusIODType)aCamera->GetIODType(); + #endif + } + return type; +} + +double OCCViewer_ViewWindow::interocularDistanceValue() const +{ + double value = 0.05; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(Graphic3d_Camera) aCamera = aView3d->Camera(); + value = aCamera->IOD(); + #endif + } + return value; +} + +void OCCViewer_ViewWindow::setReverseStereo( bool reverse ) +{ + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + aParams->ToReverseStereo = reverse; + #endif + } +} + +bool OCCViewer_ViewWindow::isReverseStereo() const +{ + int reverse = false; + Handle(V3d_View) aView3d = myViewPort->getView(); + if ( !aView3d.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Graphic3d_RenderingParams* aParams = &aView3d->ChangeRenderingParams(); + reverse = aParams->ToReverseStereo; + #endif + } + return reverse; +} + +void OCCViewer_ViewWindow::setVSync( bool enable ) +{ + Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext(); + if ( !anIntCont.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver()); + OpenGl_Caps* aCaps = &aDriver->ChangeOptions(); + aCaps->swapInterval = enable; + #endif + } +} + +bool OCCViewer_ViewWindow::isVSync() const +{ + int enable = true; + Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext(); + if ( !anIntCont.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver()); + OpenGl_Caps* aCaps = &aDriver->ChangeOptions(); + enable = aCaps->swapInterval; + #endif + } + return enable; +} + +void OCCViewer_ViewWindow::setQuadBufferSupport( bool enable ) +{ + Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext(); + if ( !anIntCont.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver()); + OpenGl_Caps* aCaps = &aDriver->ChangeOptions(); + aCaps->contextStereo = enable; + #endif + } +} + +bool OCCViewer_ViewWindow::isQuadBufferSupport() const +{ + int enable = true; + Handle(AIS_InteractiveContext) anIntCont = myModel->getAISContext(); + if ( !anIntCont.IsNull() ) { + #if OCC_VERSION_LARGE > 0x06090000 + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(anIntCont->CurrentViewer()->Driver()); + OpenGl_Caps* aCaps = &aDriver->ChangeOptions(); + enable = aCaps->contextStereo; + #endif + } + return enable; +} + + +bool OCCViewer_ViewWindow::isOpenGlStereoSupport() const +{ + GLboolean support[1]; + glGetBooleanv (GL_STEREO, support); + if ( support[0] ) + return true; + return false; +} + +// obsolete QColor OCCViewer_ViewWindow::backgroundColor() const { return myViewPort ? myViewPort->backgroundColor() : Qt::black; } - + // obsolete void OCCViewer_ViewWindow::setBackgroundColor( const QColor& theColor ) { @@ -2761,7 +3224,7 @@ Qtx::BackgroundData OCCViewer_ViewWindow::background() const { return myViewPort ? myViewPort->background() : Qtx::BackgroundData(); } - + void OCCViewer_ViewWindow::setBackground( const Qtx::BackgroundData& theBackground ) { if ( myViewPort ) myViewPort->setBackground( theBackground ); @@ -3063,7 +3526,7 @@ void OCCViewer_ViewWindow::onClipping (bool theIsOn) { if(!myModel) return; OCCViewer_ClippingDlg* aClippingDlg = myModel->getClippingDlg(); - + if (theIsOn) { if (!aClippingDlg) { aClippingDlg = new OCCViewer_ClippingDlg (this, myModel);