X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCCViewer%2FOCCViewer_ViewModel.cxx;h=d7eae71b8e218e1880be08f8efc94bb9277f26d6;hb=e6caa123c65e3c4a3017364ec5bb4225fd898465;hp=366d3bb0cc53954d530318213857a9872fda4120;hpb=02904c3728214667f919cfe06072a91e1687b12f;p=modules%2Fgui.git diff --git a/src/OCCViewer/OCCViewer_ViewModel.cxx b/src/OCCViewer/OCCViewer_ViewModel.cxx index 366d3bb0c..d7eae71b8 100755 --- a/src/OCCViewer/OCCViewer_ViewModel.cxx +++ b/src/OCCViewer/OCCViewer_ViewModel.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -26,6 +26,7 @@ #include "OCCViewer_VService.h" #include "OCCViewer_ViewPort3d.h" #include "OCCViewer_ClippingDlg.h" +#include "OCCViewer_Utilities.h" #include "SUIT_ViewWindow.h" #include "SUIT_ViewManager.h" @@ -35,6 +36,8 @@ #include "ViewerData_AISShape.hxx" +#include + #include "QtxActionToolMgr.h" #include "QtxBackgroundTool.h" @@ -50,10 +53,18 @@ #include #include -#include +#if OCC_VERSION_LARGE > 0x06080000 + #include +#else + #include +#endif #include #include +#include +#include +#include + #include #include #include @@ -62,10 +73,6 @@ #include - -// VSR: Uncomment below line to allow texture background support in OCC viewer -#define OCC_ENABLE_TEXTURED_BACKGROUND - /*! Get data for supported background modes: gradient types, identifiers and supported image formats */ @@ -79,11 +86,7 @@ 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"); } @@ -104,18 +107,8 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) //myV3dViewer->Init(); // to avoid creation of the useless perspective view (see OCCT issue 0024267) myV3dViewer->SetDefaultLights(); -#if OCC_VERSION_LARGE <= 0x06060000 // Porting to OCCT higher 6.6.0 version - myV3dCollector = OCCViewer_VService::CreateViewer( TCollection_ExtendedString("Collector3d").ToExtString() ); - //myV3dCollector->Init(); // to avoid creation of the useless perspective view (see OCCT issue 0024267) - myV3dCollector->SetDefaultLights(); -#endif - // 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 ); // display isoline on planar faces (box for ex.) @@ -132,8 +125,13 @@ 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()) { +#if OCC_VERSION_LARGE > 0x06080000 + Handle(Prs3d_Drawer) drawer = myTrihedron->Attributes(); + if (drawer->HasOwnDatumAspect()) { +#else + Handle(AIS_Drawer) drawer = myTrihedron->Attributes(); + if (drawer->HasDatumAspect()) { +#endif 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)); @@ -153,6 +151,14 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) // selection mySelectionEnabled = true; myMultiSelectionEnabled = true; + + //set clipping color and texture to standard + myClippingColor = QColor( 50, 50, 50 ); + myDefaultTextureUsed = true; + myClippingTexture = QString(); + myTextureModulated = true; + myClippingTextureScale = 1.0; + } /*! @@ -162,9 +168,6 @@ OCCViewer_Viewer::~OCCViewer_Viewer() { myAISContext.Nullify(); myV3dViewer.Nullify(); -#if OCC_VERSION_LARGE <= 0x06060000 - myV3dCollector.Nullify(); -#endif } /*! @@ -318,7 +321,10 @@ 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 (!aHasShift) { + myAISContext->ClearCurrents( false ); + emit deselection(); + } if (myStartPnt == myEndPnt) { @@ -368,25 +374,49 @@ 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); + } } - } - myAISContext->Select(); + if (aHasShift && myMultiSelectionEnabled) + myAISContext->ShiftSelect(); + else + myAISContext->Select(); - emit selectionChanged(); + emit selectionChanged(); + + break; + case Qt::Key_N: + if ( isPreselectionEnabled() ) { + if ( getAISContext()->HasOpenedContext() ) + getAISContext()->HilightNextDetected( aView->getViewPort()->getView() ); + } + break; + case Qt::Key_P: + if ( isPreselectionEnabled() ) { + if ( getAISContext()->HasOpenedContext() ) + getAISContext()->HilightPreviousDetected( aView->getViewPort()->getView() ); + } + break; + default: + break; + } } void OCCViewer_Viewer::onViewClosed(OCCViewer_ViewPort3d*) @@ -411,10 +441,8 @@ void OCCViewer_Viewer::onViewMapped(OCCViewer_ViewPort3d* viewPort) int OCCViewer_Viewer::getTopLayerId() { -#if OCC_VERSION_LARGE > 0x06050200 if ( myTopLayerId == 0 && !myAISContext->CurrentViewer().IsNull() ) myAISContext->CurrentViewer()->AddZLayer( myTopLayerId ); -#endif return myTopLayerId; } @@ -562,6 +590,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; + + Graphic3d_MaterialAspect aMaterialAspect = Graphic3d_MaterialAspect(); + aMaterialAspect.SetColor( Quantity_Color( theColor.redF(), theColor.greenF(), + theColor.blueF(), Quantity_TOC_RGB ) ); + + for( int i = 1; i <= myInternalClipPlanes.Size(); i++ ) + myInternalClipPlanes.Value(i)->SetCappingMaterial( aMaterialAspect ); + + 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 ); + + for( int i = 1; i <= myInternalClipPlanes.Size(); i++ ) + myInternalClipPlanes.Value(i)->SetCappingTexture( aTexture ); + + 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 */ @@ -727,15 +860,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 ) @@ -984,7 +1108,17 @@ 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; +#if OCC_VERSION_LARGE > 0x06070100 + 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(); +#else view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax ); +#endif if ( Xmin != RealFirst() && Ymin != RealFirst() && Zmin != RealFirst() && Xmax != RealLast() && Ymax != RealLast() && Zmax != RealLast() ) @@ -1031,7 +1165,27 @@ void OCCViewer_Viewer::setSelectionOptions( bool isPreselectionEnabled, bool isS } } +/*! + 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 + Graphic3d_MaterialAspect aMaterialAspect = Graphic3d_MaterialAspect(); + aMaterialAspect.SetColor( Quantity_Color( myClippingColor.redF(), myClippingColor.greenF(), + myClippingColor.blueF(), Quantity_TOC_RGB ) ); + aGraphic3dPlane->SetCappingMaterial( aMaterialAspect ); + // set capping texture + aGraphic3dPlane->SetCappingTexture( initClippingTexture( myDefaultTextureUsed, myClippingTexture, + myTextureModulated, myClippingTextureScale ) ); + + return aGraphic3dPlane; +} /*! Applies clipping planes to clippable objects */ @@ -1053,10 +1207,7 @@ void OCCViewer_Viewer::setClipPlanes(ClipPlanesList theList) gp_Pnt anOrigin( aPlane.X, aPlane.Y, aPlane.Z ); gp_Dir aDirection( aDx, aDy, aDz ); - Handle(Graphic3d_ClipPlane) aGraphic3dPlane = new Graphic3d_ClipPlane( gp_Pln( anOrigin, aDirection ) ); - aGraphic3dPlane->SetOn( aPlane.IsOn ); - - myInternalClipPlanes.Append( aGraphic3dPlane ); + myInternalClipPlanes.Append( createClipPlane( gp_Pln( anOrigin, aDirection ), aPlane.IsOn ) ); myClipPlanes.push_back( aPlane ); }