X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCCViewer%2FOCCViewer_ViewModel.cxx;h=eb7ff1564746fbd1d0a4dcbc30827d83f24ee52a;hb=b77aad4cd3966476063b49699b31f59d7731ba72;hp=2c3f55631211992d4102bd4a9afbf41a5821b16f;hpb=fab014daec7a2d69e158917df73157d744af28e8;p=modules%2Fgui.git diff --git a/src/OCCViewer/OCCViewer_ViewModel.cxx b/src/OCCViewer/OCCViewer_ViewModel.cxx index 2c3f55631..eb7ff1564 100644 --- a/src/OCCViewer/OCCViewer_ViewModel.cxx +++ b/src/OCCViewer/OCCViewer_ViewModel.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2019 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 @@ -21,8 +21,6 @@ // #include "OCCViewer_ViewModel.h" -#include "OCCViewer.h" -#include "OCCViewer_ViewWindow.h" #include "OCCViewer_ViewFrame.h" #include "OCCViewer_VService.h" #include "OCCViewer_ViewPort3d.h" @@ -54,6 +52,7 @@ #include #include #include +#include #include #include @@ -70,6 +69,21 @@ #include +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 */ @@ -115,7 +129,8 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) #if OCC_VERSION_LARGE <= 0x07030000 myIsUseLocalSelection(false), #endif - myClippingDlg (NULL) + myClippingDlg (NULL), + myFitter(0) { // init CasCade viewers myV3dViewer = OCCViewer_VService::CreateViewer( TCollection_ExtendedString("Viewer3d").ToExtString() ); @@ -126,7 +141,7 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) myAISContext = new AIS_InteractiveContext( myV3dViewer ); 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 ); @@ -170,6 +185,7 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron) // set projection type to orthographic myProjectionType = 0; + mySelectionStyle = OCCViewer_ViewWindow::RectStyle; // set stereo parameters myStereoType = 0; myAnaglyphFilter = 0; @@ -244,6 +260,7 @@ void OCCViewer_Viewer::initView( OCCViewer_ViewWindow* view ) view->initSketchers(); view->setInteractionStyle( interactionStyle() ); view->setProjectionType( projectionType() ); + view->setSelectionStyle( selectionStyle() ); view->setStereoType( stereoType() ); view->setAnaglyphFilter( anaglyphFilter() ); view->setStereographicFocus( stereographicFocusType(), stereographicFocusValue() ); @@ -356,17 +373,16 @@ 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) { - myAISContext->ClearSelected( false ); - 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, Standard_True ); + myAISContext->MoveTo( myEndPnt.x(), myEndPnt.y(), aView3d, Standard_True ); } } @@ -374,33 +390,34 @@ void OCCViewer_Viewer::onMouseRelease(SUIT_ViewWindow* theWindow, QMouseEvent* t 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(); + //} } /*! @@ -418,7 +435,7 @@ void OCCViewer_Viewer::onKeyPress(SUIT_ViewWindow* theWindow, QKeyEvent* theEven switch ( theEvent->key() ) { case Qt::Key_S: if (!aHasShift) { - myAISContext->ClearSelected( false ); + myAISContext->ClearCurrents( false ); emit deselection(); } @@ -545,6 +562,31 @@ void OCCViewer_Viewer::setProjectionType( const int 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 */ @@ -887,16 +929,9 @@ void OCCViewer_Viewer::setClippingColor( const QColor& theColor ) if( myInternalClipPlanes.IsEmpty() ) return; - Graphic3d_MaterialAspect aMaterialAspect = Graphic3d_MaterialAspect(); - aMaterialAspect.SetColor( Quantity_Color( theColor.redF(), theColor.greenF(), - theColor.blueF(), Quantity_TOC_RGB ) ); -#if OCC_VERSION_LARGE <= 0x07030000 - for( int i = 1; i <= myInternalClipPlanes.Size(); i++ ) - myInternalClipPlanes.Value(i)->SetCappingMaterial( aMaterialAspect ); -#else for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() ) - aPlaneIt.Value()->SetCappingMaterial( aMaterialAspect ); -#endif + setCappingColor( aPlaneIt.Value(), theColor ); + update(); } @@ -1114,11 +1149,14 @@ void OCCViewer_Viewer::setDefaultLights() double aDz = SUIT_Session::session()->resourceMgr()->doubleValue( "OCCViewer", "light_dz", -1.0 ); Handle(V3d_DirectionalLight) aLight = - new V3d_DirectionalLight( myV3dViewer, V3d_Zneg, OCCViewer::color( aColor ).Name(), Standard_True ); + 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 ); - myV3dViewer->SetLightOn( new V3d_AmbientLight( myV3dViewer ) ); + Handle(V3d_AmbientLight) ambLight = new V3d_AmbientLight(); + myV3dViewer->AddLight( ambLight ); + myV3dViewer->SetLightOn( ambLight ); } /*! @@ -1547,10 +1585,7 @@ Handle(Graphic3d_ClipPlane) OCCViewer_Viewer::createClipPlane(const gp_Pln& theP 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 ); + setCappingColor( aGraphic3dPlane, myClippingColor ); // set capping texture aGraphic3dPlane->SetCappingTexture( initClippingTexture( myDefaultTextureUsed, myClippingTexture,