X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCCViewer%2FOCCViewer_ViewModel.cxx;h=bb5d8df0779e2d940c8ac1f812ff7712e533714d;hb=b77aad4cd3966476063b49699b31f59d7731ba72;hp=96809de497c8a9344b2fe4eef402c52957104da8;hpb=05253c660fd147e1c6b69abc3d839c7b9f925b60;p=modules%2Fgui.git diff --git a/src/OCCViewer/OCCViewer_ViewModel.cxx b/src/OCCViewer/OCCViewer_ViewModel.cxx old mode 100755 new mode 100644 index 96809de49..eb7ff1564 --- a/src/OCCViewer/OCCViewer_ViewModel.cxx +++ b/src/OCCViewer/OCCViewer_ViewModel.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,10 +21,11 @@ // #include "OCCViewer_ViewModel.h" -#include "OCCViewer_ViewWindow.h" #include "OCCViewer_ViewFrame.h" #include "OCCViewer_VService.h" #include "OCCViewer_ViewPort3d.h" +#include "OCCViewer_ClippingDlg.h" +#include "OCCViewer_Utilities.h" #include "SUIT_ViewWindow.h" #include "SUIT_ViewManager.h" @@ -32,6 +33,8 @@ #include "SUIT_Session.h" #include "SUIT_ResourceMgr.h" +#include "ViewerData_AISShape.hxx" + #include "QtxActionToolMgr.h" #include "QtxBackgroundTool.h" @@ -47,23 +50,39 @@ #include #include -#include -#include +#include #include +#include + +#include +#include +#include #include #include #include #include -#include -#include #include -#include +#include +#include +#include -// VSR: Uncomment below line to allow texture background support in OCC viewer -#define OCC_ENABLE_TEXTURED_BACKGROUND +namespace +{ + void setCappingColor(const Handle(Graphic3d_ClipPlane)& plane, const QColor& color) + { + Quantity_Color qcolor( color.redF(), color.greenF(), color.blueF(), Quantity_TOC_RGB ); +#if OCC_VERSION_LARGE < 0x07040000 + Graphic3d_MaterialAspect aspect; + aspect.SetColor( qcolor ); + plane->SetCappingMaterial( aspect ); +#else + plane->SetCappingColor( qcolor ); +#endif + } +} /*! Get data for supported background modes: gradient types, identifiers and supported image formats @@ -78,14 +97,25 @@ QString OCCViewer_Viewer::backgroundData( QStringList& gradList, QIntList& idLis Diagonal1Gradient << Diagonal2Gradient << Corner1Gradient << Corner2Gradient << Corner3Gradient << Corner4Gradient; -#if OCC_VERSION_LARGE > 0x06050200 // enabled since OCCT 6.5.3, since in previous version this functionality is buggy -#ifdef OCC_ENABLE_TEXTURED_BACKGROUND txtList << Qtx::CenterTexture << Qtx::TileTexture << Qtx::StretchTexture; -#endif -#endif return tr("BG_IMAGE_FILES"); } +/*! + Get data for supported stereo pair modes: stereo types and identifiers +*/ +void OCCViewer_Viewer::stereoData( QStringList& typeList, QIntList& idList) +{ + typeList << tr("ST_QUADBUFFER") << tr("ST_ANAGLYPH") << + tr("ST_ROWINTERLACED") << tr("ST_COLUMNINTERLACED") << + tr("ST_CHESSBOARD") << tr("ST_SIDEBYSIDE") << + tr("ST_OVERUNDER"); + idList << QuadBufferType << AnaglyphType << + RowInterlacedType << ColumnInterlacedType << + ChessBoardType << SideBySideType << + OverUnderType; +} + /*! Constructor \param DisplayTrihedron - is trihedron displayed @@ -95,38 +125,30 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) myBackgrounds(4, Qtx::BackgroundData( Qt::black )), myIsRelative(true), myTopLayerId( 0 ), - myTrihedronSize(100) + myTrihedronSize(100), +#if OCC_VERSION_LARGE <= 0x07030000 + myIsUseLocalSelection(false), +#endif + myClippingDlg (NULL), + myFitter(0) { // init CasCade viewers myV3dViewer = OCCViewer_VService::CreateViewer( TCollection_ExtendedString("Viewer3d").ToExtString() ); - myV3dViewer->Init(); - -#if OCC_VERSION_LARGE <= 0x06060000 // Porting to OCCT higher 6.6.0 version - myV3dCollector = OCCViewer_VService::CreateViewer( TCollection_ExtendedString("Collector3d").ToExtString() ); - myV3dCollector->Init(); -#endif + //myV3dViewer->Init(); // to avoid creation of the useless perspective view (see OCCT issue 0024267) + setDefaultLights(); // init selector -#if OCC_VERSION_LARGE <= 0x06060000 - myAISContext = new AIS_InteractiveContext( myV3dViewer, myV3dCollector ); -#else myAISContext = new AIS_InteractiveContext( myV3dViewer ); -#endif - myAISContext->SelectionColor( Quantity_NOC_WHITE ); - + myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalSelected)->SetColor( Quantity_NOC_WHITE ); + myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_Selected)->SetColor( Quantity_NOC_WHITE ); + // display isoline on planar faces (box for ex.) myAISContext->IsoOnPlane( true ); - /* - double h = QApplication::desktop()->screenGeometry( QApplication::desktop()->primaryScreen() ).height() / 300. ; - Handle(Prs3d_Drawer) drawer = myAISContext->DefaultDrawer(); - Handle(Prs3d_TextAspect) ta = drawer->TextAspect(); - ta->SetHeight(100); // VSR: workaround for CAS.CADE bug (is it really needed ???) - ta->SetHeight(h); - drawer->SetTextAspect(ta); - drawer->AngleAspect()->SetTextAspect(ta); - drawer->LengthAspect()->SetTextAspect(ta); - */ + // create color scale + myColorScale = new AIS_ColorScale(); + myColorScale->SetZLayer( Graphic3d_ZLayerId_TopOSD ); + myColorScale->SetTransformPersistence( Graphic3d_TransformPers::FromDeprecatedParams( Graphic3d_TMF_2d, gp_Pnt(-1, -1, 0) ) ); /* create trihedron */ if ( DisplayTrihedron ) @@ -139,8 +161,8 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) //myTrihedron->SetColor( Col ); myTrihedron->SetArrowColor( Col.Name() ); myTrihedron->SetSize(100); - Handle(AIS_Drawer) drawer = myTrihedron->Attributes(); - if (drawer->HasDatumAspect()) { + Handle(Prs3d_Drawer) drawer = myTrihedron->Attributes(); + if (drawer->HasOwnDatumAspect()) { Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); daspect->FirstAxisAspect()->SetColor(Quantity_Color(1.0, 0.0, 0.0, Quantity_TOC_RGB)); daspect->SecondAxisAspect()->SetColor(Quantity_Color(0.0, 1.0, 0.0, Quantity_TOC_RGB)); @@ -160,11 +182,27 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) // selection mySelectionEnabled = true; myMultiSelectionEnabled = true; - - - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - if(resMgr) - myShowStaticTrihedron = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true ); + + // set projection type to orthographic + myProjectionType = 0; + mySelectionStyle = OCCViewer_ViewWindow::RectStyle; + // set stereo parameters + myStereoType = 0; + myAnaglyphFilter = 0; + myToReverseStereo = 0; + myVSyncMode = 1; + myQuadBufferSupport = 0; + myStereographicFocusType = 1; + myInterocularDistanceType = 1; + myStereographicFocusValue = 1.0; + myInterocularDistanceValue = 0.05; + //set clipping color and texture to standard + myClippingColor = QColor( 50, 50, 50 ); + myDefaultTextureUsed = true; + myClippingTexture = QString(); + myTextureModulated = true; + myClippingTextureScale = 1.0; + } /*! @@ -174,9 +212,6 @@ OCCViewer_Viewer::~OCCViewer_Viewer() { myAISContext.Nullify(); myV3dViewer.Nullify(); -#if OCC_VERSION_LARGE <= 0x06060000 - myV3dCollector.Nullify(); -#endif } /*! @@ -224,14 +259,25 @@ void OCCViewer_Viewer::initView( OCCViewer_ViewWindow* view ) view->initLayout(); view->initSketchers(); view->setInteractionStyle( interactionStyle() ); + view->setProjectionType( projectionType() ); + view->setSelectionStyle( selectionStyle() ); + view->setStereoType( stereoType() ); + view->setAnaglyphFilter( anaglyphFilter() ); + view->setStereographicFocus( stereographicFocusType(), stereographicFocusValue() ); + view->setInterocularDistance( interocularDistanceType(), interocularDistanceValue() ); + view->setReverseStereo( isReverseStereo() ); + view->setVSync( isVSync() ); + view->setQuadBufferSupport( isQuadBufferSupport() ); view->setZoomingStyle( zoomingStyle() ); view->enablePreselection( isPreselectionEnabled() ); view->enableSelection( isSelectionEnabled() ); - + OCCViewer_ViewPort3d* vp3d = view->getViewPort(); if ( vp3d ) { - vp3d->getView()->SetSurfaceDetail(V3d_TEX_ALL); + // connect signal from viewport + connect(vp3d, SIGNAL(vpClosed(OCCViewer_ViewPort3d*)), this, SLOT(onViewClosed(OCCViewer_ViewPort3d*))); + connect(vp3d, SIGNAL(vpMapped(OCCViewer_ViewPort3d*)), this, SLOT(onViewMapped(OCCViewer_ViewPort3d*))); } } } @@ -250,9 +296,7 @@ SUIT_ViewWindow* OCCViewer_Viewer::createView( SUIT_Desktop* theDesktop ) initView( vw ); // set default background for view window vw->setBackground( background(0) ); // 0 means MAIN_VIEW (other views are not yet created here) - // connect signal from viewport - connect(view->getViewPort(), SIGNAL(vpClosed()), this, SLOT(onViewClosed())); - connect(view->getViewPort(), SIGNAL(vpMapped()), this, SLOT(onViewMapped())); + return view; } @@ -307,7 +351,7 @@ void OCCViewer_Viewer::onMouseMove(SUIT_ViewWindow* theWindow, QMouseEvent* theE } Handle(V3d_View) aView3d = aView->getViewPort()->getView(); if ( !aView3d.IsNull() ) { - myAISContext->MoveTo(theEvent->x(), theEvent->y(), aView3d); + myAISContext->MoveTo( theEvent->x(), theEvent->y(), aView3d, Standard_True ); } } } @@ -329,48 +373,51 @@ void OCCViewer_Viewer::onMouseRelease(SUIT_ViewWindow* theWindow, QMouseEvent* t myEndPnt.setX(theEvent->x()); myEndPnt.setY(theEvent->y()); bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); - if (!aHasShift) emit deselection(); - if (myStartPnt == myEndPnt) { + if (!aHasShift) { + myAISContext->ClearCurrents( false ); + emit deselection(); + } if ( !isPreselectionEnabled() ) { Handle(V3d_View) aView3d = aView->getViewPort()->getView(); if ( !aView3d.IsNull() ) { - myAISContext->MoveTo(myEndPnt.x(), myEndPnt.y(), aView3d); + myAISContext->MoveTo( myEndPnt.x(), myEndPnt.y(), aView3d, Standard_True ); } } if (aHasShift && myMultiSelectionEnabled) - myAISContext->ShiftSelect(); - else - myAISContext->Select(); + myAISContext->ShiftSelect( Standard_True ); + else + myAISContext->Select( Standard_True ); + emit selectionChanged(); } - else - { - if (aHasShift && myMultiSelectionEnabled) - myAISContext->ShiftSelect(myStartPnt.x(), myStartPnt.y(), - myEndPnt.x(), myEndPnt.y(), - aView->getViewPort()->getView(), Standard_False ); - else - myAISContext->Select(myStartPnt.x(), myStartPnt.y(), - myEndPnt.x(), myEndPnt.y(), - aView->getViewPort()->getView(), Standard_False ); - int Nb = myAISContext->NbSelected(); - if( Nb>1 && !myMultiSelectionEnabled ) - { - myAISContext->InitSelected(); - Handle( SelectMgr_EntityOwner ) anOwner = myAISContext->SelectedOwner(); - if( !anOwner.IsNull() ) - { - myAISContext->ClearSelected( Standard_False ); - myAISContext->AddOrRemoveSelected( anOwner, Standard_False ); - } - } - - myAISContext->UpdateCurrentViewer(); - } - emit selectionChanged(); + //else + //{ + // if (aHasShift && myMultiSelectionEnabled) + // myAISContext->ShiftSelect(myStartPnt.x(), myStartPnt.y(), + // myEndPnt.x(), myEndPnt.y(), + // aView->getViewPort()->getView(), Standard_False ); + // else + // myAISContext->Select(myStartPnt.x(), myStartPnt.y(), + // myEndPnt.x(), myEndPnt.y(), + // aView->getViewPort()->getView(), Standard_False ); + + // int Nb = myAISContext->NbSelected(); + // if( Nb>1 && !myMultiSelectionEnabled ) + // { + // myAISContext->InitSelected(); + // Handle( SelectMgr_EntityOwner ) anOwner = myAISContext->SelectedOwner(); + // if( !anOwner.IsNull() ) + // { + // myAISContext->ClearSelected( Standard_False ); + // myAISContext->AddOrRemoveSelected( anOwner, Standard_False ); + // } + // } + + // myAISContext->UpdateCurrentViewer(); + //} } /*! @@ -379,28 +426,56 @@ void OCCViewer_Viewer::onMouseRelease(SUIT_ViewWindow* theWindow, QMouseEvent* t void OCCViewer_Viewer::onKeyPress(SUIT_ViewWindow* theWindow, QKeyEvent* theEvent) { if (!mySelectionEnabled) return; - if (theEvent->key() != Qt::Key_S) return; - if (!theWindow->inherits("OCCViewer_ViewWindow")) return; - OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*) theWindow; - if (!aView || aView->interactionStyle() != SUIT_ViewModel::KEY_FREE) - return; + OCCViewer_ViewWindow* aView = qobject_cast( theWindow ); + if ( !aView ) return; - emit deselection(); + bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); - if ( !isPreselectionEnabled() ) { - Handle(V3d_View) aView3d = aView->getViewPort()->getView(); - if ( !aView3d.IsNull() ) { - myAISContext->MoveTo(myCurPnt.x(), myCurPnt.y(), aView3d); + switch ( theEvent->key() ) { + case Qt::Key_S: + if (!aHasShift) { + myAISContext->ClearCurrents( false ); + emit deselection(); + } + + if ( !isPreselectionEnabled() ) { + Handle(V3d_View) aView3d = aView->getViewPort()->getView(); + if ( !aView3d.IsNull() ) { + myAISContext->MoveTo(myCurPnt.x(), myCurPnt.y(), aView3d, Standard_True ); + } } - } - myAISContext->Select(); + if (aHasShift && myMultiSelectionEnabled) + myAISContext->ShiftSelect( Standard_True ); + else + myAISContext->Select( Standard_True ); + + emit selectionChanged(); - emit selectionChanged(); + break; + case Qt::Key_N: + if ( isPreselectionEnabled() ) { +#if OCC_VERSION_LARGE <= 0x07030000 + if ( useLocalSelection() ) +#endif + getAISContext()->HilightNextDetected( aView->getViewPort()->getView() ); + } + break; + case Qt::Key_P: + if ( isPreselectionEnabled() ) { +#if OCC_VERSION_LARGE <= 0x07030000 + if ( useLocalSelection() ) +#endif + getAISContext()->HilightPreviousDetected( aView->getViewPort()->getView() ); + } + break; + default: + break; + } } -void OCCViewer_Viewer::onViewClosed() +void OCCViewer_Viewer::onViewClosed(OCCViewer_ViewPort3d*) { Standard_Integer aViewsNb = 0; for ( myV3dViewer->InitActiveViews(); myV3dViewer->MoreActiveViews(); myV3dViewer->NextActiveViews()) @@ -411,17 +486,19 @@ void OCCViewer_Viewer::onViewClosed() } } -void OCCViewer_Viewer::onViewMapped() +void OCCViewer_Viewer::onViewMapped(OCCViewer_ViewPort3d* viewPort) { setTrihedronShown( true ); + bool showStaticTrihedron = true; + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + if ( resMgr ) showStaticTrihedron = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true ); + viewPort->showStaticTrihedron( showStaticTrihedron ); } int OCCViewer_Viewer::getTopLayerId() { -#if OCC_VERSION_LARGE > 0x06050200 if ( myTopLayerId == 0 && !myAISContext->CurrentViewer().IsNull() ) myAISContext->CurrentViewer()->AddZLayer( myTopLayerId ); -#endif return myTopLayerId; } @@ -454,6 +531,278 @@ void OCCViewer_Viewer::setInteractionStyle( const int theStyle ) } } +/*! + \return projection type +*/ +int OCCViewer_Viewer::projectionType() const +{ + return myProjectionType; +} + +/*! + Sets projection type: 0 - orthographic, 1 - perspective + \param theType - new projection type +*/ +void OCCViewer_Viewer::setProjectionType( const int theType ) +{ + if ( myProjectionType != theType ) { + if ( theType != OCCViewer_ViewWindow::Stereo ) + myProjectionType = theType; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setProjectionType( (OCCViewer_ViewWindow::ProjectionType)theType ); + } + } +} + + +OCCViewer_ViewWindow::SelectionStyle OCCViewer_Viewer::selectionStyle() const +{ + return mySelectionStyle; +} + +void OCCViewer_Viewer::setSelectionStyle(OCCViewer_ViewWindow::SelectionStyle theMode) +{ + if (mySelectionStyle != theMode) { + mySelectionStyle = theMode; + if (!myViewManager) + return; + + QVector wins = myViewManager->getViews(); + for (int i = 0; i < (int)wins.count(); i++) + { + OCCViewer_ViewWindow* win = ::qobject_cast(wins.at(i)); + if (win) + win->setSelectionStyle(theMode); + } + } +} + + + +/*! + \return stereo type +*/ +int OCCViewer_Viewer::stereoType() const +{ + return myStereoType; +} + +/*! + Sets stereo type + \param theType - new stereo type +*/ +void OCCViewer_Viewer::setStereoType( const int theType ) +{ + myStereoType = theType; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setStereoType( (OCCViewer_ViewWindow::StereoType)theType ); + } +} + +/*! + \return stereographic focus type +*/ +int OCCViewer_Viewer::stereographicFocusType() const +{ + return myStereographicFocusType; +} + +/*! + \return stereographic focus value +*/ +double OCCViewer_Viewer::stereographicFocusValue() const +{ + return myStereographicFocusValue; +} + +/*! + Sets stereographic focus parameters + \param theType - new stereographic focus type + \param theValue - new stereographic focus value +*/ +void OCCViewer_Viewer::setStereographicFocus( const int theType, const double theValue ) +{ + myStereographicFocusType = theType; + myStereographicFocusValue = theValue; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setStereographicFocus( (OCCViewer_ViewWindow::FocusIODType)theType, theValue ); + } +} + +/*! + \return stereographic focus type +*/ +int OCCViewer_Viewer::interocularDistanceType() const +{ + return myInterocularDistanceType; +} + +/*! + \return stereographic focus value +*/ +double OCCViewer_Viewer::interocularDistanceValue() const +{ + return myInterocularDistanceValue; +} + +/*! + Sets interocular distance parameters + \param theType - new IOD type + \param theValue - new IOD value +*/ +void OCCViewer_Viewer::setInterocularDistance( const int theType, const double theValue ) +{ + myInterocularDistanceType = theType; + myInterocularDistanceValue = theValue; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setInterocularDistance( (OCCViewer_ViewWindow::FocusIODType)theType, theValue ); + } +} + +/*! + \return anaglyph filter +*/ +int OCCViewer_Viewer::anaglyphFilter() const +{ + return myAnaglyphFilter; +} + +/*! + Sets anaglyph filter + \param theType - new anaglyph filter +*/ +void OCCViewer_Viewer::setAnaglyphFilter( const int theType ) +{ + myAnaglyphFilter = theType; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setAnaglyphFilter( (OCCViewer_ViewWindow::AnaglyphFilter)theType ); + } +} + +/*! + \return reverse stereo +*/ +bool OCCViewer_Viewer::isReverseStereo() const +{ + return myToReverseStereo; +} + +/*! + Sets reverse stereo + \param theReverse - enable/disable reverse mode +*/ +void OCCViewer_Viewer::setReverseStereo( const bool theReverse ) +{ + myToReverseStereo = theReverse; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setReverseStereo( theReverse ); + } +} + +/*! + \return V-Sync mode +*/ +bool OCCViewer_Viewer::isVSync() const +{ + return myVSyncMode; +} + +/*! + Set V-Sync mode + \param theEnable - enable/disable V-Sync mode +*/ +void OCCViewer_Viewer::setVSync( const bool theEnable ) +{ + myVSyncMode = theEnable; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setVSync( theEnable ); + } +} + +/*! + \return support quad-buffered stereo +*/ +bool OCCViewer_Viewer::isQuadBufferSupport() const +{ + return myQuadBufferSupport; +} + +/*! + Set support quad-buffered stereo + \param theEnable - enable/disable support quad-buffered stereo +*/ +void OCCViewer_Viewer::setQuadBufferSupport( const bool theEnable ) +{ + myQuadBufferSupport = theEnable; + + if ( !myViewManager ) + return; + + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setQuadBufferSupport( theEnable ); + } +} + /*! \return zooming style */ @@ -540,6 +889,13 @@ void OCCViewer_Viewer::enableSelection(bool isEnabled) win->enableSelection( isEnabled ); } } + + + //clear current selection in the viewer + if(!isEnabled) { + myAISContext->ClearSelected( Standard_True ); + } + } /*! @@ -562,6 +918,111 @@ void OCCViewer_Viewer::enableMultiselection(bool isEnable) } } +/*! + Sets a color of the clipped region + \param theColor - a new color of the clipped region +*/ +void OCCViewer_Viewer::setClippingColor( const QColor& theColor ) +{ + myClippingColor = theColor; + + if( myInternalClipPlanes.IsEmpty() ) + return; + + for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() ) + setCappingColor( aPlaneIt.Value(), theColor ); + + update(); +} + +/*! + \return clipping color +*/ +QColor OCCViewer_Viewer::clippingColor() const +{ + return myClippingColor; +} + +// initialize a texture for clipped region +Handle(Graphic3d_Texture2Dmanual) initClippingTexture( const bool isDefault, const QString& theTexture, + const bool isModulate, const double theScale ) +{ + QString aTextureFile = isDefault ? ":images/hatch.png" : theTexture; + QPixmap px( aTextureFile ); + const Handle(Image_PixMap) aPixmap = OCCViewer_Utilities::imageToPixmap( px.toImage() ); + Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual( aPixmap ); + if( aTexture->IsDone() ) { + aTexture->EnableRepeat(); + isModulate ? aTexture->EnableModulate() : aTexture->DisableModulate(); + aTexture->GetParams()->SetScale( Graphic3d_Vec2( 1/( theScale*100 ), -1 / ( theScale*100 ) ) ); + } + return aTexture; +} + +/*! + Sets default texture parameters + \param isDefault - use/non-use default texture + \param theTexture - new texture of the clipped region + \param isModulate - enable/disable texture modulate mode + \param theScale - scale factor. +*/ +void OCCViewer_Viewer::setClippingTextureParams( const bool isDefault, const QString& theTexture, + const bool isModulate, const double theScale ) +{ + myDefaultTextureUsed = isDefault; + myClippingTexture = theTexture; + myTextureModulated = isModulate; + myClippingTextureScale = theScale; + + if( myInternalClipPlanes.IsEmpty() ) + return; + + Handle(Graphic3d_Texture2Dmanual) aTexture = + initClippingTexture( myDefaultTextureUsed, myClippingTexture, + myTextureModulated, myClippingTextureScale ); +#if OCC_VERSION_LARGE <= 0x07030000 + for( int i = 1; i <= myInternalClipPlanes.Size(); i++ ) + myInternalClipPlanes.Value(i)->SetCappingTexture( aTexture ); +#else + for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() ) + aPlaneIt.Value()->SetCappingTexture( aTexture ); +#endif + + update(); +} + +/*! + \return true if default texture is used +*/ +bool OCCViewer_Viewer::isDefaultTextureUsed() const +{ + return myDefaultTextureUsed; +} + +/*! + \return clipping texture +*/ +QString OCCViewer_Viewer::clippingTexture() const +{ + return myClippingTexture; +} + +/*! + \return true if texture is modulated +*/ +bool OCCViewer_Viewer::isTextureModulated() const +{ + return myTextureModulated; +} + +/*! + \return scale factor of texture +*/ +double OCCViewer_Viewer::clippingTextureScale() const +{ + return myClippingTextureScale; +} + /*! Builds popup for occ viewer */ @@ -575,7 +1036,7 @@ void OCCViewer_Viewer::contextMenuPopup(QMenu* thePopup) OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView()); //Support of several toolbars in the popup menu - QList lst = qFindChildren( aView ); + QList lst = aView->findChildren(); QList::const_iterator it = lst.begin(), last = lst.end(); for ( ; it!=last; it++ ) { if ( (*it)->parentWidget()->isVisible() ) @@ -668,6 +1129,36 @@ void OCCViewer_Viewer::performSelectionChanged() emit selectionChanged(); } +/* + * Defines default lights + */ +void OCCViewer_Viewer::setDefaultLights() +{ + // clear all light sources + myV3dViewer->InitDefinedLights(); + while ( myV3dViewer->MoreDefinedLights() ) + { + myV3dViewer->DelLight( myV3dViewer->DefinedLight() ); + myV3dViewer->InitDefinedLights(); + } + + // get light source parameters from preferences + QColor aColor = SUIT_Session::session()->resourceMgr()->colorValue( "OCCViewer", "light_color", QColor( 0, 0, 0 ) ); + double aDx = SUIT_Session::session()->resourceMgr()->doubleValue( "OCCViewer", "light_dx", 0.0 ); + double aDy = SUIT_Session::session()->resourceMgr()->doubleValue( "OCCViewer", "light_dy", 0.0 ); + double aDz = SUIT_Session::session()->resourceMgr()->doubleValue( "OCCViewer", "light_dz", -1.0 ); + + Handle(V3d_DirectionalLight) aLight = + new V3d_DirectionalLight( V3d_Zneg, OCCViewer::color( aColor ).Name(), Standard_True ); + myV3dViewer->AddLight( aLight ); + if( !( aDx == 0 && aDy == 0 && aDz == 0 ) ) + aLight->SetDirection( aDx, aDy, aDz ); + myV3dViewer->SetLightOn( aLight ); + Handle(V3d_AmbientLight) ambLight = new V3d_AmbientLight(); + myV3dViewer->AddLight( ambLight ); + myV3dViewer->SetLightOn( ambLight ); +} + /*! Hilights/unhilights object in viewer \param obj - object to be updated @@ -677,19 +1168,23 @@ void OCCViewer_Viewer::performSelectionChanged() bool OCCViewer_Viewer::highlight( const Handle(AIS_InteractiveObject)& obj, bool hilight, bool update ) { - bool isInLocal = myAISContext->HasOpenedContext(); - if( !obj.IsNull() ) - if( !isInLocal ) - { - if ( hilight && !myAISContext->IsSelected( obj ) ) - myAISContext->AddOrRemoveCurrentObject( obj, false ); - else if ( !hilight && myAISContext->IsSelected( obj ) ) - myAISContext->AddOrRemoveCurrentObject( obj, false ); - } + if( !obj.IsNull() ) { +#if OCC_VERSION_LARGE <= 0x07030000 + if( !myAISContext->HasOpenedContext() ) + { +#endif + if ( hilight && !myAISContext->IsSelected( obj ) ) + myAISContext->AddOrRemoveSelected( obj, false ); + else if ( !hilight && myAISContext->IsSelected( obj ) ) + myAISContext->AddOrRemoveSelected( obj, false ); +#if OCC_VERSION_LARGE <= 0x07030000 + } +#endif + } if ( update ) myV3dViewer->Redraw(); - + return false; } @@ -699,20 +1194,23 @@ bool OCCViewer_Viewer::highlight( const Handle(AIS_InteractiveObject)& obj, */ bool OCCViewer_Viewer::unHighlightAll( bool updateviewer, bool unselect ) { +#if OCC_VERSION_LARGE <= 0x07030000 if ( myAISContext->HasOpenedContext() ) { +#endif if ( unselect ) { myAISContext->ClearSelected( updateviewer ); } else { myAISContext->UnhilightSelected( updateviewer ); } +#if OCC_VERSION_LARGE <= 0x07030000 } else { - if ( unselect ) { + if ( unselect ) { myAISContext->ClearCurrents( updateviewer ); } else { myAISContext->UnhilightCurrents( updateviewer ); } } - +#endif return false; } @@ -727,15 +1225,6 @@ bool OCCViewer_Viewer::isInViewer( const Handle(AIS_InteractiveObject)& obj, AIS_ListOfInteractive List; myAISContext->DisplayedObjects(List); -#if OCC_VERSION_LARGE <= 0x06060000 - if( !onlyInViewer ) - { - AIS_ListOfInteractive List1; - myAISContext->ObjectsInCollector(List1); - List.Append(List1); - } -#endif - AIS_ListIteratorOfListOfInteractive ite(List); for ( ; ite.More(); ite.Next() ) if( ite.Value()==obj ) @@ -805,6 +1294,28 @@ void OCCViewer_Viewer::setTransparency( const Handle(AIS_InteractiveObject)& obj myV3dViewer->Update(); } +bool OCCViewer_Viewer::isColorScaleVisible() const +{ + return !myColorScale.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed( myColorScale ); +} + +void OCCViewer_Viewer::setColorScaleShown( const bool on ) +{ + if ( myColorScale.IsNull() ) + return; + if ( on ) + { + if ( !myAISContext->IsDisplayed( myColorScale ) ) + myAISContext->Display( myColorScale, Standard_True ); + myAISContext->Redisplay( myColorScale, Standard_True, Standard_True ); + } + else + { + if ( myAISContext->IsDisplayed( myColorScale ) ) + myAISContext->Erase( myColorScale, Standard_True ); + } +} + /*! Changes visibility of trihedron to opposite */ @@ -832,11 +1343,16 @@ void OCCViewer_Viewer::setTrihedronShown( const bool on ) return; if ( on ) { - myAISContext->Display( myTrihedron ); - myAISContext->Deactivate(myTrihedron); + myAISContext->Display( myTrihedron, + 0 /*wireframe*/, + -1 /* selection mode */, + Standard_True /* update viewer*/, + Standard_False /* allow decomposition */, + AIS_DS_Displayed /* display status */); + myAISContext->Deactivate( myTrihedron ); } else { - myAISContext->Erase( myTrihedron ); + myAISContext->Erase( myTrihedron , Standard_True ); } } @@ -899,9 +1415,31 @@ void OCCViewer_Viewer::isos( int& u, int& v ) const */ OCCViewer_ViewWindow* OCCViewer_Viewer::createSubWindow() { - return new OCCViewer_ViewWindow( 0, this); + return new OCCViewer_ViewWindow(0, this); } +#if OCC_VERSION_LARGE <= 0x07030000 +/*! + Sets using local selection state + \param theIsUseLocalSelection - state +*/ +void OCCViewer_Viewer::setUseLocalSelection(bool theIsUseLocalSelection) +{ + myIsUseLocalSelection = theIsUseLocalSelection; +} + +/* + * Returns true if local context is opened or view model local state is set + */ +bool OCCViewer_Viewer::useLocalSelection() const +{ + if (myIsUseLocalSelection) + return true; + Handle(AIS_InteractiveContext) ic = getAISContext(); + return !ic.IsNull() && ic->HasOpenedContext(); +} +#endif + // obsolete QColor OCCViewer_Viewer::backgroundColor( int theViewId ) const { @@ -933,18 +1471,10 @@ void OCCViewer_Viewer::setBackground( int theViewId, const Qtx::BackgroundData& /*! Set the show static trihedron flag */ -void OCCViewer_Viewer::setStaticTrihedronDisplayed(const bool on) { - if(myShowStaticTrihedron != on) { - OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView()); - if(!aView) - return; - - OCCViewer_ViewPort3d* vp3d = aView->getViewPort(); - if(vp3d) { - myShowStaticTrihedron = on; - vp3d->updateStaticTriedronVisibility(); - } - } +void OCCViewer_Viewer::setStaticTrihedronDisplayed(const bool on) +{ + OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView()); + if ( aView ) aView->showStaticTrihedron( on ); } /*! @@ -966,18 +1496,7 @@ bool OCCViewer_Viewer::computeTrihedronSize( double& theNewSize, double& theSize if ( view3d.IsNull() ) return false; - double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0; - double aMaxSide; - - view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax ); - - if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() || - Xmax == RealLast() || Ymax == RealLast() || Zmax == RealLast() ) - return false; - - aMaxSide = Xmax - Xmin; - if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin; - if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin; + double aMaxSide = computeSceneSize( view3d ); // IPAL21687 // The boundary box of the view may be initialized but nullified @@ -991,8 +1510,35 @@ bool OCCViewer_Viewer::computeTrihedronSize( double& theNewSize, double& theSize theSize = getTrihedron()->Size(); theNewSize = aMaxSide*aSizeInPercents / 100.0; - return fabs( theNewSize - theSize ) > theSize * EPS || - fabs( theNewSize - theSize) > theNewSize * EPS; + return fabs( theNewSize - theSize ) > theSize * EPS || + fabs( theNewSize - theSize ) > theNewSize * EPS; +} + +/*! + * Compute scene size + */ +double OCCViewer_Viewer::computeSceneSize(const Handle(V3d_View)& view3d) const +{ + double aMaxSide = 0; + double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0; + + Bnd_Box aBox = view3d->View()->MinMaxValues(); + Xmin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().X(); + Ymin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Y(); + Zmin = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Z(); + Xmax = aBox.IsVoid() ? RealLast() : aBox.CornerMax().X(); + Ymax = aBox.IsVoid() ? RealLast() : aBox.CornerMax().Y(); + Zmax = aBox.IsVoid() ? RealLast() : aBox.CornerMax().Z(); + + if ( Xmin != RealFirst() && Ymin != RealFirst() && Zmin != RealFirst() && + Xmax != RealLast() && Ymax != RealLast() && Zmax != RealLast() ) + { + aMaxSide = Xmax - Xmin; + if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin; + if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin; + } + + return aMaxSide; } /*! @@ -1022,4 +1568,118 @@ void OCCViewer_Viewer::setSelectionOptions( bool isPreselectionEnabled, bool isS { myPreselectionEnabled = isPreselectionEnabled; mySelectionEnabled = isSelectionEnabled; + //clear current selection in the viewer + + if(!mySelectionEnabled) { + myAISContext->ClearSelected( Standard_True ); + } +} + +/*! + Creates clipping plane based on the incoming plane +*/ +Handle(Graphic3d_ClipPlane) OCCViewer_Viewer::createClipPlane(const gp_Pln& thePlane, const Standard_Boolean theIsOn) +{ + Handle(Graphic3d_ClipPlane) aGraphic3dPlane = new Graphic3d_ClipPlane( thePlane ); + aGraphic3dPlane->SetOn( theIsOn ); + aGraphic3dPlane->SetCapping( Standard_True ); + + // set capping color + setCappingColor( aGraphic3dPlane, myClippingColor ); + + // set capping texture + aGraphic3dPlane->SetCappingTexture( initClippingTexture( myDefaultTextureUsed, myClippingTexture, + myTextureModulated, myClippingTextureScale ) ); + + return aGraphic3dPlane; +} +/*! + Applies clipping planes to clippable objects +*/ +void OCCViewer_Viewer::setClipPlanes(ClipPlanesList theList) +{ + // 1. Remove existing clipping planes + myClipPlanes.clear(); + myInternalClipPlanes.Clear(); + + // 2. Create new clipping planes + ClipPlanesList::iterator inIt = theList.begin(); + for (;inIt != theList.end(); inIt++ ) + { + OCCViewer_ClipPlane aPlane = *inIt; + + double aDx = 0.0, aDy = 0.0, aDz = 0.0; + aPlane.OrientationToXYZ( aDx, aDy, aDz ); + + gp_Pnt anOrigin( aPlane.X, aPlane.Y, aPlane.Z ); + gp_Dir aDirection( aDx, aDy, aDz ); + + myInternalClipPlanes.Append( createClipPlane( gp_Pln( anOrigin, aDirection ), aPlane.IsOn ) ); + myClipPlanes.push_back( aPlane ); + } + + // 3. Apply clipping planes + AIS_ListOfInteractive aList; + myAISContext->DisplayedObjects (aList); + for ( AIS_ListIteratorOfListOfInteractive anIter (aList); anIter.More(); anIter.Next() ) { + Handle(AIS_InteractiveObject) anObj = anIter.Value(); + Handle(ViewerData_AISShape) aShape = Handle(ViewerData_AISShape)::DownCast (anObj); + if (!aShape.IsNull() && aShape->IsClippable()) { + aShape->SetClipPlanes(myInternalClipPlanes); + } + } +} + +/*! + Returns the clipping planes applied to the displayed objects. +*/ +ClipPlanesList OCCViewer_Viewer::getClipPlanes() const { + return myClipPlanes; +} +/*! + Applies clipping planes to given object objects +*/ +void OCCViewer_Viewer::applyExistingClipPlanesToObject (const Handle(AIS_InteractiveObject)& theObject) +{ + Handle(ViewerData_AISShape) aShape = Handle(ViewerData_AISShape)::DownCast (theObject); + if (!aShape.IsNull() && aShape->IsClippable()) + { + aShape->SetClipPlanes (myInternalClipPlanes); + } +} + +/*! + Returns the pointer to the clipping dialog box. +*/ +OCCViewer_ClippingDlg* OCCViewer_Viewer::getClippingDlg() const{ + return myClippingDlg; +} + + +/*! + Stores pointer to the clipping dialog box. +*/ +void OCCViewer_Viewer::setClippingDlg(OCCViewer_ClippingDlg* theDlg) { + if(myClippingDlg != theDlg) { + myClippingDlg = theDlg; + } +} + + +bool OCCViewer_Viewer::enableDrawMode( bool on ) +{ + //!! To be done for view windows + if ( !myViewManager ) + return false; + + bool prev = false; + QVector wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) { + prev = prev || win->enableDrawMode( on ); + } + } + return prev; }