Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4OpenGLViewerMessenger.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
29
30#include "G4OpenGLViewer.hh"
33#include "G4UImanager.hh"
34#include "G4UIcommand.hh"
35#include "G4UIdirectory.hh"
37#include "G4UIcmdWithADouble.hh"
38#include "G4UIcmdWithABool.hh"
39#include "G4UIcmdWithAString.hh"
41#include "G4VisManager.hh"
42#include <sstream>
43
45G4OpenGLViewerMessenger::fpInstance = 0;
46
49{
50 if (!fpInstance) fpInstance = new G4OpenGLViewerMessenger;
51 return fpInstance;
52}
53
54G4OpenGLViewerMessenger::G4OpenGLViewerMessenger()
55{
56 G4bool omitable;
57
58 fpDirectory = new G4UIdirectory("/vis/ogl/");
59 fpDirectory->SetGuidance("G4OpenGLViewer commands.");
60
61 fpCommandExport =
62 new G4UIcommand("/vis/ogl/export", this);
63 fpCommandExport->SetGuidance ("Export a screenshot of current OpenGL viewer");
64 fpCommandExport->SetGuidance
65 ("If name is \"\", filename and extension will have the current value");
66 fpCommandExport->SetGuidance
67 ("If name is \"toto.png\", set the name to \"toto\" and the format to \"png\".");
68 fpCommandExport->SetGuidance
69 ("If name is \"toto\", set the name to \"toto\" and the format to current format.");
70 fpCommandExport->SetGuidance
71 ("Will also add an incremented suffix at the end of the name, except if name is"
72 "\nthe same as previous it will not reset the incremented suffix.");
73 fpCommandExport->SetGuidance
74 ("Setting size is available only on eps/pdf/svg/ps formats.");
75 G4UIparameter* parameterExport;
76 parameterExport = new G4UIparameter ("name", 's', omitable = true);
77 parameterExport->SetDefaultValue("!");
78 parameterExport->SetGuidance
79 ("By default, will take a default value or the last \"/vis/ogl/set/printFilename\""
80 " value if set.");
81 fpCommandExport->SetParameter(parameterExport);
82 parameterExport = new G4UIparameter ("width", 'd', omitable = true);
83 parameterExport->SetGuidance
84 ("By default, will take the current width of the viewer or \"/vis/ogl/set/printSize\""
85 "\nif set. This parameter is only useful for eps/pdf/svg/ps formats !");
86 parameterExport->SetDefaultValue(-1);
87 fpCommandExport->SetParameter(parameterExport);
88 parameterExport = new G4UIparameter ("height", 'd', omitable = true);
89 parameterExport->SetGuidance
90 ("By default, will take the current height of the viewer or \"/vis/ogl/set/printSize\""
91 "\nif set. This parameter is only useful for eps/pdf/svg/ps formats !");
92 parameterExport->SetDefaultValue(-1);
93 fpCommandExport->SetParameter(parameterExport);
94
95 fpCommandFlushAt = new G4UIcommand("/vis/ogl/flushAt", this);
96 fpCommandFlushAt->SetGuidance
97 ("Controls the rate at which graphics primitives are flushed to screen.");
98 fpCommandFlushAt->SetGuidance
99 ("Flushing to screen is an expensive operation so to speed drawing choose"
100 "\nan action suitable for your application. Note that detectors are flushed"
101 "\nto screen anyway at end of drawing, and events are flushed to screen"
102 "\nanyway depending on /vis/scene/endOfEventAction and endOfRunAction.");
103 fpCommandFlushAt->SetGuidance
104 ("For NthPrimitive and NthEvent the second parameter N is operative.");
105 fpCommandFlushAt->SetGuidance
106 ("For \"never\", detectors and events are still flushed as described above.");
107 G4UIparameter* parameterFlushAt;
108 parameterFlushAt = new G4UIparameter ("action", 's', omitable = true);
109 parameterFlushAt->SetParameterCandidates
110 ("endOfEvent endOfRun eachPrimitive NthPrimitive NthEvent never");
111 parameterFlushAt->SetDefaultValue("NthEvent");
112 fpCommandFlushAt->SetParameter(parameterFlushAt);
113 parameterFlushAt = new G4UIparameter ("N", 'i', omitable = true);
114 parameterFlushAt->SetDefaultValue(100);
115 fpCommandFlushAt->SetParameter(parameterFlushAt);
116
117 fpDirectorySet = new G4UIdirectory ("/vis/ogl/set/");
118 fpDirectorySet->SetGuidance("G4OpenGLViewer set commands.");
119
120 fpCommandDisplayListLimit =
121 new G4UIcmdWithoutParameter("/vis/ogl/set/displayListLimit", this);
122 fpCommandDisplayListLimit->SetGuidance
123 ("This command is no longer relevant. There is no longer any limit on the"
124 "\nnumber of display lists - except, of course, the available memory in"
125 "\nyour computer. Keep an eye on that. Good luck!");
126
127 fpCommandExportFormat =
128 new G4UIcommand("/vis/ogl/set/exportFormat", this);
129 fpCommandExportFormat->SetGuidance ("Set export format");
130 fpCommandExportFormat->SetGuidance ("By default, pdf/eps/svg/ps are available. Depending of viewers several other format are available.");
131 fpCommandExportFormat->SetGuidance ("Try /vis/ogl/set/exportFormat without parameters to see them.");
132 fpCommandExportFormat->SetGuidance ("Changing format will reset the incremental suffix to 0.");
133 G4UIparameter* parameterExportFormat;
134 parameterExportFormat = new G4UIparameter ("format", 's', omitable = true);
135 parameterExportFormat->SetDefaultValue("");
136 fpCommandExportFormat->SetParameter(parameterExportFormat);
137
138 fpCommandPrintFilename =
139 new G4UIcommand("/vis/ogl/set/printFilename", this);
140 fpCommandPrintFilename->SetGuidance ("Set print filename");
141 fpCommandPrintFilename->SetGuidance ("Setting 'incremental' will increment filename by one at each new print, starting at 0");
142 G4UIparameter* parameterPrintFilename;
143 parameterPrintFilename = new G4UIparameter ("name", 's', omitable = true);
144 parameterPrintFilename->SetDefaultValue("G4OpenGL");
145 fpCommandPrintFilename->SetParameter(parameterPrintFilename);
146 parameterPrintFilename = new G4UIparameter ("incremental", 'b', omitable = true);
147 parameterPrintFilename->SetDefaultValue(1);
148 fpCommandPrintFilename->SetParameter(parameterPrintFilename);
149
150 fpCommandPrintMode = new G4UIcmdWithAString("/vis/ogl/set/printMode",this);
151 fpCommandPrintMode->SetGuidance("Set print mode, only available for \"ps\" format");
152 fpCommandPrintMode->SetParameterName("print_mode",omitable = true);
153 fpCommandPrintMode->SetCandidates("vectored pixmap");
154 fpCommandPrintMode->SetDefaultValue("vectored");
155
156 fpCommandPrintSize =
157 new G4UIcommand("/vis/ogl/set/printSize", this);
158 fpCommandPrintSize->SetGuidance ("Set print size");
159 fpCommandPrintSize->SetGuidance ("Tip : -1 will mean 'print size' = 'window size'");
160 fpCommandPrintSize->SetGuidance (" Setting size greater than your maximum graphic card capacity , will set the size to maximum size.");
161 G4UIparameter* parameterPrintSize;
162 parameterPrintSize = new G4UIparameter ("width", 'd', omitable = false);
163 parameterPrintSize->SetDefaultValue(-1);
164 fpCommandPrintSize->SetParameter(parameterPrintSize);
165 parameterPrintSize = new G4UIparameter ("height", 'd', omitable = false);
166 parameterPrintSize->SetDefaultValue(-1);
167 fpCommandPrintSize->SetParameter(parameterPrintSize);
168
169 fpCommandTransparency =
170 new G4UIcmdWithABool("/vis/ogl/set/transparency", this);
171 fpCommandTransparency->SetGuidance
172 ("True/false to enable/disable rendering of transparent objects.");
173 fpCommandTransparency->SetParameterName
174 ("transparency-enabled", omitable = true);
175 fpCommandTransparency->SetDefaultValue(true);
176}
177
179{
180 delete fpCommandTransparency;
181 delete fpCommandPrintSize;
182 delete fpCommandPrintMode;
183 delete fpCommandPrintFilename;
184 delete fpCommandExportFormat;
185 delete fpCommandDisplayListLimit;
186 delete fpDirectorySet;
187 delete fpCommandFlushAt;
188 delete fpCommandExport;
189 delete fpDirectory;
190
191 delete fpInstance;
192}
193
195(G4UIcommand* command, G4String newValue)
196{
198
199 G4VViewer* pViewer = pVisManager->GetCurrentViewer();
200 if (!pViewer) {
201 G4cout <<
202 "G4OpenGLViewerMessenger::SetNewValue: No current viewer."
203 "\n \"/vis/open\", or similar, to get one."
204 << G4endl;
205 return;
206 }
207
208 G4VSceneHandler* pSceneHandler = pViewer->GetSceneHandler();
209 if (!pSceneHandler) {
210 G4cout <<
211 "G4OpenGLViewerMessenger::SetNewValue: This viewer has no scene handler."
212 "\n Shouldn't happen - please report circumstances."
213 "\n (Viewer is \"" << pViewer->GetName() << "\".)"
214 "\n Try \"/vis/open\", or similar, to get one."
215 << G4endl;
216 return;
217 }
218
219 G4OpenGLViewer* pOGLViewer = dynamic_cast<G4OpenGLViewer*>(pViewer);
220 if (!pOGLViewer) {
221 G4cout <<
222 "G4OpenGLViewerMessenger::SetNewValue: Current viewer is not of type"
223 "\n OGL. (It is \""
224 << pViewer->GetName() <<
225 "\".)\n Use \"/vis/viewer/select\" or \"/vis/open\"."
226 << G4endl;
227 return;
228 }
229
230 G4OpenGLSceneHandler* pOGLSceneHandler =
231 dynamic_cast<G4OpenGLSceneHandler*>(pSceneHandler);
232 if (!pOGLSceneHandler) {
233 G4cout <<
234 "G4OpenGLViewerMessenger::SetNewValue: Current scene handler is not of type"
235 "\n OGL. (Viewer is \"" << pViewer->GetName() << "\".)"
236 "\n (Scene handler is \"" << pSceneHandler->GetName() << "\".)"
237 "\n Use \"/vis/sceneHandler/list\" and \"/vis/sceneHandler/select\""
238 "\n or \"/vis/open\"."
239 << G4endl;
240 return;
241 }
242
243 if (command == fpCommandExport)
244 {
245 G4String name;
246 G4int width,height;
247 std::istringstream iss(newValue);
248 iss >> name >> width >> height;
249 pOGLViewer->exportImage(name, width, height);
250
251 if (pOGLViewer->fVP.IsAutoRefresh())
252 G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh");
253 return;
254 }
255
256 if (command == fpCommandExportFormat)
257 {
258 G4String name;
259 std::istringstream iss(newValue);
260 iss >> name;
261 pOGLViewer->setExportImageFormat(name);
262
263 return;
264 }
265
266 if (command == fpCommandFlushAt)
267 {
268 static G4bool firstTime = true;
269 static std::map<G4String,G4OpenGLSceneHandler::FlushAction> actionMap;
270 if (firstTime) {
271 actionMap["endOfEvent"] = G4OpenGLSceneHandler::endOfEvent;
272 actionMap["endOfRun"] = G4OpenGLSceneHandler::endOfRun;
273 actionMap["eachPrimitive"] = G4OpenGLSceneHandler::eachPrimitive;
274 actionMap["NthPrimitive"] = G4OpenGLSceneHandler::NthPrimitive;
275 actionMap["NthEvent"] = G4OpenGLSceneHandler::NthEvent;
276 actionMap["never"] = G4OpenGLSceneHandler::never;
277 firstTime = false;
278 }
279 G4String action;
280 G4int entitiesFlushInterval;
281 std::istringstream iss(newValue);
282 iss >> action >> entitiesFlushInterval;
283 pOGLSceneHandler->SetFlushAction(actionMap[action]);
284 pOGLSceneHandler->SetEntitiesFlushInterval(entitiesFlushInterval);
285 return;
286 }
287
288 if (command == fpCommandPrintFilename)
289 {
290 G4String name;
291 G4bool inc;
292 std::istringstream iss(newValue);
293 iss >> name
294 >> inc;
295 pOGLViewer->setExportFilename(name,inc);
296 return;
297 }
298
299 if (command == fpCommandPrintMode)
300 {
301 if (newValue == "vectored") pOGLViewer->fVectoredPs = true;
302
303 if (newValue == "pixmap") pOGLViewer->fVectoredPs = false;
304 return;
305 }
306
307 if (command == fpCommandPrintSize)
308 {
309 G4int width,height;
310 std::istringstream iss(newValue);
311 iss >> width
312 >> height;
313 pOGLViewer->setExportSize(width,height);
314 return;
315 }
316
317 if (command == fpCommandTransparency)
318 {
319 pOGLViewer->transparency_enabled = command->ConvertToBool(newValue);
320 if (pOGLViewer->fVP.IsAutoRefresh())
321 G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh");
322 return;
323 }
324
325 // Stored viewer commands
326 G4OpenGLStoredViewer* pOGLSViewer =
327 dynamic_cast<G4OpenGLStoredViewer*>(pViewer);
328
329 if (!pOGLSViewer)
330 {
331 G4cout <<
332 "G4OpenGLViewerMessenger::SetNewValue: Current viewer is not of type OGLS."
333 "\n (It is \"" << pViewer->GetName() << "\".)"
334 "\n This feature is only implemented for OGL Stored viewers."
335 "\n Use \"/vis/viewer/select\" or \"/vis/open OGLS...\"."
336 << G4endl;
337 return;
338 }
339
340 // Scene handler commands
341 G4OpenGLStoredSceneHandler* pOGLSSceneHandler =
342 dynamic_cast<G4OpenGLStoredSceneHandler*>(pViewer->GetSceneHandler());
343
344 if (!pOGLSSceneHandler) {
345 G4cout <<
346 "G4OpenGLViewerMessenger::SetNewValue: Current scene handler is not of type"
347 "\n OGLS (Stored). (Viewer is \"" << pViewer->GetName() << "\".)"
348 "\n (Scene handler is \"" << pSceneHandler->GetName() << "\".)"
349 "\n This feature is only implemented for OGL Stored"
350 "\n scene handlers. Use \"/vis/viewer/select\" or \"/vis/open OGLS...\"."
351 << G4endl;
352 return;
353 }
354
355 if (command == fpCommandDisplayListLimit)
356 {
357 G4cerr << command->GetGuidanceLine(0) << G4endl;
358 return;
359 }
360}
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
static void SetFlushAction(FlushAction action)
static void SetEntitiesFlushInterval(G4int interval)
static G4OpenGLViewerMessenger * GetInstance()
void SetNewValue(G4UIcommand *, G4String)
bool setExportImageFormat(std::string format, bool quiet=false)
bool setExportFilename(G4String name, G4bool inc=true)
void setExportSize(G4int, G4int)
G4bool transparency_enabled
virtual bool exportImage(std::string name="", int width=-1, int height=-1)
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
void SetDefaultValue(G4bool defVal)
void SetCandidates(const char *candidateList)
void SetParameterName(const char *theName, G4bool omittable, G4bool currentAsDefault=false)
void SetDefaultValue(const char *defVal)
const G4String & GetGuidanceLine(G4int i) const
Definition: G4UIcommand.hh:133
void SetParameter(G4UIparameter *const newParameter)
Definition: G4UIcommand.hh:147
void SetGuidance(const char *aGuidance)
Definition: G4UIcommand.hh:157
static G4bool ConvertToBool(const char *st)
Definition: G4UIcommand.cc:549
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:495
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:77
void SetDefaultValue(const char *theDefaultValue)
void SetGuidance(const char *theGuidance)
void SetParameterCandidates(const char *theString)
const G4String & GetName() const
const G4String & GetName() const
G4ViewParameters fVP
Definition: G4VViewer.hh:220
G4VSceneHandler * GetSceneHandler() const
G4bool IsAutoRefresh() const
G4VViewer * GetCurrentViewer() const
static G4VisManager * GetInstance()