#include "TEveManager.h"
#include "TEveSelection.h"
#include "TEveViewer.h"
#include "TEveScene.h"
#include "TEvePad.h"
#include "TEveEventManager.h"
#include "TEveBrowser.h"
#include "TEveGedEditor.h"
#include "TGStatusBar.h"
#include "TGLSAViewer.h"
#include "TROOT.h"
#include "TFile.h"
#include "TMacro.h"
#include "TFolder.h"
#include "TBrowser.h"
#include "TPad.h"
#include "TCanvas.h"
#include "TSystem.h"
#include "TRint.h"
#include "TVirtualX.h"
#include "TEnv.h"
#include "TColor.h"
#include "TVirtualGL.h"
#include "TPluginManager.h"
#include <iostream>
TEveManager* gEve = 0;
ClassImp(TEveManager)
TEveManager::TEveManager(UInt_t w, UInt_t h) :
fExcHandler (0),
fBrowser (0),
fEditor (0),
fStatusBar (0),
fMacroFolder (0),
fViewers (0),
fScenes (0),
fViewer (0),
fGlobalScene (0),
fEventScene (0),
fCurrentEvent (0),
fRedrawDisabled (0),
fResetCameras (kFALSE),
fDropLogicals (kFALSE),
fKeepEmptyCont (kFALSE),
fTimerActive (kFALSE),
fRedrawTimer (),
fStampedElements(),
fSelection (0),
fHighlight (0),
fGeometries ()
{
static const TEveException eh("TEveManager::TEveManager ");
if (gEve != 0)
throw(eh + "There can be only one!");
gEve = this;
fExcHandler = new TExceptionHandler;
fSelection = new TEveSelection("Global Selection");
fHighlight = new TEveSelection("Global Highlight");
fHighlight->SetHighlightMode();
fRedrawTimer.Connect("Timeout()", "TEveManager", this, "DoRedraw3D()");
fMacroFolder = new TFolder("EVE", "Visualization macros");
gROOT->GetListOfBrowsables()->Add(fMacroFolder);
fBrowser = new TEveBrowser(w, h);
fStatusBar = fBrowser->GetStatusBar();
fBrowser->StartEmbedding(0);
fLTEFrame = new TEveGListTreeEditorFrame;
fBrowser->StopEmbedding("Eve");
fLTEFrame->ConnectSignals();
fEditor = fLTEFrame->fEditor;
fBrowser->StartEmbedding(1);
TGLSAViewer* glv = new TGLSAViewer(gClient->GetRoot(), 0, fEditor);
glv->ToggleEditObject();
fBrowser->StopEmbedding();
fBrowser->SetTabTitle("GLViewer", 1);
fBrowser->InitPlugins();
fBrowser->MapWindow();
fViewers = new TEveViewerList("Viewers");
fViewers->IncDenyDestroy();
AddToListTree(fViewers, kTRUE);
fViewer = new TEveViewer("GLViewer");
fViewer->SetGLViewer(glv);
fViewer->IncDenyDestroy();
AddElement(fViewer, fViewers);
fViewers->Connect();
fScenes = new TEveSceneList ("Scenes");
fScenes->IncDenyDestroy();
AddToListTree(fScenes, kTRUE);
fGlobalScene = new TEveScene("Geometry scene");
fGlobalScene->IncDenyDestroy();
AddElement(fGlobalScene, fScenes);
fEventScene = new TEveScene("Event scene");
fEventScene->IncDenyDestroy();
AddElement(fEventScene, fScenes);
fViewer->AddScene(fGlobalScene);
fViewer->AddScene(fEventScene);
EditElement(fViewer);
gSystem->ProcessEvents();
}
TEveManager::~TEveManager()
{
delete fExcHandler;
}
TCanvas* TEveManager::AddCanvasTab(const char* name)
{
fBrowser->StartEmbedding(1, -1);
TCanvas* c = new TCanvas;
fBrowser->StopEmbedding();
fBrowser->SetTabTitle(name, 1, -1);
return c;
}
TGWindow* TEveManager::GetMainWindow() const
{
return fBrowser;
}
TGLViewer* TEveManager::GetGLViewer() const
{
return fViewer->GetGLViewer();
}
TEveViewer* TEveManager::SpawnNewViewer(const Text_t* name, const Text_t* title,
Bool_t embed)
{
TEveViewer* v = new TEveViewer(name, title);
if (embed) fBrowser->StartEmbedding(1);
v->SpawnGLViewer(gClient->GetRoot(), embed ? fEditor : 0);
v->IncDenyDestroy();
if (embed) fBrowser->StopEmbedding(), fBrowser->SetTabTitle(name, 1);
AddElement(v, fViewers);
return v;
}
TEveScene* TEveManager::SpawnNewScene(const Text_t* name, const Text_t* title)
{
TEveScene* s = new TEveScene(name, title);
AddElement(s, fScenes);
return s;
}
TMacro* TEveManager::GetMacro(const Text_t* name) const
{
return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
}
void TEveManager::EditElement(TEveElement* element)
{
static const TEveException eh("TEveManager::EditElement ");
fEditor->DisplayElement(element);
}
void TEveManager::RegisterRedraw3D()
{
fRedrawTimer.Start(0, kTRUE);
fTimerActive = true;
}
void TEveManager::DoRedraw3D()
{
static const TEveException eh("TEveManager::DoRedraw3D ");
fScenes ->ProcessSceneChanges(fDropLogicals, fStampedElements);
fViewers->RepaintChangedViewers(fResetCameras, fDropLogicals);
for (TEveElement::Set_i i = fStampedElements.begin(); i != fStampedElements.end(); ++i)
{
if (fEditor->GetModel() == (*i)->GetEditorObject(eh))
EditElement((*i));
(*i)->ClearStamps();
}
fStampedElements.clear();
GetListTree()->ClearViewPort();
fResetCameras = kFALSE;
fDropLogicals = kFALSE;
fTimerActive = kFALSE;
}
void TEveManager::FullRedraw3D(Bool_t resetCameras, Bool_t dropLogicals)
{
fScenes ->RepaintAllScenes (fDropLogicals);
fViewers->RepaintAllViewers(resetCameras, dropLogicals);
}
void TEveManager::ElementChanged(TEveElement* element, Bool_t update_scenes, Bool_t redraw)
{
static const TEveException eh("TEveElement::ElementChanged ");
if (fEditor->GetModel() == element->GetEditorObject(eh))
EditElement(element);
if (update_scenes) {
TEveElement::List_t scenes;
element->CollectSceneParents(scenes);
ScenesChanged(scenes);
}
if (redraw)
Redraw3D();
}
void TEveManager::ScenesChanged(TEveElement::List_t& scenes)
{
for (TEveElement::List_i s=scenes.begin(); s!=scenes.end(); ++s)
((TEveScene*)*s)->Changed();
}
TGListTree* TEveManager::GetListTree() const
{
return fLTEFrame->fListTree;
}
TGListTreeItem*
TEveManager::AddToListTree(TEveElement* re, Bool_t open, TGListTree* lt)
{
if (lt == 0) lt = GetListTree();
TGListTreeItem* lti = re->AddIntoListTree(lt, (TGListTreeItem*)0);
if (open) lt->OpenItem(lti);
return lti;
}
void TEveManager::RemoveFromListTree(TEveElement* element,
TGListTree* lt, TGListTreeItem* lti)
{
static const TEveException eh("TEveManager::RemoveFromListTree ");
if (lti->GetParent())
throw(eh + "not a top-level item.");
element->RemoveFromListTree(lt, 0);
}
TGListTreeItem* TEveManager::AddEvent(TEveEventManager* event)
{
fCurrentEvent = event;
fCurrentEvent->IncDenyDestroy();
AddElement(fCurrentEvent, fEventScene);
return AddToListTree(event, kTRUE);
}
void TEveManager::AddElement(TEveElement* element, TEveElement* parent)
{
if (parent == 0) {
if (fCurrentEvent == 0)
AddEvent(new TEveEventManager("Event", "Auto-created event directory"));
parent = fCurrentEvent;
}
parent->AddElement(element);
}
void TEveManager::AddGlobalElement(TEveElement* element, TEveElement* parent)
{
if (parent == 0)
parent = fGlobalScene;
parent->AddElement(element);
}
void TEveManager::RemoveElement(TEveElement* element,
TEveElement* parent)
{
parent->RemoveElement(element);
}
void TEveManager::PreDeleteElement(TEveElement* element)
{
if (fEditor->GetEveElement() == element)
EditElement(0);
fScenes->DestroyElementRenderers(element);
TEveElement::Set_i sei = fStampedElements.find(element);
if (sei != fStampedElements.end())
fStampedElements.erase(sei);
}
void TEveManager::ElementSelect(TEveElement* element)
{
if (element != 0)
EditElement(element);
}
Bool_t TEveManager::ElementPaste(TEveElement* element)
{
TEveElement* src = fEditor->GetEveElement();
if (src)
return element->HandleElementPaste(src);
return kFALSE;
}
TGeoManager* TEveManager::GetGeometry(const TString& filename)
{
static const TEveException eh("TEveManager::GetGeometry ");
TString exp_filename = filename;
gSystem->ExpandPathName(exp_filename);
printf("%s loading: '%s' -> '%s'.\n", eh.Data(),
filename.Data(), exp_filename.Data());
std::map<TString, TGeoManager*>::iterator geom = fGeometries.find(filename);
if (geom != fGeometries.end()) {
gGeoManager = geom->second;
} else {
gGeoManager = 0;
Bool_t locked = TGeoManager::IsLocked();
if (locked) {
Warning(eh, "TGeoManager is locked ... unlocking it.");
TGeoManager::UnlockGeometry();
}
if (TGeoManager::Import(filename) == 0) {
throw(eh + "TGeoManager::Import() failed for '" + exp_filename + "'.");
}
if (locked) {
TGeoManager::LockGeometry();
}
gGeoManager->GetTopVolume()->VisibleDaughters(1);
{
TFile f(exp_filename, "READ");
TObjArray* collist = (TObjArray*) f.Get("ColorList");
f.Close();
if (collist != 0) {
TIter next(gGeoManager->GetListOfVolumes());
TGeoVolume* vol;
while ((vol = (TGeoVolume*) next()) != 0)
{
Int_t oldID = vol->GetLineColor();
TColor* col = (TColor*)collist->At(oldID);
Float_t r, g, b;
col->GetRGB(r, g, b);
Int_t newID = TColor::GetColor(r,g,b);
vol->SetLineColor(newID);
}
}
}
fGeometries[filename] = gGeoManager;
}
return gGeoManager;
}
TGeoManager* TEveManager::GetGeometryByAlias(const TString& alias)
{
static const TEveException eh("TEveManager::GetGeometry ");
std::map<TString, TString>::iterator i = fGeometryAliases.find(alias);
if (i == fGeometryAliases.end())
throw(eh + "geometry alias '" + alias + "' not registered.");
return GetGeometry(i->second);
}
TGeoManager* TEveManager::GetDefaultGeometry()
{
return GetGeometryByAlias("Default");
}
void TEveManager::RegisterGeometryAlias(const TString& alias, const TString& filename)
{
fGeometryAliases[alias] = filename;
}
void TEveManager::SetStatusLine(const char* text)
{
fBrowser->SetStatusText(text, 1);
}
TEveManager* TEveManager::Create()
{
if (gEve == 0)
{
TApplication::NeedGraphicsLibs();
gApplication->InitializeGraphics();
Int_t w = 1024;
Int_t h = 768;
TEveUtil::SetupEnvironment();
TEveUtil::SetupGUI();
gEve = new TEveManager(w, h);
}
return gEve;
}
ClassImp(TEveManager::TExceptionHandler)
TStdExceptionHandler::EStatus
TEveManager::TExceptionHandler::Handle(std::exception& exc)
{
TEveException* ex = dynamic_cast<TEveException*>(&exc);
if (ex) {
Info("Handle", ex->Data());
gEve->SetStatusLine(ex->Data());
gSystem->Beep();
return kSEHandled;
} else {
return kSEProceed;
}
}
Last change: Tue May 13 17:09:15 2008
Last generated: 2008-05-13 17:09
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.