]> SALOME platform Git repositories - modules/visu.git/commitdiff
Salome HOME
Provides reqired camera behaviour for Gauss points
authorpkv <pkv@opencascade.com>
Thu, 8 Sep 2005 12:39:54 +0000 (12:39 +0000)
committerpkv <pkv@opencascade.com>
Thu, 8 Sep 2005 12:39:54 +0000 (12:39 +0000)
src/OBJECT/VISU_GaussPtsAct.cxx
src/OBJECT/VISU_GaussPtsAct.h
src/VVTK/VVTK_InteractorStyle.cxx
src/VVTK/VVTK_InteractorStyle.h

index 51e3e06c512c18210375277ad9746c8d38a77528..c456b71dfb045a66841da796932a07c5397a10db 100644 (file)
@@ -128,14 +128,101 @@ protected:
   vtkSmartPointer<vtkActor> myActors[6];
 };
 //
+///////////////////////////////////////////////////////////////////////////
+//
+// class: VISU_GPTextActor
+//
+class vtkViewport;
 
+class VISU_GPTextActor : public vtkTextActor 
+{
+protected:
+  VISU_GPTextActor();
+  virtual ~VISU_GPTextActor();
+
+public:
+  vtkTypeMacro(VISU_GPTextActor, vtkTextActor);
+  static VISU_GPTextActor* New();
+  //
+  void SetWorldPoint(const float theCoord[4]);
+  
+  float* WorldPoint();
+
+  virtual int RenderOpaqueGeometry(vtkViewport *theViewport);
+protected:
+  float myWorldPoint[4]; 
+};
+//
+///////////////////////////////////////////////////////////////////////////
+//
+// class: VISU_CursorPyramid
+//
+#include <vtkViewport.h>
+
+vtkStandardNewMacro(VISU_GPTextActor);// <- static VISU_GPTextActor* New()
+
+//==================================================================
+// function : Constructor
+// purpose  :
+//==================================================================
+VISU_GPTextActor::VISU_GPTextActor()
+{
+  float aCoord[]={0.,0.,0.,1};
+  //
+  SetWorldPoint(aCoord);
+}
+//==================================================================
+// function : ~
+// purpose  :
+//==================================================================
+VISU_GPTextActor::~VISU_GPTextActor()
+{
+}
+//==================================================================
+// function : SetWorldPoint
+// purpose  :
+//==================================================================
+void VISU_GPTextActor::SetWorldPoint(const float theCoord[4])
+{
+  int i;
+  //
+  for (i=0; i<4; ++i){
+    myWorldPoint[i]=theCoord[i];
+  }
+}
+//==================================================================
+// function : WorldPoint
+// purpose  :
+//==================================================================
+float* VISU_GPTextActor::WorldPoint()
+{
+  return myWorldPoint;
+}
+//==================================================================
+// function : RenderOpaqueGeometry
+// purpose  :
+//==================================================================
+int VISU_GPTextActor::RenderOpaqueGeometry(vtkViewport *theViewport)
+{
+  float aSelectionPoint[3];
+  //
+  theViewport->SetWorldPoint(myWorldPoint); 
+  theViewport->WorldToDisplay();
+  theViewport->GetDisplayPoint(aSelectionPoint);
+  SetPosition(aSelectionPoint);
+  //
+  Superclass::RenderOpaqueGeometry(theViewport);
+}
+//
+//VISU_GaussPtsAct
 vtkStandardNewMacro(VISU_GaussPtsAct);
 
 VISU_GaussPtsAct
 ::VISU_GaussPtsAct():
   myGaussPointsPL(NULL),
   myTextMapper(vtkTextMapper::New()),
-  myTextActor(vtkTextActor::New()),
+  myTextActor(VISU_GPTextActor::New()),
   myLastObjPointID(-1),
   mySphereSource(vtkSphereSource::New()),
   mySphereMapper(vtkPolyDataMapper::New()),
@@ -164,6 +251,7 @@ VISU_GaussPtsAct
   mySphereActor->SetPickable(false);
   //
   myCursorPyramid->Delete();
+  
 }
 
 VISU_GaussPtsAct
@@ -249,12 +337,7 @@ VISU_GaussPtsAct
 
          // To calculate display (2D) position of the annotation
          float aWorldCoord[4] = {aNodeCoord[0], aNodeCoord[1], aNodeCoord[2], 1.0};
-         aRenderer->SetWorldPoint(aWorldCoord);
-         aRenderer->WorldToDisplay();
-         float aSelectionPoint[3];
-         aRenderer->GetDisplayPoint(aSelectionPoint);
-         myTextActor->SetPosition(aSelectionPoint);
-         
+         myTextActor->SetWorldPoint(aWorldCoord);
          // To prepare the annotation text
          std::ostringstream aStr;
          aStr<<"Global ID: "<<anObjId;
@@ -321,7 +404,7 @@ VISU_GaussPtsAct::Highlight( SVTK_Selector *theSelector,
                             vtkInteractorStyle *theIS,
                             SVTK_SelectionEvent theSelectionEvent,
                             bool theIsHighlight )
-{
+{ 
   int aTextVisibility, aSphereVisibility;
   //
   aTextVisibility=myTextActor->GetVisibility();
@@ -350,8 +433,10 @@ VISU_GaussPtsAct::Highlight( SVTK_Selector *theSelector,
   float z2 = 0.0;
   bool isShift = theSelectionEvent.myIsShift;
   bool isRectangle = theSelectionEvent.myIsRectangle;
-  bool bRet=false;
+  bool bRet, bHasIO;
   //
+  bHasIO=hasIO();
+  bRet=false;
   if( !isRectangle )  {
     myPointPicker->Pick( x1, y1, z1, aRenderer );
     
@@ -360,9 +445,9 @@ VISU_GaussPtsAct::Highlight( SVTK_Selector *theSelector,
       mySphereActor->SetVisibility(aSphereVisibility);
       return bRet;
     }
-    
+    //
     vtkIdType aVtkId = myPointPicker->GetPointId();
-    if( aVtkId >= 0  && theSelector->IsValid( this, aVtkId, true ) && hasIO())  {
+    if( aVtkId >= 0  && theSelector->IsValid( this, aVtkId, true ) && bHasIO)  {
       vtkIdType anObjId = GetNodeObjId( aVtkId );
       //
       //double aCoeff=0.667;
@@ -388,17 +473,15 @@ VISU_GaussPtsAct::Highlight( SVTK_Selector *theSelector,
        //
        // To calculate display (2D) position of the annotation
        float aWorldCoord[4] = {aNodeCoord[0], aNodeCoord[1], aNodeCoord[2], 1.0};
-       aRenderer->SetWorldPoint(aWorldCoord);
-       aRenderer->WorldToDisplay();
-       float aSelectionPoint[3];
-       aRenderer->GetDisplayPoint(aSelectionPoint);
-       myTextActor->SetPosition(aSelectionPoint);
+       myTextActor->SetWorldPoint(aWorldCoord);
        //
        float aColor[3]={1.,1.,1.};
        mySphereActor->GetProperty()->SetColor(aColor);
-      }
-    }
+       //
+      }// if( anObjId >= 0 ) {
+    }//if( aVtkId >= 0  && theSelector->IsValid( this, aVtkId, true ) && hasIO()) 
   }// if( !isRectangle )  
+  //
   else {
     if( vtkDataSet* aDataSet = GetInput() ) {
       int i, aNbPnts;
index 99f0c77316f03eff8d6b58d9b2c7d5162eb908ad..34c1f8c29b1cb8cd2aae432812d511ea176bc50d 100644 (file)
@@ -42,6 +42,7 @@ class vtkActor;
 class vtkInteractorStyle;
 
 class VISU_CursorPyramid;
+class VISU_GPTextActor;
 
 class VTKOCC_EXPORT VISU_GaussPtsAct : public VISU_ScalarMapAct
 {
@@ -78,12 +79,13 @@ class VTKOCC_EXPORT VISU_GaussPtsAct : public VISU_ScalarMapAct
             bool theIsHighlight );
 
  protected:
+  
   VISU_GaussPtsAct();
   virtual ~VISU_GaussPtsAct();
 
   vtkSmartPointer<VISU_GaussPointsPL> myGaussPointsPL;
   vtkSmartPointer<vtkTextMapper> myTextMapper;
-  vtkSmartPointer<vtkTextActor> myTextActor;
+  vtkSmartPointer<VISU_GPTextActor> myTextActor;
   vtkIdType myLastObjPointID;
 
   vtkSmartPointer<vtkSphereSource> mySphereSource;
index da7b4bcf7eb4597b1618d0f67ed4c4aa91c70bbd..617f8e548e18b7f59ebf5b57d43861df9013d746 100644 (file)
 #include <vtkObjectFactory.h>
 #include <vtkRenderWindowInteractor.h>
 #include <vtkCommand.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
 
+#include <SVTK_Selector.h>
 //----------------------------------------------------------------------------
 vtkStandardNewMacro(VVTK_InteractorStyle);
 //----------------------------------------------------------------------------
@@ -169,3 +172,32 @@ VVTK_InteractorStyle
     startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE);
   }
 }
+
+//----------------------------------------------------------------------------
+void  VVTK_InteractorStyle::onFinishOperation()
+{
+  int aNbObjWas, aNbObjNow;
+  //
+  aNbObjWas=GetSelector()->IObjectCount();
+  //
+  SVTK_InteractorStyle::onFinishOperation();
+  //
+  aNbObjNow=GetSelector()->IObjectCount();
+  
+  if (aNbObjWas+aNbObjNow==1){
+    double aScale, aCoeff;
+    vtkRenderer *aRenderer=GetCurrentRenderer();
+    vtkCamera *aCamera = aRenderer->GetActiveCamera();
+    //
+    aCoeff=0.667;
+    aScale = aCamera->GetParallelScale();
+    //
+    if (!aNbObjWas && aNbObjNow) {
+      aCamera->SetParallelScale(aScale*aCoeff);
+    }
+    else {
+      aCoeff=1./aCoeff;
+      aCamera->SetParallelScale(aScale*aCoeff);
+    }
+  }
+}
index 2a958377d66345eb1a344f1d13c838e599ec8ce7..9690b9c7705bc7f10a62048a5d678c2564f0a7e3 100644 (file)
@@ -57,6 +57,7 @@ class VVTK_EXPORT VVTK_InteractorStyle : public SVTK_InteractorStyle
   virtual void OnLeftButtonUp(int ctrl, int shift, int x, int y);
   virtual void OnMiddleButtonUp(int ctrl, int shift, int x, int y);
   virtual void OnKeyDown();
+  virtual void onFinishOperation();
 
  private:
   bool myIsMidButtonDown;