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