Salome HOME
DCQ: prepare V2.0.0
[modules/visu.git] / src / VISU_I / VISU_TimeAnimation.cxx
1 //  Copyright (C) 2003  CEA/DEN, EDF R&D
2 //
3 //
4 //
5 //  File   : VISU_TimeAnimation.cxx
6 //  Author : Vitaly SMETANNIKOV
7 //  Module : VISU
8
9 #include "VISU_TimeAnimation.h"
10 #include "VISU_Result_i.hh"
11 #include "VISU_Prs3d_i.hh"
12 #include "VISU_Mesh_i.hh"
13 #include "VISU_ScalarMap_i.hh"
14 #include "VISU_IsoSurfaces_i.hh"
15 #include "VISU_DeformedShape_i.hh"
16 #include "VISU_CutPlanes_i.hh"
17 #include "VISU_CutLines_i.hh"
18 #include "VISU_Vectors_i.hh"
19 #include "VISU_StreamLines_i.hh"
20 #include "VISU_ViewManager_i.hh"
21 #include "VISU_ScalarBarActor.hxx"
22 #include "VISU_Actor.h"
23
24 #include "SALOME_Event.hxx"
25
26 #include "VTKViewer_ViewFrame.h"
27
28 #include "QAD_Config.h"
29
30 using namespace std;
31
32 //QWaitCondition myCondition;
33 static int MYDELAY = 1;
34
35 //************************************************************************
36 VISU_TimeAnimation::VISU_TimeAnimation(SALOMEDS::Study_ptr theStudy, VISU::View3D_ptr theView3D) {
37   myStudy = theStudy;
38   myIsActive = false;
39   myFrame = 0;
40   mySpeed = 1;
41   myProportional = false;
42   myView = 0;
43
44   if(!CORBA::is_nil(theView3D)){
45     VISU::View3D_i* pView = dynamic_cast<VISU::View3D_i*>(GetServant(theView3D).in());
46     QAD_StudyFrame* aStudyFrame = pView->GetStudyFrame();
47     myView = VISU::GetViewFrame(aStudyFrame);
48   }
49
50   myMaxVal = 0;
51   myMinVal = 0;
52   myTimeMin = 0;
53   myTimeMax = 0;
54   myLastError = "";
55   myCycling = false;
56 }
57
58
59 //************************************************************************
60 VISU_TimeAnimation::~VISU_TimeAnimation() {
61   for (int i = 0; i < getNbFields(); i++) {
62     clearData(myFieldsLst[i]);
63   }
64 }
65
66
67 //************************************************************************
68 void VISU_TimeAnimation::addField(SALOMEDS::SObject_ptr theField) {
69   FieldData aNewData;
70   aNewData.myField = SALOMEDS::SObject::_duplicate(theField);
71   aNewData.myNbFrames = 0;
72   aNewData.myPrsType = VISU::TSCALARMAP;
73   VISU::Storable::TRestoringMap aMap = getMapOfValue(aNewData.myField);
74   aNewData.myNbTimes = VISU::Storable::FindValue(aMap,"myNbTimeStamps").toLong();
75   myFieldsLst.append(aNewData);
76
77   //find Min/Max timestamps
78   if ((myTimeMin == 0) && (myTimeMax == 0)) {
79     SALOMEDS::ChildIterator_var anIter = myStudy->NewChildIterator(theField);
80     SALOMEDS::SObject_var aTimeStamp;
81     anIter->Next(); // First is reference on support
82     myTimeMin = getTimeValue(anIter->Value());
83     for(; anIter->More(); anIter->Next()) {
84       myTimeMax = getTimeValue(anIter->Value());
85     }
86   }
87 }
88
89
90 //************************************************************************
91 void VISU_TimeAnimation::clearData(FieldData& theData) {
92   theData.myTiming.clear();
93   vtkRenderer* aRen = myView->getRenderer();
94   if (!theData.myActors.empty()) {
95     for (int i = 0, iEnd = theData.myActors.size(); i < iEnd; i++) {
96       //_CS_PhB      if (theData.myActors.at(i) != 0) {
97       //_CS_PhB theData.myActors.at(i)->RemoveFromRender(aRen);
98       //_CS_PhB theData.myActors.at(i)->Delete();
99       //_CS_PhB     }
100       if (theData.myActors[i] != 0) {
101         theData.myActors[i]->RemoveFromRender(aRen);
102         theData.myActors[i]->Delete();
103       }
104     }
105     theData.myActors.clear();
106   }
107   if (!theData.myPrs.empty()) {
108     for (int i = 0, iEnd = theData.myPrs.size(); i < iEnd; i++) 
109      //_CS_PhB if (theData.myPrs.at(i) != 0) {
110      //_CS_PhB  theData.myPrs.at(i)->_remove_ref();
111      //_CS_PhB     }
112       if (theData.myPrs[i] != 0) {
113         theData.myPrs[i]->_remove_ref();
114       }
115     theData.myPrs.clear();
116   }  
117   theData.myNbFrames = 0;
118   myView->update();
119 }
120
121
122 //************************************************************************
123 void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) {
124   FieldData& aData = myFieldsLst[theFieldNum];
125
126   // Delete previous presentations
127   clearData(aData);
128
129   VISU::Result_i* pResult = createPresent(aData.myField); 
130   VISU::Storable::TRestoringMap aMap = getMapOfValue(aData.myField);
131   aData.myNbFrames = aData.myNbTimes;
132     //VISU::Storable::FindValue(aMap,"myNbTimeStamps").toLong();
133
134   aData.myPrs.resize(aData.myNbTimes,NULL);
135   aData.myTiming.resize(aData.myNbTimes);
136
137   SALOMEDS::ChildIterator_var anIter = myStudy->NewChildIterator(aData.myField);
138   SALOMEDS::SObject_var aTimeStamp;
139   anIter->Next(); // First is reference on support
140   long i = 0;
141   double aMin = VTK_LARGE_FLOAT, aMax = -VTK_LARGE_FLOAT;
142   for(;anIter->More();anIter->Next()) {
143     if (i == aData.myNbTimes) {
144       MESSAGE("There are extra timestamps in field");
145       return;
146     }
147     aTimeStamp = anIter->Value();
148     if (aTimeStamp->_is_nil()) continue;
149
150    //_CS_PhB aData.myTiming.at(i) = getTimeValue(aTimeStamp);
151    //_CS_PhB if (isRangeDefined()) {
152    //_CS_PhB   if (aData.myTiming.at(i) < myMinVal) continue;
153    //_CS_PhB   if (aData.myTiming.at(i) > myMaxVal) break;
154    //_CS_PhB }
155     aData.myTiming[i] = getTimeValue(aTimeStamp);
156     if (isRangeDefined()) {
157       if (aData.myTiming[i] < myMinVal) continue;
158       if (aData.myTiming[i] > myMaxVal) break;
159     }
160
161     VISU::Storable::TRestoringMap aTimeMap = getMapOfValue(aTimeStamp);
162     QString aMeshName = VISU::Storable::FindValue(aTimeMap,"myMeshName"); 
163     VISU::Entity anEntity = (VISU::Entity) VISU::Storable::FindValue(aTimeMap,"myEntityId").toInt(); 
164     QString aFieldName = VISU::Storable::FindValue(aTimeMap,"myFieldName"); 
165     int aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toInt(); 
166     
167     switch (aData.myPrsType) {
168     case VISU::TSCALARMAP: // ScalarMap
169       {
170         VISU::ScalarMap_i* aPresent = new VISU::ScalarMap_i(pResult, false);
171         aPresent->Create(aMeshName.latin1(), anEntity, 
172                          aFieldName.latin1(), aTimeStampId);
173         //VISU::ScalarMap_var aTmp = aPresent->_this();
174         //aPresent->_remove_ref();
175     //_CS_PhB   aData.myPrs.at(i) = aPresent;
176         aData.myPrs[i] = aPresent;
177       }
178       break;
179       
180     case VISU::TISOSURFACE: // Iso Surfaces
181       {
182         VISU::IsoSurfaces_i* aPresent = new VISU::IsoSurfaces_i(pResult, false);
183         aPresent->Create(aMeshName.latin1(), anEntity, 
184                          aFieldName.latin1(), aTimeStampId);
185         //VISU::IsoSurfaces_var aTmp = aPresent->_this();
186         //aPresent->_remove_ref();
187     //_CS_PhB aData.myPrs.at(i) = aPresent;
188         aData.myPrs[i] = aPresent;
189       }
190       break;
191     
192     case VISU::TCUTPLANES: // Cut Planes
193       {
194         VISU::CutPlanes_i* aPresent = new VISU::CutPlanes_i(pResult, false);
195         aPresent->Create(aMeshName.latin1(), anEntity, 
196                          aFieldName.latin1(), aTimeStampId);
197         //VISU::CutPlanes_var aTmp = aPresent->_this();
198         //aPresent->_remove_ref();
199      //_CS_PhB  aData.myPrs.at(i) = aPresent;
200         aData.myPrs[i] = aPresent;
201       }
202       break;
203       
204     case VISU::TDEFORMEDSHAPE: // Deformed Shape
205       {
206         VISU::DeformedShape_i* aPresent = new VISU::DeformedShape_i(pResult, false);
207         aPresent->Create(aMeshName.latin1(), anEntity, 
208                          aFieldName.latin1(), aTimeStampId);
209         //VISU::DeformedShape_var aTmp = aPresent->_this();
210         //aPresent->_remove_ref();
211      //_CS_PhB  aData.myPrs.at(i) = aPresent;
212         aData.myPrs[i] = aPresent;
213       }
214       break;
215       
216     case VISU::TVECTORS: // Vectors
217       {
218         VISU::Vectors_i* aPresent = new VISU::Vectors_i(pResult, false);
219         aPresent->Create(aMeshName.latin1(), anEntity,  
220                          aFieldName.latin1(), aTimeStampId);
221         //VISU::Vectors_var aTmp = aPresent->_this();
222         //aPresent->_remove_ref();
223      //_CS_PhB          aData.myPrs.at(i) = aPresent;
224         aData.myPrs[i] = aPresent;
225       }
226       break;
227       
228     case VISU::TSTREAMLINES: // Stream Lines
229       {
230         VISU::StreamLines_i* aPresent = new VISU::StreamLines_i(pResult, false);
231         aPresent->Create(aMeshName.latin1(), anEntity, 
232                          aFieldName.latin1(), aTimeStampId);
233         //VISU::StreamLines_var aTmp = aPresent->_this();
234         //aPresent->_remove_ref();
235      //_CS_PhB  aData.myPrs.at(i) = aPresent;
236         aData.myPrs[i] = aPresent;
237       }
238       break;
239     }
240    //_CS_PhB if (aData.myPrs.at(i)->GetMin() < aMin) aMin = aData.myPrs.at(i)->GetMin();
241    //_CS_PhB if (aData.myPrs.at(i)->GetMax() > aMax) aMax = aData.myPrs.at(i)->GetMax();
242     if (aData.myPrs[i]->GetMin() < aMin) aMin = aData.myPrs[i]->GetMin();
243     if (aData.myPrs[i]->GetMax() > aMax) aMax = aData.myPrs[i]->GetMax();
244     i++;
245   }
246   aData.myNbFrames = i;
247   QString aFixRange = QAD_CONFIG->getSetting("Visu:SBImposeRange");
248   if (aFixRange.compare("true") != 0) {
249     for (i = 0; i < aData.myNbFrames; i++) 
250     //_CS_PhB  aData.myPrs.at(i)->SetRange(aMin, aMax);
251       aData.myPrs[i]->SetRange(aMin, aMax);
252     if(aData.myPrsType == VISU::TISOSURFACE)
253       for (i = 0; i < aData.myNbFrames; i++)
254  //_CS_PhB      if(VISU::IsoSurfaces_i* aPrs = dynamic_cast<VISU::IsoSurfaces_i*>(aData.myPrs.at(i)))
255         if(VISU::IsoSurfaces_i* aPrs = dynamic_cast<VISU::IsoSurfaces_i*>(aData.myPrs[i]))
256            aPrs->SetSubRange(aMin, aMax);
257   }
258 }
259
260
261 //************************************************************************
262 CORBA::Boolean VISU_TimeAnimation::generateFrames() {
263   if (!myView) {
264     MESSAGE("Viewer is nod defined for animation");
265     return false;
266   }
267
268   myLastError = QString("Frame(s) for ");
269   bool aNoError = true;
270
271   clearView();
272   vtkRenderer* aRen = myView->getRenderer();
273
274   for (int i = 0; i < getNbFields(); i++) {
275     FieldData& aData = myFieldsLst[i];
276     aData.myActors.resize(aData.myNbFrames,NULL);
277     for (long j = 0; j < aData.myNbFrames; j++) {
278       VISU_Actor* aActor = NULL;
279       try{
280  //_CS_PhB      aActor = aData.myPrs.at(j)->CreateActor();
281         aActor = aData.myPrs[j]->CreateActor();
282         myView->AddActor(aActor);
283         if(j == 0)
284           aActor->VisibilityOn();
285         else
286           aActor->VisibilityOff();
287       }catch(...){ //catch(std::runtime_error& exc){
288         aNoError = false;
289  //_CS_PhB      myLastError += QString("%1 ").arg(aData.myTiming.at(j));
290         myLastError += QString("%1 ").arg(aData.myTiming[j]);
291       }
292  //_CS_PhB     aData.myActors.at(j) = aActor;
293       aData.myActors[j] = aActor;
294     }
295   }
296   myFrame = 0;
297   myLastError += QString(" timestamp(s) cannot /local/salome/SALOME2/VISU/V1_4_1a/VISU_SRC/src/VISU_I/VISU_TimeAnimation.cxxbe created.");
298   //_CS_PhB     emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
299   emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
300   myView->Repaint();
301   return aNoError;
302 }
303
304 //************************************************************************
305 void VISU_TimeAnimation::clearView() {
306   if (!myView) {
307     MESSAGE("Viewer is nod defined for animation");
308     return;
309   }
310   //_CS_PhB : "mt" ne sert pas dans cette methode  VISU::Mutex mt(myMutex,qApp,MYDELAY);
311   vtkRenderer* aRen = myView->getRenderer();
312   for (int i = 0; i < getNbFields(); i++) {
313     FieldData& aData = myFieldsLst[i];
314     if (!aData.myActors.empty()) {
315       for (int i = 0, iEnd = aData.myActors.size(); i < iEnd; i++) {
316 //_CS_PhB       if (aData.myActors.at(i) != 0) {
317 //_CS_PhB         aData.myActors.at(i)->RemoveFromRender(aRen);
318 //_CS_PhB         aData.myActors.at(i)->Delete();
319 //_CS_PhB       }
320         if (aData.myActors[i] != 0) {
321           aData.myActors[i]->RemoveFromRender(aRen);
322           aData.myActors[i]->Delete();
323         }
324       } 
325       aData.myActors.clear();
326     }
327   }
328   myView->getRW()->getRenderWindow()->Render();
329   //myView->update();
330 }
331
332 //************************************************************************
333 void VISU_TimeAnimation::stopAnimation() {
334   myIsActive = false;
335 }
336
337 //************************************************************************
338 void VISU_TimeAnimation::startAnimation() {
339   if (!myIsActive) {
340     myIsActive = true;
341     QThread::start();
342   }
343 }
344
345 //************************************************************************
346 void VISU_TimeAnimation::nextFrame() {
347   stopAnimation();
348   if (myFrame < (myFieldsLst[0].myNbFrames-1)) {
349     int i;
350     for (i = 0; i < getNbFields(); i++) 
351
352 //_CS_PhB      if (myFieldsLst[i].myActors.at(myFrame) != 0)
353 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOff();
354       if (myFieldsLst[i].myActors[myFrame] != 0)
355         myFieldsLst[i].myActors[myFrame]->VisibilityOff();
356     myFrame++;
357     for (i = 0; i < getNbFields(); i++) 
358 //_CS_PhB      if (myFieldsLst[i].myActors.at(myFrame) != 0)
359 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOn(); 
360       if (myFieldsLst[i].myActors[myFrame] != 0)
361         myFieldsLst[i].myActors[myFrame]->VisibilityOn();
362  
363 //_CS_PhB     emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
364     emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
365     myView->Repaint();
366   }
367 }
368
369 //************************************************************************
370 void VISU_TimeAnimation::prevFrame() {
371   stopAnimation();
372   if (myFrame > 0) {
373     int i;
374     for (i = 0; i < getNbFields(); i++) 
375   //_CS_PhB     if (myFieldsLst[i].myActors.at(myFrame) != 0)
376 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOff();
377       if (myFieldsLst[i].myActors[myFrame] != 0)
378         myFieldsLst[i].myActors[myFrame]->VisibilityOff();
379
380     myFrame--;
381     for (i = 0; i < getNbFields(); i++) 
382   //_CS_PhB     if (myFieldsLst[i].myActors.at(myFrame) != 0)
383 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOn();    
384       if (myFieldsLst[i].myActors[myFrame] != 0)
385         myFieldsLst[i].myActors[myFrame]->VisibilityOn(); 
386    
387   //_CS_PhB   emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
388     emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
389     myView->Repaint();
390   }
391 }
392
393 //************************************************************************
394 void VISU_TimeAnimation::firstFrame() {
395   stopAnimation();
396   int i;
397   for (i = 0; i < getNbFields(); i++) 
398     if(!myFieldsLst[i].myActors.empty())
399   //_CS_PhB    if (myFieldsLst[i].myActors.at(myFrame) != 0)
400 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOff();
401       if (myFieldsLst[i].myActors[myFrame] != 0)
402         myFieldsLst[i].myActors[myFrame]->VisibilityOff();
403   myFrame = 0;
404   for (i = 0; i < getNbFields(); i++) 
405     if(!myFieldsLst[i].myActors.empty())
406  //_CS_PhB    if (myFieldsLst[i].myActors.at(myFrame) != 0)
407 //_CS_PhB       myFieldsLst[i].myActors.at(myFrame)->VisibilityOn();    
408       if (myFieldsLst[i].myActors[myFrame] != 0)
409         myFieldsLst[i].myActors[myFrame]->VisibilityOn();    
410   if(!myFieldsLst[0].myTiming.empty()){
411  //_CS_PhB   emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
412     emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
413     myView->Repaint();
414   }
415 }
416
417 //************************************************************************
418 void VISU_TimeAnimation::lastFrame() {
419   stopAnimation();
420   int i;
421   for (i = 0; i < getNbFields(); i++) 
422  //_CS_PhB   if (myFieldsLst[i].myActors.at(myFrame) != 0)
423  //_CS_PhB     myFieldsLst[i].myActors.at(myFrame)->VisibilityOff();
424    if (myFieldsLst[i].myActors[myFrame] != 0)
425       myFieldsLst[i].myActors[myFrame]->VisibilityOff();
426   myFrame = myFieldsLst[0].myNbFrames-1;
427   for (i = 0; i < getNbFields(); i++) 
428 //_CS_PhB    if (myFieldsLst[i].myActors.at(myFrame) != 0)
429 //_CS_PhB      myFieldsLst[i].myActors.at(myFrame)->VisibilityOn();
430     if (myFieldsLst[i].myActors[myFrame] != 0)
431       myFieldsLst[i].myActors[myFrame]->VisibilityOn();
432
433 //_CS_PhB  emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
434   emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
435   myView->Repaint();
436 }
437
438
439 //************************************************************************
440 // For Batchmode using
441 void VISU_TimeAnimation::gotoFrame(CORBA::Long theFrame) {
442   if ((theFrame < 0) || (theFrame > (getNbFrames()-1))) 
443     return;
444   stopAnimation();
445   qApp->lock();
446   qApp->syncX();
447   int i;
448   for (i = 0; i < getNbFields(); i++) 
449 //_CS_PhB    if (myFieldsLst[i].myActors.at(myFrame) != 0)
450 //_CS_PhB      myFieldsLst[i].myActors.at(myFrame)->VisibilityOff();
451     if (myFieldsLst[i].myActors[myFrame] != 0)
452       myFieldsLst[i].myActors[myFrame]->VisibilityOff();
453
454   myFrame = theFrame;
455   for (i = 0; i < getNbFields(); i++) 
456 //_CS_PhB    if (myFieldsLst[i].myActors.at(myFrame) != 0)
457 //_CS_PhB      myFieldsLst[i].myActors.at(myFrame)->VisibilityOn();
458     if (myFieldsLst[i].myActors[myFrame] != 0)
459       myFieldsLst[i].myActors[myFrame]->VisibilityOn();
460
461 //_CS_PhB  emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
462   emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
463   myView->Repaint();
464   qApp->flushX(); 
465   qApp->processEvents(3);
466   qApp->unlock();
467 }
468
469
470 //************************************************************************
471 VISU::ScalarMap_ptr VISU_TimeAnimation::getPresentation(CORBA::Long theField, CORBA::Long theFrame) {
472   if ((theField > getNbFields()) || (theField < 0))
473     return VISU::ScalarMap::_nil();
474   if ((theFrame < 0) || (theFrame > (myFieldsLst[theField].myNbFrames - 1)))
475     return VISU::ScalarMap::_nil();
476 //_CS_PhB  return myFieldsLst[theField].myPrs.at(theFrame)->_this();
477   return myFieldsLst[theField].myPrs[theFrame]->_this();
478 }
479
480
481 //************************************************************************
482 CORBA::Long VISU_TimeAnimation::getNbFrames() { 
483   return (getNbFields() > 0)? myFieldsLst[0].myNbFrames : 0;
484 }
485
486
487 //************************************************************************
488 void VISU_TimeAnimation::run() {
489   if (!myView) {
490     MESSAGE("Viewer is nod defined for animation");
491     return;
492   }
493   double k=1;
494   double aOneVal;
495   bool isDumping = !myDumpPath.isEmpty();
496   aOneVal = (myFieldsLst[0].myNbFrames > 2) ?
497  //_CS_PhB    myFieldsLst[0].myTiming.at(1) - myFieldsLst[0].myTiming.at(0) : 1;
498     myFieldsLst[0].myTiming[1] - myFieldsLst[0].myTiming[0] : 1;
499   qApp->lock();      
500   while (myIsActive) {
501  //_CS_PhB    emit frameChanged(myFrame, myFieldsLst[0].myTiming.at(myFrame));
502     emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
503     for (int i = 0; i < getNbFields(); i++) {
504       FieldData& aData = myFieldsLst[i];
505       if (myFrame > 0) {
506 //_CS_PhB       if (aData.myActors.at(myFrame-1) != 0) 
507 //_CS_PhB         aData.myActors.at(myFrame-1)->VisibilityOff();
508         if (aData.myActors[myFrame-1] != 0) 
509           aData.myActors[myFrame-1]->VisibilityOff();
510       } else { 
511 //_CS_PhB       if (aData.myActors.at(aData.myNbFrames-1) != 0)
512 //_CS_PhB         aData.myActors.at(aData.myNbFrames-1)->VisibilityOff();
513         if (aData.myActors[aData.myNbFrames-1] != 0)
514           aData.myActors[aData.myNbFrames-1]->VisibilityOff();
515       }
516 //_CS_PhB      if (aData.myActors.at(myFrame) != 0) {
517 //_CS_PhB       aData.myActors.at(myFrame)->VisibilityOn();
518       if (aData.myActors[myFrame] != 0) {
519         aData.myActors[myFrame]->VisibilityOn();
520       }
521     }
522     myView->Repaint(false);
523     if (isDumping) {
524       QPixmap px = QPixmap::grabWindow(myView->getViewWidget()->winId());
525       QString aFile(myDumpPath);
526 //_CS_PhB      QString aName = QString("%1").arg(myFieldsLst[0].myTiming.at(myFrame));
527       QString aName = QString("%1").arg(myFieldsLst[0].myTiming[myFrame]);
528       int aPos = -1;
529       while ((aPos = aName.find(".")) > -1 )
530         aName.replace(aPos, 1, "_");
531       aFile += aName;
532       aFile += ".jpeg";
533       px.save(aFile, "JPEG");
534     }//_CS_PhB
535     if (!isDumping) {
536       if (myProportional) {
537         switch (myFrame) {
538         case 0:
539           k=1;
540           break;        
541         case 1:
542           if (myFieldsLst[0].myNbFrames > 2)
543 //_CS_PhB           k = (myFieldsLst[0].myTiming.at(myFrame+1) - myFieldsLst[0].myTiming.at(myFrame))/aOneVal;
544             k = (myFieldsLst[0].myTiming[myFrame+1] - myFieldsLst[0].myTiming[myFrame])/aOneVal;
545           else
546             k = 1;
547           break;        
548         default:
549           k = (myFrame < (myFieldsLst[0].myNbFrames-1))? 
550 //_CS_PhB           (myFieldsLst[0].myTiming.at(myFrame+1) - myFieldsLst[0].myTiming.at(myFrame))/aOneVal : 1;
551             (myFieldsLst[0].myTiming[myFrame+1] - myFieldsLst[0].myTiming[myFrame])/aOneVal : 1;
552         }
553       } else
554         k = 1;
555       qApp->unlock();
556       msleep((int)(1000.*k/mySpeed));
557       qApp->lock();
558     } else {
559       qApp->unlock();
560       msleep(100);
561       qApp->lock();
562     }
563     if (!myIsActive) break;
564
565     myFrame++;
566     if (myFrame == myFieldsLst[0].myNbFrames) {
567       if (!myCycling) {
568         myIsActive = false;
569         myFrame--;
570         break;
571       } else
572         myFrame = 0;
573     }
574   }
575   emit stopped();
576   qApp->unlock();
577   QThread::exit();
578 }
579
580 //************************************************************************
581 VISU::Result_i* VISU_TimeAnimation::createPresent(SALOMEDS::SObject_var theField) {
582   SALOMEDS::SObject_var aSObj = theField->GetFather();
583   aSObj = aSObj->GetFather();
584   aSObj = aSObj->GetFather();
585   CORBA::Object_var anObject = VISU::SObjectToObject(aSObj);
586   if(CORBA::is_nil(anObject)) return NULL;
587   return dynamic_cast<VISU::Result_i*>(VISU::GetServant(anObject).in());
588 }
589
590
591 //************************************************************************
592 VISU::Storable::TRestoringMap VISU_TimeAnimation::getMapOfValue(SALOMEDS::SObject_var theSObject) {
593   VISU::Storable::TRestoringMap aMap;
594   if(!theSObject->_is_nil()){
595     SALOMEDS::GenericAttribute_var anAttr;
596     if (theSObject->FindAttribute(anAttr, "AttributeComment")) {
597       SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
598       CORBA::String_var aString = aComment->Value();
599       QString strIn(aString.in());
600       VISU::Storable::StrToMap(strIn,aMap);
601     }
602   }
603   return aMap;
604 }
605
606 //************************************************************************
607 double VISU_TimeAnimation::getTimeValue(SALOMEDS::SObject_var theTimeStamp) {
608   SALOMEDS::GenericAttribute_var anAttr;
609   if(theTimeStamp->FindAttribute(anAttr, "AttributeName")) {
610     SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
611     QString aNameString(aName->Value());
612     return aNameString.toDouble();
613   }
614 }
615   
616 //************************************************************************
617 void VISU_TimeAnimation::setSpeed(CORBA::Long theSpeed) { 
618   mySpeed = (theSpeed<1)? 1 : theSpeed; 
619 }
620
621
622 //========================================================================
623 VISU_TimeAnimation_i::VISU_TimeAnimation_i(SALOMEDS::Study_ptr theStudy, VISU::View3D_ptr theView3D){
624   myAnim = new VISU_TimeAnimation(theStudy,theView3D);
625 }
626
627
628 VISU_TimeAnimation_i::~VISU_TimeAnimation_i(){
629   delete myAnim;
630 }
631
632
633 void VISU_TimeAnimation_i::addField(SALOMEDS::SObject_ptr theField){
634   myAnim->addField(theField);
635 }
636
637
638 CORBA::Boolean VISU_TimeAnimation_i::generateFrames(){
639   return ProcessEvent(new TMemFunEvent<VISU_TimeAnimation,bool>(myAnim,&VISU_TimeAnimation::generateFrames));
640 }
641
642
643 void VISU_TimeAnimation_i::generatePresentations(CORBA::Long theFieldNum){
644   myAnim->generatePresentations(theFieldNum);
645 }
646
647
648 void VISU_TimeAnimation_i::clearView(){
649   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::clearView));
650 }
651
652
653 void VISU_TimeAnimation_i::stopAnimation(){
654   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::stopAnimation));
655 }
656
657
658 void VISU_TimeAnimation_i::startAnimation(){
659   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::startAnimation));
660 }
661
662
663 void VISU_TimeAnimation_i::nextFrame(){
664   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::nextFrame));
665 }
666
667
668 void VISU_TimeAnimation_i::prevFrame(){
669   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::prevFrame));
670 }
671
672
673 void VISU_TimeAnimation_i::firstFrame(){
674   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::firstFrame));
675 }
676
677
678 void VISU_TimeAnimation_i::lastFrame(){
679   ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(myAnim,&VISU_TimeAnimation::lastFrame));
680 }
681
682
683 void VISU_TimeAnimation_i::gotoFrame(CORBA::Long theFrame){
684   ProcessVoidEvent(new TVoidMemFun1ArgEvent<VISU_TimeAnimation,CORBA::Long>(myAnim,&VISU_TimeAnimation::gotoFrame,theFrame));
685 }
686
687
688 CORBA::Long VISU_TimeAnimation_i::getNbFields(){
689   return myAnim->getNbFields();
690 }
691
692
693 CORBA::Long VISU_TimeAnimation_i::getNbFrames(){
694   return myAnim->getNbFrames();
695 }
696
697
698 CORBA::Boolean VISU_TimeAnimation_i::isRunning(){
699   return myAnim->isRunning();
700 }
701
702
703 CORBA::Long VISU_TimeAnimation_i::getCurrentFrame(){
704   return myAnim->getCurrentFrame();
705 }
706
707
708 VISU::ScalarMap_ptr VISU_TimeAnimation_i::getPresentation(CORBA::Long theField, CORBA::Long theFrame){
709   return myAnim->getPresentation(theField,theFrame);
710 }
711
712
713 void VISU_TimeAnimation_i::setPresentationType(CORBA::Long theFieldNum, VISU::VISUType theType){
714   myAnim->setPresentationType(theFieldNum,theType);
715 }
716
717
718 VISU::VISUType VISU_TimeAnimation_i::getPresentationType(CORBA::Long theFieldNum){
719   return myAnim->getPresentationType(theFieldNum);
720 }
721
722
723 void VISU_TimeAnimation_i::setSpeed(CORBA::Long theSpeed){
724   myAnim->setSpeed(theSpeed);
725 }
726
727
728 CORBA::Long VISU_TimeAnimation_i::getSpeed(){
729   return myAnim->getSpeed();
730 }
731
732
733 CORBA::Boolean VISU_TimeAnimation_i::isProportional(){
734   return myAnim->isProportional();
735 }
736
737
738 void VISU_TimeAnimation_i::setAnimationRange(CORBA::Double theMin, CORBA::Double theMax){
739   myAnim->setAnimationRange(theMin,theMax);
740 }
741
742
743 CORBA::Double VISU_TimeAnimation_i::getMinRange(){
744   return myAnim->getMinRange();
745 }
746
747
748 CORBA::Double VISU_TimeAnimation_i::getMaxRange(){
749   return myAnim->getMaxRange();
750 }
751
752
753 CORBA::Boolean VISU_TimeAnimation_i::isRangeDefined(){
754   return myAnim->isRangeDefined();
755 }
756
757
758 void VISU_TimeAnimation_i::dumpTo(const char* thePath){
759   myAnim->dumpTo(thePath);
760 }
761
762
763 CORBA::Boolean VISU_TimeAnimation_i::isCycling(){
764   return myAnim->isCycling();
765 }
766
767
768 CORBA::Double VISU_TimeAnimation_i::getMinTime(){
769   return myAnim->getMinTime();
770 }
771
772
773 CORBA::Double VISU_TimeAnimation_i::getMaxTime(){
774   return myAnim->getMaxTime();
775 }
776
777
778 void VISU_TimeAnimation_i::setProportional(CORBA::Boolean theProp){
779   myAnim->setProportional(theProp);
780 }
781
782
783 void VISU_TimeAnimation_i::setCycling(CORBA::Boolean theCycle){
784   myAnim->setCycling(theCycle);
785 }
786
787