Salome HOME
INT PAL 0052660: Plot2D Viewer: Plot2d_Curve can't be selected
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewModel.cxx
index e55694dc8ce1656fac5bd731721d9fe9ca06b051..d7eae71b8e218e1880be08f8efc94bb9277f26d6 100755 (executable)
@@ -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
@@ -36,6 +36,8 @@
 
 #include "ViewerData_AISShape.hxx"
 
+#include <Basics_OCCTVersion.hxx>
+
 #include "QtxActionToolMgr.h"
 #include "QtxBackgroundTool.h"
 
 #include <QDesktopWidget>
 
 #include <AIS_Axis.hxx>
-#include <AIS_Drawer.hxx>
+#if OCC_VERSION_LARGE > 0x06080000
+  #include <Prs3d_Drawer.hxx>
+#else
+  #include <AIS_Drawer.hxx>
+#endif
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 
 #include <Graphic3d_Texture2Dmanual.hxx>
+#include <Graphic3d_MaterialAspect.hxx>
 #include <Graphic3d_TextureParams.hxx>
 
 #include <Geom_Axis2Placement.hxx>
@@ -118,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));
@@ -139,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;
+
 }
 
 /*!
@@ -301,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)
   {
@@ -351,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<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 );
+      emit deselection();
     }
-  }
 
-  myAISContext->Select();
+    if ( !isPreselectionEnabled() ) {
+      Handle(V3d_View) aView3d = aView->getViewPort()->getView();
+      if ( !aView3d.IsNull() ) {
+       myAISContext->MoveTo(myCurPnt.x(), myCurPnt.y(), aView3d);
+      }
+    }
 
-  emit selectionChanged();
+    if (aHasShift && myMultiSelectionEnabled)
+      myAISContext->ShiftSelect();
+    else
+      myAISContext->Select();
+
+    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*)
@@ -543,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
 */
@@ -956,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() )
@@ -1012,18 +1174,16 @@ Handle(Graphic3d_ClipPlane) OCCViewer_Viewer::createClipPlane(const gp_Pln& theP
   aGraphic3dPlane->SetOn( theIsOn );
   aGraphic3dPlane->SetCapping( Standard_True );
 
-  // load capping texture
-  QPixmap px( ":images/hatch.png" );
-  if( !px.isNull() ) {
-    const Handle(Image_PixMap) aPixmap = imageToPixmap( px.toImage() );
-    Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual( aPixmap );
-    if( aTexture->IsDone() ) {
-      aTexture->EnableModulate();
-      aTexture->EnableRepeat();
-      aTexture->GetParams()->SetScale( Graphic3d_Vec2( 0.01, 0.01 ) );
-      aGraphic3dPlane->SetCappingTexture( aTexture );
-    }
-  }
+  // 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;
 }
 /*!