1 // VISU OBJECT : interactive object for VISU entities implementation
3 // Copyright (C) 2003 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 // File : VISU_ColoredPrs3dCache_i.cc
24 // Author : Oleg UVAROV
27 #include "VISU_ColoredPrs3dCache_i.hh"
29 #include "VISU_ColoredPrs3dHolder_i.hh"
30 #include "VISU_ColoredPrs3dFactory.hh"
32 #include "VISU_ViewManager_i.hh"
33 #include "VISU_View_i.hh"
34 #include "VISU_Actor.h"
36 #include "VISU_PipeLine.hxx"
38 #include "SALOME_Event.hxx"
40 #include "VTKViewer_Algorithm.h"
41 #include "SVTK_Functor.h"
43 #include "VVTK_ViewWindow.h"
44 #include "SUIT_ResourceMgr.h"
46 #include <vtkRenderWindow.h>
49 static int MYDEBUG = 0;
51 static int MYDEBUG = 0;
56 //----------------------------------------------------------------------------
59 IsSameField(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
60 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
62 return thePrs3dInput.myResult->_is_equivalent(theReferenceInput.myResult) &&
63 thePrs3dInput.myEntity == theReferenceInput.myEntity &&
64 !strcmp(thePrs3dInput.myFieldName.in(), theReferenceInput.myFieldName.in());
68 //----------------------------------------------------------------------------
71 IsSameTimeStamp(const VISU::ColoredPrs3dHolder::BasicInput& theReferenceInput,
72 const VISU::ColoredPrs3dHolder::BasicInput& thePrs3dInput)
74 return IsSameField(theReferenceInput, thePrs3dInput) &&
75 thePrs3dInput.myTimeStampNumber == theReferenceInput.myTimeStampNumber;
79 //----------------------------------------------------------------------------
81 FindSameFieldPrs(const VISU::TColoredPrs3dHolderMap& theHolderMap,
82 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
83 VISU::VISUType theType)
85 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
86 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
87 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
88 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
89 VISU::TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
90 VISU::TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
91 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
92 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
93 if(aPrs3d->GetType() != theType)
95 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
96 if(IsSameField(theInput, anInput))
104 //----------------------------------------------------------------------------
106 EstimateMemorySize(const VISU::TColoredPrs3dHolderMap& theHolderMap,
107 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
108 VISU::VISUType theType,
109 const size_t theRawEstimatedMemorySize)
111 VISU::ColoredPrs3d_i* aPrs3d = FindSameFieldPrs(theHolderMap, theInput, theType);
113 return aPrs3d->GetMemorySize();
114 return CORBA::Float(theRawEstimatedMemorySize/(1024.0*1024.0)); // convert to Mb
118 //----------------------------------------------------------------------------
120 SelectPrs3dToBeDeleted(CORBA::Float theRequiredMemory,
121 const std::string& theActiveHolderEntry,
122 const VISU::TColoredPrs3dHolderMap& theHolderMap,
123 VISU::TColoredPrs3dHolderMap& theColoredPrs3dHolderMap)
125 if( theRequiredMemory < 1.0 / VTK_LARGE_FLOAT )
128 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIter = theHolderMap.begin();
129 VISU::TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = theHolderMap.end();
131 // To calculate the maximum length of the cache history among all holders
133 for( ; aHolderIter != aHolderIterEnd; aHolderIter++ ){
134 if( aHolderIter->first == theActiveHolderEntry )
136 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
137 anIteration = QMAX( aPrsList.size() - 1, anIteration );
140 // To estimate what amount of memory can be obtained
141 // by cleaning of non-active holder's presentation
142 CORBA::Float aGatheredMemory = 0.0;
143 for(; anIteration > 0; anIteration--){ // To take into account only non-devices
144 aHolderIter = theHolderMap.begin();
145 for(; aHolderIter != aHolderIterEnd; aHolderIter++ ){
146 const std::string& aHolderEntry = aHolderIter->first;
147 if( aHolderEntry == theActiveHolderEntry )
149 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
150 if( anIteration < aPrsList.size() ){
151 VISU::TPrs3dPtr aPrs3d = aPrsList[anIteration];
152 aGatheredMemory += aPrs3d->GetMemorySize();
153 theColoredPrs3dHolderMap[aHolderEntry].push_back(aPrs3d);
154 if( aGatheredMemory > theRequiredMemory )
160 // To estimate what amount of memory can be obtained
161 // by cleaning of active holder's presentation
162 if( theActiveHolderEntry != "" ){
163 aHolderIter = theHolderMap.find( theActiveHolderEntry );
164 if(aHolderIter == theHolderMap.end())
167 const VISU::TLastVisitedPrsList& aPrsList = aHolderIter->second;
169 // To prefere "move" action instead of destroy / create presentation
170 if(aPrsList.back()->GetMemorySize() >= theRequiredMemory)
173 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIter = aPrsList.rbegin();
174 // Do not porcess first item to avoid of the device destruction
175 VISU::TLastVisitedPrsList::const_reverse_iterator aPrsIterEnd = aPrsList.rend()++;
176 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
177 VISU::TPrs3dPtr aPrs3d = *aPrsIter;
178 aGatheredMemory += aPrs3d->GetMemorySize();
179 theColoredPrs3dHolderMap[theActiveHolderEntry].push_back(aPrs3d);
180 if( aGatheredMemory > theRequiredMemory )
189 //----------------------------------------------------------------------------
191 ErasePrs3d(VISU::TLastVisitedPrsList& thePrsList,
192 const VISU::TPrs3dPtr& thePrs3d)
194 VISU::TLastVisitedPrsList::iterator anIter = thePrsList.begin();
195 VISU::TLastVisitedPrsList::iterator aEndIter = thePrsList.end();
196 for(; anIter != aEndIter; anIter++){
197 VISU::TPrs3dPtr aPrs3d = *anIter;
198 if(aPrs3d == thePrs3d)
199 thePrsList.erase(anIter);
205 //----------------------------------------------------------------------------
206 VISU::ColoredPrs3dCache_i
207 ::ColoredPrs3dCache_i(SALOMEDS::Study_ptr theStudy,
208 bool thePublishInStudy):
211 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::ColoredPrs3dCache_i - this = "<<this);
212 SetStudyDocument(theStudy);
214 SetName(GetFolderName(), false);
216 if( thePublishInStudy )
218 CORBA::String_var anIOR = GetID();
219 SALOMEDS::SComponent_var aSComponent = VISU::FindOrCreateVisuComponent(theStudy);
220 CORBA::String_var aFatherEntry = aSComponent->GetID();
221 CreateAttributes(GetStudyDocument(), aFatherEntry.in(), "", anIOR.in(), GetName(), "", "", true);
224 SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
226 int aMemoryMode = aResourceMgr->integerValue( "VISU", "cache_memory_mode", 0 );
227 SetMemoryMode( aMemoryMode == 0 ? VISU::ColoredPrs3dCache::MINIMAL : VISU::ColoredPrs3dCache::LIMITED );
229 float aLimitedMemory = aResourceMgr->doubleValue( "VISU", "cache_memory_limit", 1024.0 );
230 SetLimitedMemory( aLimitedMemory );
234 //----------------------------------------------------------------------------
235 VISU::ColoredPrs3dCache_i
236 ::~ColoredPrs3dCache_i()
238 if(MYDEBUG) MESSAGE("ColoredPrs3dCache_i::~ColoredPrs3dCache_i - this = "<<this);
242 //----------------------------------------------------------------------------
243 const string VISU::ColoredPrs3dCache_i::myComment = "COLOREDPRS3DCACHE";
246 VISU::ColoredPrs3dCache_i
249 return myComment.c_str();
253 //----------------------------------------------------------------------------
255 VISU::ColoredPrs3dCache_i
258 CORBA::Float aMemoryUsed = 0.0;
259 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
260 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
261 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
262 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
263 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
264 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
265 for(; aPrsIter != aPrsIterEnd; aPrsIter++){
266 if(TPrs3dPtr aPrs3d = *aPrsIter)
267 aMemoryUsed += aPrs3d->GetMemorySize();
274 //----------------------------------------------------------------------------
276 VISU::ColoredPrs3dCache_i
277 ::GetDeviceMemorySize()
279 CORBA::Float aMemoryUsed = 0.0;
280 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
281 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
282 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
283 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
284 if(TPrs3dPtr aPrs3d = aPrsList.front())
285 aMemoryUsed += aPrs3d->GetMemorySize();
291 //----------------------------------------------------------------------------
293 VISU::ColoredPrs3dCache_i
294 ::IsPossible(VISU::VISUType theType,
295 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
296 CORBA::Float& theRequiredMemory,
297 const std::string theHolderEntry)
299 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
300 if(aRawEstimatedMemorySize > 0){
301 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
302 CORBA::Float aMemoryUsed = GetMemorySize();
303 CORBA::Float aMemoryLimit = GetLimitedMemory();
304 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
307 aRawEstimatedMemorySize);
309 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
312 theRequiredMemory = aMemoryNeeded - ( aMemoryLimit - aMemoryUsed );
313 TColoredPrs3dHolderMap aColoredPrs3dHolderMap;
314 return SelectPrs3dToBeDeleted(theRequiredMemory,
317 aColoredPrs3dHolderMap);
320 return aRawEstimatedMemorySize > 0;
324 //----------------------------------------------------------------------------
325 VISU::ColoredPrs3dCache::EnlargeType
326 VISU::ColoredPrs3dCache_i
327 ::GetRequiredMemory(VISU::VISUType theType,
328 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
329 CORBA::Float& theRequiredMemory)
331 VISU::ColoredPrs3dCache::EnlargeType anEnlargeType = VISU::ColoredPrs3dCache::NO_ENLARGE;
333 size_t aRawEstimatedMemorySize = VISU::CheckIsPossible(theType, theInput, true);
334 if(aRawEstimatedMemorySize > 0){
335 if(GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED){
336 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
337 CORBA::Float aMemoryLimit = GetLimitedMemory();
338 CORBA::Float aMemoryNeeded = EstimateMemorySize(myHolderMap,
341 aRawEstimatedMemorySize);
342 if( aMemoryUsed + aMemoryNeeded < aMemoryLimit )
343 return anEnlargeType;
345 theRequiredMemory = int( aMemoryUsed + aMemoryNeeded ) + 1;
347 size_t aMb = 1024 * 1024;
348 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(2048*aMb)) / double(aMb);
349 anEnlargeType = aMemoryNeeded < aFreeMemory ?
350 VISU::ColoredPrs3dCache::ENLARGE : VISU::ColoredPrs3dCache::IMPOSSIBLE;
353 return anEnlargeType;
357 //----------------------------------------------------------------------------
358 VISU::ColoredPrs3dCache_i*
359 VISU::ColoredPrs3dCache_i
360 ::GetInstance_i(SALOMEDS::Study_ptr theStudy)
362 std::string aFolderName = VISU::ColoredPrs3dCache_i::GetFolderName();
363 SALOMEDS::SObject_var aSObject = theStudy->FindObject(aFolderName.c_str());
364 if(!CORBA::is_nil(aSObject)){
365 CORBA::Object_var anObject = aSObject->GetObject();
366 VISU::ColoredPrs3dCache_var aCache = VISU::ColoredPrs3dCache::_narrow(anObject);
367 if(!CORBA::is_nil(aCache))
368 return dynamic_cast<VISU::ColoredPrs3dCache_i*>(GetServant(aCache).in());
371 return new VISU::ColoredPrs3dCache_i(theStudy);
375 VISU::ColoredPrs3dCache_ptr
376 VISU::ColoredPrs3dCache_i
377 ::GetInstance(SALOMEDS::Study_ptr theStudy)
379 VISU::ColoredPrs3dCache_i* aServant = GetInstance_i(theStudy);
380 VISU::ColoredPrs3dCache_var anObject = aServant->_this();
381 return anObject._retn();
385 //----------------------------------------------------------------------------
386 VISU::ColoredPrs3dHolder_ptr
387 VISU::ColoredPrs3dCache_i
388 ::CreateHolder(VISU::VISUType theType,
389 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
391 if(MYDEBUG) cout << "CreateHolder " << theType << endl;
392 CORBA::Float aRequiredMemory = 0.0;
393 if(IsPossible(theType, theInput, aRequiredMemory, "")){
394 if(VISU::ColoredPrs3d_i* aColoredPrs3d = CreateColoredPrs3d(theType, theInput)){
395 VISU::ColoredPrs3dHolder_i* aHolder = new VISU::ColoredPrs3dHolder_i(*this);
396 std::string aComment = std::string("myComment=") + aColoredPrs3d->GetComment();
397 std::string aName = aColoredPrs3d->GenerateName().latin1();
398 aHolder->PublishInStudy(aName, aColoredPrs3d->GetIconName(), aComment);
399 RegisterInHolder(aColoredPrs3d, aHolder->GetEntry());
400 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
401 ClearMemory( aRequiredMemory, aHolder->GetEntry() );
402 return aHolder->_this();
405 return VISU::ColoredPrs3dHolder::_nil();
409 //----------------------------------------------------------------------------
411 VISU::ColoredPrs3dCache_i
412 ::SetMemoryMode(VISU::ColoredPrs3dCache::MemoryMode theMode)
414 VISU::ColoredPrs3dCache::MemoryMode aCurrentMode = GetMemoryMode();
416 if( aCurrentMode == VISU::ColoredPrs3dCache::LIMITED &&
417 theMode == VISU::ColoredPrs3dCache::MINIMAL )
422 myMemoryMode = theMode;
423 GetStudyDocument()->Modified();
426 VISU::ColoredPrs3dCache::MemoryMode
427 VISU::ColoredPrs3dCache_i
434 //----------------------------------------------------------------------------
436 VISU::ColoredPrs3dCache_i
437 ::SetLimitedMemory(CORBA::Float theMemorySize)
439 if( fabs( myLimitedMemory - theMemorySize ) < 1 / VTK_LARGE_FLOAT )
442 size_t aMb = 1024 * 1024;
443 double aFreeMemory = double(VISU_PipeLine::GetAvailableMemory(2048*aMb)) / double(aMb);
444 CORBA::Float aMemoryUsed = GetDeviceMemorySize();
445 CORBA::Float aMemoryNeeded = theMemorySize - aMemoryUsed;
446 if( aMemoryNeeded > aFreeMemory )
449 ClearCache(theMemorySize);
450 myLimitedMemory = theMemorySize;
451 GetStudyDocument()->Modified();
455 VISU::ColoredPrs3dCache_i
458 return myLimitedMemory;
463 VISU::ColoredPrs3dCache_i
466 CORBA::String_var anIOR = GetID();
467 SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectIOR(anIOR.in());
468 VISU::RemoveFromStudy(aSObject, false, true);
473 VISU::ColoredPrs3dCache_i
476 return "3D Cache System";
479 //----------------------------------------------------------------------------
480 VISU::ColoredPrs3d_i*
481 VISU::ColoredPrs3dCache_i
482 ::CreateColoredPrs3d(VISU::VISUType theType,
483 VISU::ColoredPrs3dHolder::BasicInput theInput)
485 VISU::ColoredPrs3d_i* aPrs3d = VISU::CreatePrs3d_i(theType, GetStudyDocument(), ColoredPrs3d_i::ERegisterInCache);
486 aPrs3d->SetResultObject( theInput.myResult );
487 aPrs3d->SetMeshName( theInput.myMeshName );
488 aPrs3d->SetEntity( theInput.myEntity );
489 aPrs3d->SetFieldName( theInput.myFieldName );
490 aPrs3d->SetTimeStampNumber( theInput.myTimeStampNumber );
491 if(aPrs3d->Apply( false ))
497 //----------------------------------------------------------------------------
498 VISU::ColoredPrs3d_i*
499 VISU::ColoredPrs3dCache_i
500 ::RegisterInHolder(VISU::ColoredPrs3d_i* thePrs3d,
501 const std::string& theHolderEntry)
503 if(MYDEBUG) cout << "RegisterInHolder " << theHolderEntry.c_str() << " " << thePrs3d << endl;
505 TPrs3dPtr aPrs3d(thePrs3d);
506 myHolderMap[theHolderEntry].push_front(aPrs3d);
507 thePrs3d->SetHolderEntry( theHolderEntry );
514 //----------------------------------------------------------------------------
515 VISU::ColoredPrs3d_i*
516 VISU::ColoredPrs3dCache_i
517 ::CreatePrs(VISU::VISUType theType,
518 VISU::ColoredPrs3dHolder::BasicInput theInput,
519 VISU::ColoredPrs3dHolder_i* theHolder)
521 return RegisterInHolder(CreateColoredPrs3d(theType, theInput),
522 theHolder->GetEntry());
526 //----------------------------------------------------------------------------
527 VISU::TLastVisitedPrsList&
528 VISU::ColoredPrs3dCache_i
529 ::GetLastVisitedPrsList(VISU::ColoredPrs3dHolder_i* theHolder)
531 return myHolderMap[theHolder->GetEntry()];
535 //----------------------------------------------------------------------------
537 VISU::ColoredPrs3dCache_i
538 ::GetLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder)
540 const TLastVisitedPrsList& aList = GetLastVisitedPrsList(theHolder);
541 if(MYDEBUG) cout << "GetLastVisitedPrs " << theHolder->GetEntry().c_str() << " " << aList.size() << endl;
543 return aList.front();
544 return VISU::TPrs3dPtr();
548 //----------------------------------------------------------------------------
550 VISU::ColoredPrs3dCache_i
551 ::FindPrsByInput(TLastVisitedPrsList& theLastVisitedPrsList,
552 const VISU::ColoredPrs3dHolder::BasicInput& theInput)
554 TLastVisitedPrsList::iterator anIter = theLastVisitedPrsList.begin();
555 TLastVisitedPrsList::iterator aEndIter = theLastVisitedPrsList.end();
556 for(; anIter != aEndIter; anIter++){
557 TPrs3dPtr aPrs3d = *anIter;
558 VISU::ColoredPrs3dHolder::BasicInput_var anInput = aPrs3d->GetBasicInput();
559 if(IsSameTimeStamp(theInput, anInput)){
560 theLastVisitedPrsList.erase(anIter);
564 return VISU::TPrs3dPtr();
567 struct TFindActorEvent: public SALOME_Event
569 VISU::TPrs3dPtr myPrs3d;
570 SVTK_ViewWindow* myViewWindow;
572 typedef VISU_Actor* TResult;
575 TFindActorEvent(VISU::TPrs3dPtr thePrs3d, SVTK_ViewWindow* theViewWindow):
577 myViewWindow(theViewWindow),
585 myResult = VISU::FindActor(myViewWindow, myPrs3d);
589 struct TAddActorEvent: public SALOME_Event
592 SVTK_ViewWindow* myViewWindow;
594 TAddActorEvent(VISU_Actor* theActor, SVTK_ViewWindow* theViewWindow):
596 myViewWindow(theViewWindow)
598 virtual void Execute(){
599 myViewWindow->AddActor(myActor);
603 struct TRenderEvent: public SALOME_Event
605 SVTK_ViewWindow* myViewWindow;
607 TRenderEvent(SVTK_ViewWindow* theViewWindow):
608 myViewWindow(theViewWindow)
610 virtual void Execute(){
611 myViewWindow->getRenderWindow()->Render();
615 //----------------------------------------------------------------------------
617 VISU::ColoredPrs3dCache_i
618 ::UpdateLastVisitedPrs(VISU::ColoredPrs3dHolder_i* theHolder,
619 VISU::ColoredPrs3d_i* thePrs,
620 const VISU::ColoredPrs3dHolder::BasicInput& theInput,
621 VISU::View3D_ptr theView3D)
623 if(MYDEBUG) cout << "VISU::ColoredPrs3dCache_i::UpdateLastVisitedPrs" << endl;
626 TPrs3dPtr aLastVisitedPrs3d = GetLastVisitedPrs(theHolder);
627 TLastVisitedPrsList& aLastVisitedPrsList = GetLastVisitedPrsList(theHolder);
628 bool anIsCheckPossible = GetMemoryMode() == VISU::ColoredPrs3dCache::LIMITED;
629 std::string aHolderEntry = theHolder->GetEntry();
630 VISU::VISUType aPrsType = theHolder->GetPrsType();
631 CORBA::Float aRequiredMemory = 0.0;
632 if(aPrs3d = FindPrsByInput(aLastVisitedPrsList, theInput)){
633 aLastVisitedPrsList.push_front(aPrs3d);
634 if(MYDEBUG) cout << "FindPrsByInput " << aPrs3d << endl;
635 }else if(anIsCheckPossible && IsPossible(aPrsType, theInput, aRequiredMemory, aHolderEntry)){
636 if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT )
637 ClearMemory(aRequiredMemory, aHolderEntry);
638 aPrs3d = CreatePrs(aPrsType, theInput, theHolder);
639 if(MYDEBUG) cout << "Created " << aPrs3d << endl;
641 aPrs3d = aLastVisitedPrsList.back();
642 aPrs3d->SetResultObject(theInput.myResult);
643 aPrs3d->SetMeshName(theInput.myMeshName);
644 aPrs3d->SetEntity(theInput.myEntity);
645 aPrs3d->SetFieldName(theInput.myFieldName);
646 aPrs3d->SetTimeStampNumber(theInput.myTimeStampNumber);
647 aLastVisitedPrsList.pop_back();
648 aLastVisitedPrsList.push_front(aPrs3d);
649 if(MYDEBUG) cout << "Move only " << aPrs3d << endl;
651 //if(MYDEBUG) PrintCache();
653 aPrs3d->SameAs(thePrs);
654 aPrs3d->UpdateActors();
655 if(CORBA::is_nil(theView3D))
658 PortableServer::ServantBase_var aServant = GetServant(theView3D);
659 if(VISU::View3D_i* aView3d = dynamic_cast<VISU::View3D_i*>(aServant.in())){
660 if(SUIT_ViewWindow* aView = aView3d->GetViewWindow()){
661 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aView)){
662 // Find actor that corresponds to the holder
663 VISU_Actor* anActor = ProcessEvent(new TFindActorEvent(aLastVisitedPrs3d,aViewWindow));
664 //VISU_Actor* anActor = VISU::FindActor(aViewWindow, aLastVisitedPrs3d);
666 // If the holder was erased from view then do nothing
667 if(anActor && !anActor->GetVisibility())
672 anActor = aLastVisitedPrs3d->CreateActor();
673 ProcessVoidEvent(new TAddActorEvent(anActor,aViewWindow));
674 //aViewWindow->AddActor(anActor);
675 anActor->SetVisibility(true);
678 if(aPrs3d != aLastVisitedPrs3d)
680 // To erase non active presentation
681 aLastVisitedPrs3d->SetActiveState(false);
683 anActor->SetVisibility(false);
685 // To find the new one that corresponds to fresh presentation
686 VISU_Actor* aNewActor = ProcessEvent(new TFindActorEvent(aPrs3d,aViewWindow));
687 //VISU_Actor* aNewActor = VISU::FindActor(aViewWindow, aPrs3d);
689 aNewActor = aPrs3d->CreateActor();
690 ProcessVoidEvent(new TAddActorEvent(aNewActor,aViewWindow));
691 //aViewWindow->AddActor(aNewActor);
693 aNewActor->SetVisibility(true);
694 aNewActor->DeepCopy(anActor);
696 aPrs3d->SetActiveState(true);
698 ProcessVoidEvent(new TRenderEvent(aViewWindow));
699 //aViewWindow->getRenderWindow()->Render();
704 }catch(std::exception& exc){
705 INFOS("Follow exception was occured :\n"<<exc.what());
707 INFOS("Unknown exception was occured!");
714 //----------------------------------------------------------------------------
716 VISU::ColoredPrs3dCache_i
717 ::ClearCache(float theMemory)
719 CORBA::Float aCurrentMemory = GetMemorySize();
720 ClearMemory( aCurrentMemory - theMemory, "" );
724 //----------------------------------------------------------------------------
726 VISU::ColoredPrs3dCache_i
727 ::ClearMemory(CORBA::Float theRequiredMemory,
728 const std::string& theHolderEntry)
730 CORBA::Float aInitialMemorySize = GetMemorySize();
731 TColoredPrs3dHolderMap aHolder2PrsToBeDeletedMap;
732 SelectPrs3dToBeDeleted(theRequiredMemory, theHolderEntry, myHolderMap, aHolder2PrsToBeDeletedMap);
733 TColoredPrs3dHolderMap::const_iterator aHolderIter = aHolder2PrsToBeDeletedMap.begin();
734 TColoredPrs3dHolderMap::const_iterator anEndHolderIter = aHolder2PrsToBeDeletedMap.end();
735 for(; aHolderIter != anEndHolderIter; aHolderIter++){
736 const std::string aHolderEntry = aHolderIter->first;
737 TColoredPrs3dHolderMap::iterator anHolderMapIter = myHolderMap.find(aHolderEntry);
738 if(anHolderMapIter != myHolderMap.end()){
739 TLastVisitedPrsList& aLastVisitedPrsList = anHolderMapIter->second;
741 const TLastVisitedPrsList& aPrsToBeDeletedList = aHolderIter->second;
742 TLastVisitedPrsList::const_iterator anIter = aPrsToBeDeletedList.begin();
743 TLastVisitedPrsList::const_iterator aEndIter = aPrsToBeDeletedList.end();
744 for(; anIter != aEndIter; anIter++){
745 TPrs3dPtr aPrs3d = *anIter;
746 ErasePrs3d(aLastVisitedPrsList, aPrs3d);
750 CORBA::Float aCurrentMemory = GetMemorySize();
751 return (aInitialMemorySize - aCurrentMemory >= theRequiredMemory);
755 //----------------------------------------------------------------------------
757 VISU::ColoredPrs3dCache_i
762 cout << "--------------CACHE-----------------" << endl;
763 cout << "Cache memory - " << GetMemorySize() << " Mb" << endl;
764 TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin();
765 TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end();
766 for(; aHolderIter != aHolderIterEnd; aHolderIter++){
767 const TLastVisitedPrsList& aPrsList = aHolderIter->second;
768 TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin();
769 TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end();
771 cout << "--------------------------" << endl;
772 cout << "Holder - " << aHolderIter->first.c_str() << endl;
773 cout << "Size - " << aPrsList.size() << endl;
774 for(; aPrsIter != aPrsIterEnd; aPrsIter++)
775 if(TPrs3dPtr aPrs3d = *aPrsIter)
777 cout << aPrs3d << " (" << aPrs3d->GetMemorySize() << " Mb)";
778 if(aPrsIter == aPrsList.begin())
783 cout << "------------------------------------" << endl;
788 //----------------------------------------------------------------------------
790 VISU::ColoredPrs3dCache_i
791 ::RemoveHolder(VISU::ColoredPrs3dHolder_i* theHolder)
793 TColoredPrs3dHolderMap::iterator anIter = myHolderMap.find(theHolder->GetEntry());
794 if(anIter != myHolderMap.end())
795 myHolderMap.erase(anIter);
798 //----------------------------------------------------------------------------
800 VISU::ColoredPrs3dCache_i
801 ::ToStream(std::ostringstream& theStr)
803 Storable::DataToStream( theStr, "myMemoryMode", GetMemoryMode() );
804 Storable::DataToStream( theStr, "myLimitedMemory", GetLimitedMemory() );
807 //---------------------------------------------------------------
809 VISU::ColoredPrs3dCache_i
810 ::Restore(SALOMEDS::SObject_ptr theSObject,
811 const Storable::TRestoringMap& theMap)
813 SetMemoryMode( (VISU::ColoredPrs3dCache::MemoryMode)VISU::Storable::FindValue( theMap, "myMemoryMode" ).toInt() );
814 SetLimitedMemory( VISU::Storable::FindValue( theMap, "myLimitedMemory" ).toInt() );
819 //---------------------------------------------------------------
821 VISU::ColoredPrs3dCache_i
822 ::StorableEngine(SALOMEDS::SObject_ptr theSObject,
823 const Storable::TRestoringMap& theMap,
824 const std::string& thePrefix,
825 CORBA::Boolean theIsMultiFile)
827 SALOMEDS::Study_var aStudy = theSObject->GetStudy();
828 VISU::ColoredPrs3dCache_i* aCache = new VISU::ColoredPrs3dCache_i(aStudy, false);
829 return aCache->Restore(theSObject, theMap);