-// Copyright (C) 2007-2016 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.h"
-#include "OCCViewer_ViewWindow.h"
#include "OCCViewer_ViewFrame.h"
#include "OCCViewer_VService.h"
#include "OCCViewer_ViewPort3d.h"
#include "ViewerData_AISShape.hxx"
-#include <Basics_OCCTVersion.hxx>
-
#include "QtxActionToolMgr.h"
#include "QtxBackgroundTool.h"
#include <QDesktopWidget>
#include <AIS_Axis.hxx>
-#if OCC_VERSION_LARGE > 0x06080000
- #include <Prs3d_Drawer.hxx>
-#else
- #include <AIS_Drawer.hxx>
-#endif
+#include <Prs3d_Drawer.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <StdSelect_ViewerSelector3d.hxx>
#include <Graphic3d_Texture2Dmanual.hxx>
#include <Graphic3d_MaterialAspect.hxx>
#include <V3d_DirectionalLight.hxx>
#include <V3d_AmbientLight.hxx>
-#if OCC_VERSION_MAJOR < 7
- #include <Visual3d_View.hxx>
+#include <Basics_OCCTVersion.hxx>
+
+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
*/
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)
setDefaultLights();
// init selector
myAISContext = new AIS_InteractiveContext( myV3dViewer );
-#if OCC_VERSION_LARGE > 0x07010000
myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_LocalSelected)->SetColor( Quantity_NOC_WHITE );
myAISContext->HighlightStyle(Prs3d_TypeOfHighlight_Selected)->SetColor( Quantity_NOC_WHITE );
-#elif OCC_VERSION_LARGE > 0x07000000
- const Handle(Graphic3d_HighlightStyle)& sStyle = myAISContext->SelectionStyle();
- sStyle->SetColor( Quantity_NOC_WHITE );
-#else
- myAISContext->SelectionColor( Quantity_NOC_WHITE );
-#endif
-
+
// 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);
-#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_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));
}
}
// set projection type to orthographic
myProjectionType = 0;
+ mySelectionStyle = OCCViewer_ViewWindow::RectStyle;
// set stereo parameters
myStereoType = 0;
myAnaglyphFilter = 0;
view->initSketchers();
view->setInteractionStyle( interactionStyle() );
view->setProjectionType( projectionType() );
+ view->setSelectionStyle( selectionStyle() );
view->setStereoType( stereoType() );
view->setAnaglyphFilter( anaglyphFilter() );
view->setStereographicFocus( stereographicFocusType(), stereographicFocusValue() );
OCCViewer_ViewPort3d* vp3d = view->getViewPort();
if ( vp3d )
{
-#if OCC_VERSION_LARGE <= 0x07000000
- vp3d->getView()->SetSurfaceDetail(V3d_TEX_ALL);
-#endif
// 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());
}
myEndPnt.setX(theEvent->x()); myEndPnt.setY(theEvent->y());
bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier);
- if (!aHasShift) {
- myAISContext->ClearCurrents( false );
- 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, Standard_True );
+ myAISContext->MoveTo( myEndPnt.x(), myEndPnt.y(), aView3d, Standard_True );
}
}
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();
+ //}
}
/*!
switch ( theEvent->key() ) {
case Qt::Key_S:
if (!aHasShift) {
- myAISContext->ClearCurrents( false );
+ myAISContext->ClearCurrents( false ); // todo: ClearCurrents is deprecated
emit deselection();
}
break;
case Qt::Key_N:
if ( isPreselectionEnabled() ) {
- if ( getAISContext()->HasOpenedContext() )
- getAISContext()->HilightNextDetected( aView->getViewPort()->getView() );
+ getAISContext()->HilightNextDetected( aView->getViewPort()->getView() );
}
break;
case Qt::Key_P:
if ( isPreselectionEnabled() ) {
- if ( getAISContext()->HasOpenedContext() )
- getAISContext()->HilightPreviousDetected( aView->getViewPort()->getView() );
+ getAISContext()->HilightPreviousDetected( aView->getViewPort()->getView() );
}
break;
default:
}
}
+
+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
*/
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 );
+ for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() )
+ setCappingColor( aPlaneIt.Value(), theColor );
update();
}
Handle(Graphic3d_Texture2Dmanual) aTexture =
initClippingTexture( myDefaultTextureUsed, myClippingTexture,
myTextureModulated, myClippingTextureScale );
-
- for( int i = 1; i <= myInternalClipPlanes.Size(); i++ )
- myInternalClipPlanes.Value(i)->SetCappingTexture( aTexture );
+ for ( Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt ( myInternalClipPlanes ); aPlaneIt.More(); aPlaneIt.Next() )
+ aPlaneIt.Value()->SetCappingTexture( aTexture );
update();
}
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 );
}
/*!
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);
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
*/
0 /*wireframe*/,
-1 /* selection mode */,
Standard_True /* update viewer*/,
- Standard_False /* allow decomposition */,
AIS_DS_Displayed /* display status */);
myAISContext->Deactivate( myTrihedron );
}
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;
-#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();
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() )
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,
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?
}
}