Salome HOME
Fixed method GetSame for the case of two cylindrical surfaces that are part of the...
[modules/geom.git] / src / OBJECT / GEOM_Actor.cxx
index e29c665cbd465c69308d824bf5810aa1d031f2ff..e1ff415418bc65d33122661f1d44c6921443ed0b 100644 (file)
@@ -17,7 +17,7 @@
 //  License along with this library; if not, write to the Free Software 
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 // 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
@@ -26,7 +26,6 @@
 //  Module : GEOM
 //  $Header$
 
-using namespace std;
 /*!
   \class GEOM_Actor GEOM_Actor.h
   \brief This class allows to display an OpenCASCADE CAD model in a VTK viewer.
@@ -34,10 +33,25 @@ using namespace std;
 
 #include "GEOM_Actor.h"
 
+#include <vtkObjectFactory.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+
+#include <vtkTransform.h>
+#include <vtkMatrix4x4.h>
+#include <vtkMath.h>
+
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+
 // OpenCASCADE Includes
 #include "GEOM_OCCReader.h"
 #include <BRep_Tool.hxx>
 
+using namespace std;
+
 //-------------------------------------------------------------
 // Main methods
 //-------------------------------------------------------------
@@ -73,9 +87,10 @@ GEOM_Actor::GEOM_Actor()
   this->myName = "";
 
   this->HighlightProperty = NULL;
-  this->ishighlighted = false;
+  this->myIsHighlighted = false;
 
   this->subshape = false;
+  this->myIsInfinite = false;
 }
 
 GEOM_Actor::~GEOM_Actor()
@@ -98,7 +113,7 @@ void GEOM_Actor::ShallowCopy(vtkProp *prop)
   GEOM_Actor *f = GEOM_Actor::SafeDownCast(prop);
   if ( f != NULL )
     {
-      this->setInputShape(f->getTopo(),f->getDeflection(),f->getDisplayMode());
+      this->setInputShape(f->getTopo(),f->getDeflection(),f->getDisplayMode(),f->isVector());
       this->setName( f->getName() );
       if ( f->hasIO() )
        this->setIO( f->getIO() );
@@ -140,9 +155,12 @@ void GEOM_Actor::setDeflection(double adef) {
   deflection = adef;
 }
 
-void GEOM_Actor::setInputShape(const TopoDS_Shape& aShape,double adef,int imode) {
+void GEOM_Actor::setInputShape(const TopoDS_Shape& aShape, double adef,
+                               int imode, bool isVector)
+{
   myShape = aShape;
   deflection = adef;
+  myIsVector = isVector;
   setDisplayMode(imode);
 }
 
@@ -171,15 +189,16 @@ void GEOM_Actor::SetShadingProperty(vtkProperty* Prop) {
 // Mapper creating function
 //-------------------------------------------------------------
 void GEOM_Actor::CreateMapper(int theMode) {
+  this->myIsInfinite = (bool)myShape.Infinite();  
   if(myShape.ShapeType() == TopAbs_VERTEX) {
     gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(myShape));
     this->SetPosition(aPnt.X(),aPnt.Y(),aPnt.Z());
   }
   GEOM_OCCReader* aread = GEOM_OCCReader::New();
-  aread->setTopo(myShape);
+  aread->setTopo(myShape, myIsVector);
   aread->setDisplayMode(theMode);
   aread->GetOutput()->ReleaseDataFlagOn(); 
-    
+
   vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
   if (theMode == 0) { 
     aMapper->SetInput(aread->GetOutput());
@@ -219,8 +238,10 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper)
     this->Property->SetSpecularColor(0.99,0.98,0.83);
   }
 
-  if(!ishighlighted) {
-    if(myDisplayMode >= 1) {
+  if(!myIsHighlighted) {
+    if ( myIsPreselected ) 
+      this->Property = PreviewProperty;
+    else if(myDisplayMode >= 1) {
       // SHADING
       this->Property = ShadingProperty;
     }
@@ -228,8 +249,6 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper)
       this->Property = WireframeProperty;     
     }
 
-    if ( ispreselected )
-      this->Property = PreviewProperty;
   }
 
   this->Property->Render(this, ren);
@@ -259,10 +278,10 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper)
   if(myShape.ShapeType() == TopAbs_VERTEX) {
     if(ren){
       //The parameter determine size of vertex actor relate to diagonal of RendererWindow
-      static float delta = 0.01;
-      float X1 = -1, Y1 = -1, Z1 = 0;
+      static vtkFloatingPointType delta = 0.01;
+      vtkFloatingPointType X1 = -1, Y1 = -1, Z1 = 0;
       ren->ViewToWorld(X1,Y1,Z1);
-      float X2 = +1, Y2 = +1, Z2 = 0;
+      vtkFloatingPointType X2 = +1, Y2 = +1, Z2 = 0;
       ren->ViewToWorld(X2,Y2,Z2);
       Z2 = sqrt((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1) + (Z2-Z1)*(Z2-Z1));
       this->SetScale(Z2*delta);
@@ -274,7 +293,8 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper)
     aMatrix->Delete();    
   } else
     this->Device->Render(ren, this->Mapper);
-  this->EstimatedRenderTime = WireframeMapper->GetTimeToDraw();
+ if(WireframeMapper!=NULL) this->EstimatedRenderTime = WireframeMapper->GetTimeToDraw(); 
+ else if(ShadingMapper!=NULL) this->EstimatedRenderTime = ShadingMapper->GetTimeToDraw();
 }
 
 // SubShape
@@ -291,40 +311,40 @@ void GEOM_Actor::SubShapeOff()
 // Opacity methods
 //-------------------------------------------------------------
 
-void GEOM_Actor::SetOpacity(float opa)
+void GEOM_Actor::SetOpacity(vtkFloatingPointType opa)
 {
   //HighlightProperty->SetOpacity(opa);
   SALOME_Actor::SetOpacity(opa);
   ShadingProperty->SetOpacity(opa);
 }
 
-float GEOM_Actor::GetOpacity() {
+vtkFloatingPointType GEOM_Actor::GetOpacity() {
   return ShadingProperty->GetOpacity();
 }
 
 //-------------------------------------------------------------
 // Color methods
 //-------------------------------------------------------------
-void GEOM_Actor::SetColor(float r,float g,float b) {
+void GEOM_Actor::SetColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) {
   ShadingProperty->SetColor(r,g,b);  
 }
 
-void GEOM_Actor::GetColor(float& r,float& g,float& b) {
-  float color[3];
-   ShadingProperty->GetColor(color);
-   r = color[0];
-   g = color[1];
-   b = color[2];
+void GEOM_Actor::GetColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) {
+  vtkFloatingPointType color[3];
+  ShadingProperty->GetColor(color);
+  r = color[0];
+  g = color[1];
+  b = color[2];
 }
 
 //-------------------------------------------------------------
 // Highlight methods
 //-------------------------------------------------------------
 
-void GEOM_Actor::highlight(Standard_Boolean highlight) {
+void GEOM_Actor::highlight(bool highlight) {
 
-  if(highlight && !ishighlighted) {
-    ishighlighted=true;
+  if(highlight && !myIsHighlighted) {
+    myIsHighlighted=true;
     // build highlight property is necessary
     if(HighlightProperty==NULL) {
       HighlightProperty = vtkProperty::New();
@@ -341,8 +361,8 @@ void GEOM_Actor::highlight(Standard_Boolean highlight) {
  
   }
   else if (!highlight) {
-    if(ishighlighted) {
-      ishighlighted=false;
+    if(myIsHighlighted) {
+      myIsHighlighted=false;
       if(myDisplayMode==1) {
        //unhilight in shading
        this->Property = ShadingProperty;
@@ -355,11 +375,6 @@ void GEOM_Actor::highlight(Standard_Boolean highlight) {
   }
 }
 
-bool GEOM_Actor::hasHighlight()
-{
-  return true;
-}
-
 void GEOM_Actor::SetHighlightProperty(vtkProperty* Prop) {
   this->HighlightProperty = Prop;
 }