1 // File : VISU_TimeAnimation.cxx
2 // Created : 10 / 04 / 2003
3 // Author : Vitaly SMETANNIKOV
6 // Copyright : Open CASCADE
9 #include "VISU_TimeAnimation.h"
10 #include "VISU_ScalarBarActor.hxx"
13 //************************************************************************
14 VISU_TimeAnimation::VISU_TimeAnimation(SALOMEDS::Study_var theStudy) {
19 myProportional = false;
26 //************************************************************************
27 VISU_TimeAnimation::~VISU_TimeAnimation() {
28 for (int i = 0; i < getNbFields(); i++)
29 clearData(myFieldsLst[i]);
33 //************************************************************************
34 void VISU_TimeAnimation::addField(SALOMEDS::SObject_var theField) {
36 aNewData.myField = theField;
37 aNewData.myNbTimes = 0;
39 aNewData.myActors = 0;
40 aNewData.myTiming = 0;
41 aNewData.myPrsType = VISU::TSCALARMAP;
42 myFieldsLst.append(aNewData);
46 //************************************************************************
47 void VISU_TimeAnimation::clearData(FieldData& theData) {
48 if (theData.myTiming) {
49 free(theData.myTiming);
52 vtkRenderer* aRen = myView->getRenderer();
53 if (theData.myActors) {
54 for (int i = 0; i < theData.myNbTimes; i++) {
55 if (theData.myActors[i]->HasScalarBar() && (i==0))
56 aRen->RemoveActor2D(theData.myActors[i]->getScalarBar());
57 aRen->RemoveActor(theData.myActors[i]);
58 theData.myActors[i]->Delete();
60 free(theData.myActors);
64 for (int i = 0; i < theData.myNbTimes; i++)
65 theData.myPrs[i]->_remove_ref();
69 theData.myNbTimes = 0;
73 //************************************************************************
74 void VISU_TimeAnimation::generatePresentations(int theFieldNum) {
75 FieldData& aData = myFieldsLst[theFieldNum];
77 // Delete previous presentations
80 VISU::Result_i* pResult = createPresent(aData.myField);
81 VISU::Storable::TRestoringMap aMap = getMapOfValue(aData.myField);
82 aData.myNbTimes = VISU::Storable::FindValue(aMap,"myNbTimeStamps").toLong();
84 aData.myPrs = (VISU::ScalarMap_i**) malloc(aData.myNbTimes * sizeof(VISU::ScalarMap_i*));
85 aData.myTiming = (double*) malloc(aData.myNbTimes * sizeof(double));
87 SALOMEDS::ChildIterator_var anIter = myStudy->NewChildIterator(aData.myField);
88 SALOMEDS::SObject_var aTimeStamp;
89 anIter->Next(); // First is reference on support
91 double aMin = 0, aMax = 0;
92 for(;anIter->More();anIter->Next()) {
93 if (i == aData.myNbTimes) {
94 MESSAGE("Found extra timestamps in field");
97 aTimeStamp = anIter->Value();
98 if (aTimeStamp->_is_nil()) continue;
100 aData.myTiming[i] = getTimeValue(aTimeStamp);
101 if (isRangeDefined()) {
102 if (aData.myTiming[i] < myMinVal) continue;
103 if (aData.myTiming[i] > myMaxVal) break;
106 VISU::Storable::TRestoringMap aTimeMap = getMapOfValue(aTimeStamp);
107 QString aMeshName = VISU::Storable::FindValue(aTimeMap,"myMeshName");
108 VISU::Entity anEntity = (VISU::Entity) VISU::Storable::FindValue(aTimeMap,"myEntityId").toInt();
109 QString aFieldName = VISU::Storable::FindValue(aTimeMap,"myFieldName");
110 double aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toDouble();
112 switch (aData.myPrsType) {
113 case VISU::TSCALARMAP: // ScalarMap
115 VISU::ScalarMap_i* aPresent = new VISU::ScalarMap_i(pResult, false);
116 aPresent->Create(aMeshName.latin1(), anEntity,
117 aFieldName.latin1(), aTimeStampId);
118 //VISU::ScalarMap_var aTmp = aPresent->_this();
119 //aPresent->_remove_ref();
120 aData.myPrs[i] = aPresent;
124 case VISU::TISOSURFACE: // Iso Surfaces
126 VISU::IsoSurfaces_i* aPresent = new VISU::IsoSurfaces_i(pResult, false);
127 aPresent->Create(aMeshName.latin1(), anEntity,
128 aFieldName.latin1(), aTimeStampId);
129 //VISU::IsoSurfaces_var aTmp = aPresent->_this();
130 //aPresent->_remove_ref();
131 aData.myPrs[i] = aPresent;
135 case VISU::TCUTPLANES: // Cut Planes
137 VISU::CutPlanes_i* aPresent = new VISU::CutPlanes_i(pResult, false);
138 aPresent->Create(aMeshName.latin1(), anEntity,
139 aFieldName.latin1(), aTimeStampId);
140 //VISU::CutPlanes_var aTmp = aPresent->_this();
141 //aPresent->_remove_ref();
142 aData.myPrs[i] = aPresent;
146 case VISU::TDEFORMEDSHAPE: // Deformed Shape
148 VISU::DeformedShape_i* aPresent = new VISU::DeformedShape_i(pResult, false);
149 aPresent->Create(aMeshName.latin1(), anEntity,
150 aFieldName.latin1(), aTimeStampId);
151 //VISU::DeformedShape_var aTmp = aPresent->_this();
152 //aPresent->_remove_ref();
153 aData.myPrs[i] = aPresent;
157 case VISU::TVECTORS: // Vectors
159 VISU::Vectors_i* aPresent = new VISU::Vectors_i(pResult, false);
160 aPresent->Create(aMeshName.latin1(), anEntity,
161 aFieldName.latin1(), aTimeStampId);
162 //VISU::Vectors_var aTmp = aPresent->_this();
163 //aPresent->_remove_ref();
164 aData.myPrs[i] = aPresent;
168 case VISU::TSTREAMLINES: // Stream Lines
170 VISU::StreamLines_i* aPresent = new VISU::StreamLines_i(pResult, false);
171 aPresent->Create(aMeshName.latin1(), anEntity,
172 aFieldName.latin1(), aTimeStampId);
173 //VISU::StreamLines_var aTmp = aPresent->_this();
174 //aPresent->_remove_ref();
175 aData.myPrs[i] = aPresent;
179 if (aData.myPrs[i]->GetMin() < aMin) aMin = aData.myPrs[i]->GetMin();
180 if (aData.myPrs[i]->GetMax() > aMax) aMax = aData.myPrs[i]->GetMax();
184 for (i = 0; i < aData.myNbTimes; i++)
185 aData.myPrs[i]->SetRange(aMin, aMax);
189 //************************************************************************
190 bool VISU_TimeAnimation::generateFrames() {
192 MESSAGE("Viewer is nod defined for animation");
196 vtkRenderer* aRen = myView->getRenderer();
197 for (int i = 0; i < getNbFields(); i++) {
198 FieldData& aData = myFieldsLst[i];
199 aData.myActors = (VISU_Actor**) malloc(aData.myNbTimes * sizeof(VISU_Actor*));
200 for (long j = 0; j < aData.myNbTimes; j++) {
201 VISU_Actor* aActor = aData.myPrs[j]->CreateActor();
202 if (aActor == NULL) {
203 for (int k = 0; k < j; k++) {
204 aData.myActors[k]->Delete();
206 free(aData.myActors);
210 aRen->AddActor(aActor);
212 aActor->VisibilityOn();
213 if (aActor->HasScalarBar()) {
214 aRen->AddActor2D(aActor->getScalarBar());
217 aActor->VisibilityOff();
218 aData.myActors[j] = aActor;
222 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
227 //************************************************************************
228 void VISU_TimeAnimation::clearView() {
230 MESSAGE("Viewer is nod defined for animation");
233 vtkRenderer* aRen = myView->getRenderer();
234 for (int i = 0; i < getNbFields(); i++) {
235 FieldData& aData = myFieldsLst[i];
236 if (aData.myActors) {
237 for (int i = 0; i < aData.myNbTimes; i++) {
238 if (aData.myActors[i]->HasScalarBar() && (i==0))
239 aRen->RemoveActor2D(aData.myActors[i]->getScalarBar());
240 aRen->RemoveActor(aData.myActors[i]);
241 aData.myActors[i]->Delete();
243 free(aData.myActors);
249 //************************************************************************
250 void VISU_TimeAnimation::stopAnimation() {
254 //************************************************************************
255 void VISU_TimeAnimation::startAnimation() {
262 //************************************************************************
263 void VISU_TimeAnimation::nextFrame() {
265 if (myFrame < (myFieldsLst[0].myNbTimes-1)) {
267 for (i = 0; i < getNbFields(); i++)
268 myFieldsLst[i].myActors[myFrame]->VisibilityOff();
270 for (i = 0; i < getNbFields(); i++)
271 myFieldsLst[i].myActors[myFrame]->VisibilityOn();
273 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
278 //************************************************************************
279 void VISU_TimeAnimation::prevFrame() {
283 for (i = 0; i < getNbFields(); i++)
284 myFieldsLst[i].myActors[myFrame]->VisibilityOff();
286 for (i = 0; i < getNbFields(); i++)
287 myFieldsLst[i].myActors[myFrame]->VisibilityOn();
289 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
294 //************************************************************************
295 void VISU_TimeAnimation::firstFrame() {
298 for (i = 0; i < getNbFields(); i++)
299 myFieldsLst[i].myActors[myFrame]->VisibilityOff();
301 for (i = 0; i < getNbFields(); i++)
302 myFieldsLst[i].myActors[myFrame]->VisibilityOn();
304 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
308 //************************************************************************
309 void VISU_TimeAnimation::lastFrame() {
312 for (i = 0; i < getNbFields(); i++)
313 myFieldsLst[i].myActors[myFrame]->VisibilityOff();
314 myFrame = myFieldsLst[0].myNbTimes-1;
315 for (i = 0; i < getNbFields(); i++)
316 myFieldsLst[i].myActors[myFrame]->VisibilityOn();
318 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
323 //************************************************************************
324 void VISU_TimeAnimation::gotoFrame(long theFrame) {
325 if ((theFrame < 0) || (theFrame > (getNbFrames()-1)))
329 for (i = 0; i < getNbFields(); i++)
330 myFieldsLst[i].myActors[myFrame]->VisibilityOff();
332 for (i = 0; i < getNbFields(); i++)
333 myFieldsLst[i].myActors[myFrame]->VisibilityOn();
334 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
339 //************************************************************************
340 VISU::ScalarMap_i* VISU_TimeAnimation::getPresentation(int theField, long theFrame) {
341 if ((theField > getNbFields()) || (theField < 0))
343 if ((theFrame < 0) || (theFrame > (myFieldsLst[theField].myNbTimes - 1)))
345 return myFieldsLst[theField].myPrs[theFrame];
349 //************************************************************************
350 long VISU_TimeAnimation::getNbFrames() {
351 return (getNbFields() > 0)? myFieldsLst[0].myNbTimes : 0;
355 //************************************************************************
356 void VISU_TimeAnimation::run() {
358 MESSAGE("Viewer is nod defined for animation");
364 bool isDumping = !myDumpPath.isEmpty();
365 aOneVal = (myFieldsLst[0].myNbTimes > 2) ?
366 myFieldsLst[0].myTiming[1] - myFieldsLst[0].myTiming[0] : 1;
370 emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
371 for (int i = 0; i < getNbFields(); i++) {
372 FieldData& aData = myFieldsLst[i];
373 if (myFrame > 0) aData.myActors[myFrame-1]->VisibilityOff();
374 else aData.myActors[aData.myNbTimes-1]->VisibilityOff();
376 aData.myActors[myFrame]->VisibilityOn();
380 QPixmap px = QPixmap::grabWindow(myView->getViewWidget()->winId());
381 QString aFile(myDumpPath);
382 QString aName = QString("%1").arg(myFieldsLst[0].myTiming[myFrame]);
384 while ((aPos = aName.find(".")) > -1 )
385 aName.replace(aPos, 1, "_");
388 //cout<<"### save:"<<aFile<<endl;
389 px.save(aFile, "JPEG");
394 if (myProportional) {
400 if (myFieldsLst[0].myNbTimes > 2)
401 k = (myFieldsLst[0].myTiming[myFrame+1] - myFieldsLst[0].myTiming[myFrame])/aOneVal;
406 k = (myFrame < (myFieldsLst[0].myNbTimes-1))?
407 (myFieldsLst[0].myTiming[myFrame+1] - myFieldsLst[0].myTiming[myFrame])/aOneVal : 1;
412 msleep((int) 1000.*k/mySpeed);
414 if (!myIsActive) QThread::exit();
417 if (myFrame == myFieldsLst[0].myNbTimes)
422 //************************************************************************
423 VISU::Result_i* VISU_TimeAnimation::createPresent(SALOMEDS::SObject_var theField) {
424 SALOMEDS::SObject_var aSObj = theField->GetFather();
425 aSObj = aSObj->GetFather();
426 aSObj = aSObj->GetFather();
427 CORBA::Object_var anObject = VISU::SObjectToObject(aSObj);
428 if(CORBA::is_nil(anObject)) return NULL;
429 return dynamic_cast<VISU::Result_i*>(VISU::GetServant(anObject));
433 //************************************************************************
434 VISU::Storable::TRestoringMap VISU_TimeAnimation::getMapOfValue(SALOMEDS::SObject_var theSObject) {
435 VISU::Storable::TRestoringMap aMap;
436 if(!theSObject->_is_nil()){
437 SALOMEDS::GenericAttribute_var anAttr;
438 if (theSObject->FindAttribute(anAttr, "AttributeComment")) {
439 SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
440 CORBA::String_var aString = aComment->Value();
441 QString strIn(aString.in());
442 VISU::Storable::StrToMap(strIn,aMap);
448 //************************************************************************
449 double VISU_TimeAnimation::getTimeValue(SALOMEDS::SObject_var theTimeStamp) {
450 SALOMEDS::GenericAttribute_var anAttr;
451 if(theTimeStamp->FindAttribute(anAttr, "AttributeName")) {
452 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
453 QString aNameString(aName->Value());
454 return aNameString.toDouble();
458 //************************************************************************
459 void VISU_TimeAnimation::setSpeed(int theSpeed) {
460 mySpeed = (theSpeed<1)? 1 : theSpeed;