jeshj
February 12, 2016, 9:36pm
1
Hey guys
I am trying to draw some geometry using the TGeo-classes. I want to make a small GUI for my peers to use, that shows the geometry using the OpenGL viewer next to some input widgets. I can not seem to get hold of the OpenGL viewer so I can embed in into a TGWindow or TGFrame like I can with TRootEmbeddedCanvas. It always pop up as a seperate window. I know there is the whole Eve framework, but it seems a bit overkill when I just want to show a simple viewer and frankly I have a hard time figuring out where to start if I were to use that. Is it even possible?
couet
February 15, 2016, 7:44am
2
Hi,
Didi you try a TGLEmbeddedViewer ? For example:
[code] TEveManager::Create(kFALSE);
TGMainFrame *main = new TGMainFrame(0, 800, 600);
TGLEmbeddedViewer* v = new TGLEmbeddedViewer(main, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());
nv->AddScene(gEve->GetEventScene());
main->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));
main->Layout();
main->MapSubwindows();
main->MapWindow();
[/code]
Cheers, Bertrand.
jeshj
February 15, 2016, 4:00pm
4
So I was able to embed it, thanks! I am, however, not sure how I draw onto it? It just opens a new pad whenever I draw something.
Hi,
Could you post a running piece of code showing what you’re trying to do?
Cheers, Bertrand.
jeshj
February 15, 2016, 4:20pm
6
Yes. This is a class that extends a TGHorizontalFrame. So far there is only the constructor. I am trying to make it show a simple box, but it is just black:
[code]RenderingFrame::RenderingFrame(const TGWindow *p) : TGHorizontalFrame§ {
TGTab* tab = new TGTab(this);
TGHorizontalFrame* frame = new TGHorizontalFrame(this, 800, 800);
tab->AddTab("Tab", frame);
TEveManager::Create(kFALSE);
TGLEmbeddedViewer* v = new TGLEmbeddedViewer(frame, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());
nv->AddScene(gEve->GetEventScene());
frame->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));
TGeoManager* manager = new TGeoManager("Setup", "Setup");
TGeoMaterial* fe = new TGeoMaterial("Fe", 55.845, 26, 7.87);
TGeoMedium* iron = new TGeoMedium("Iron", 1, fe);
TGeoVolume* top = manager->MakeBox("top", iron, 10, 10, 1);
manager->SetTopVolume(top);
TEveGeoTopNode* node = new TEveGeoTopNode(manager, manager->GetTopNode());
gEve->GetEventScene()->AddElement(node);
this->AddFrame(tab);
frame->Layout();
frame->MapSubwindows();
frame->MapWindow();
}[/code]
You have to tell the system to draw the elements in the scene, so add gEve->FullRedraw3D(kTRUE) after the last gEve->GetEventScene()->AddElement(node) (or at the end of the method):
[code]RenderingFrame::RenderingFrame(const TGWindow *p) : TGHorizontalFrame§ {
TGTab* tab = new TGTab(this);
TGHorizontalFrame* frame = new TGHorizontalFrame(this, 800, 800);
tab->AddTab("Tab", frame);
TEveManager::Create(kFALSE);
TGLEmbeddedViewer* v = new TGLEmbeddedViewer(frame, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());
nv->AddScene(gEve->GetEventScene());
gEve->GetViewers()->AddElement(nv);
frame->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));
TGeoManager* manager = new TGeoManager("Setup", "Setup");
TGeoMaterial* fe = new TGeoMaterial("Fe", 55.845, 26, 7.87);
TGeoMedium* iron = new TGeoMedium("Iron", 1, fe);
TGeoVolume* top = manager->MakeBox("top", iron, 10, 10, 1);
manager->SetTopVolume(top);
TEveGeoTopNode* node = new TEveGeoTopNode(manager, manager->GetTopNode());
gEve->GetEventScene()->AddElement(node);
gEve->FullRedraw3D(kTRUE);
this->AddFrame(tab);
frame->Layout();
frame->MapSubwindows();
frame->MapWindow();
}
[/code]
Cheers, Bertrand.
jeshj
February 15, 2016, 4:55pm
8
Thanks a lot, that worked!