#include "TEveManager.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 (),
fGeometries ()
{
static const TEveException eh("TEveManager::TEveManager ");
if (gEve != 0)
throw(eh + "There can be only one!");
gEve = this;
fExcHandler = new TExceptionHandler;
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("Eve list-tree/editor");
fBrowser->StopEmbedding();
fBrowser->SetTabTitle("Eve", 0);
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);
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);
fEditor->DisplayObject(GetGLViewer());
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()
{
fScenes ->RepaintChangedScenes();
fViewers->RepaintChangedViewers(fResetCameras, fDropLogicals);
fResetCameras = kFALSE;
fDropLogicals = kFALSE;
fTimerActive = kFALSE;
}
void TEveManager::FullRedraw3D(Bool_t resetCameras, Bool_t dropLogicals)
{
fScenes ->RepaintAllScenes();
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))
fEditor->DisplayElement(element);
if (update_scenes) {
std::list<TEveElement*> scenes;
element->CollectSceneParents(scenes);
ScenesChanged(scenes);
}
if (redraw)
Redraw3D();
}
void TEveManager::ScenesChanged(std::list<TEveElement*>& 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);
}
TGListTreeItem* TEveManager::AddElement(TEveElement* element,
TEveElement* parent)
{
if (parent == 0) {
if (fCurrentEvent == 0)
AddEvent(new TEveEventManager("Event", "Auto-created event directory"));
parent = fCurrentEvent;
}
return parent->AddElement(element);
}
TGListTreeItem* TEveManager::AddGlobalElement(TEveElement* element,
TEveElement* parent)
{
if (parent == 0)
parent = fGlobalScene;
return parent->AddElement(element);
}
void TEveManager::RemoveElement(TEveElement* element,
TEveElement* parent)
{
parent->RemoveElement(element);
}
void TEveManager::PreDeleteElement(TEveElement* element)
{
if (fEditor->GetEveElement() == element)
fEditor->DisplayObject(0);
std::list<TEveElement*> scenes;
element->CollectSceneParents(scenes);
ScenesChanged(scenes);
}
void TEveManager::ElementSelect(TEveElement* element)
{
EditElement(element);
}
Bool_t TEveManager::ElementPaste(TEveElement* element)
{
TEveElement* src = fEditor->GetEveElement();
if (src)
return element->HandleElementPaste(src);
return kFALSE;
}
void TEveManager::ElementChecked(TEveElement* element, Bool_t state)
{
element->SetRnrState(state);
element->ElementChanged();
}
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 g = fGeometries.find(filename);
if (g != fGeometries.end()) {
return g->second;
} else {
gGeoManager = 0;
if (TGeoManager::Import(filename) == 0)
throw(eh + "GeoManager::Import() failed for '" + exp_filename + "'.");
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 update: Thu Jan 17 08:48:51 2008
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.