1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // VISU OBJECT : interactive object for VISU entities implementation
24 // File : VISU_ColoredPrs3dCache_i.cc
25 // Author : Oleg UVAROV
32 #include "VISU_ColoredPrs3dCache_i.hh"
34 #include "VISU_ColoredPrs3dHolder_i.hh"
35 #include "VISU_ColoredPrs3dFactory.hh"
37 #include "VISU_ViewManager_i.hh"
38 #include "VISU_View_i.hh"
39 #include "VISU_Actor.h"
41 #include "VISU_PipeLine.hxx"
43 #include "SALOME_Event.h"
45 #include "VTKViewer_Algorithm.h"
46 #include "SVTK_Functor.h"
47 #include "SVTK_ViewWindow.h"
49 #include "SUIT_ResourceMgr.h"
51 #include <vtkRenderWindow.h>
55 #include "utilities.h"
58 static int MYDEBUG = 0;
60 static int MYDEBUG = 0;
67 //----------------------------------------------------------------------------
70 IsSameField(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
71 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
73 return thePrs3dInput.myResult->_is_equivalent(theReferenceInput.myResult) &&
74 thePrs3dInput.myEntity == theReferenceInput.myEntity &&
75 !strcmp(thePrs3dInput.myFieldName.in(), theReferenceInput.myFieldName.in());
79 //----------------------------------------------------------------------------
82 IsSameTimeStamp(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
83 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
85 return IsSameField(theReferenceInput, thePrs3dInput) &&
86 thePrs3dInput.myTimeStampNumber == theReferenceInput.myTimeStampNumber;
90 //----------------------------------------------------------------------------
92 FindSameFieldPrs(const VISU::TColoredPrs3dHolderMap& theHolderMap,
93 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
94 VISU::VISUType theType)
96 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
97 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
98 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
99 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
100 VISU::TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
101 VISU::TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
102 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
103 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
104 if(aPrs3d->GetType() != theType)
106 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
107 if(IsSameField(theInput, anInput))
115 //----------------------------------------------------------------------------
117 EstimateMemorySize(const VISU::TColoredPrs3dHolderMap& theHolderMap,
118 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
119 VISU::VISUType theType,
120 const size_t theRawEstimatedMemorySize)
122 VISU::ColoredPrs3d_i* aPrs3d = FindSameFieldPrs(theHolderMap, theInput, theType);
124 return aPrs3d->GetMemorySize();
125 return CORBA::Float(theRawEstimatedMemorySize/(1024.0*1024.0)); // convert to Mb
129 //----------------------------------------------------------------------------
131 SelectPrs3dToBeDeleted(CORBA::Float theRequiredMemory,
132 const std::string& theActiveHolderEntry,
133 const VISU::TColoredPrs3dHolderMap& theHolderMap,
134 VISU::TColoredPrs3dHolderMap& theColoredPrs3dHolderMap)
136 if( theRequiredMemory < 1.0 / VTK_LARGE_FLOAT )
139 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
140 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
142 // To calculate the maximum length of the cache history among all holders
144 for( ; aHolderIter != aHolderIterEnd; aHolderIter++ ){
145 if( aHolderIter->first == theActiveHolderEntry )
147 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
148 anIteration = qMax( (int)aPrsList.size() - 1, anIteration );
151 // To estimate what amount of memory can be obtained
152 // by cleaning of non-active holder's presentation
153 CORBA::Float aGatheredMemory = 0.0;
154 for(; anIteration > 0; anIteration--){ // To take into account only non-devices
155 aHolderIter = theHolderMap.begin();
156 for(; aHolderIter != aHolderIterEnd; aHolderIter++ ){
157 const std::string& aHolderEntry = aHolderIter->first;
158 if( aHolderEntry == theActiveHolderEntry )
160 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
161 if( anIteration < aPrsList.size() ){
162 VISU::TPrs3dPtr aPrs3d = aPrsList[anIteration];
163 aGatheredMemory += aPrs3d->GetMemorySize();
164 theColoredPrs3dHolderMap[aHolderEntry].push_back(aPrs3d);
165 if( aGatheredMemory > theRequiredMemory )
171 // To estimate what amount of memory can be obtained
172 // by cleaning of active holder's presentation
173 if( theActiveHolderEntry != "" ){
174 aHolderIter = theHolderMap.find( theActiveHolderEntry );
175 if(aHolderIter == theHolderMap.end())
178 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
180 // To prefere "move" action instead of destroy / create presentation
181 if(aPrsList.back()->GetMemorySize() >= theRequiredMemory)
184 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIter = aPrsList.rbegin();
185 // Do not porcess first item to avoid of the device destruction
186 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIterEnd = aPrsList.rend()++;
187 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
188 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
189 aGatheredMemory += aPrs3d->GetMemorySize();
190 theColoredPrs3dHolderMap[theActiveHolderEntry].push_back(aPrs3d);
191 if( aGatheredMemory > theRequiredMemory )
200 //----------------------------------------------------------------------------
202 ErasePrs3d(VISU::TLastVisitedPrsList& thePrsList,
203 const VISU::TPrs3dPtr& thePrs3d)
205 VISU::TLastVisitedPrsList::iterator anIter = thePrsList.begin();
206 VISU::TLastVisitedPrsList::iterator aEndIter = thePrsList.end();
207 for(; anIter != aEndIter; anIter++){
208 VISU::TPrs3dPtr aPrs3d = *anIter;
209 if(aPrs3d == thePrs3d)
210 thePrsList.erase(anIter);
216 //----------------------------------------------------------------------------
217 VISU::ColoredPrs3dCache_i
218 ::ColoredPrs3dCache_i(SALOMEDS::Study_ptr theStudy,
219 bool thePublishInStudy):
222 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::ColoredPrs3dCache_i - this = "<<this);
223 SetStudyDocument(theStudy);
225 SetName(GetFolderName(), false);
227 if( thePublishInStudy )
229 CORBA::String_var anIOR = GetID();
230 SALOMEDS::SComponent_var aSComponent = VISU::FindOrCreateVisuComponent(theStudy);
231 CORBA::String_var aFatherEntry = aSComponent->GetID();
232 CreateAttributes(GetStudyDocument(), aFatherEntry.in(), "", anIOR.in(), GetName(), "", "", true);
235 SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
237 int aMemoryMode = aResourceMgr->integerValue( "VISU", "cache_memory_mode", 0 );
238 SetMemoryMode( aMemoryMode == 0 ? VISU::ColoredPrs3dCache::MINIMAL : VISU::ColoredPrs3dCache::LIMITED );
240 float aLimitedMemory = aResourceMgr->doubleValue( "VISU", "cache_memory_limit", 1024.0 );
241 SetLimitedMemory( aLimitedMemory );
245 //----------------------------------------------------------------------------
246 VISU::ColoredPrs3dCache_i
247 ::~ColoredPrs3dCache_i()
249 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::~ColoredPrs3dCache_i - this = "<<this);
253 //----------------------------------------------------------------------------
254 const string VISU::ColoredPrs3dCache_i::myComment = "COLOREDPRS3DCACHE";
257 VISU::ColoredPrs3dCache_i
260 return myComment.c_str();
264 //----------------------------------------------------------------------------
266 VISU::ColoredPrs3dCache_i
269 CORBA::Float aMemoryUsed = 0.0;
270 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
271 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
272 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
273 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
274 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
275 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
276 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
277 if(TPrs3dPtr aPrs3d = *aPrsIter)
278 aMemoryUsed += aPrs3d->GetMemorySize();
285 //----------------------------------------------------------------------------
287 VISU::ColoredPrs3dCache_i
288 ::GetDeviceMemorySize()
290 CORBA::Float aMemoryUsed = 0.0;
291 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
292 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
293 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
294 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
295 if(TPrs3dPtr aPrs3d = aPrsList.front())
296 aMemoryUsed += aPrs3d->GetMemorySize();
302 //----------------------------------------------------------------------------
304 VISU::ColoredPrs3dCache_i
305 ::IsPossible(VISU::VISUType theType,
306 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
307 CORBA::Float& theRequiredMemory,
308 const std::string theHolderEntry)
310 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
311 if(aRawEstimatedMemorySize > 0){
312 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
313 CORBA::Float aMemoryUsed = GetMemorySize();
314 CORBA::Float aMemoryLimit = GetLimitedMemory();
315 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
318 aRawEstimatedMemorySize);
320 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
323 theRequiredMemory = aMemoryNeeded - ( aMemoryLimit - aMemoryUsed );
324 TColoredPrs3dHolderMap aColoredPrs3dHolderMap;
325 return SelectPrs3dToBeDeleted(theRequiredMemory,
328 aColoredPrs3dHolderMap);
331 return aRawEstimatedMemorySize > 0;
335 //----------------------------------------------------------------------------
336 VISU::ColoredPrs3dCache::EnlargeType
337 VISU::ColoredPrs3dCache_i
338 ::GetRequiredMemory(VISU::VISUType theType,
339 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
340 CORBA::Float& theRequiredMemory)
342 VISU::ColoredPrs3dCache::EnlargeType anEnlargeType = VISU::ColoredPrs3dCache::NO_ENLARGE;
344 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
345 if(aRawEstimatedMemorySize > 0){
346 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
347 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
348 CORBA::Float aMemoryLimit = GetLimitedMemory();
349 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
352 aRawEstimatedMemorySize);
353 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
354 return anEnlargeType;
356 theRequiredMemory = int( aMemoryUsed + aMemoryNeeded ) + 1;
358 size_t aMb = 1024 * 1024;
359 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(8192*(double)aMb)) / double(aMb);
360 anEnlargeType = aMemoryNeeded < aFreeMemory ?
361 VISU::ColoredPrs3dCache::ENLARGE : VISU::ColoredPrs3dCache::IMPOSSIBLE;
364 return anEnlargeType;
368 //----------------------------------------------------------------------------
369 VISU::ColoredPrs3dCache_i*
370 VISU::ColoredPrs3dCache_i
371 ::GetInstance_i(SALOMEDS::Study_ptr theStudy)
373 std::string aFolderName = VISU::ColoredPrs3dCache_i::GetFolderName();
374 SALOMEDS::SObject_var aSObject = theStudy->FindObject(aFolderName.c_str());
375 if (CORBA::is_nil(aSObject)) {
376 aSObject = theStudy->FindObject("3D Cache System");
377 if (!CORBA::is_nil(aSObject)) {
378 SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder();
379 SALOMEDS::GenericAttribute_var anAttr = aBuilder->FindOrCreateAttribute( aSObject, "AttributeName" );
380 SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr );
381 aNameAttr->SetValue( GetFolderName().c_str() );
384 if(!CORBA::is_nil(aSObject)){
385 CORBA::Object_var anObject = aSObject->GetObject();
386 VISU::ColoredPrs3dCache_var aCache = VISU::ColoredPrs3dCache::_narrow(anObject);
387 if(!CORBA::is_nil(aCache))
388 return dynamic_cast<VISU::ColoredPrs3dCache_i*>(GetServant(aCache).in());
391 return new VISU::ColoredPrs3dCache_i(theStudy);
395 VISU::ColoredPrs3dCache_ptr
396 VISU::ColoredPrs3dCache_i
397 ::GetInstance(SALOMEDS::Study_ptr theStudy)
399 VISU::ColoredPrs3dCache_i* aServant = GetInstance_i(theStudy);
400 VISU::ColoredPrs3dCache_var anObject = aServant->_this();
401 return anObject._retn();
405 //----------------------------------------------------------------------------
406 VISU::ColoredPrs3dHolder_ptr
407 VISU::ColoredPrs3dCache_i
408 ::CreateHolder(VISU::VISUType theType,
409 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
411 if(MYDEBUG) MESSAGE ("CreateHolder "<<theType);
412 CORBA::Float aRequiredMemory = 0.0;
413 if(IsPossible(theType, theInput, aRequiredMemory, "")){
414 if(VISU::ColoredPrs3d_i* aColoredPrs3d = CreateColoredPrs3d(theType, theInput)){
415 VISU::ColoredPrs3dHolder_i* aHolder = new VISU::ColoredPrs3dHolder_i(*this);
416 std::string aComment = std::string("myComment=") + aColoredPrs3d->GetComment();
417 std::string aName = (const char*)aColoredPrs3d->GenerateName().toLatin1();
418 aHolder->PublishInStudy(aName, aColoredPrs3d->GetIconName(), aComment);
419 RegisterInHolder(aColoredPrs3d, aHolder->GetEntry());
420 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
421 ClearMemory( aRequiredMemory, aHolder->GetEntry() );
422 return aHolder->_this();
425 return VISU::ColoredPrs3dHolder::_nil();
429 //----------------------------------------------------------------------------
431 VISU::ColoredPrs3dCache_i
432 ::SetMemoryMode(VISU::ColoredPrs3dCache::MemoryMode theMode)
434 VISU::ColoredPrs3dCache::MemoryMode aCurrentMode = GetMemoryMode();
436 if( aCurrentMode == VISU::ColoredPrs3dCache::LIMITED &&
437 theMode == VISU::ColoredPrs3dCache::MINIMAL )
442 myMemoryMode = theMode;
443 GetStudyDocument()->Modified();
446 VISU::ColoredPrs3dCache::MemoryMode
447 VISU::ColoredPrs3dCache_i
454 //----------------------------------------------------------------------------
456 VISU::ColoredPrs3dCache_i
457 ::SetLimitedMemory(CORBA::Float theMemorySize)
459 if( fabs( myLimitedMemory - theMemorySize ) < 1 / VTK_LARGE_FLOAT )
462 size_t aMb = 1024 * 1024;
463 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(8192*(double)aMb)) / double(aMb);
464 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
465 CORBA::Float aMemoryNeeded = theMemorySize - aMemoryUsed;
466 if( aMemoryNeeded > aFreeMemory )
469 ClearCache(theMemorySize);
470 myLimitedMemory = theMemorySize;
471 GetStudyDocument()->Modified();
475 VISU::ColoredPrs3dCache_i
478 return myLimitedMemory;
483 VISU::ColoredPrs3dCache_i
486 CORBA::String_var anIOR = GetID();
487 SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectIOR(anIOR.in());
488 VISU::RemoveFromStudy(aSObject, false, true);
493 VISU::ColoredPrs3dCache_i
496 //return "3D Cache System";
497 return "Presentations";
500 //----------------------------------------------------------------------------
501 VISU::ColoredPrs3d_i*
502 VISU::ColoredPrs3dCache_i
503 ::CreateColoredPrs3d(VISU::VISUType theType,
504 VISU::ColoredPrs3dHolder::BasicInput theInput)
506 VISU::ColoredPrs3d_i* aPrs3d = VISU::CreatePrs3d_i(theType, GetStudyDocument(), ColoredPrs3d_i::ERegisterInCache);
507 aPrs3d->SetResultObject( theInput.myResult );
508 aPrs3d->SetMeshName( theInput.myMeshName );
509 aPrs3d->SetEntity( theInput.myEntity );
510 aPrs3d->SetFieldName( theInput.myFieldName );
511 aPrs3d->SetTimeStampNumber( theInput.myTimeStampNumber );
512 if(aPrs3d->Apply( false ))
518 //----------------------------------------------------------------------------
519 VISU::ColoredPrs3d_i*
520 VISU::ColoredPrs3dCache_i
521 ::RegisterInHolder(VISU::ColoredPrs3d_i* thePrs3d,
522 const std::string& theHolderEntry)
524 if(MYDEBUG) MESSAGE("RegisterInHolder "<<theHolderEntry.c_str()<<" "<<thePrs3d);
526 TPrs3dPtr aPrs3d(thePrs3d);
527 myHolderMap[theHolderEntry].push_front(aPrs3d);
528 thePrs3d->SetHolderEntry( theHolderEntry );
529 thePrs3d->UnRegister();
535 //----------------------------------------------------------------------------
536 VISU::ColoredPrs3d_i*
537 VISU::ColoredPrs3dCache_i
538 ::CreatePrs(VISU::VISUType theType,
539 VISU::ColoredPrs3dHolder::BasicInput theInput,
540 VISU::ColoredPrs3dHolder_i* theHolder)
542 return RegisterInHolder(CreateColoredPrs3d(theType, theInput),
543 theHolder->GetEntry());
547 //----------------------------------------------------------------------------
548 VISU::TLastVisitedPrsList&
549 VISU::ColoredPrs3dCache_i
550 ::GetLastVisitedPrsList(VISU::ColoredPrs3dHolder_i* theHolder)
552 return myHolderMap[theHolder->GetEntry()];
556 //----------------------------------------------------------------------------
558 VISU::ColoredPrs3dCache_i
559 ::GetLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder)
561 const TLastVisitedPrsList& aList = GetLastVisitedPrsList(theHolder);
562 if(MYDEBUG) MESSAGE("GetLastVisitedPrs " << theHolder->GetEntry().c_str() << " " << aList.size() );
564 return aList.front();
565 return VISU::TPrs3dPtr();
569 //----------------------------------------------------------------------------
571 VISU::ColoredPrs3dCache_i
572 ::FindPrsByInput(TLastVisitedPrsList& theLastVisitedPrsList,
573 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
575 TLastVisitedPrsList::iterator anIter = theLastVisitedPrsList.begin();
576 TLastVisitedPrsList::iterator aEndIter = theLastVisitedPrsList.end();
577 for(; anIter != aEndIter; anIter++){
578 TPrs3dPtr aPrs3d = *anIter;
579 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
580 if(IsSameTimeStamp(theInput, anInput)){
581 theLastVisitedPrsList.erase(anIter);
585 return VISU::TPrs3dPtr();
588 struct TFindActorEvent: public SALOME_Event
590 VISU::TPrs3dPtr myPrs3d;
591 SVTK_ViewWindow* myViewWindow;
593 typedef VISU_Actor* TResult;
596 TFindActorEvent(VISU::TPrs3dPtr thePrs3d, SVTK_ViewWindow* theViewWindow):
598 myViewWindow(theViewWindow),
606 myResult = VISU::FindActor(myViewWindow, myPrs3d);
610 struct TAddActorEvent: public SALOME_Event
613 SVTK_ViewWindow* myViewWindow;
615 TAddActorEvent(VISU_Actor* theActor, SVTK_ViewWindow* theViewWindow):
617 myViewWindow(theViewWindow)
619 virtual void Execute(){
620 myViewWindow->AddActor(myActor);
624 struct TRenderEvent: public SALOME_Event
626 SVTK_ViewWindow* myViewWindow;
628 TRenderEvent(SVTK_ViewWindow* theViewWindow):
629 myViewWindow(theViewWindow)
631 virtual void Execute(){
632 myViewWindow->getRenderWindow()->Render();
636 //----------------------------------------------------------------------------
638 VISU::ColoredPrs3dCache_i
639 ::UpdateLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder,
640 VISU::ColoredPrs3d_i* thePrs,
641 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
642 VISU::View3D_ptr theView3D)
644 if(MYDEBUG) MESSAGE( "VISU::ColoredPrs3dCache_i::UpdateLastVisitedPrs" );
647 TPrs3dPtr aLastVisitedPrs3d = GetLastVisitedPrs(theHolder);
648 TLastVisitedPrsList& aLastVisitedPrsList = GetLastVisitedPrsList(theHolder);
649 bool anIsCheckPossible = GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED;
650 std::string aHolderEntry = theHolder->GetEntry();
651 VISU::VISUType aPrsType = theHolder->GetPrsType();
652 CORBA::Float aRequiredMemory = 0.0;
653 if(aPrs3d = FindPrsByInput(aLastVisitedPrsList, theInput)){
654 aLastVisitedPrsList.push_front(aPrs3d);
655 if(MYDEBUG) MESSAGE( "FindPrsByInput " << aPrs3d );
656 }else if(anIsCheckPossible && IsPossible(aPrsType, theInput, aRequiredMemory, aHolderEntry)){
657 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
658 ClearMemory(aRequiredMemory, aHolderEntry);
659 aPrs3d = CreatePrs(aPrsType, theInput, theHolder);
660 if(MYDEBUG) MESSAGE( "Created " << aPrs3d );
662 aPrs3d = aLastVisitedPrsList.back();
663 aPrs3d->SetResultObject(theInput.myResult);
664 aPrs3d->SetMeshName(theInput.myMeshName);
665 aPrs3d->SetEntity(theInput.myEntity);
666 aPrs3d->SetFieldName(theInput.myFieldName);
667 aPrs3d->SetTimeStampNumber(theInput.myTimeStampNumber);
668 aLastVisitedPrsList.pop_back();
669 aLastVisitedPrsList.push_front(aPrs3d);
670 if(MYDEBUG) MESSAGE( "Move only " << aPrs3d );
672 //if(MYDEBUG) PrintCache();
674 aPrs3d->SameAs(thePrs);
676 // rnv: fix for the 20870: EDF 1410 VISU: Anomaly in the Gauss point representation.
677 // special case for the "Gauss Points" presentation,
678 // update the LookupTable in the mapper, after assign properties of the presentation
679 // using SameAs(...) method.
680 VISU::GaussPoints_i* gPoints = dynamic_cast<VISU::GaussPoints_i*>( aPrs3d.get() );
682 gPoints->UpdateMapperLookupTable();
685 // special case for deformed shape
686 VISU::DeformedShapeAndScalarMap_i* dShape =
687 dynamic_cast<VISU::DeformedShapeAndScalarMap_i*>( aPrs3d.get() );
688 if ( dShape && dShape->GetScalarTimeStampNumber() != theInput.myTimeStampNumber )
690 dShape->SetScalarField( dShape->GetScalarEntity(),
691 dShape->GetScalarFieldName(), theInput.myTimeStampNumber );
694 if(CORBA::is_nil(theView3D))
697 PortableServer::ServantBase_var aServant = GetServant(theView3D);
698 if(VISU::View3D_i* aView3d = dynamic_cast<VISU::View3D_i*>(aServant.in())){
699 if(SUIT_ViewWindow* aView = aView3d->GetViewWindow()){
700 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aView)){
701 // Find actor that corresponds to the holder
702 VISU_Actor* anActor = ProcessEvent(new TFindActorEvent(aLastVisitedPrs3d,aViewWindow));
703 //VISU_Actor* anActor = VISU::FindActor(aViewWindow, aLastVisitedPrs3d);
705 // If the holder was erased from view then do nothing
706 if(anActor && !anActor->GetVisibility())
711 anActor = aLastVisitedPrs3d->CreateActor();
712 ProcessVoidEvent(new TAddActorEvent(anActor,aViewWindow));
713 //aViewWindow->AddActor(anActor);
714 anActor->SetVisibility(true);
717 if(aPrs3d != aLastVisitedPrs3d)
719 // To erase non active presentation
720 aLastVisitedPrs3d->SetActiveState(false);
722 anActor->SetVisibility(false);
724 // To find the new one that corresponds to fresh presentation
725 VISU_Actor* aNewActor = ProcessEvent(new TFindActorEvent(aPrs3d,aViewWindow));
726 //VISU_Actor* aNewActor = VISU::FindActor(aViewWindow, aPrs3d);
728 aNewActor = aPrs3d->CreateActor();
729 ProcessVoidEvent(new TAddActorEvent(aNewActor,aViewWindow));
730 //aViewWindow->AddActor(aNewActor);
732 aNewActor->SetVisibility(true);
733 aNewActor->DeepCopy(anActor);
735 aPrs3d->SetActiveState(true);
738 aPrs3d->UpdateActors();
739 ProcessVoidEvent(new TRenderEvent(aViewWindow));
740 //aViewWindow->getRenderWindow()->Render();
745 }catch(std::exception& exc){
746 INFOS("Follow exception was occured :\n"<<exc.what());
748 INFOS("Unknown exception was occured!");
755 //----------------------------------------------------------------------------
757 VISU::ColoredPrs3dCache_i
758 ::ClearCache(float theMemory)
760 CORBA::Float aCurrentMemory = GetMemorySize();
761 ClearMemory( aCurrentMemory - theMemory, "" );
765 //----------------------------------------------------------------------------
767 VISU::ColoredPrs3dCache_i
768 ::ClearMemory(CORBA::Float theRequiredMemory,
769 const std::string& theHolderEntry)
771 CORBA::Float aInitialMemorySize = GetMemorySize();
772 TColoredPrs3dHolderMap aHolder2PrsToBeDeletedMap;
773 SelectPrs3dToBeDeleted(theRequiredMemory, theHolderEntry, myHolderMap, aHolder2PrsToBeDeletedMap);
774 TColoredPrs3dHolderMap::const_iterator aHolderIter = aHolder2PrsToBeDeletedMap.begin();
775 TColoredPrs3dHolderMap::const_iterator anEndHolderIter = aHolder2PrsToBeDeletedMap.end();
776 for(; aHolderIter != anEndHolderIter; aHolderIter++){
777 const std::string aHolderEntry = aHolderIter->first;
778 TColoredPrs3dHolderMap::iterator anHolderMapIter = myHolderMap.find(aHolderEntry);
779 if(anHolderMapIter != myHolderMap.end()){
780 TLastVisitedPrsList& aLastVisitedPrsList = anHolderMapIter->second;
782 const TLastVisitedPrsList& aPrsToBeDeletedList = aHolderIter->second;
783 TLastVisitedPrsList::const_iterator anIter = aPrsToBeDeletedList.begin();
784 TLastVisitedPrsList::const_iterator aEndIter = aPrsToBeDeletedList.end();
785 for(; anIter != aEndIter; anIter++){
786 TPrs3dPtr aPrs3d = *anIter;
787 ErasePrs3d(aLastVisitedPrsList, aPrs3d);
791 CORBA::Float aCurrentMemory = GetMemorySize();
792 return (aInitialMemorySize - aCurrentMemory >= theRequiredMemory);
796 //----------------------------------------------------------------------------
798 VISU::ColoredPrs3dCache_i
803 MESSAGE_BEGIN(std::endl << "--------------CACHE-----------------" );
804 MESSAGE_ADD(std::endl << "Cache memory - " << GetMemorySize() << " Mb" );
805 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
806 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
807 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
808 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
809 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
810 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
812 MESSAGE_ADD(std::endl << "--------------------------" );
813 MESSAGE_ADD(std::endl << "Holder - " << aHolderIter->first.c_str() );
814 MESSAGE_ADD(std::endl << "Size - " << aPrsList.size() );
815 for(; aPrsIter != aPrsIterEnd; aPrsIter++)
816 if(TPrs3dPtr aPrs3d = *aPrsIter)
818 MESSAGE_ADD(std::endl << aPrs3d << " (" << aPrs3d->GetMemorySize() << " Mb)");
819 if(aPrsIter == aPrsList.begin())
820 MESSAGE_ADD( " (device)" );
823 MESSAGE_END(std::endl << "------------------------------------" );
828 //----------------------------------------------------------------------------
830 VISU::ColoredPrs3dCache_i
831 ::RemoveHolder(VISU::ColoredPrs3dHolder_i* theHolder)
833 TColoredPrs3dHolderMap::iterator anIter = myHolderMap.find(theHolder->GetEntry());
834 if(anIter != myHolderMap.end())
835 myHolderMap.erase(anIter);
838 //----------------------------------------------------------------------------
840 VISU::ColoredPrs3dCache_i
841 ::ToStream(std::ostringstream& theStr)
843 Storable::DataToStream( theStr, "myMemoryMode", GetMemoryMode() );
844 Storable::DataToStream( theStr, "myLimitedMemory", GetLimitedMemory() );
847 //---------------------------------------------------------------
849 VISU::ColoredPrs3dCache_i
850 ::Restore(SALOMEDS::SObject_ptr theSObject,
851 const Storable::TRestoringMap& theMap)
853 SetMemoryMode( (VISU::ColoredPrs3dCache::MemoryMode)VISU::Storable::FindValue( theMap, "myMemoryMode" ).toInt() );
854 SetLimitedMemory( VISU::Storable::FindValue( theMap, "myLimitedMemory" ).toInt() );
859 //---------------------------------------------------------------
861 VISU::ColoredPrs3dCache_i
862 ::StorableEngine(SALOMEDS::SObject_ptr theSObject,
863 const Storable::TRestoringMap& theMap,
864 const std::string& thePrefix,
865 CORBA::Boolean theIsMultiFile)
867 SALOMEDS::Study_var aStudy = theSObject->GetStudy();
868 VISU::ColoredPrs3dCache_i* aCache = new VISU::ColoredPrs3dCache_i(aStudy, false);
869 return aCache->Restore(theSObject, theMap);