-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022 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
//
#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"
#include <QDesktopWidget>
#include <AIS_Axis.hxx>
-#include <AIS_Drawer.hxx>
-#include <AIS_ListOfInteractive.hxx>
+#include <Prs3d_Drawer.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <StdSelect_ViewerSelector3d.hxx>
+
+#include <Graphic3d_Texture2Dmanual.hxx>
+#include <Graphic3d_MaterialAspect.hxx>
+#include <Graphic3d_TextureParams.hxx>
#include <Geom_Axis2Placement.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_TextAspect.hxx>
-#include <Visual3d_View.hxx>
+#include <V3d_DirectionalLight.hxx>
+#include <V3d_AmbientLight.hxx>
+#include <Basics_OCCTVersion.hxx>
-// 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
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
*/
OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron)
: SUIT_ViewModel(),
- myBackgrounds(4, Qtx::BackgroundData( Qt::black )),
myIsRelative(true),
- myTopLayerId( 0 ),
+ myTopLayerId(0),
myTrihedronSize(100),
- myClippingDlg (NULL)
+ myBackgrounds(4, Qtx::BackgroundData(Qt::black)),
+ myClippingDlg(0),
+ myFitter(0)
{
// init CasCade viewers
- myV3dViewer = OCCViewer_VService::CreateViewer( TCollection_ExtendedString("Viewer3d").ToExtString() );
+ myV3dViewer = OCCViewer_VService::CreateViewer();
//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
+ 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 );
-
+
+ // create color scale
+ myColorScale = new AIS_ColorScale();
+ myColorScale->SetZLayer( Graphic3d_ZLayerId_TopOSD );
+#if OCC_VERSION_LARGE < 0x07070000
+ myColorScale->SetTransformPersistence( Graphic3d_TransformPers::FromDeprecatedParams( Graphic3d_TMF_2d, gp_Pnt(-1, -1, 0) ) );
+#else
+ myColorScale->SetTransformPersistence( new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER) );
+#endif
+
/* create trihedron */
if ( 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));
- daspect->ThirdAxisAspect()->SetColor(Quantity_Color(0.0, 0.0, 1.0, Quantity_TOC_RGB));
+ daspect->LineAspect(Prs3d_DP_XAxis)->SetColor(Quantity_Color(1.0, 0.0, 0.0, Quantity_TOC_RGB));
+ daspect->LineAspect(Prs3d_DP_YAxis)->SetColor(Quantity_Color(0.0, 1.0, 0.0, Quantity_TOC_RGB));
+ daspect->LineAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_Color(0.0, 0.0, 1.0, Quantity_TOC_RGB));
}
}
+ /* create view cube */
+ myViewCube = new AIS_ViewCube();
+ setViewCubeParamsFromPreferences();
+
// set interaction style to standard
myInteractionStyle = 0;
// selection
mySelectionEnabled = true;
myMultiSelectionEnabled = 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;
+
}
/*!
{
myAISContext.Nullify();
myV3dViewer.Nullify();
-#if OCC_VERSION_LARGE <= 0x06060000
- myV3dCollector.Nullify();
-#endif
}
/*!
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*)));
/*!
SLOT: called on mouse button press, stores current mouse position as start point for transformations
*/
-void OCCViewer_Viewer::onMousePress(SUIT_ViewWindow* theWindow, QMouseEvent* theEvent)
+void OCCViewer_Viewer::onMousePress(SUIT_ViewWindow* /*theWindow*/, QMouseEvent* theEvent)
{
myStartPnt.setX(theEvent->x()); myStartPnt.setY(theEvent->y());
}
}
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 );
}
}
}
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 ); // todo: ClearCurrents is deprecated
+ 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();
+ //}
}
/*!
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<OCCViewer_ViewWindow*>( 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 ); // todo: ClearCurrents is deprecated
+ emit deselection();
}
- }
- myAISContext->Select();
+ if ( !isPreselectionEnabled() ) {
+ Handle(V3d_View) aView3d = aView->getViewPort()->getView();
+ if ( !aView3d.IsNull() ) {
+ myAISContext->MoveTo(myCurPnt.x(), myCurPnt.y(), aView3d, Standard_True );
+ }
+ }
+
+ if (aHasShift && myMultiSelectionEnabled)
+ myAISContext->ShiftSelect( Standard_True );
+ else
+ myAISContext->Select( Standard_True );
+
+ emit selectionChanged();
- emit selectionChanged();
+ break;
+ case Qt::Key_N:
+ if ( isPreselectionEnabled() ) {
+ getAISContext()->HilightNextDetected( aView->getViewPort()->getView() );
+ }
+ break;
+ case Qt::Key_P:
+ if ( isPreselectionEnabled() ) {
+ getAISContext()->HilightPreviousDetected( aView->getViewPort()->getView() );
+ }
+ break;
+ default:
+ break;
+ }
}
void OCCViewer_Viewer::onViewClosed(OCCViewer_ViewPort3d*)
void OCCViewer_Viewer::onViewMapped(OCCViewer_ViewPort3d* viewPort)
{
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+
setTrihedronShown( true );
+
+ bool showViewCube = true;
+ if ( resMgr ) showViewCube = resMgr->booleanValue( "OCCViewer", "viewcube_show", true );
+ setViewCubeShown( showViewCube );
+
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;
}
}
}
+/*!
+ \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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for (int i = 0; i < (int)wins.count(); i++)
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>(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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( 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<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+ if ( win )
+ win->setQuadBufferSupport( theEnable );
+ }
+}
+
/*!
\return zooming style
*/
}
}
+/*!
+ 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 );
+ for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() )
+ aPlaneIt.Value()->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
*/
OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView());
//Support of several toolbars in the popup menu
- QList<QToolBar*> lst = qFindChildren<QToolBar*>( aView );
+ QList<QToolBar*> lst = aView->findChildren<QToolBar*>();
QList<QToolBar*>::const_iterator it = lst.begin(), last = lst.end();
for ( ; it!=last; it++ ) {
if ( (*it)->parentWidget()->isVisible() )
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
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 ( hilight && !myAISContext->IsSelected( obj ) )
+ myAISContext->AddOrRemoveSelected( obj, false );
+ else if ( !hilight && myAISContext->IsSelected( obj ) )
+ myAISContext->AddOrRemoveSelected( obj, false );
+ }
if ( update )
myV3dViewer->Redraw();
-
+
return false;
}
*/
bool OCCViewer_Viewer::unHighlightAll( bool updateviewer, bool unselect )
{
- if ( myAISContext->HasOpenedContext() ) {
- if ( unselect ) {
- myAISContext->ClearSelected( updateviewer );
- } else {
- myAISContext->UnhilightSelected( updateviewer );
- }
+ if ( unselect ) {
+ myAISContext->ClearSelected( updateviewer );
} else {
- if ( unselect ) {
- myAISContext->ClearCurrents( updateviewer );
- } else {
- myAISContext->UnhilightCurrents( updateviewer );
- }
+ myAISContext->UnhilightSelected( updateviewer );
}
-
return false;
}
\param onlyInViewer - search object only in viewer (so object must be displayed)
*/
bool OCCViewer_Viewer::isInViewer( const Handle(AIS_InteractiveObject)& obj,
- bool onlyInViewer )
+ bool /*onlyInViewer*/ )
{
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 )
myV3dViewer->Update();
}
-/*!
- Changes visibility of trihedron to opposite
-*/
-void OCCViewer_Viewer::toggleTrihedron()
+bool OCCViewer_Viewer::isColorScaleVisible() const
+{
+ return !myColorScale.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed( myColorScale );
+}
+
+void OCCViewer_Viewer::setColorScaleShown( const bool on )
{
- setTrihedronShown( !isTrihedronVisible() );
+ 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 );
+ }
}
/*!
return !myTrihedron.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed( myTrihedron );
}
+/*!
+ \return true if view cube is visible
+*/
+bool OCCViewer_Viewer::isViewCubeVisible() const
+{
+ return !myViewCube.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed( myViewCube );
+}
+
/*!
Sets visibility state of trihedron
\param on - new state
return;
if ( on ) {
- myAISContext->Display( myTrihedron );
- myAISContext->Deactivate(myTrihedron);
+ myAISContext->Display( myTrihedron,
+ 0 /*wireframe*/,
+ -1 /* selection mode */,
+ Standard_True /* update viewer*/,
+ AIS_DS_Displayed /* display status */);
+ myAISContext->Deactivate( myTrihedron );
}
else {
- myAISContext->Erase( myTrihedron );
+ myAISContext->Erase( myTrihedron , Standard_True );
}
}
+/*!
+ Sets visibility state of view cube
+ \param on - new state
+*/
+
+void OCCViewer_Viewer::setViewCubeShown( const bool on )
+{
+ if ( myViewCube.IsNull() )
+ return;
+
+ if ( on ) {
+ myAISContext->Display( myViewCube,
+ 0 /*wireframe*/,
+ 0 /* selection mode */,
+ Standard_True /* update viewer*/,
+ AIS_DS_Displayed /* display status */);
+ }
+ else {
+ myAISContext->Erase( myViewCube, Standard_True );
+ }
+}
+
+/*!
+ Set View Cube parameters from preferences
+*/
+void OCCViewer_Viewer::setViewCubeParamsFromPreferences()
+{
+ // Resource manager
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ if (!resMgr || myViewCube.IsNull())
+ return;
+
+ bool isVisibleVC = isVisible(myViewCube);
+
+ if (resMgr->booleanValue("OCCViewer", "viewcube_custom", false)) {
+ // Use custom settings from preferences
+ QColor aColor;
+
+ // Box color
+ aColor = resMgr->colorValue("OCCViewer", "viewcube_color", QColor(255, 255, 255));
+ myViewCube->SetBoxColor(OCCViewer::color(aColor));
+
+ // Size
+ myViewCube->SetSize(resMgr->doubleValue("OCCViewer", "viewcube_size", 70.0));
+
+ // Text color
+ aColor = resMgr->colorValue("OCCViewer", "viewcube_text_color", QColor(0, 0, 0));
+ myViewCube->SetTextColor(OCCViewer::color(aColor));
+ }
+ else {
+ myViewCube->ResetStyles();
+ }
+
+ // Axes
+ myViewCube->SetDrawAxes(resMgr->booleanValue("OCCViewer", "viewcube_axes", false));
+
+ // Animation duration (sec)
+ myViewCube->SetDuration(resMgr->doubleValue("OCCViewer", "viewcube_duration", 0.5));
+
+ // Update the viewer
+ if (isVisibleVC)
+ myAISContext->Redisplay( myViewCube, Standard_True);
+}
+
/*!
\return trihedron size
*/
float aSizeInPercents = SUIT_Session::session()->resourceMgr()->doubleValue("3DViewer","trihedron_size", 100.);
- static float EPS = 5.0E-3;
+ static float EPS = 5.0E-3f;
theSize = getTrihedron()->Size();
theNewSize = aMaxSide*aSizeInPercents / 100.0;
double aMaxSide = 0;
double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0;
- view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
+ 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() )
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;
}
/*!
Handle(AIS_InteractiveObject) anObj = anIter.Value();
Handle(ViewerData_AISShape) aShape = Handle(ViewerData_AISShape)::DownCast (anObj);
if (!aShape.IsNull() && aShape->IsClippable()) {
- aShape->SetClipPlanes(myInternalClipPlanes);
+ aShape->SetClipPlanes(new Graphic3d_SequenceOfHClipPlane(myInternalClipPlanes)); // todo: store clipping planes in a handle?
}
}
}
Handle(ViewerData_AISShape) aShape = Handle(ViewerData_AISShape)::DownCast (theObject);
if (!aShape.IsNull() && aShape->IsClippable())
{
- aShape->SetClipPlanes (myInternalClipPlanes);
+ aShape->SetClipPlanes (new Graphic3d_SequenceOfHClipPlane(myInternalClipPlanes)); // todo: store clipping planes in a handle?
}
}
myClippingDlg = theDlg;
}
}
+
+
+bool OCCViewer_Viewer::enableDrawMode( bool on )
+{
+ //!! To be done for view windows
+ if ( !myViewManager )
+ return false;
+
+ bool prev = false;
+ QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+ for ( int i = 0; i < (int)wins.count(); i++ )
+ {
+ OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+ if ( win ) {
+ prev = prev || win->enableDrawMode( on );
+ }
+ }
+ return prev;
+}