X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVTKViewer%2FVTKViewer_Actor.cxx;h=76f5d153bde1b9a64534a216f774c4ab2b6b0c82;hb=refs%2Fheads%2Fngr%2Fpython3_dev_pv5.4;hp=da05fc98df4fa0c0a82b9c96066d6c83c94210c8;hpb=9f1a66957ba9a2308f8fdc3f9397140af9df5fd0;p=modules%2Fgui.git diff --git a/src/VTKViewer/VTKViewer_Actor.cxx b/src/VTKViewer/VTKViewer_Actor.cxx index da05fc98d..76f5d153b 100755 --- a/src/VTKViewer/VTKViewer_Actor.cxx +++ b/src/VTKViewer/VTKViewer_Actor.cxx @@ -1,42 +1,38 @@ -// SALOME OBJECT : implementation of interactive object visualization for OCC and VTK viewers +// Copyright (C) 2007-2016 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 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// 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 +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SALOME OBJECT : implementation of interactive object visualization for OCC and VTK viewers // File : SALOME_Actor.cxx // Author : Nicolas REJNERI -// Module : SALOME -// $Header$ /*! \class SALOME_Actor SALOME_Actor.h \brief Abstract class of SALOME Objects in VTK. */ - #include "VTKViewer_Actor.h" #include "VTKViewer_Transform.h" #include "VTKViewer_TransformFilter.h" -#include "VTKViewer_PassThroughFilter.h" #include "VTKViewer_GeometryFilter.h" // VTK Includes @@ -45,10 +41,8 @@ #include #include #include -#include #include - -using namespace std; +#include #if defined __GNUC__ #if __GNUC__ == 2 @@ -60,34 +54,36 @@ int VTKViewer_POINT_SIZE = 5; int VTKViewer_LINE_WIDTH = 3; -//---------------------------------------------------------------------------- vtkStandardNewMacro(VTKViewer_Actor); - -//---------------------------------------------------------------------------- +/*! + Constructor +*/ VTKViewer_Actor ::VTKViewer_Actor(): - myIsHighlighted(false), - myIsPreselected(false), - myRepresentation(VTK_SURFACE), + myIsResolveCoincidentTopology(true), + myOpacity(1.0), myDisplayMode(1), - myProperty(vtkProperty::New()), - PreviewProperty(NULL), myIsInfinite(false), - myIsResolveCoincidentTopology(true), myStoreMapping(false), myGeomFilter(VTKViewer_GeometryFilter::New()), - myTransformFilter(VTKViewer_TransformFilter::New()) + myTransformFilter(VTKViewer_TransformFilter::New()), + myRepresentation(VTKViewer::Representation::Surface), + myProperty(vtkProperty::New()), + PreviewProperty(NULL), + myIsPreselected(false), + myIsHighlighted(false) { vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor, - myPolygonOffsetUnits); + myPolygonOffsetUnits); for(int i = 0; i < 6; i++) - myPassFilter.push_back(VTKViewer_PassThroughFilter::New()); + myPassFilter.push_back(vtkPassThroughFilter::New()); } - -//---------------------------------------------------------------------------- +/*! + Destructor +*/ VTKViewer_Actor ::~VTKViewer_Actor() { @@ -104,8 +100,9 @@ VTKViewer_Actor myProperty->Delete(); } - -//---------------------------------------------------------------------------- +/*! + \return name +*/ const char* VTKViewer_Actor ::getName() @@ -113,6 +110,10 @@ VTKViewer_Actor return myName.c_str(); } +/*! + Sets name + \param theName - new name +*/ void VTKViewer_Actor ::setName(const char* theName) @@ -120,8 +121,9 @@ VTKViewer_Actor myName = theName; } - -//---------------------------------------------------------------------------- +/*! + To publish the actor an all its internal devices +*/ void VTKViewer_Actor ::AddToRender(vtkRenderer* theRenderer) @@ -129,6 +131,9 @@ VTKViewer_Actor theRenderer->AddActor(this); } +/*! + To remove the actor an all its internal devices +*/ void VTKViewer_Actor ::RemoveFromRender(vtkRenderer* theRenderer) @@ -136,13 +141,18 @@ VTKViewer_Actor theRenderer->RemoveActor(this); } +/*! + Used to obtain all dependent actors +*/ void VTKViewer_Actor ::GetChildActors(vtkActorCollection*) {} - -//---------------------------------------------------------------------------- +/*! + Apply view transformation + \param theTransform - view transformation +*/ void VTKViewer_Actor ::SetTransform(VTKViewer_Transform* theTransform) @@ -151,6 +161,9 @@ VTKViewer_Actor } +/*! + To insert some additional filters and then sets the given #vtkMapper +*/ void VTKViewer_Actor ::SetMapper(vtkMapper* theMapper) @@ -158,64 +171,75 @@ VTKViewer_Actor InitPipeLine(theMapper); } +/*! + Initialization +*/ void VTKViewer_Actor ::InitPipeLine(vtkMapper* theMapper) { if(theMapper){ int anId = 0; - myPassFilter[ anId ]->SetInput( theMapper->GetInput() ); - myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() ); + myPassFilter[ anId ]->SetInputData( theMapper->GetInput() ); + myPassFilter[ anId + 1]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 1 myGeomFilter->SetStoreMapping( myStoreMapping ); - myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); + myGeomFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 2 - myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); + myPassFilter[ anId ]->SetInputConnection( myGeomFilter->GetOutputPort() ); + myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 3 - myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); + myTransformFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 4 - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); + myPassFilter[ anId ]->SetInputConnection( myTransformFilter->GetOutputPort() ); + myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() ); anId++; // 5 - if(vtkDataSetMapper* aMapper = dynamic_cast(theMapper)){ - aMapper->SetInput(myPassFilter[anId]->GetOutput()); - }else if(vtkPolyDataMapper* aMapper = dynamic_cast(theMapper)){ - aMapper->SetInput(myPassFilter[anId]->GetPolyDataOutput()); - } + theMapper->SetInputConnection(myPassFilter[anId]->GetOutputPort()); } Superclass::SetMapper(theMapper); } - -//---------------------------------------------------------------------------- +/*! + Renders actor +*/ void VTKViewer_Actor ::Render(vtkRenderer *ren, vtkMapper* m) { + if(vtkDataSet* aDataSet = GetInput()){ + static double PERCENTS_OF_DETAILS = 0.50; + vtkIdType aNbOfPoints = vtkIdType(aDataSet->GetNumberOfPoints()*PERCENTS_OF_DETAILS); + if(aNbOfPoints > 0) + SetNumberOfCloudPoints(aNbOfPoints); + } + + int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology(); if(myIsResolveCoincidentTopology){ - int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology(); - float aFactor, aUnit; + double aFactor, aUnit; vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit); vtkMapper::SetResolveCoincidentTopologyToPolygonOffset(); vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor, - myPolygonOffsetUnits); + myPolygonOffsetUnits); Superclass::Render(ren,m); vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit); - vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology); }else{ + vtkMapper::SetResolveCoincidentTopologyToOff(); Superclass::Render(ren,m); } + vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology); } - +/*! + Set ResolveCoincidentTopology flag + \param theIsResolve - new flag value +*/ void VTKViewer_Actor ::SetResolveCoincidentTopology(bool theIsResolve) @@ -223,31 +247,45 @@ VTKViewer_Actor myIsResolveCoincidentTopology = theIsResolve; } +/*! + Set polygon offset parameters + \param factor, units - Opengl polygon offset parameters +*/ void VTKViewer_Actor -::SetPolygonOffsetParameters(float factor, float units) +::SetPolygonOffsetParameters(double factor, + double units) { myPolygonOffsetFactor = factor; myPolygonOffsetUnits = units; } +/*! + Get polygon offset parameters + \param factor, units - Opengl polygon offset parameters +*/ void VTKViewer_Actor -::GetPolygonOffsetParameters(float& factor, float& units) +::GetPolygonOffsetParameters(double& factor, + double& units) { factor = myPolygonOffsetFactor; units = myPolygonOffsetUnits; } - -//---------------------------------------------------------------------------- -float +/*! + \return shrink factor +*/ +double VTKViewer_Actor ::GetShrinkFactor() { return 1.0; } +/*! + \return true if the actor is shrunkable +*/ bool VTKViewer_Actor ::IsShrunkable() @@ -255,6 +293,9 @@ VTKViewer_Actor return false; } +/*! + \return true if the actor is shrunk +*/ bool VTKViewer_Actor ::IsShrunk() @@ -262,18 +303,25 @@ VTKViewer_Actor return false; } +/*! + Insert shrink filter into pipeline +*/ void VTKViewer_Actor ::SetShrink() {} +/*! + Remove shrink filter from pipeline +*/ void VTKViewer_Actor ::UnShrink() {} - -//---------------------------------------------------------------------------- +/*! + Allows to get initial #vtkDataSet +*/ vtkDataSet* VTKViewer_Actor ::GetInput() @@ -281,68 +329,87 @@ VTKViewer_Actor return myPassFilter.front()->GetOutput(); } - -unsigned long int +/*! + To calculatate last modified time +*/ +vtkMTimeType VTKViewer_Actor ::GetMTime() { - unsigned long mTime = this->Superclass::GetMTime(); - unsigned long time = myTransformFilter->GetMTime(); + vtkMTimeType mTime = this->Superclass::GetMTime(); + vtkMTimeType time = myTransformFilter->GetMTime(); mTime = ( time > mTime ? time : mTime ); - if(vtkDataSet *aDataSet = myPassFilter[0]->GetInput()){ + if(vtkDataSet *aDataSet = dynamic_cast(myPassFilter[0]->GetInput())){ // bad usage of GetInput time = aDataSet->GetMTime(); mTime = ( time > mTime ? time : mTime ); } return mTime; } - -//---------------------------------------------------------------------------- +/*! + Set representation (VTK_SURFACE, VTK_POINTS, VTK_WIREFRAME and so on) + param theMode - new mode +*/ void VTKViewer_Actor ::SetRepresentation(int theMode) { + using namespace VTKViewer::Representation; switch(myRepresentation){ - case VTK_POINTS : - case VTK_SURFACE : - myProperty->DeepCopy(GetProperty()); + case Points : + case Surface : + case SurfaceWithEdges : + myProperty->SetAmbient(GetProperty()->GetAmbient()); + myProperty->SetDiffuse(GetProperty()->GetDiffuse()); + myProperty->SetSpecular(GetProperty()->GetSpecular()); + break; } + switch(theMode){ - case VTK_POINTS : - case VTK_SURFACE : - GetProperty()->DeepCopy(myProperty); + case Points : + case Surface : + case SurfaceWithEdges : + GetProperty()->SetAmbient(myProperty->GetAmbient()); + GetProperty()->SetDiffuse(myProperty->GetDiffuse()); + GetProperty()->SetSpecular(myProperty->GetSpecular()); break; default: GetProperty()->SetAmbient(1.0); GetProperty()->SetDiffuse(0.0); GetProperty()->SetSpecular(0.0); } + switch(theMode){ - case 3 : + case Insideframe : myGeomFilter->SetInside(true); myGeomFilter->SetWireframeMode(true); GetProperty()->SetRepresentation(VTK_WIREFRAME); break; - case VTK_POINTS : + case Points : GetProperty()->SetPointSize(VTKViewer_POINT_SIZE); GetProperty()->SetRepresentation(theMode); myGeomFilter->SetWireframeMode(false); myGeomFilter->SetInside(false); break; - case VTK_WIREFRAME : + case Wireframe : GetProperty()->SetRepresentation(theMode); myGeomFilter->SetWireframeMode(true); myGeomFilter->SetInside(false); break; - case VTK_SURFACE : + case Surface : + case SurfaceWithEdges : GetProperty()->SetRepresentation(theMode); myGeomFilter->SetWireframeMode(false); myGeomFilter->SetInside(false); break; } + myRepresentation = theMode; } +/*! + \return current representation mode +*/ int VTKViewer_Actor ::GetRepresentation() @@ -350,8 +417,9 @@ VTKViewer_Actor return myRepresentation; } - -//---------------------------------------------------------------------------- +/*! + Maps VTK index of a node to corresponding object index +*/ int VTKViewer_Actor ::GetNodeObjId(int theVtkID) @@ -359,13 +427,19 @@ VTKViewer_Actor return theVtkID; } -float* +/*! + Get coordinates of a node for given object index +*/ +double* VTKViewer_Actor ::GetNodeCoord(int theObjID) { return GetInput()->GetPoint(theObjID); } +/*! + Get corresponding #vtkCell for given object index +*/ vtkCell* VTKViewer_Actor ::GetElemCell(int theObjID) @@ -373,6 +447,9 @@ VTKViewer_Actor return GetInput()->GetCell(theObjID); } +/*! + Maps VTK index of a cell to corresponding object index +*/ int VTKViewer_Actor ::GetElemObjId(int theVtkID) @@ -381,11 +458,9 @@ VTKViewer_Actor } -//================================================================================= -// function : GetObjDimension -// purpose : Return object dimension. -// Virtual method shoulb be redifined by derived classes -//================================================================================= +/*! + \return object dimension. Virtual method should be redifined by derived classes +*/ int VTKViewer_Actor ::GetObjDimension( const int theObjId ) @@ -395,7 +470,10 @@ VTKViewer_Actor return 0; } - +/*! + Infinitive means actor without size (point for example), + which is not taken into account in calculation of boundaries of the scene +*/ void VTKViewer_Actor ::SetInfinitive(bool theIsInfinite) @@ -403,16 +481,34 @@ VTKViewer_Actor myIsInfinite = theIsInfinite; } - +/*! + \return infinive flag +*/ bool VTKViewer_Actor ::IsInfinitive() { - return myIsInfinite; -} + if(myIsInfinite) + return true; + static double MAX_DISTANCE = 0.9*VTK_FLOAT_MAX; + double aBounds[6]; + GetBounds(aBounds); + for(int i = 0; i < 6; i++) + if(fabs(aBounds[i]) > MAX_DISTANCE) + return true; + + static double MIN_DISTANCE = 1.0/VTK_FLOAT_MAX; + if(GetLength() < MIN_DISTANCE) + return true; + + return false; +} -float* +/*! + \return current bounding box +*/ +double* VTKViewer_Actor ::GetBounds() { @@ -420,15 +516,17 @@ VTKViewer_Actor } +/*! + \return current bounding box +*/ void VTKViewer_Actor -::GetBounds(float theBounds[6]) +::GetBounds(double theBounds[6]) { Superclass::GetBounds(theBounds); } -//---------------------------------------------------------------------------- bool VTKViewer_Actor ::IsSetCamera() const @@ -445,7 +543,7 @@ VTKViewer_Actor void VTKViewer_Actor -::SetSize( const float ) +::SetSize( const double ) {} @@ -454,16 +552,16 @@ VTKViewer_Actor ::SetCamera( vtkCamera* ) {} -//---------------------------------------------------------------------------- + void VTKViewer_Actor -::SetOpacity(float theOpacity) +::SetOpacity(double theOpacity) { myOpacity = theOpacity; GetProperty()->SetOpacity(theOpacity); } -float +double VTKViewer_Actor ::GetOpacity() { @@ -471,25 +569,38 @@ VTKViewer_Actor } +/*! + Change color +*/ void VTKViewer_Actor -::SetColor(float r,float g,float b) +::SetColor(double r, + double g, + double b) { GetProperty()->SetColor(r,g,b); } +/*! + Change color +*/ void VTKViewer_Actor -::SetColor(const float theRGB[3]) +::SetColor(const double theRGB[3]) { SetColor(theRGB[0],theRGB[1],theRGB[2]); } +/*! + Get color +*/ void VTKViewer_Actor -::GetColor(float& r,float& g,float& b) +::GetColor(double& r, + double& g, + double& b) { - float aColor[3]; + double aColor[3]; GetProperty()->GetColor(aColor); r = aColor[0]; g = aColor[1]; @@ -497,7 +608,38 @@ VTKViewer_Actor } -//---------------------------------------------------------------------------- +/*! + Change material +*/ +void +VTKViewer_Actor +::SetMaterial(std::vector theProps) +{ +} + +/*! + Get current front material +*/ +vtkProperty* +VTKViewer_Actor +::GetFrontMaterial() +{ + return NULL; +} + +/*! + Get current back material +*/ +vtkProperty* +VTKViewer_Actor +::GetBackMaterial() +{ + return NULL; +} + +/*! + \return display mode +*/ int VTKViewer_Actor ::getDisplayMode() @@ -505,6 +647,9 @@ VTKViewer_Actor return myDisplayMode; } +/*! + Change display mode +*/ void VTKViewer_Actor ::setDisplayMode(int theMode) @@ -514,7 +659,9 @@ VTKViewer_Actor } -//---------------------------------------------------------------------------- +/*! + \return true if the descendant of the VTKViewer_Actor will implement its own highlight or not +*/ bool VTKViewer_Actor ::hasHighlight() @@ -522,6 +669,9 @@ VTKViewer_Actor return false; } +/*! + \return true if the VTKViewer_Actor is already highlighted +*/ bool VTKViewer_Actor ::isHighlighted() @@ -529,6 +679,19 @@ VTKViewer_Actor return myIsHighlighted; } +/*! + \return true if the VTKViewer_Actor is already preselected +*/ +bool +VTKViewer_Actor +::isPreselected() +{ + return myIsPreselected; +} + +/*! + Set preselection mode +*/ void VTKViewer_Actor ::SetPreSelected(bool thePreselect) @@ -536,8 +699,9 @@ VTKViewer_Actor myIsPreselected = thePreselect; } - -//---------------------------------------------------------------- +/*! + Just to update visibility of the highlight devices +*/ void VTKViewer_Actor ::highlight(bool theIsHighlight) @@ -545,4 +709,41 @@ VTKViewer_Actor myIsHighlighted = theIsHighlight; } +/*! + * On/Off representation 2D quadratic element as arked polygon + */ +void VTKViewer_Actor::SetQuadraticArcMode(bool theFlag){ + myGeomFilter->SetQuadraticArcMode(theFlag); +} + +/*! + * Return true if 2D quadratic element displayed as arked polygon + */ +bool VTKViewer_Actor::GetQuadraticArcMode() const{ + return myGeomFilter->GetQuadraticArcMode(); +} +/*! + * Set Max angle for representation 2D quadratic element as arked polygon + */ +void VTKViewer_Actor::SetQuadraticArcAngle(double theMaxAngle){ + myGeomFilter->SetQuadraticArcAngle(theMaxAngle); +} + +/*! + * Return Max angle of the representation 2D quadratic element as arked polygon + */ +double VTKViewer_Actor::GetQuadraticArcAngle() const{ + return myGeomFilter->GetQuadraticArcAngle(); +} + +/*! + * Return pointer to the dataset, which used to calculation of the bounding box of the actor. + * By default it is the input dataset. + */ +vtkDataSet* VTKViewer_Actor::GetHighlightedDataSet() { + return GetInput(); +} + + + vtkCxxSetObjectMacro(VTKViewer_Actor,PreviewProperty,vtkProperty);