Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OpenInventorXtExtendedViewer.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28/*
29 * jck 05 Feb 1997 - Initial Implementation
30 * jck 21 Apr 1997
31 * Mods for SoXtHepViewer
32 * gb : on Win32 use an SoXtExaminerViewer.
33 * gb 05 April 2004 : revisit to separate Windows things.
34 * gb 09 November 2004 : restore the escape button.
35 * gb 09 November 2004 : have a menu bar in the viewer shell.
36 * gb 09 November 2004 : have gl2ps file production.
37 * gb 14 November 2004 : inherit G4OpenInventorViewer.
38 */
39
40// this :
42
43#include <Inventor/nodes/SoSelection.h>
44
45#include <Inventor/Xt/SoXt.h>
46
47//Replaces inclusion of SoXtExaminerViewer.h
48#include <Inventor/Xt/viewers/SoXtFlyViewer.h>
49
50#include <X11/StringDefs.h>
51#include <X11/Shell.h>
52
53#include <Xm/Xm.h>
54#include <Xm/PushB.h>
55#include <Xm/Form.h>
56#include <Xm/CascadeB.h>
57#include <Xm/RowColumn.h>
58#include <Xm/Text.h>
59
60#include <cstdio>
61
63
64#include "G4OpenInventor.hh"
68#include "G4VisManager.hh"
69#include "G4AttCheck.hh"
70
72 G4OpenInventorSceneHandler& sceneHandler
73,const G4String& name)
74:G4OpenInventorViewer (sceneHandler, name)
75,fShell(0)
76,fViewer(0)
77,fHelpForm(0)
78,fHelpText(0)
79{
81 G4cout << "Window name: " << fName << G4endl;
82}
83
84
86
87 G4String wName = fName;
88
89 Widget parent = (Widget)fInteractorManager->GetParentInteractor ();
90 // G4cout << "DEBUG G4OpenInventorXtExtendedViewer: parent = " << parent << G4endl;
91 int width = 600;
92 int height = 600;
93
94 if(!parent) {
95 // Check if user has specified an X-Windows-type geometry string...
96 char s[32];
97
98 G4String sgeometry = fVP.GetXGeometryString();
99 if(sgeometry.empty()) {
100 G4cout << "ERROR: Geometry string \""
101 << sgeometry
102 << "\" is empty. Using \"600x600\"."
103 << G4endl;
104 width = 600;
105 height = 600;
106 snprintf(s,32,"%dx%d",width,height);
107 sgeometry = s;
108 } else {
109 width = fVP.GetWindowSizeHintX();
110 height = fVP.GetWindowSizeHintX();
111 }
112
113 //Create a shell window :
114 G4String shellName = wName;
115 shellName += "_shell";
116 Arg args[10];
117 XtSetArg(args[0],XtNgeometry,XtNewString(sgeometry.c_str()));
118 XtSetArg(args[1],XtNborderWidth,0);
119 XtSetArg(args[2],XtNtitle,XtNewString(wName.c_str()));
120 fShell = XtAppCreateShell(shellName.c_str(),"Inventor",
121 topLevelShellWidgetClass,
122 SoXt::getDisplay(),
123 args,3);
124
125 // G4cout << "DEBUG CREATING THE VIEWER WITH CREATED SHELL = " << fShell << G4endl;
126 fViewer = new G4OpenInventorXtExaminerViewer(fShell, wName.c_str(), TRUE);
127 fViewer->addEscapeCallback(EscapeFromKeyboardCbk, (void *)this);
128
129 // FWJ (viewpoints don't work with this!)
130 // fViewer->setAutoClipping((SbBool)0);
131
132 //XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
133 //XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
134 //XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
135 //XtSetArg(args[3],XmNbottomAttachment,XmATTACH_FORM);
136 //Widget form = XmCreateForm (fShell,(char*)"form",args,4);
137 //XtManageChild (form);
138
139 Widget menuBar = fViewer->getMenuBar();
140
141 //XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
142 //XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
143 //XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
144 //Widget menuBar = XmCreateMenuBar (form,(char*)"menuBar",args,3);
145 //XtManageChild(menuBar);
146
147 {Widget menu = fViewer->getMenu();
148 //{Widget menu = AddMenu(menuBar,"File","File");
149 AddButton(menu,"Write PS (gl2ps)",PostScriptCbk);
150 AddButton(menu, "Write PDF (gl2ps)", PDFCbk);
151 AddButton(menu,"Write PS (pixmap)",PixmapPostScriptCbk);
152 AddButton(menu,"Write IV",WriteInventorCbk);
153 AddButton(menu,"Escape",EscapeCbk);}
154
155 {Widget menu = AddMenu(menuBar,"Etc","Etc");
156 AddButton(menu,"Erase detector",EraseDetectorCbk);
157 AddButton(menu,"Erase event",EraseEventCbk);
158 AddButton(menu,"Set solid",SetSolidCbk);
159/* AddButton(menu,"Set (G4) wire frame",SetWireFrameCbk);*/
160 AddButton(menu,"Set (G4) reduced wire frame",SetReducedWireFrameCbk);
161 AddButton(menu,"Set (G4) full wire frame",SetFullWireFrameCbk);
162 AddButton(menu,"Visible mothers + invisible daughters",SetPreviewCbk);
163 AddButton(menu,"Visible mothers + visible daughters",SetPreviewAndFullCbk);
164 AddButton(menu,"Update scene",UpdateSceneCbk);
165 AddButton(menu,"Scene graph stats",SceneGraphStatisticsCbk);
166 }
167
168 {Widget menu = AddMenu(menuBar,"Help","Help");
169 AddButton(menu,"Controls",HelpCbk);}
170
171 //fViewer = new SoXtExaminerViewer(form,wName.c_str(),TRUE);
172
173 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_WIDGET);
174 XtSetArg(args[1],XmNtopWidget ,menuBar);
175 XtSetArg(args[2],XmNleftAttachment ,XmATTACH_FORM);
176 XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
177 XtSetArg(args[4],XmNbottomAttachment,XmATTACH_FORM);
178 XtSetValues(fViewer->getWidget(),args,5);
179
180 fHelpForm = XmCreateFormDialog(fShell,(char*)"help",NULL,0);
181 XtSetArg(args[0],XmNleftAttachment ,XmATTACH_FORM);
182 XtSetArg(args[1],XmNrightAttachment ,XmATTACH_FORM);
183 XtSetArg(args[2],XmNbottomAttachment,XmATTACH_FORM);
184 Widget cancel = XmCreatePushButton(fHelpForm,(char*)"helpCancel",args,3);
185 XtAddCallback(cancel,XmNactivateCallback,HelpCancelCbk,(XtPointer)this);
186 XtManageChild(cancel);
187 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
188 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
189 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
190 XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
191 XtSetArg(args[4],XmNbottomWidget ,cancel);
192 fHelpText = XmCreateScrolledText(fHelpForm,(char*)"helpText",args,5);
193 XtManageChild(fHelpText);
194
196
197 } else {
199 if(str!=0) wName = str;
200 // G4cout << "DEBUG CREATING THE VIEWER WITH parent = " << parent << G4endl;
201 fViewer = new G4OpenInventorXtExaminerViewer(parent, wName.c_str(), TRUE);
202 }
203
204 // Use our own SelectionCB for the Xt viewer to allow for abbreviated output
205 // when picking a trajectory
206 fSoSelection->removeSelectionCallback(G4OpenInventorViewer::SelectionCB,
207 this);
208// fSoSelection->addSelectionCallback(SelectionCB, this);
209
210 fViewer->setSize(SbVec2s(width,height));
211
212 // Have a GL2PS render action :
213 const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
214 fGL2PSAction = new SoGL2PSAction(vpRegion);
215 fViewer->setGLRenderAction(fGL2PSAction);
216
217 // Else :
218 fViewer->setSceneGraph(fSoSelection);
219 fViewer->viewAll();
220 fViewer->saveHomePosition();
221 fViewer->setTitle(fName);
222 fViewer->show();
223 if(fShell) {
224 SoXt::show(fShell);
226 }
227 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
228 // TJR added:
229 fViewer->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_ADD);
230}
231
233 if(fShell) fInteractorManager->RemoveShell(fShell);
234 if(fViewer) {
235 fViewer->setSceneGraph(0);
236 //FIXME : SGI : the below "delete" block things.
237 //FIXME : CoinXt : the below "delete" crashe in ~SoXtRenderArea.
238 //FIXME : delete fViewer;
239 }
240 if(fShell) XtDestroyWidget(fShell);
241}
242
244 if(!fViewer) return;
245 fViewer->viewAll();
246 fViewer->saveHomePosition();
247}
248
251 if(!fViewer) return;
252 // Background.
254 fViewer->setBackgroundColor
255 (SbColor((float)b.GetRed(),(float)b.GetGreen(),(float)b.GetBlue()));
256}
257
258
260 if(!fViewer) return;
261 fViewer->render();
262}
263
265 if(!fViewer) return 0;
266 return fViewer->getCamera();
267}
268
269Widget G4OpenInventorXtExtendedViewer::AddMenu(
270 Widget aMenuBar
271,const G4String& aName
272,const G4String& aLabel
273)
274{
275 // Pulldown menu :
276 Widget menu = XmCreatePulldownMenu(aMenuBar,(char*)aName.c_str(),NULL,0);
277 // Cascade button :
278 Arg args[2];
279 XmString cps =
280 XmStringLtoRCreate((char*)aLabel.c_str(),(char*)XmSTRING_DEFAULT_CHARSET);
281 XtSetArg (args[0],XmNlabelString,cps);
282 XtSetArg (args[1],XmNsubMenuId,menu);
283 Widget widget = XmCreateCascadeButton(aMenuBar,(char*)aName.c_str(),args,2);
284 XmStringFree (cps);
285 XtManageChild(widget);
286 return menu;
287}
288void G4OpenInventorXtExtendedViewer::AddButton (
289 Widget aMenu
290,const G4String& aLabel
291,XtCallbackProc aCallback
292)
293{
294 Widget widget = XmCreatePushButton(aMenu,(char*)aLabel.c_str(),NULL,0);
295 XtManageChild(widget);
296 XtAddCallback(widget,XmNactivateCallback,aCallback,(XtPointer)this);
297}
298
299void G4OpenInventorXtExtendedViewer::HelpCancelCbk(
300 Widget,XtPointer aData,XtPointer) {
302 XtUnmanageChild(This->fHelpForm);
303}
304
305
306//////////////////////////////////////////////////////////////////////////////
307//////////////////////////////////////////////////////////////////////////////
308//////////////////////////////////////////////////////////////////////////////
309
310void G4OpenInventorXtExtendedViewer::EscapeCbk(
311 Widget,XtPointer aData,XtPointer) {
313 This->Escape();
314}
315
316// Allow escape from X event loop via key
317void G4OpenInventorXtExtendedViewer::EscapeFromKeyboardCbk(void* o) {
319 This->Escape();
320}
321
322void G4OpenInventorXtExtendedViewer::PostScriptCbk(
323 Widget,XtPointer aData,XtPointer) {
325 // FWJ Workaround: avoids empty 2nd page in file
326 SbBool superimpState =
327 This->fViewer->getSuperimpositionEnabled(This->fViewer->superimposition);
328 This->fViewer->setSuperimpositionEnabled(This->fViewer->superimposition,
329 FALSE);
330 This->WritePostScript();
331 if (superimpState)
332 This->fViewer->setSuperimpositionEnabled(This->fViewer->superimposition,
333 TRUE);
334}
335void G4OpenInventorXtExtendedViewer::PDFCbk(
336 Widget,XtPointer aData,XtPointer) {
338 // FWJ Workaround: avoids empty 2nd page in file
339 SbBool superimpState =
340 This->fViewer->getSuperimpositionEnabled(This->fViewer->superimposition);
341 This->fViewer->setSuperimpositionEnabled(This->fViewer->superimposition,
342 FALSE);
343 This->WritePDF();
344 if (superimpState)
345 This->fViewer->setSuperimpositionEnabled(This->fViewer->superimposition,
346 TRUE);
347}
348
349void G4OpenInventorXtExtendedViewer::PixmapPostScriptCbk(
350 Widget,XtPointer aData,XtPointer) {
352 This->WritePixmapPostScript();
353}
354
355void G4OpenInventorXtExtendedViewer::SceneGraphStatisticsCbk(
356 Widget,XtPointer aData,XtPointer) {
358 This->SceneGraphStatistics();
359}
360
361void G4OpenInventorXtExtendedViewer::WriteInventorCbk(
362 Widget,XtPointer aData,XtPointer) {
364 This->WriteInventor();
365}
366
367void G4OpenInventorXtExtendedViewer::EraseDetectorCbk(
368 Widget,XtPointer aData,XtPointer) {
370 This->EraseDetector();
371}
372
373void G4OpenInventorXtExtendedViewer::EraseEventCbk(
374 Widget,XtPointer aData,XtPointer) {
376 This->EraseEvent();
377}
378
379void G4OpenInventorXtExtendedViewer::SetSolidCbk(
380 Widget,XtPointer aData,XtPointer) {
382 This->SetSolid();
383}
384
385void G4OpenInventorXtExtendedViewer::SetWireFrameCbk(
386 Widget,XtPointer aData,XtPointer) {
388 This->SetWireFrame();
389}
390
391void G4OpenInventorXtExtendedViewer::SetReducedWireFrameCbk(
392 Widget,XtPointer aData,XtPointer) {
394 This->SetReducedWireFrame(true);
395}
396
397void G4OpenInventorXtExtendedViewer::SetFullWireFrameCbk(
398 Widget,XtPointer aData,XtPointer) {
400 This->SetReducedWireFrame(false);
401}
402
403void G4OpenInventorXtExtendedViewer::UpdateSceneCbk(
404 Widget,XtPointer aData,XtPointer) {
406 This->UpdateScene();
407}
408
409void G4OpenInventorXtExtendedViewer::SetPreviewCbk(
410 Widget,XtPointer aData,XtPointer) {
412 This->SetPreview();
413}
414
415void G4OpenInventorXtExtendedViewer::SetPreviewAndFullCbk(
416 Widget,XtPointer aData,XtPointer) {
418 This->SetPreviewAndFull();
419}
420
421void G4OpenInventorXtExtendedViewer::HelpCbk(
422 Widget,XtPointer aData,XtPointer) {
424 XtManageChild(This->fHelpForm);
425 XmTextSetString(This->fHelpText,(char*)This->Help().c_str());
426}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define SoGL2PSAction
Definition: SoGL2PSAction.h:40
G4double GetBlue() const
Definition: G4Colour.hh:154
G4double GetRed() const
Definition: G4Colour.hh:152
G4double GetGreen() const
Definition: G4Colour.hh:153
G4String Help(const G4String &topic="controls")
void WriteInventor(const G4String &file="g4out.iv")
void WritePostScript(const G4String &file="g4out.ps")
void Escape()
Menu items callbacks /////////////////////////////////////////////////////.
G4VInteractorManager * fInteractorManager
void WritePixmapPostScript(const G4String &file="g4out.ps")
static void SelectionCB(void *, SoPath *)
void WritePDF(const G4String &file="g4out.pdf")
Geant4_SoGL2PSAction * fGL2PSAction
void addEscapeCallback(void(*cb)(void *), void *)
G4OpenInventorXtExtendedViewer(G4OpenInventorSceneHandler &scene, const G4String &name="")
void SetCreatedInteractor(G4Interactor)
virtual void FlushAndWaitExecution()=0
G4Interactor GetParentInteractor()
void RemoveShell(G4Interactor)
void AddShell(G4Interactor)
G4String fName
Definition: G4VViewer.hh:218
G4ViewParameters fVP
Definition: G4VViewer.hh:220
const G4String & GetXGeometryString() const
unsigned int GetWindowSizeHintX() const
const G4Colour & GetBackgroundColour() const
static Verbosity GetVerbosity()
#define TRUE
Definition: globals.hh:41
#define FALSE
Definition: globals.hh:38