50 TEveManager* gEve = 0;
58 ClassImp(TEveManager);
62 TEveManager::TEveManager(UInt_t w, UInt_t h, Bool_t map_window, Option_t* opt) :
64 fVizDB (0), fVizDBReplace(kTRUE), fVizDBUpdate(kTRUE),
79 fResetCameras (kFALSE),
80 fDropLogicals (kFALSE),
81 fKeepEmptyCont (kFALSE),
82 fTimerActive (kFALSE),
90 fUseOrphanage (kFALSE)
104 static const TEveException eh(
"TEveManager::TEveManager ");
107 throw(eh +
"There can be only one!");
111 fExcHandler =
new TExceptionHandler;
113 fGeometries =
new TMap; fGeometries->SetOwnerKeyValue();
114 fGeometryAliases =
new TMap; fGeometryAliases->SetOwnerKeyValue();
115 fVizDB =
new TMap; fVizDB->SetOwnerKeyValue();
117 fStampedElements =
new TExMap;
119 fSelection =
new TEveSelection(
"Global Selection");
120 fSelection->IncDenyDestroy();
121 fHighlight =
new TEveSelection(
"Global Highlight");
122 fHighlight->SetHighlightMode();
123 fHighlight->IncDenyDestroy();
125 fOrphanage =
new TEveElementList(
"Global Orphanage");
126 fOrphanage->IncDenyDestroy();
128 fRedrawTimer.Connect(
"Timeout()",
"TEveManager",
this,
"DoRedraw3D()");
129 fMacroFolder =
new TFolder(
"EVE",
"Visualization macros");
130 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
133 fWindowManager =
new TEveWindowManager(
"WindowManager",
"Manager of EVE windows");
136 fBrowser =
new TEveBrowser(w, h);
139 fBrowser->StartEmbedding(0);
140 fLTEFrame =
new TEveGListTreeEditorFrame;
141 fBrowser->StopEmbedding(
"Eve");
142 fLTEFrame->ConnectSignals();
145 TString str_opt(opt);
146 TPMERegexp viewer_re(
"V",
"g");
147 Int_t viewer_count = viewer_re.Substitute(str_opt,
"", kFALSE);
150 fBrowser->InitPlugins(str_opt);
152 fBrowser->MapWindow();
156 fWindowManager->IncDenyDestroy();
157 AddToListTree(fWindowManager, kFALSE);
159 fViewers =
new TEveViewerList(
"Viewers");
160 fViewers->IncDenyDestroy();
161 AddToListTree(fViewers, kFALSE);
163 fScenes =
new TEveSceneList (
"Scenes");
164 fScenes->IncDenyDestroy();
165 AddToListTree(fScenes, kFALSE);
167 fGlobalScene =
new TEveScene(
"Geometry scene");
168 fGlobalScene->IncDenyDestroy();
169 fScenes->AddElement(fGlobalScene);
171 fEventScene =
new TEveScene(
"Event scene");
172 fEventScene->IncDenyDestroy();
173 fScenes->AddElement(fEventScene);
175 for (Int_t vc = 0; vc < viewer_count; ++vc)
177 TEveViewer* v = SpawnNewViewer(Form(
"Viewer %d", vc+1));
178 v->AddScene(fGlobalScene);
179 v->AddScene(fEventScene);
182 if (GetDefaultViewer())
184 EditElement(GetDefaultViewer());
187 gSystem->ProcessEvents();
193 TEveManager::~TEveManager()
197 fTimerActive = kTRUE;
199 delete fCurrentEvent;
202 fGlobalScene->DecDenyDestroy();
203 fEventScene->DecDenyDestroy();
204 fScenes->DestroyScenes();
205 fScenes->DecDenyDestroy();
209 fViewers->DestroyElements();
210 fViewers->DecDenyDestroy();
214 fWindowManager->DestroyWindows();
215 fWindowManager->DecDenyDestroy();
216 fWindowManager->Destroy();
219 fOrphanage->DecDenyDestroy();
220 fHighlight->DecDenyDestroy();
221 fSelection->DecDenyDestroy();
223 gROOT->GetListOfBrowsables()->Remove(fMacroFolder);
226 delete fGeometryAliases;
230 delete fStampedElements;
232 fLTEFrame->DeleteWindow();
234 fBrowser->DontCallClose();
235 fBrowser->TRootBrowser::CloseWindow();
241 void TEveManager::ClearOrphanage()
243 Bool_t old_state = fUseOrphanage;
244 fUseOrphanage = kFALSE;
245 fOrphanage->DestroyElements();
246 fUseOrphanage = old_state;
252 TGWindow* TEveManager::GetMainWindow()
const
260 TEveViewer* TEveManager::GetDefaultViewer()
const
262 return dynamic_cast<TEveViewer*
>(fViewers->FirstChild());
268 TGLViewer* TEveManager::GetDefaultGLViewer()
const
270 TEveViewer *ev = GetDefaultViewer();
271 return ev ? ev->GetGLViewer() : 0;
277 TEveGedEditor* TEveManager::GetEditor()
const
279 return fLTEFrame->GetEditor();
285 TGStatusBar* TEveManager::GetStatusBar()
const
287 return fBrowser->GetStatusBar();
293 TCanvas* TEveManager::AddCanvasTab(
const char* name)
295 fBrowser->StartEmbedding(1, -1);
296 TCanvas* c =
new TCanvas;
297 fBrowser->StopEmbedding(name);
305 TEveViewer* TEveManager::SpawnNewViewer(
const char* name,
const char* title,
308 TEveWindowSlot* slot = 0;
311 slot = fWindowManager->GetCurrentWindowAsSlot();
317 slot = TEveWindow::CreateWindowInTab(fBrowser->GetTabRight());
318 fBrowser->SanitizeTabCounts();
323 slot = TEveWindow::CreateWindowMainFrame();
326 TEveViewer* v =
new TEveViewer(name, title);
327 v->SpawnGLViewer(embed ? GetEditor() : 0);
329 slot->ReplaceWindow(v);
331 fViewers->AddElement(v);
339 TEveScene* TEveManager::SpawnNewScene(
const char* name,
const char* title)
341 TEveScene* s =
new TEveScene(name, title);
342 AddElement(s, fScenes);
349 TMacro* TEveManager::GetMacro(
const char* name)
const
351 return dynamic_cast<TMacro*
>(fMacroFolder->FindObject(name));
357 void TEveManager::EditElement(TEveElement* element)
359 static const TEveException eh(
"TEveManager::EditElement ");
361 GetEditor()->DisplayElement(element);
367 void TEveManager::RegisterRedraw3D()
369 fRedrawTimer.Start(0, kTRUE);
370 fTimerActive = kTRUE;
377 void TEveManager::DoRedraw3D()
379 static const TEveException eh(
"TEveManager::DoRedraw3D ");
385 TEveElement::List_t scenes;
387 TExMapIter stamped_elements(fStampedElements);
388 while (stamped_elements.Next(key, value))
390 TEveElement *el =
reinterpret_cast<TEveElement*
>(key);
391 if (el->GetChangeBits() & TEveElement::kCBVisibility)
393 el->CollectSceneParents(scenes);
396 ScenesChanged(scenes);
400 fScenes ->ProcessSceneChanges(fDropLogicals, fStampedElements);
401 fViewers->RepaintChangedViewers(fResetCameras, fDropLogicals);
407 TExMapIter stamped_elements(fStampedElements);
408 while (stamped_elements.Next(key, value))
410 TEveElement *el =
reinterpret_cast<TEveElement*
>(key);
411 if (GetEditor()->GetModel() == el->GetEditorObject(eh))
413 TEveGedEditor::ElementChanged(el);
418 fStampedElements->Delete();
419 GetListTree()->ClearViewPort();
421 fResetCameras = kFALSE;
422 fDropLogicals = kFALSE;
424 fTimerActive = kFALSE;
430 void TEveManager::FullRedraw3D(Bool_t resetCameras, Bool_t dropLogicals)
432 fScenes ->RepaintAllScenes (dropLogicals);
433 fViewers->RepaintAllViewers(resetCameras, dropLogicals);
440 void TEveManager::ElementChanged(TEveElement* element, Bool_t update_scenes, Bool_t redraw)
442 static const TEveException eh(
"TEveElement::ElementChanged ");
444 if (GetEditor()->GetModel() == element->GetEditorObject(eh))
445 EditElement(element);
446 TEveGedEditor::ElementChanged(element);
449 TEveElement::List_t scenes;
450 element->CollectSceneParents(scenes);
451 ScenesChanged(scenes);
461 void TEveManager::ScenesChanged(TEveElement::List_t& scenes)
463 for (TEveElement::List_i s=scenes.begin(); s!=scenes.end(); ++s)
464 ((TEveScene*)*s)->Changed();
470 void TEveManager::ElementStamped(TEveElement* element)
473 if (fStampedElements->GetValue((ULong64_t) element, (Long64_t) element, slot) == 0)
475 fStampedElements->AddAt(slot, (ULong64_t) element, (Long64_t) element, 1);
482 TGListTree* TEveManager::GetListTree()
const
484 return fLTEFrame->fListTree;
488 TEveManager::AddToListTree(TEveElement* re, Bool_t open, TGListTree* lt)
493 if (lt == 0) lt = GetListTree();
494 TGListTreeItem* lti = re->AddIntoListTree(lt, (TGListTreeItem*)0);
495 if (open) lt->OpenItem(lti);
502 void TEveManager::RemoveFromListTree(TEveElement* element,
503 TGListTree* lt, TGListTreeItem* lti)
505 static const TEveException eh(
"TEveManager::RemoveFromListTree ");
507 if (lti->GetParent())
508 throw(eh +
"not a top-level item.");
510 element->RemoveFromListTree(lt, 0);
518 TGListTreeItem* TEveManager::AddEvent(TEveEventManager* event)
520 fCurrentEvent = event;
521 fCurrentEvent->IncDenyDestroy();
522 AddElement(fCurrentEvent, fEventScene);
523 return AddToListTree(event, kTRUE);
530 void TEveManager::AddElement(TEveElement* element, TEveElement* parent)
533 if (fCurrentEvent == 0)
534 AddEvent(
new TEveEventManager(
"Event",
"Auto-created event directory"));
535 parent = fCurrentEvent;
538 parent->AddElement(element);
546 void TEveManager::AddGlobalElement(TEveElement* element, TEveElement* parent)
549 parent = fGlobalScene;
551 parent->AddElement(element);
557 void TEveManager::RemoveElement(TEveElement* element,
560 parent->RemoveElement(element);
567 void TEveManager::PreDeleteElement(TEveElement* element)
569 if (GetEditor()->GetEveElement() == element)
571 TEveGedEditor::ElementDeleted(element);
574 fScenes->DestroyElementRenderers(element);
576 if (fStampedElements->GetValue((ULong64_t) element, (Long64_t) element) != 0)
577 fStampedElements->Remove((ULong64_t) element, (Long64_t) element);
579 if (element->fImpliedSelected > 0)
580 fSelection->RemoveImpliedSelected(element);
581 if (element->fImpliedHighlighted > 0)
582 fHighlight->RemoveImpliedSelected(element);
589 void TEveManager::ElementSelect(TEveElement* element)
592 EditElement(element);
598 Bool_t TEveManager::ElementPaste(TEveElement* element)
603 TEveElement* src = GetEditor()->GetEveElement();
605 return element->HandleElementPaste(src);
623 Bool_t TEveManager::InsertVizDBEntry(
const TString& tag, TEveElement* model,
624 Bool_t replace, Bool_t update)
626 TPair* pair = (TPair*) fVizDB->FindObject(tag);
631 model->IncDenyDestroy();
632 model->SetRnrChildren(kFALSE);
634 TEveElement* old_model =
dynamic_cast<TEveElement*
>(pair->Value());
637 while (old_model->HasChildren())
639 TEveElement *el = old_model->FirstChild();
640 el->SetVizModel(model);
643 el->CopyVizParams(model);
644 el->PropagateVizParamsToProjecteds();
647 old_model->DecDenyDestroy();
649 pair->SetValue(dynamic_cast<TObject*>(model));
659 model->IncDenyDestroy();
660 model->SetRnrChildren(kFALSE);
661 fVizDB->Add(
new TObjString(tag), dynamic_cast<TObject*>(model));
672 Bool_t TEveManager::InsertVizDBEntry(
const TString& tag, TEveElement* model)
674 return InsertVizDBEntry(tag, model, fVizDBReplace, fVizDBUpdate);
681 TEveElement* TEveManager::FindVizDBEntry(
const TString& tag)
683 return dynamic_cast<TEveElement*
>(fVizDB->GetValue(tag));
692 void TEveManager::LoadVizDB(
const TString& filename, Bool_t replace, Bool_t update)
694 Bool_t ex_replace = fVizDBReplace;
695 Bool_t ex_update = fVizDBUpdate;
696 fVizDBReplace = replace;
697 fVizDBUpdate = update;
701 fVizDBReplace = ex_replace;
702 fVizDBUpdate = ex_update;
710 void TEveManager::LoadVizDB(
const TString& filename)
712 TEveUtil::Macro(filename);
719 void TEveManager::SaveVizDB(
const TString& filename)
721 TPMERegexp re(
"(.+)\\.\\w+");
722 if (re.Match(filename) != 2) {
723 Error(
"SaveVizDB",
"filename does not match required format '(.+)\\.\\w+'.");
727 TString exp_filename(filename);
728 gSystem->ExpandPathName(exp_filename);
730 std::ofstream out(exp_filename, std::ios::out | std::ios::trunc);
731 out <<
"void " << re[1] <<
"()\n";
733 out <<
" TEveManager::Create();\n";
735 ClearROOTClassSaved();
741 while ((key = (TObjString*)next()))
743 TEveElement* mdl =
dynamic_cast<TEveElement*
>(fVizDB->GetValue(key));
746 var_name.Form(
"x%03d", var_id++);
747 mdl->SaveVizParams(out, key->String(), var_name);
751 Warning(
"SaveVizDB",
"Saving failed for key '%s'.", key->String().Data());
765 TGeoManager* TEveManager::GetGeometry(
const TString& filename)
767 static const TEveException eh(
"TEveManager::GetGeometry ");
769 TString exp_filename = filename;
770 gSystem->ExpandPathName(exp_filename);
771 printf(
"%s loading: '%s' -> '%s'.\n", eh.Data(),
772 filename.Data(), exp_filename.Data());
774 gGeoManager = (TGeoManager*) fGeometries->GetValue(filename);
777 gGeoIdentity = (TGeoIdentity*) gGeoManager->GetListOfMatrices()->At(0);
781 Bool_t locked = TGeoManager::IsLocked();
783 Warning(eh,
"TGeoManager is locked ... unlocking it.");
784 TGeoManager::UnlockGeometry();
786 if (TGeoManager::Import(filename) == 0) {
787 throw(eh +
"TGeoManager::Import() failed for '" + exp_filename +
"'.");
790 TGeoManager::LockGeometry();
793 gGeoManager->GetTopVolume()->VisibleDaughters(1);
797 TFile f(exp_filename,
"READ");
798 TObjArray* collist = (TObjArray*) f.Get(
"ColorList");
801 TIter next(gGeoManager->GetListOfVolumes());
803 while ((vol = (TGeoVolume*) next()) != 0)
805 Int_t oldID = vol->GetLineColor();
806 TColor* col = (TColor*)collist->At(oldID);
808 col->GetRGB(r, g, b);
809 Int_t newID = TColor::GetColor(r,g,b);
810 vol->SetLineColor(newID);
815 fGeometries->Add(
new TObjString(filename), gGeoManager);
824 TGeoManager* TEveManager::GetGeometryByAlias(
const TString& alias)
826 static const TEveException eh(
"TEveManager::GetGeometry ");
828 TObjString* full_name = (TObjString*) fGeometryAliases->GetValue(alias);
830 throw(eh +
"geometry alias '" + alias +
"' not registered.");
831 return GetGeometry(full_name->String());
838 TGeoManager* TEveManager::GetDefaultGeometry()
840 return GetGeometryByAlias(
"Default");
849 void TEveManager::RegisterGeometryAlias(
const TString& alias,
const TString& filename)
851 fGeometryAliases->Add(
new TObjString(alias),
new TObjString(filename));
857 void TEveManager::SetStatusLine(
const char* text)
859 fBrowser->SetStatusText(text, 1);
865 void TEveManager::ClearROOTClassSaved()
867 TIter nextcl(gROOT->GetListOfClasses());
869 while((cls = (TClass *)nextcl()))
871 cls->ResetBit(TClass::kClassSaved);
879 void TEveManager::CloseEveWindow()
881 TGMainFrame *mf = (TGMainFrame*) gTQSender;
882 TEveBrowser *eb =
dynamic_cast<TEveBrowser*
>(mf);
887 gApplication->Terminate();
895 TEveManager* TEveManager::Create(Bool_t map_window, Option_t* opt)
897 static const TEveException eh(
"TEveManager::Create ");
902 if (gROOT->IsBatch())
904 throw eh +
"ROOT is running in batch mode.";
906 TApplication::NeedGraphicsLibs();
907 gApplication->InitializeGraphics();
908 if (gROOT->IsBatch() || gClient == 0 || gClient->IsZombie())
910 throw eh +
"window system not initialized.";
916 TEveUtil::SetupEnvironment();
917 TEveUtil::SetupGUI();
918 gEve =
new TEveManager(w, h, map_window, opt);
926 void TEveManager::Terminate()
930 TEveGedEditor::DestroyEditors();
941 ClassImp(TEveManager::TExceptionHandler);
946 TStdExceptionHandler::EStatus
947 TEveManager::TExceptionHandler::Handle(std::exception& exc)
949 TEveException* ex =
dynamic_cast<TEveException*
>(&exc);
951 Info(
"Handle",
"%s", ex->Data());
952 gEve->SetStatusLine(ex->Data());