1 // VISU OBJECT : interactive object for VISU entities implementation
3 // Copyright (C) 2003 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.
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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : VISU_Actor.cxx
25 // Author : Laurent CORNABE with help of Nicolas REJNERI
29 #include "VISU_Actor.h"
30 #include "VISU_PipeLine.hxx"
31 #include "SALOME_ShrinkFilter.h"
32 #include "SALOME_GeometryFilter.h"
33 #include "SALOME_PassThroughFilter.h"
38 #include <vtkProperty.h>
40 #include <vtkDataSet.h>
41 #include <vtkPolyData.h>
42 #include <vtkUnstructuredGrid.h>
44 #include <vtkShrinkFilter.h>
45 #include <vtkShrinkPolyData.h>
47 #include <vtkDataSetMapper.h>
48 #include <vtkGeometryFilter.h>
49 #include <vtkObjectFactory.h>
51 #include "utilities.h"
55 static int MYVTKDEBUG = 0;
58 static int MYDEBUG = 1;
59 static int MYDEBUGWITHFILES = 0;
61 static int MYDEBUG = 0;
62 static int MYDEBUGWITHFILES = 0;
65 //=======================================================================
67 vtkStandardNewMacro(VISU_Actor);
69 VISU_Actor::VISU_Actor(){
75 myStoreMapping = true;
78 myIsShrinkable = false;
79 myShrinkFilter = SALOME_ShrinkFilter::New();
80 myShrinkFilter->SetStoreMapping(true);
83 myMapper = vtkDataSetMapper::New();
88 vtkProperty* aProperty = GetProperty();
89 aProperty->SetAmbient(0.5);
90 aProperty->SetDiffuse(0.2);
91 aProperty->SetSpecular(0.2);
92 aProperty->SetAmbientColor(1, 1, 1);
93 aProperty->SetDiffuseColor(1, 1, 1);
94 aProperty->SetSpecularColor(0.5, 0.5, 0.5);
95 this->SetProperty(aProperty);
98 VISU_Actor::~VISU_Actor(){
99 SALOME_Actor::SetProperty(NULL);
101 myMapper->RemoveAllInputs();
105 myPipeLine->UnRegister(this);
107 myShrinkFilter->UnRegisterAllOutputs();
108 myShrinkFilter->Delete();
111 void VISU_Actor::setIO(const Handle(SALOME_InteractiveObject)& theIO){
112 SALOME_Actor::setIO(theIO);
113 myName = theIO->getName();
116 void VISU_Actor::SetPrs3d(VISU::Prs3d_i* thePrs3d){
120 void VISU_Actor::SetPipeLine(VISU_PipeLine* thePipeLine) {
121 if (myPipeLine != thePipeLine){
122 if (myPipeLine != NULL) myPipeLine->UnRegister(this);
123 myPipeLine = thePipeLine;
124 if (myPipeLine != NULL) myPipeLine->Register(this);
126 vtkMapper *aMapper = myPipeLine->GetMapper();
127 vtkDataSet *aDataSet = aMapper->GetInput();
129 throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no input data !!!");
131 static float eps = VTK_LARGE_FLOAT * 0.1 ;
132 if(aDataSet->GetLength() > eps)
133 throw std::runtime_error("VISU_Actor::SetPipeLine >> Diagonal of the actor is too large !!!");
134 if(!aDataSet->GetNumberOfCells())
135 throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no visible elements");
136 //Bug SAL4221: Mesh with less than 10 cells : shrink mode disable
137 //SetShrinkable(aDataSet->GetNumberOfCells() > 10);
139 //Now, we use vtkShrinkPolyData (not vtkShrinkFilter),
140 //and the class there is no such limitation.
142 myMapper->SetInput(aDataSet);
147 void VISU_Actor::SetParent(VISU_Actor* theParent){
148 myParent = theParent;
151 void VISU_Actor::SetRepresentation(int theMode) {
152 SALOME_Actor::SetRepresentation(theMode);
153 if(myRepresentation == VTK_POINTS)
157 void VISU_Actor::SetOpacity(float theValue){
158 GetProperty()->SetOpacity(theValue);
161 float VISU_Actor::GetOpacity(){
162 return GetProperty()->GetOpacity();
166 void VISU_Actor::SetShrink(){
167 if(!myIsShrinkable) return;
168 if(vtkDataSet* aDataSet = myPassFilter[0]->GetOutput()){
169 myShrinkFilter->SetInput(aDataSet);
170 myPassFilter[1]->SetInput(myShrinkFilter->GetOutput());
175 void VISU_Actor::UnShrink(){
176 if(!myIsShrunk) return;
177 if(vtkDataSet* aDataSet = myPassFilter[0]->GetOutput()){
178 myPassFilter[1]->SetInput(aDataSet);
179 myPassFilter[1]->Modified();
185 void VISU_Actor::SetShrinkable(bool theIsShrinkable){
186 myIsShrinkable = theIsShrinkable;
189 void VISU_Actor::SetShrinkFactor(float theValue){
190 myShrinkFilter->SetShrinkFactor(theValue);
194 float VISU_Actor::GetShrinkFactor(){
195 return myShrinkFilter->GetShrinkFactor();
199 //----------------------------------------------------------------------------
200 void VISU_Actor::SetVisibility(int theMode){
201 SALOME_Actor::SetVisibility(theMode);
204 int VISU_Actor::GetVisibility(){
205 return SALOME_Actor::GetVisibility();
208 void VISU_Actor::SetProperty(vtkProperty* theProperty){
209 SALOME_Actor::SetProperty(theProperty);
212 vtkProperty* VISU_Actor::GetProperty(){
213 return SALOME_Actor::GetProperty();
216 void VISU_Actor::SetLineWidth(float theLineWidth){
217 GetProperty()->SetLineWidth(theLineWidth);
220 float VISU_Actor::GetLineWidth(){
221 return GetProperty()->GetLineWidth();
224 //----------------------------------------------------------------------------
225 void VISU_Actor::ShallowCopy(vtkProp *prop){
226 VISU_Actor *anActor = VISU_Actor::SafeDownCast(prop);
228 setName(anActor->getName());
229 if(anActor->hasIO()) setIO(anActor->getIO());
231 SALOME_Actor::ShallowCopy(prop);
234 //----------------------------------------------------------------------------
235 int VISU_Actor::GetNodeObjId(int theVtkID){
237 return myShrinkFilter->GetNodeObjId(theVtkID);
241 int VISU_Actor::GetElemObjId(int theVtkID){
242 return myGeomFilter->GetElemObjId(theVtkID);