Salome HOME
IPAL8849,8850: problems with empty data set; MEN_FILE replaced with MEN_DESK_FILE...
[modules/visu.git] / src / VISU_I / VISU_Prs3d_i.cc
1 //  VISU OBJECT : interactive object for VISU entities implementation
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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.
10 //
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.
15 //
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
19 //
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
21 //
22 //
23 //  File   : VISU_Prs3d_i.cc
24 //  Author : Alexey PETROV
25 //  Module : VISU
26
27 #include "VISU_PipeLine.hxx"
28 #include "VISU_Result_i.hh"
29 #include "VISU_Prs3d_i.hh"
30 #include "VISU_Actor.h"
31
32 #include <vtkGeometryFilter.h>
33 #include <vtkDataSetMapper.h>
34
35 using namespace VISU;
36 using namespace std;
37
38 #ifdef _DEBUG_
39 static int MYDEBUG = 0;
40 #else
41 static int MYDEBUG = 0;
42 #endif
43
44 VISU::Prs3d_i::
45 Prs3d_i(Result_i* theResult,
46         SALOMEDS::SObject_ptr theSObject) :
47   PrsObject_i(theResult->GetStudyDocument()),
48   myResult(theResult),
49   mySObject(SALOMEDS::SObject::_duplicate(theSObject)),
50   myAddToStudy(true),
51   myPipeLine(NULL)
52 {
53   myOffset[0] = myOffset[1] = myOffset[2] = 0;
54   myResult->Register();
55 }
56
57 VISU::Prs3d_i::
58 Prs3d_i(Result_i* theResult,
59         bool theAddToStudy) :
60   PrsObject_i(theResult->GetStudyDocument()),
61   myResult(theResult),
62   mySObject(SALOMEDS::SObject::_nil()),
63   myAddToStudy(theAddToStudy),
64   myPipeLine(NULL)
65 {
66   myOffset[0] = myOffset[1] = myOffset[2] = 0;
67   myResult->Register();
68 }
69
70 void VISU::Prs3d_i::SameAs(const Prs3d_i* theOrigin)
71 {
72   if (Prs3d_i* aOrigin = const_cast<Prs3d_i*>(theOrigin)) {
73     myPipeLine->SameAs(aOrigin->GetPL());
74     aOrigin->GetOffset(myOffset);
75   }
76 }
77
78 VISU::Prs3d_i::~Prs3d_i() {
79   if(MYDEBUG) MESSAGE("~Prs3d_i() - this = "<<this
80                       <<"; GetReferenceCount() = "<<myPipeLine->GetReferenceCount());
81   myPipeLine->Delete();
82   myResult->Destroy();
83 }
84
85 void VISU::Prs3d_i::CreateActor(VISU_Actor* theActor, const Handle(SALOME_InteractiveObject)& theIO)
86 {
87   try{
88     Update();
89     //    if(myAddToStudy){
90     Handle(SALOME_InteractiveObject) anIO = theIO;
91     if(anIO.IsNull() && (!mySObject->_is_nil())){
92       anIO = new SALOME_InteractiveObject(mySObject->GetID(),"VISU",GetName());
93       theActor->setIO(anIO);
94     }
95       // }
96     theActor->SetPipeLine(GetPipeLine());
97     theActor->SetPrs3d(this);
98     theActor->SetPosition(myOffset);
99   }catch(std::bad_alloc& ex){
100     throw std::runtime_error("CreateActor >> No enough memory");
101     throw ex;
102   } catch(std::exception& ex){
103     throw ex;
104   }catch(...) {
105     throw std::runtime_error("CreateActor >> unexpected exception was caught!!!");
106   }
107 }
108
109 void VISU::Prs3d_i::UpdateActor(VISU_Actor* theActor) {
110   if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActor() - this = "<<this);
111   theActor->GetMapper()->ShallowCopy(myPipeLine->GetMapper());
112   theActor->SetPosition(myOffset);
113   theActor->Modified();
114 }
115
116 VISU::Storable* VISU::Prs3d_i::Restore(const Storable::TRestoringMap& theMap)
117 {
118   myName = VISU::Storable::FindValue(theMap,"myName").latin1();
119   myOffset[0] = VISU::Storable::FindValue(theMap,"myOffset[0]").toFloat();
120   myOffset[1] = VISU::Storable::FindValue(theMap,"myOffset[1]").toFloat();
121   myOffset[2] = VISU::Storable::FindValue(theMap,"myOffset[2]").toFloat();
122   return this;
123 }
124
125 void VISU::Prs3d_i::ToStream(std::ostringstream& theStr){
126   Storable::DataToStream( theStr, "myName",   myName.c_str() );
127   Storable::DataToStream( theStr, "myOffset[0]", myOffset[0] );
128   Storable::DataToStream( theStr, "myOffset[1]", myOffset[1] );
129   Storable::DataToStream( theStr, "myOffset[2]", myOffset[2] );
130 }
131
132 void VISU::Prs3d_i::Update() {
133   if(MYDEBUG) MESSAGE("Prs3d_i::Update() - this = "<<this);
134   try{
135     myPipeLine->Update();
136   }catch(...){
137     throw std::runtime_error("Prs3d_i::Update >> unexpected exception was caught!!!");
138   }
139 }
140
141 VISU_PipeLine* VISU::Prs3d_i::GetPipeLine(){
142   return GetPL();
143 }
144
145 VISU_PipeLine* VISU::Prs3d_i::GetPL(){
146   return myPipeLine;
147 }
148
149 vtkUnstructuredGrid* VISU::Prs3d_i::GetInput(){
150   return myPipeLine->GetInput();
151 }
152
153
154 SALOMEDS::SObject_var VISU::Prs3d_i::GetSObject(){
155   if (CORBA::is_nil(mySObject.in())) {
156     const SALOMEDS::Study_var& aStudy = myResult->GetStudyDocument();
157     CORBA::String_var anIOR = GetID();
158     mySObject = aStudy->FindObjectIOR(anIOR);
159   }
160   return mySObject;
161 }
162
163 void VISU::Prs3d_i::GetBounds(float aBounds[6]){
164   myPipeLine->GetMapper()->GetBounds(aBounds);
165 }
166
167 // Clipping planes
168
169 void VISU::Prs3d_i::RemoveAllClippingPlanes(){
170   myPipeLine->RemoveAllClippingPlanes();
171 }
172
173 vtkIdType VISU::Prs3d_i::GetNumberOfClippingPlanes() const{
174   return myPipeLine->GetNumberOfClippingPlanes();
175 }
176
177 bool VISU::Prs3d_i::AddClippingPlane(vtkPlane* thePlane){
178   return myPipeLine->AddClippingPlane(thePlane);
179 }
180
181 vtkPlane* VISU::Prs3d_i::GetClippingPlane(vtkIdType theID) const{
182   return myPipeLine->GetClippingPlane(theID);
183 }
184
185 void VISU::Prs3d_i::SetPlaneParam (float theDir[3], float theDist, vtkPlane* thePlane) {
186   myPipeLine->SetPlaneParam(theDir, theDist, thePlane);
187 }
188
189 VISU::Result_i* VISU::GetResult(SALOMEDS::SObject_ptr theSObject){
190   VISU::Result_var aResult = FindResult(theSObject);
191   if(!aResult->_is_nil())
192     return dynamic_cast<VISU::Result_i*>(VISU::GetServant(aResult.in()).in());
193   return NULL;
194 }
195
196 void VISU::Prs3d_i::SetOffset(const float* theOffsets)
197 {
198   myOffset[0] = theOffsets[0];
199   myOffset[1] = theOffsets[1];
200   myOffset[2] = theOffsets[2];
201 }
202
203 void VISU::Prs3d_i::SetOffset(float theDx, float theDy, float theDz)
204 {
205   myOffset[0] = theDx;
206   myOffset[1] = theDy;
207   myOffset[2] = theDz;
208 }
209
210 void VISU::Prs3d_i::GetOffset(float* theOffsets)
211 {
212   theOffsets[0] = myOffset[0];
213   theOffsets[1] = myOffset[1];
214   theOffsets[2] = myOffset[2];
215 }
216 void VISU::Prs3d_i::GetOffset(float& theDx, float& theDy, float& theDz)
217 {
218   theDx = myOffset[0];
219   theDy = myOffset[1];
220   theDz = myOffset[2];
221 }