1 // Copyright (C) 2007-2011 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"
42 #include "VISU_Tools.h"
44 #include "SALOME_Event.h"
46 #include "VTKViewer_Algorithm.h"
47 #include "SVTK_Functor.h"
48 #include "SVTK_ViewWindow.h"
50 #include "SUIT_ResourceMgr.h"
52 #include <vtkRenderWindow.h>
56 #include "utilities.h"
59 static int MYDEBUG = 0;
61 static int MYDEBUG = 0;
68 //----------------------------------------------------------------------------
71 IsSameField(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
72 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
74 return thePrs3dInput.myResult->_is_equivalent(theReferenceInput.myResult) &&
75 thePrs3dInput.myEntity == theReferenceInput.myEntity &&
76 !strcmp(thePrs3dInput.myFieldName.in(), theReferenceInput.myFieldName.in());
80 //----------------------------------------------------------------------------
83 IsSameTimeStamp(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
84 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
86 return IsSameField(theReferenceInput, thePrs3dInput) &&
87 thePrs3dInput.myTimeStampNumber == theReferenceInput.myTimeStampNumber;
91 //----------------------------------------------------------------------------
93 FindSameFieldPrs(const VISU::TColoredPrs3dHolderMap& theHolderMap,
94 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
95 VISU::VISUType theType)
97 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
98 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
99 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
100 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
101 VISU::TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
102 VISU::TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
103 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
104 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
105 if(aPrs3d->GetType() != theType)
107 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
108 if(IsSameField(theInput, anInput))
116 //----------------------------------------------------------------------------
118 EstimateMemorySize(const VISU::TColoredPrs3dHolderMap& theHolderMap,
119 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
120 VISU::VISUType theType,
121 const size_t theRawEstimatedMemorySize)
123 VISU::ColoredPrs3d_i* aPrs3d = FindSameFieldPrs(theHolderMap, theInput, theType);
125 return aPrs3d->GetMemorySize();
126 return CORBA::Float(theRawEstimatedMemorySize/(1024.0*1024.0)); // convert to Mb
130 //----------------------------------------------------------------------------
132 SelectPrs3dToBeDeleted(CORBA::Float theRequiredMemory,
133 const std::string& theActiveHolderEntry,
134 const VISU::TColoredPrs3dHolderMap& theHolderMap,
135 VISU::TColoredPrs3dHolderMap& theColoredPrs3dHolderMap)
137 if( theRequiredMemory < 1.0 / VTK_LARGE_FLOAT )
140 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
141 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
143 // To calculate the maximum length of the cache history among all holders
145 for( ; aHolderIter != aHolderIterEnd; aHolderIter++ ){
146 if( aHolderIter->first == theActiveHolderEntry )
148 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
149 anIteration = qMax( (int)aPrsList.size() - 1, anIteration );
152 // To estimate what amount of memory can be obtained
153 // by cleaning of non-active holder's presentation
154 CORBA::Float aGatheredMemory = 0.0;
155 for(; anIteration > 0; anIteration--){ // To take into account only non-devices
156 aHolderIter = theHolderMap.begin();
157 for(; aHolderIter != aHolderIterEnd; aHolderIter++ ){
158 const std::string& aHolderEntry = aHolderIter->first;
159 if( aHolderEntry == theActiveHolderEntry )
161 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
162 if( anIteration < aPrsList.size() ){
163 VISU::TPrs3dPtr aPrs3d = aPrsList[anIteration];
164 aGatheredMemory += aPrs3d->GetMemorySize();
165 theColoredPrs3dHolderMap[aHolderEntry].push_back(aPrs3d);
166 if( aGatheredMemory > theRequiredMemory )
172 // To estimate what amount of memory can be obtained
173 // by cleaning of active holder's presentation
174 if( theActiveHolderEntry != "" ){
175 aHolderIter = theHolderMap.find( theActiveHolderEntry );
176 if(aHolderIter == theHolderMap.end())
179 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
181 // To prefere "move" action instead of destroy / create presentation
182 if(aPrsList.back()->GetMemorySize() >= theRequiredMemory)
185 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIter = aPrsList.rbegin();
186 // Do not porcess first item to avoid of the device destruction
187 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIterEnd = aPrsList.rend()++;
188 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
189 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
190 aGatheredMemory += aPrs3d->GetMemorySize();
191 theColoredPrs3dHolderMap[theActiveHolderEntry].push_back(aPrs3d);
192 if( aGatheredMemory > theRequiredMemory )
201 //----------------------------------------------------------------------------
203 ErasePrs3d(VISU::TLastVisitedPrsList& thePrsList,
204 const VISU::TPrs3dPtr& thePrs3d)
206 VISU::TLastVisitedPrsList::iterator anIter = thePrsList.begin();
207 VISU::TLastVisitedPrsList::iterator aEndIter = thePrsList.end();
208 for(; anIter != aEndIter; anIter++){
209 VISU::TPrs3dPtr aPrs3d = *anIter;
210 if(aPrs3d == thePrs3d)
211 thePrsList.erase(anIter);
217 //----------------------------------------------------------------------------
218 VISU::ColoredPrs3dCache_i
219 ::ColoredPrs3dCache_i(SALOMEDS::Study_ptr theStudy,
220 bool thePublishInStudy):
223 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::ColoredPrs3dCache_i - this = "<<this);
224 SetStudyDocument(theStudy);
226 SetName(GetFolderName(), false);
228 if( thePublishInStudy )
230 CORBA::String_var anIOR = GetID();
231 SALOMEDS::SComponent_var aSComponent = VISU::FindOrCreateVisuComponent(theStudy);
232 CORBA::String_var aFatherEntry = aSComponent->GetID();
233 CreateAttributes(GetStudyDocument(), aFatherEntry.in(), "", anIOR.in(), GetName(), "", "", true);
236 SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
238 int aMemoryMode = aResourceMgr->integerValue( "VISU", "cache_memory_mode", 0 );
239 SetMemoryMode( aMemoryMode == 0 ? VISU::ColoredPrs3dCache::MINIMAL : VISU::ColoredPrs3dCache::LIMITED );
241 float aLimitedMemory = aResourceMgr->doubleValue( "VISU", "cache_memory_limit", 1024.0 );
242 SetLimitedMemory( aLimitedMemory );
246 //----------------------------------------------------------------------------
247 VISU::ColoredPrs3dCache_i
248 ::~ColoredPrs3dCache_i()
250 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::~ColoredPrs3dCache_i - this = "<<this);
254 //----------------------------------------------------------------------------
255 const string VISU::ColoredPrs3dCache_i::myComment = "COLOREDPRS3DCACHE";
258 VISU::ColoredPrs3dCache_i
261 return myComment.c_str();
265 //----------------------------------------------------------------------------
267 VISU::ColoredPrs3dCache_i
270 CORBA::Float aMemoryUsed = 0.0;
271 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
272 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
273 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
274 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
275 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
276 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
277 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
278 if(TPrs3dPtr aPrs3d = *aPrsIter)
279 aMemoryUsed += aPrs3d->GetMemorySize();
286 //----------------------------------------------------------------------------
288 VISU::ColoredPrs3dCache_i
289 ::GetDeviceMemorySize()
291 CORBA::Float aMemoryUsed = 0.0;
292 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
293 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
294 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
295 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
296 if(TPrs3dPtr aPrs3d = aPrsList.front())
297 aMemoryUsed += aPrs3d->GetMemorySize();
303 //----------------------------------------------------------------------------
305 VISU::ColoredPrs3dCache_i
306 ::IsPossible(VISU::VISUType theType,
307 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
308 CORBA::Float& theRequiredMemory,
309 const std::string theHolderEntry)
311 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
312 if(aRawEstimatedMemorySize > 0){
313 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
314 CORBA::Float aMemoryUsed = GetMemorySize();
315 CORBA::Float aMemoryLimit = GetLimitedMemory();
316 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
319 aRawEstimatedMemorySize);
321 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
324 theRequiredMemory = aMemoryNeeded - ( aMemoryLimit - aMemoryUsed );
325 TColoredPrs3dHolderMap aColoredPrs3dHolderMap;
326 return SelectPrs3dToBeDeleted(theRequiredMemory,
329 aColoredPrs3dHolderMap);
332 return aRawEstimatedMemorySize > 0;
336 //----------------------------------------------------------------------------
337 VISU::ColoredPrs3dCache::EnlargeType
338 VISU::ColoredPrs3dCache_i
339 ::GetRequiredMemory(VISU::VISUType theType,
340 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
341 CORBA::Float& theRequiredMemory)
343 VISU::ColoredPrs3dCache::EnlargeType anEnlargeType = VISU::ColoredPrs3dCache::NO_ENLARGE;
345 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
346 if(aRawEstimatedMemorySize > 0){
347 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
348 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
349 CORBA::Float aMemoryLimit = GetLimitedMemory();
350 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
353 aRawEstimatedMemorySize);
354 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
355 return anEnlargeType;
357 theRequiredMemory = int( aMemoryUsed + aMemoryNeeded ) + 1;
359 size_t aMb = 1024 * 1024;
360 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(8192*(double)aMb)) / double(aMb);
361 anEnlargeType = aMemoryNeeded < aFreeMemory ?
362 VISU::ColoredPrs3dCache::ENLARGE : VISU::ColoredPrs3dCache::IMPOSSIBLE;
365 return anEnlargeType;
369 //----------------------------------------------------------------------------
370 VISU::ColoredPrs3dCache_i*
371 VISU::ColoredPrs3dCache_i
372 ::GetInstance_i(SALOMEDS::Study_ptr theStudy)
374 std::string aFolderName = VISU::ColoredPrs3dCache_i::GetFolderName();
375 SALOMEDS::SObject_var aSObject = theStudy->FindObject(aFolderName.c_str());
376 if (CORBA::is_nil(aSObject)) {
377 aSObject = theStudy->FindObject("3D Cache System");
378 if (!CORBA::is_nil(aSObject)) {
379 SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder();
380 SALOMEDS::GenericAttribute_var anAttr = aBuilder->FindOrCreateAttribute( aSObject, "AttributeName" );
381 SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr );
382 aNameAttr->SetValue( GetFolderName().c_str() );
385 if(!CORBA::is_nil(aSObject)){
386 CORBA::Object_var anObject = aSObject->GetObject();
387 VISU::ColoredPrs3dCache_var aCache = VISU::ColoredPrs3dCache::_narrow(anObject);
388 if(!CORBA::is_nil(aCache))
389 return dynamic_cast<VISU::ColoredPrs3dCache_i*>(GetServant(aCache).in());
392 return new VISU::ColoredPrs3dCache_i(theStudy);
396 VISU::ColoredPrs3dCache_ptr
397 VISU::ColoredPrs3dCache_i
398 ::GetInstance(SALOMEDS::Study_ptr theStudy)
400 VISU::ColoredPrs3dCache_i* aServant = GetInstance_i(theStudy);
401 VISU::ColoredPrs3dCache_var anObject = aServant->_this();
402 return anObject._retn();
406 //----------------------------------------------------------------------------
407 VISU::ColoredPrs3dHolder_ptr
408 VISU::ColoredPrs3dCache_i
409 ::CreateHolder(VISU::VISUType theType,
410 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
412 if(MYDEBUG) MESSAGE ("CreateHolder "<<theType);
413 CORBA::Float aRequiredMemory = 0.0;
414 if(IsPossible(theType, theInput, aRequiredMemory, "")){
415 if(VISU::ColoredPrs3d_i* aColoredPrs3d = CreateColoredPrs3d(theType, theInput)){
416 VISU::ColoredPrs3dHolder_i* aHolder = new VISU::ColoredPrs3dHolder_i(*this);
417 std::string aComment = std::string("myComment=") + aColoredPrs3d->GetComment();
418 std::string aName = (const char*)aColoredPrs3d->GenerateName().toLatin1();
419 aHolder->PublishInStudy(aName, aColoredPrs3d->GetIconName(), aComment);
420 RegisterInHolder(aColoredPrs3d, aHolder->GetEntry());
421 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
422 ClearMemory( aRequiredMemory, aHolder->GetEntry() );
423 return aHolder->_this();
426 return VISU::ColoredPrs3dHolder::_nil();
430 //----------------------------------------------------------------------------
432 VISU::ColoredPrs3dCache_i
433 ::SetMemoryMode(VISU::ColoredPrs3dCache::MemoryMode theMode)
435 VISU::ColoredPrs3dCache::MemoryMode aCurrentMode = GetMemoryMode();
437 if( aCurrentMode == VISU::ColoredPrs3dCache::LIMITED &&
438 theMode == VISU::ColoredPrs3dCache::MINIMAL )
443 myMemoryMode = theMode;
444 GetStudyDocument()->Modified();
447 VISU::ColoredPrs3dCache::MemoryMode
448 VISU::ColoredPrs3dCache_i
455 //----------------------------------------------------------------------------
457 VISU::ColoredPrs3dCache_i
458 ::SetLimitedMemory(CORBA::Float theMemorySize)
460 if( fabs( myLimitedMemory - theMemorySize ) < 1 / VTK_LARGE_FLOAT )
463 size_t aMb = 1024 * 1024;
464 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(8192*(double)aMb)) / double(aMb);
465 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
466 CORBA::Float aMemoryNeeded = theMemorySize - aMemoryUsed;
467 if( aMemoryNeeded > aFreeMemory )
470 ClearCache(theMemorySize);
471 myLimitedMemory = theMemorySize;
472 GetStudyDocument()->Modified();
476 VISU::ColoredPrs3dCache_i
479 return myLimitedMemory;
484 VISU::ColoredPrs3dCache_i
487 CORBA::String_var anIOR = GetID();
488 SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectIOR(anIOR.in());
489 VISU::RemoveFromStudy(aSObject, false, true);
494 VISU::ColoredPrs3dCache_i
497 //return "3D Cache System";
498 return "Presentations";
501 //----------------------------------------------------------------------------
502 VISU::ColoredPrs3d_i*
503 VISU::ColoredPrs3dCache_i
504 ::CreateColoredPrs3d(VISU::VISUType theType,
505 VISU::ColoredPrs3dHolder::BasicInput theInput)
507 VISU::ColoredPrs3d_i* aPrs3d = VISU::CreatePrs3d_i(theType, GetStudyDocument(), ColoredPrs3d_i::ERegisterInCache);
508 aPrs3d->SetResultObject( theInput.myResult );
509 aPrs3d->SetMeshName( theInput.myMeshName );
510 aPrs3d->SetEntity( theInput.myEntity );
511 aPrs3d->SetFieldName( theInput.myFieldName );
512 aPrs3d->SetTimeStampNumber( theInput.myTimeStampNumber );
513 if(aPrs3d->Apply( false ))
519 //----------------------------------------------------------------------------
520 VISU::ColoredPrs3d_i*
521 VISU::ColoredPrs3dCache_i
522 ::RegisterInHolder(VISU::ColoredPrs3d_i* thePrs3d,
523 const std::string& theHolderEntry)
525 if(MYDEBUG) MESSAGE("RegisterInHolder "<<theHolderEntry.c_str()<<" "<<thePrs3d);
527 TPrs3dPtr aPrs3d(thePrs3d);
528 myHolderMap[theHolderEntry].push_front(aPrs3d);
529 thePrs3d->SetHolderEntry( theHolderEntry );
530 thePrs3d->UnRegister();
536 //----------------------------------------------------------------------------
537 VISU::ColoredPrs3d_i*
538 VISU::ColoredPrs3dCache_i
539 ::CreatePrs(VISU::VISUType theType,
540 VISU::ColoredPrs3dHolder::BasicInput theInput,
541 VISU::ColoredPrs3dHolder_i* theHolder)
543 return RegisterInHolder(CreateColoredPrs3d(theType, theInput),
544 theHolder->GetEntry());
548 //----------------------------------------------------------------------------
549 VISU::TLastVisitedPrsList&
550 VISU::ColoredPrs3dCache_i
551 ::GetLastVisitedPrsList(VISU::ColoredPrs3dHolder_i* theHolder)
553 return myHolderMap[theHolder->GetEntry()];
557 //----------------------------------------------------------------------------
559 VISU::ColoredPrs3dCache_i
560 ::GetLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder)
562 const TLastVisitedPrsList& aList = GetLastVisitedPrsList(theHolder);
563 if(MYDEBUG) MESSAGE("GetLastVisitedPrs " << theHolder->GetEntry().c_str() << " " << aList.size() );
565 return aList.front();
566 return VISU::TPrs3dPtr();
570 //----------------------------------------------------------------------------
572 VISU::ColoredPrs3dCache_i
573 ::FindPrsByInput(TLastVisitedPrsList& theLastVisitedPrsList,
574 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
576 TLastVisitedPrsList::iterator anIter = theLastVisitedPrsList.begin();
577 TLastVisitedPrsList::iterator aEndIter = theLastVisitedPrsList.end();
578 for(; anIter != aEndIter; anIter++){
579 TPrs3dPtr aPrs3d = *anIter;
580 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
581 if(IsSameTimeStamp(theInput, anInput)){
582 theLastVisitedPrsList.erase(anIter);
586 return VISU::TPrs3dPtr();
589 struct TFindActorEvent: public SALOME_Event
591 VISU::TPrs3dPtr myPrs3d;
592 SVTK_ViewWindow* myViewWindow;
594 typedef VISU_Actor* TResult;
597 TFindActorEvent(VISU::TPrs3dPtr thePrs3d, SVTK_ViewWindow* theViewWindow):
599 myViewWindow(theViewWindow),
607 myResult = VISU::FindActor(myViewWindow, myPrs3d);
611 struct TAddActorEvent: public SALOME_Event
614 SVTK_ViewWindow* myViewWindow;
616 TAddActorEvent(VISU_Actor* theActor, SVTK_ViewWindow* theViewWindow):
618 myViewWindow(theViewWindow)
620 virtual void Execute(){
621 myViewWindow->AddActor(myActor);
625 struct TRenderEvent: public SALOME_Event
627 SVTK_ViewWindow* myViewWindow;
629 TRenderEvent(SVTK_ViewWindow* theViewWindow):
630 myViewWindow(theViewWindow)
632 virtual void Execute(){
633 myViewWindow->getRenderWindow()->Render();
637 //----------------------------------------------------------------------------
639 VISU::ColoredPrs3dCache_i
640 ::UpdateLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder,
641 VISU::ColoredPrs3d_i* thePrs,
642 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
643 VISU::View3D_ptr theView3D)
645 if(MYDEBUG) MESSAGE( "VISU::ColoredPrs3dCache_i::UpdateLastVisitedPrs" );
648 TPrs3dPtr aLastVisitedPrs3d = GetLastVisitedPrs(theHolder);
649 TLastVisitedPrsList& aLastVisitedPrsList = GetLastVisitedPrsList(theHolder);
650 bool anIsCheckPossible = GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED;
651 std::string aHolderEntry = theHolder->GetEntry();
652 VISU::VISUType aPrsType = theHolder->GetPrsType();
653 CORBA::Float aRequiredMemory = 0.0;
654 if(aPrs3d = FindPrsByInput(aLastVisitedPrsList, theInput)){
655 aLastVisitedPrsList.push_front(aPrs3d);
656 if(MYDEBUG) MESSAGE( "FindPrsByInput " << aPrs3d );
657 }else if(anIsCheckPossible && IsPossible(aPrsType, theInput, aRequiredMemory, aHolderEntry)){
658 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
659 ClearMemory(aRequiredMemory, aHolderEntry);
660 aPrs3d = CreatePrs(aPrsType, theInput, theHolder);
661 if(MYDEBUG) MESSAGE( "Created " << aPrs3d );
663 aPrs3d = aLastVisitedPrsList.back();
664 aPrs3d->SetResultObject(theInput.myResult);
665 aPrs3d->SetMeshName(theInput.myMeshName);
666 aPrs3d->SetEntity(theInput.myEntity);
667 aPrs3d->SetFieldName(theInput.myFieldName);
668 aPrs3d->SetTimeStampNumber(theInput.myTimeStampNumber);
669 aLastVisitedPrsList.pop_back();
670 aLastVisitedPrsList.push_front(aPrs3d);
671 if(MYDEBUG) MESSAGE( "Move only " << aPrs3d );
673 //if(MYDEBUG) PrintCache();
675 aPrs3d->SameAs(thePrs);
677 // rnv: fix for the 20870: EDF 1410 VISU: Anomaly in the Gauss point representation.
678 // special case for the "Gauss Points" presentation,
679 // update the LookupTable in the mapper, after assign properties of the presentation
680 // using SameAs(...) method.
681 VISU::GaussPoints_i* gPoints = dynamic_cast<VISU::GaussPoints_i*>( aPrs3d.get() );
683 gPoints->UpdateMapperLookupTable();
686 // special case for deformed shape
687 VISU::DeformedShapeAndScalarMap_i* dShape =
688 dynamic_cast<VISU::DeformedShapeAndScalarMap_i*>( aPrs3d.get() );
689 if ( dShape && dShape->GetScalarTimeStampNumber() != theInput.myTimeStampNumber )
691 dShape->SetScalarField( dShape->GetScalarEntity(),
692 dShape->GetScalarFieldName(), theInput.myTimeStampNumber );
695 if(CORBA::is_nil(theView3D))
698 PortableServer::ServantBase_var aServant = GetServant(theView3D);
699 if(VISU::View3D_i* aView3d = dynamic_cast<VISU::View3D_i*>(aServant.in())){
700 if(SUIT_ViewWindow* aView = aView3d->GetViewWindow()){
701 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aView)){
702 // Find actor that corresponds to the holder
703 VISU_Actor* anActor = ProcessEvent(new TFindActorEvent(aLastVisitedPrs3d,aViewWindow));
704 //VISU_Actor* anActor = VISU::FindActor(aViewWindow, aLastVisitedPrs3d);
706 // If the holder was erased from view then do nothing
707 if(anActor && !anActor->GetVisibility())
712 anActor = aLastVisitedPrs3d->CreateActor();
713 ProcessVoidEvent(new TAddActorEvent(anActor,aViewWindow));
714 //aViewWindow->AddActor(anActor);
715 anActor->SetVisibility(true);
716 SetVisibilityState( aHolderEntry, Qtx::ShownState);
719 if(aPrs3d != aLastVisitedPrs3d)
721 // To erase non active presentation
722 aLastVisitedPrs3d->SetActiveState(false);
724 anActor->SetVisibility(false);
726 // To find the new one that corresponds to fresh presentation
727 VISU_Actor* aNewActor = ProcessEvent(new TFindActorEvent(aPrs3d,aViewWindow));
728 //VISU_Actor* aNewActor = VISU::FindActor(aViewWindow, aPrs3d);
730 aNewActor = aPrs3d->CreateActor();
731 ProcessVoidEvent(new TAddActorEvent(aNewActor,aViewWindow));
732 //aViewWindow->AddActor(aNewActor);
734 aNewActor->SetVisibility(true);
735 SetVisibilityState( aHolderEntry, Qtx::ShownState);
737 aNewActor->DeepCopy(anActor);
739 aPrs3d->SetActiveState(true);
742 aPrs3d->UpdateActors();
743 ProcessVoidEvent(new TRenderEvent(aViewWindow));
744 //aViewWindow->getRenderWindow()->Render();
749 }catch(std::exception& exc){
750 INFOS("Follow exception was occured :\n"<<exc.what());
752 INFOS("Unknown exception was occured!");
759 //----------------------------------------------------------------------------
761 VISU::ColoredPrs3dCache_i
762 ::ClearCache(float theMemory)
764 CORBA::Float aCurrentMemory = GetMemorySize();
765 ClearMemory( aCurrentMemory - theMemory, "" );
769 //----------------------------------------------------------------------------
771 VISU::ColoredPrs3dCache_i
772 ::ClearMemory(CORBA::Float theRequiredMemory,
773 const std::string& theHolderEntry)
775 CORBA::Float aInitialMemorySize = GetMemorySize();
776 TColoredPrs3dHolderMap aHolder2PrsToBeDeletedMap;
777 SelectPrs3dToBeDeleted(theRequiredMemory, theHolderEntry, myHolderMap, aHolder2PrsToBeDeletedMap);
778 TColoredPrs3dHolderMap::const_iterator aHolderIter = aHolder2PrsToBeDeletedMap.begin();
779 TColoredPrs3dHolderMap::const_iterator anEndHolderIter = aHolder2PrsToBeDeletedMap.end();
780 for(; aHolderIter != anEndHolderIter; aHolderIter++){
781 const std::string aHolderEntry = aHolderIter->first;
782 TColoredPrs3dHolderMap::iterator anHolderMapIter = myHolderMap.find(aHolderEntry);
783 if(anHolderMapIter != myHolderMap.end()){
784 TLastVisitedPrsList& aLastVisitedPrsList = anHolderMapIter->second;
786 const TLastVisitedPrsList& aPrsToBeDeletedList = aHolderIter->second;
787 TLastVisitedPrsList::const_iterator anIter = aPrsToBeDeletedList.begin();
788 TLastVisitedPrsList::const_iterator aEndIter = aPrsToBeDeletedList.end();
789 for(; anIter != aEndIter; anIter++){
790 TPrs3dPtr aPrs3d = *anIter;
791 ErasePrs3d(aLastVisitedPrsList, aPrs3d);
795 CORBA::Float aCurrentMemory = GetMemorySize();
796 return (aInitialMemorySize - aCurrentMemory >= theRequiredMemory);
800 //----------------------------------------------------------------------------
802 VISU::ColoredPrs3dCache_i
807 MESSAGE_BEGIN(std::endl << "--------------CACHE-----------------" );
808 MESSAGE_ADD(std::endl << "Cache memory - " << GetMemorySize() << " Mb" );
809 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
810 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
811 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
812 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
813 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
814 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
816 MESSAGE_ADD(std::endl << "--------------------------" );
817 MESSAGE_ADD(std::endl << "Holder - " << aHolderIter->first.c_str() );
818 MESSAGE_ADD(std::endl << "Size - " << aPrsList.size() );
819 for(; aPrsIter != aPrsIterEnd; aPrsIter++)
820 if(TPrs3dPtr aPrs3d = *aPrsIter)
822 MESSAGE_ADD(std::endl << aPrs3d << " (" << aPrs3d->GetMemorySize() << " Mb)");
823 if(aPrsIter == aPrsList.begin())
824 MESSAGE_ADD( " (device)" );
827 MESSAGE_END(std::endl << "------------------------------------" );
832 //----------------------------------------------------------------------------
834 VISU::ColoredPrs3dCache_i
835 ::RemoveHolder(VISU::ColoredPrs3dHolder_i* theHolder)
837 TColoredPrs3dHolderMap::iterator anIter = myHolderMap.find(theHolder->GetEntry());
838 if(anIter != myHolderMap.end())
839 myHolderMap.erase(anIter);
842 //----------------------------------------------------------------------------
844 VISU::ColoredPrs3dCache_i
845 ::ToStream(std::ostringstream& theStr)
847 Storable::DataToStream( theStr, "myMemoryMode", GetMemoryMode() );
848 Storable::DataToStream( theStr, "myLimitedMemory", GetLimitedMemory() );
851 //---------------------------------------------------------------
853 VISU::ColoredPrs3dCache_i
854 ::Restore(SALOMEDS::SObject_ptr theSObject,
855 const Storable::TRestoringMap& theMap)
857 SetMemoryMode( (VISU::ColoredPrs3dCache::MemoryMode)VISU::Storable::FindValue( theMap, "myMemoryMode" ).toInt() );
858 SetLimitedMemory( VISU::Storable::FindValue( theMap, "myLimitedMemory" ).toInt() );
863 //---------------------------------------------------------------
865 VISU::ColoredPrs3dCache_i
866 ::StorableEngine(SALOMEDS::SObject_ptr theSObject,
867 const Storable::TRestoringMap& theMap,
868 const std::string& thePrefix,
869 CORBA::Boolean theIsMultiFile)
871 SALOMEDS::Study_var aStudy = theSObject->GetStudy();
872 VISU::ColoredPrs3dCache_i* aCache = new VISU::ColoredPrs3dCache_i(aStudy, false);
873 return aCache->Restore(theSObject, theMap);