Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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:67
G4GLOB_DLL std::ostream G4cout
#define SoGL2PSAction
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
void RemoveShell(G4Interactor)
void AddShell(G4Interactor)
G4String fName
Definition G4VViewer.hh:255
G4ViewParameters fVP
Definition G4VViewer.hh:257
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