1 // Copyright (C) 2007-2023 CEA, EDF, 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 <vtkPassThrough.h>
53 int VTKViewer_POINT_SIZE = 5;
54 int VTKViewer_LINE_WIDTH = 3;
57 vtkStandardNewMacro(VTKViewer_Actor)
64 myIsResolveCoincidentTopology(true),
68 myStoreMapping(false),
69 myGeomFilter(VTKViewer_GeometryFilter::New()),
70 myTransformFilter(VTKViewer_TransformFilter::New()),
71 myRepresentation(VTKViewer::Representation::Surface),
72 myProperty(vtkProperty::New()),
73 PreviewProperty(NULL),
74 myIsPreselected(false),
75 myIsHighlighted(false)
77 VTKViewer_Actor::GetDefaultPolygonOffsetParameters(myPolygonOffsetFactor,
78 myPolygonOffsetUnits);
80 for(int i = 0; i < 6; i++)
81 myPassFilter.push_back(vtkPassThrough::New());
90 SetPreviewProperty(NULL);
92 myGeomFilter->Delete();
94 myTransformFilter->Delete();
96 for(size_t 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 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
222 if(myIsResolveCoincidentTopology){
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);
233 vtkMapper::SetResolveCoincidentTopologyToOff();
234 Superclass::Render(ren,m);
236 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
240 Set ResolveCoincidentTopology flag
241 \param theIsResolve - new flag value
245 ::SetResolveCoincidentTopology(bool theIsResolve)
247 myIsResolveCoincidentTopology = theIsResolve;
251 Set polygon offset parameters
252 \param factor, units - Opengl polygon offset parameters
256 ::SetPolygonOffsetParameters(double factor,
259 myPolygonOffsetFactor = factor;
260 myPolygonOffsetUnits = units;
264 Get polygon offset parameters
265 \param factor, units - Opengl polygon offset parameters
269 ::GetPolygonOffsetParameters(double& factor,
272 factor = myPolygonOffsetFactor;
273 units = myPolygonOffsetUnits;
277 Get polygon offset parameters
278 \param factor, units - Opengl polygon offset parameters
282 ::GetDefaultPolygonOffsetParameters(double& factor,
290 \return shrink factor
300 \return true if the actor is shrunkable
310 \return true if the actor is shrunk
320 Insert shrink filter into pipeline
328 Remove shrink filter from pipeline
336 Allows to get initial #vtkDataSet
342 return static_cast<vtkDataSet *>( myPassFilter.front()->GetOutput() );
346 To calculatate last modified time
352 vtkMTimeType mTime = this->Superclass::GetMTime();
353 vtkMTimeType time = myTransformFilter->GetMTime();
354 mTime = ( time > mTime ? time : mTime );
355 if(vtkDataSet *aDataSet = dynamic_cast<vtkDataSet*>(myPassFilter[0]->GetInput())){ // bad usage of GetInput
356 time = aDataSet->GetMTime();
357 mTime = ( time > mTime ? time : mTime );
363 Set representation (VTK_SURFACE, VTK_POINTS, VTK_WIREFRAME and so on)
364 param theMode - new mode
368 ::SetRepresentation(int theMode)
370 using namespace VTKViewer::Representation;
371 switch(myRepresentation){
374 case SurfaceWithEdges :
375 myProperty->SetAmbient(GetProperty()->GetAmbient());
376 myProperty->SetDiffuse(GetProperty()->GetDiffuse());
377 myProperty->SetSpecular(GetProperty()->GetSpecular());
384 case SurfaceWithEdges :
385 GetProperty()->SetAmbient(myProperty->GetAmbient());
386 GetProperty()->SetDiffuse(myProperty->GetDiffuse());
387 GetProperty()->SetSpecular(myProperty->GetSpecular());
390 GetProperty()->SetAmbient(1.0);
391 GetProperty()->SetDiffuse(0.0);
392 GetProperty()->SetSpecular(0.0);
397 myGeomFilter->SetInside(true);
398 myGeomFilter->SetWireframeMode(true);
399 GetProperty()->SetRepresentation(VTK_WIREFRAME);
402 GetProperty()->SetPointSize(VTKViewer_POINT_SIZE);
403 GetProperty()->SetRepresentation(theMode);
404 myGeomFilter->SetWireframeMode(false);
405 myGeomFilter->SetInside(false);
408 GetProperty()->SetRepresentation(theMode);
409 myGeomFilter->SetWireframeMode(true);
410 myGeomFilter->SetInside(false);
413 case SurfaceWithEdges :
414 GetProperty()->SetRepresentation(theMode);
415 myGeomFilter->SetWireframeMode(false);
416 myGeomFilter->SetInside(false);
420 myRepresentation = theMode;
424 \return current representation mode
428 ::GetRepresentation()
430 return myRepresentation;
434 Maps VTK index of a node to corresponding object index
438 ::GetNodeObjId(vtkIdType theVtkID)
444 Get coordinates of a node for given object index
448 ::GetNodeCoord(vtkIdType theObjID)
450 return GetInput()->GetPoint(theObjID);
454 Maps object index of a node to corresponding VTK index
458 ::GetNodeVtkId( vtkIdType theObjID )
465 Get corresponding #vtkCell for given object index
469 ::GetElemCell(vtkIdType theObjID)
471 return GetInput()->GetCell(theObjID);
475 Maps VTK index of a cell to corresponding object index
479 ::GetElemObjId(vtkIdType theVtkID)
486 \return object dimension. Virtual method should be redifined by derived classes
490 ::GetObjDimension( const vtkIdType theObjId )
492 if ( vtkCell* aCell = GetElemCell(theObjId) )
493 return aCell->GetCellDimension();
498 Infinitive means actor without size (point for example),
499 which is not taken into account in calculation of boundaries of the scene
503 ::SetInfinitive(bool theIsInfinite)
505 myIsInfinite = theIsInfinite;
509 \return infinive flag
518 static double MAX_DISTANCE = 0.9*VTK_FLOAT_MAX;
521 for(int i = 0; i < 6; i++)
522 if(fabs(aBounds[i]) > MAX_DISTANCE)
525 static double MIN_DISTANCE = 1.0/VTK_FLOAT_MAX;
526 if(GetLength() < MIN_DISTANCE)
533 \return current bounding box
539 return Superclass::GetBounds();
544 \return current bounding box
548 ::GetBounds(double theBounds[6])
550 Superclass::GetBounds(theBounds);
556 ::IsSetCamera() const
563 ::IsResizable() const
570 ::SetSize( const double )
576 ::SetCamera( vtkCamera* )
582 ::SetOpacity(double theOpacity)
584 myOpacity = theOpacity;
585 GetProperty()->SetOpacity(theOpacity);
605 GetProperty()->SetColor(r,g,b);
613 ::SetColor(const double theRGB[3])
615 SetColor(theRGB[0],theRGB[1],theRGB[2]);
623 ::GetColor(double& r,
628 GetProperty()->GetColor(aColor);
640 ::SetMaterial(std::vector<vtkProperty*> /*theProps*/)
645 Get current front material
655 Get current back material
671 return myDisplayMode;
679 ::setDisplayMode(int theMode)
681 SetRepresentation(theMode + 1);
682 myDisplayMode = GetRepresentation() - 1;
687 \return true if the descendant of the VTKViewer_Actor will implement its own highlight or not
697 \return true if the VTKViewer_Actor is already highlighted
703 return myIsHighlighted;
707 \return true if the VTKViewer_Actor is already preselected
713 return myIsPreselected;
717 Set preselection mode
721 ::SetPreSelected(bool thePreselect)
723 myIsPreselected = thePreselect;
727 Just to update visibility of the highlight devices
731 ::highlight(bool theIsHighlight)
733 myIsHighlighted = theIsHighlight;
737 * On/Off representation 2D quadratic element as arked polygon
739 void VTKViewer_Actor::SetQuadraticArcMode(bool theFlag){
740 myGeomFilter->SetQuadraticArcMode(theFlag);
744 * Return true if 2D quadratic element displayed as arked polygon
746 bool VTKViewer_Actor::GetQuadraticArcMode() const{
747 return myGeomFilter->GetQuadraticArcMode();
750 * Set Max angle for representation 2D quadratic element as arked polygon
752 void VTKViewer_Actor::SetQuadraticArcAngle(double theMaxAngle){
753 myGeomFilter->SetQuadraticArcAngle(theMaxAngle);
757 * Return Max angle of the representation 2D quadratic element as arked polygon
759 double VTKViewer_Actor::GetQuadraticArcAngle() const{
760 return myGeomFilter->GetQuadraticArcAngle();
764 * Return pointer to the dataset, which used to calculation of the bounding box of the actor.
765 * By default it is the input dataset.
767 vtkDataSet* VTKViewer_Actor::GetHighlightedDataSet() {
773 vtkCxxSetObjectMacro(VTKViewer_Actor,PreviewProperty,vtkProperty)