1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // SALOME OBJECT : implementation of interactive object visualization for OCC and VTK viewers
24 // File : SALOME_Actor.cxx
25 // Author : Nicolas REJNERI
28 \class SALOME_Actor SALOME_Actor.h
29 \brief Abstract class of SALOME Objects in VTK.
32 #include "VTKViewer_Actor.h"
34 #include "VTKViewer_Transform.h"
35 #include "VTKViewer_TransformFilter.h"
36 #include "VTKViewer_GeometryFilter.h"
40 #include <vtkPolyData.h>
41 #include <vtkObjectFactory.h>
42 #include <vtkDataSetMapper.h>
43 #include <vtkPolyDataMapper.h>
44 #include <vtkRenderer.h>
45 #include <vtkPassThroughFilter.h>
53 int VTKViewer_POINT_SIZE = 5;
54 int VTKViewer_LINE_WIDTH = 3;
57 vtkStandardNewMacro(VTKViewer_Actor);
65 myIsHighlighted(false),
66 myIsPreselected(false),
67 myRepresentation(VTKViewer::Representation::Surface),
69 myProperty(vtkProperty::New()),
70 PreviewProperty(NULL),
72 myIsResolveCoincidentTopology(true),
73 myStoreMapping(false),
74 myGeomFilter(VTKViewer_GeometryFilter::New()),
75 myTransformFilter(VTKViewer_TransformFilter::New())
77 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
78 myPolygonOffsetUnits);
80 for(int i = 0; i < 6; i++)
81 myPassFilter.push_back(vtkPassThroughFilter::New());
90 SetPreviewProperty(NULL);
92 myGeomFilter->Delete();
94 myTransformFilter->Delete();
96 for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++)
98 myPassFilter[i]->Delete();
100 myProperty->Delete();
110 return myName.c_str();
115 \param theName - new name
119 ::setName(const char* theName)
125 To publish the actor an all its internal devices
129 ::AddToRender(vtkRenderer* theRenderer)
131 theRenderer->AddActor(this);
135 To remove the actor an all its internal devices
139 ::RemoveFromRender(vtkRenderer* theRenderer)
141 theRenderer->RemoveActor(this);
145 Used to obtain all dependent actors
149 ::GetChildActors(vtkActorCollection*)
153 Apply view transformation
154 \param theTransform - view transformation
158 ::SetTransform(VTKViewer_Transform* theTransform)
160 myTransformFilter->SetTransform(theTransform);
165 To insert some additional filters and then sets the given #vtkMapper
169 ::SetMapper(vtkMapper* theMapper)
171 InitPipeLine(theMapper);
179 ::InitPipeLine(vtkMapper* theMapper)
183 myPassFilter[ anId ]->SetInputData( theMapper->GetInput() );
184 myPassFilter[ anId + 1]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() );
187 myGeomFilter->SetStoreMapping( myStoreMapping );
188 myGeomFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() );
191 myPassFilter[ anId ]->SetInputConnection( myGeomFilter->GetOutputPort() );
192 myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() );
195 myTransformFilter->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() );
198 myPassFilter[ anId ]->SetInputConnection( myTransformFilter->GetOutputPort() );
199 myPassFilter[ anId + 1 ]->SetInputConnection( myPassFilter[ anId ]->GetOutputPort() );
202 theMapper->SetInputConnection(myPassFilter[anId]->GetOutputPort());
204 Superclass::SetMapper(theMapper);
212 ::Render(vtkRenderer *ren, vtkMapper* m)
214 if(vtkDataSet* aDataSet = GetInput()){
215 static double PERCENTS_OF_DETAILS = 0.50;
216 vtkIdType aNbOfPoints = vtkIdType(aDataSet->GetNumberOfPoints()*PERCENTS_OF_DETAILS);
218 SetNumberOfCloudPoints(aNbOfPoints);
221 if(myIsResolveCoincidentTopology){
222 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
223 double aFactor, aUnit;
224 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
226 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
227 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
228 myPolygonOffsetUnits);
229 Superclass::Render(ren,m);
231 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
232 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
234 Superclass::Render(ren,m);
239 Set ResolveCoincidentTopology flag
240 \param theIsResolve - new flag value
244 ::SetResolveCoincidentTopology(bool theIsResolve)
246 myIsResolveCoincidentTopology = theIsResolve;
250 Set polygon offset parameters
251 \param factor, units - Opengl polygon offset parameters
255 ::SetPolygonOffsetParameters(double factor,
258 myPolygonOffsetFactor = factor;
259 myPolygonOffsetUnits = units;
263 Get polygon offset parameters
264 \param factor, units - Opengl polygon offset parameters
268 ::GetPolygonOffsetParameters(double& factor,
271 factor = myPolygonOffsetFactor;
272 units = myPolygonOffsetUnits;
276 \return shrink factor
286 \return true if the actor is shrunkable
296 \return true if the actor is shrunk
306 Insert shrink filter into pipeline
314 Remove shrink filter from pipeline
322 Allows to get initial #vtkDataSet
328 return myPassFilter.front()->GetOutput();
332 To calculatate last modified time
338 unsigned long mTime = this->Superclass::GetMTime();
339 unsigned long time = myTransformFilter->GetMTime();
340 mTime = ( time > mTime ? time : mTime );
341 if(vtkDataSet *aDataSet = dynamic_cast<vtkDataSet*>(myPassFilter[0]->GetInput())){ // bad usage of GetInput
342 time = aDataSet->GetMTime();
343 mTime = ( time > mTime ? time : mTime );
349 Set representation (VTK_SURFACE, VTK_POINTS, VTK_WIREFRAME and so on)
350 param theMode - new mode
354 ::SetRepresentation(int theMode)
356 using namespace VTKViewer::Representation;
357 switch(myRepresentation){
360 case SurfaceWithEdges :
361 myProperty->SetAmbient(GetProperty()->GetAmbient());
362 myProperty->SetDiffuse(GetProperty()->GetDiffuse());
363 myProperty->SetSpecular(GetProperty()->GetSpecular());
370 case SurfaceWithEdges :
371 GetProperty()->SetAmbient(myProperty->GetAmbient());
372 GetProperty()->SetDiffuse(myProperty->GetDiffuse());
373 GetProperty()->SetSpecular(myProperty->GetSpecular());
376 GetProperty()->SetAmbient(1.0);
377 GetProperty()->SetDiffuse(0.0);
378 GetProperty()->SetSpecular(0.0);
383 myGeomFilter->SetInside(true);
384 myGeomFilter->SetWireframeMode(true);
385 GetProperty()->SetRepresentation(VTK_WIREFRAME);
388 GetProperty()->SetPointSize(VTKViewer_POINT_SIZE);
389 GetProperty()->SetRepresentation(theMode);
390 myGeomFilter->SetWireframeMode(false);
391 myGeomFilter->SetInside(false);
394 GetProperty()->SetRepresentation(theMode);
395 myGeomFilter->SetWireframeMode(true);
396 myGeomFilter->SetInside(false);
399 case SurfaceWithEdges :
400 GetProperty()->SetRepresentation(theMode);
401 myGeomFilter->SetWireframeMode(false);
402 myGeomFilter->SetInside(false);
406 myRepresentation = theMode;
410 \return current representation mode
414 ::GetRepresentation()
416 return myRepresentation;
420 Maps VTK index of a node to corresponding object index
424 ::GetNodeObjId(int theVtkID)
430 Get coordinates of a node for given object index
434 ::GetNodeCoord(int theObjID)
436 return GetInput()->GetPoint(theObjID);
440 Get corresponding #vtkCell for given object index
444 ::GetElemCell(int theObjID)
446 return GetInput()->GetCell(theObjID);
450 Maps VTK index of a cell to corresponding object index
454 ::GetElemObjId(int theVtkID)
461 \return object dimension. Virtual method should be redifined by derived classes
465 ::GetObjDimension( const int theObjId )
467 if ( vtkCell* aCell = GetElemCell(theObjId) )
468 return aCell->GetCellDimension();
473 Infinitive means actor without size (point for example),
474 which is not taken into account in calculation of boundaries of the scene
478 ::SetInfinitive(bool theIsInfinite)
480 myIsInfinite = theIsInfinite;
484 \return infinive flag
493 static double MAX_DISTANCE = 0.9*VTK_LARGE_FLOAT;
496 for(int i = 0; i < 6; i++)
497 if(fabs(aBounds[i]) > MAX_DISTANCE)
500 static double MIN_DISTANCE = 1.0/VTK_LARGE_FLOAT;
501 if(GetLength() < MIN_DISTANCE)
508 \return current bounding box
514 return Superclass::GetBounds();
519 \return current bounding box
523 ::GetBounds(double theBounds[6])
525 Superclass::GetBounds(theBounds);
531 ::IsSetCamera() const
538 ::IsResizable() const
545 ::SetSize( const double )
551 ::SetCamera( vtkCamera* )
557 ::SetOpacity(double theOpacity)
559 myOpacity = theOpacity;
560 GetProperty()->SetOpacity(theOpacity);
580 GetProperty()->SetColor(r,g,b);
588 ::SetColor(const double theRGB[3])
590 SetColor(theRGB[0],theRGB[1],theRGB[2]);
598 ::GetColor(double& r,
603 GetProperty()->GetColor(aColor);
615 ::SetMaterial(std::vector<vtkProperty*> theProps)
620 Get current front material
\r
624 ::GetFrontMaterial()
\r
630 Get current back material
\r
634 ::GetBackMaterial()
\r
646 return myDisplayMode;
654 ::setDisplayMode(int theMode)
656 SetRepresentation(theMode + 1);
657 myDisplayMode = GetRepresentation() - 1;
662 \return true if the descendant of the VTKViewer_Actor will implement its own highlight or not
672 \return true if the VTKViewer_Actor is already highlighted
678 return myIsHighlighted;
682 \return true if the VTKViewer_Actor is already preselected
688 return myIsPreselected;
692 Set preselection mode
696 ::SetPreSelected(bool thePreselect)
698 myIsPreselected = thePreselect;
702 Just to update visibility of the highlight devices
706 ::highlight(bool theIsHighlight)
708 myIsHighlighted = theIsHighlight;
712 * On/Off representation 2D quadratic element as arked polygon
714 void VTKViewer_Actor::SetQuadraticArcMode(bool theFlag){
715 myGeomFilter->SetQuadraticArcMode(theFlag);
719 * Return true if 2D quadratic element displayed as arked polygon
721 bool VTKViewer_Actor::GetQuadraticArcMode() const{
722 return myGeomFilter->GetQuadraticArcMode();
725 * Set Max angle for representation 2D quadratic element as arked polygon
727 void VTKViewer_Actor::SetQuadraticArcAngle(double theMaxAngle){
728 myGeomFilter->SetQuadraticArcAngle(theMaxAngle);
732 * Return Max angle of the representation 2D quadratic element as arked polygon
734 double VTKViewer_Actor::GetQuadraticArcAngle() const{
735 return myGeomFilter->GetQuadraticArcAngle();
739 * Return pointer to the dataset, which used to calculation of the bounding box of the actor.
740 * By default it is the input dataset.
742 vtkDataSet* VTKViewer_Actor::GetHighlightedDataSet() {
748 vtkCxxSetObjectMacro(VTKViewer_Actor,PreviewProperty,vtkProperty);