source: trunk/source/visualization/management/src/G4VisCommandsViewer.cc @ 1136

Last change on this file since 1136 was 1136, checked in by garnier, 15 years ago

debug updates

  • Property svn:mime-type set to text/cpp
File size: 49.3 KB
Line 
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// $Id: G4VisCommandsViewer.cc,v 1.75 2009/01/19 15:47:49 lgarnier Exp $
28// GEANT4 tag $Name:  $
29
30// /vis/viewer commands - John Allison  25th October 1998
31
32#include "G4VisCommandsViewer.hh"
33
34#include "G4VisManager.hh"
35#include "G4GraphicsSystemList.hh"
36#include "G4VisCommandsScene.hh"
37#include "G4UImanager.hh"
38#include "G4UIcommand.hh"
39#include "G4UIcmdWithoutParameter.hh"
40#include "G4UIcmdWithAString.hh"
41#include "G4UIcmdWithADouble.hh"
42#include "G4UIcmdWithADoubleAndUnit.hh"
43#include "G4UIcmdWith3Vector.hh"
44#include "G4UnitsTable.hh"
45#include "G4ios.hh"
46#include <sstream>
47
48G4VVisCommandViewer::G4VVisCommandViewer () {}
49
50G4VVisCommandViewer::~G4VVisCommandViewer () {}
51
52void G4VVisCommandViewer::SetViewParameters
53(G4VViewer* viewer, const G4ViewParameters& viewParams) {
54  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
55  viewer->SetViewParameters(viewParams);
56  G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
57  if (sceneHandler && sceneHandler->GetScene()) {
58    if (viewParams.IsAutoRefresh()) {
59      G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh");
60    }
61    else {
62      if (verbosity >= G4VisManager::confirmations) {
63        G4cout << "Issue /vis/viewer/refresh to see effect." << G4endl;
64      }
65    }
66  }
67}
68
69////////////// /vis/viewer/addCutawayPlane ///////////////////////////////////////
70
71G4VisCommandViewerAddCutawayPlane::G4VisCommandViewerAddCutawayPlane () {
72  G4bool omitable;
73  fpCommand = new G4UIcommand ("/vis/viewer/addCutawayPlane", this);
74  fpCommand -> SetGuidance
75    ("Add cutaway plane to current viewer.");
76  G4UIparameter* parameter;
77  parameter  =  new G4UIparameter("x",'d',omitable = true);
78  parameter  -> SetDefaultValue  (0);
79  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
80  fpCommand->SetParameter(parameter);
81  parameter  =  new G4UIparameter("y",'d',omitable = true);
82  parameter  -> SetDefaultValue  (0);
83  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
84  fpCommand->SetParameter(parameter);
85  parameter  =  new G4UIparameter("z",'d',omitable = true);
86  parameter  -> SetDefaultValue  (0);
87  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
88  fpCommand->SetParameter(parameter);
89  parameter  =  new G4UIparameter("unit",'s',omitable = true);
90  parameter  -> SetDefaultValue  ("m");
91  parameter  -> SetGuidance      ("Unit of point on the plane.");
92  fpCommand->SetParameter(parameter);
93  parameter  =  new G4UIparameter("nx",'d',omitable = true);
94  parameter  -> SetDefaultValue  (1);
95  parameter  -> SetGuidance      ("Component of plane normal.");
96  fpCommand->SetParameter(parameter);
97  parameter  =  new G4UIparameter("ny",'d',omitable = true);
98  parameter  -> SetDefaultValue  (0);
99  parameter  -> SetGuidance      ("Component of plane normal.");
100  fpCommand->SetParameter(parameter);
101  parameter  =  new G4UIparameter("nz",'d',omitable = true);
102  parameter  -> SetDefaultValue  (0);
103  parameter  -> SetGuidance      ("Component of plane normal.");
104  fpCommand->SetParameter(parameter);
105}
106
107G4VisCommandViewerAddCutawayPlane::~G4VisCommandViewerAddCutawayPlane () {
108  delete fpCommand;
109}
110
111G4String G4VisCommandViewerAddCutawayPlane::GetCurrentValue (G4UIcommand*) {
112  return "";
113}
114
115void G4VisCommandViewerAddCutawayPlane::SetNewValue (G4UIcommand*, G4String newValue) {
116
117  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
118
119  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
120  if (!viewer) {
121    if (verbosity >= G4VisManager::errors) {
122      G4cout <<
123  "ERROR: No current viewer - \"/vis/viewer/list\" to see possibilities."
124             << G4endl;
125    }
126    return;
127  }
128
129  G4double x, y, z, nx, ny, nz;
130  G4String unit;
131  std::istringstream is (newValue);
132  is >> x >> y >> z >> unit >> nx >> ny >> nz;
133  G4double F = G4UIcommand::ValueOf(unit);
134  x *= F; y *= F; z *= F;
135
136  G4ViewParameters vp = viewer->GetViewParameters();
137  vp.AddCutawayPlane(G4Plane3D(G4Normal3D(nx,ny,nz), G4Point3D(x,y,z)));
138  if (verbosity >= G4VisManager::confirmations) {
139    G4cout << "Cutaway planes for viewer \"" << viewer->GetName() << "\" now:";
140    const G4Planes& cutaways = vp.GetCutawayPlanes();
141    for (size_t i = 0; i < cutaways.size(); ++i)
142      G4cout << "\n  " << i << ": " << cutaways[i];
143    G4cout << G4endl;
144  }
145
146  SetViewParameters(viewer, vp);
147}
148
149////////////// /vis/viewer/changeCutawayPlane ///////////////////////////////////////
150
151G4VisCommandViewerChangeCutawayPlane::G4VisCommandViewerChangeCutawayPlane () {
152  G4bool omitable;
153  fpCommand = new G4UIcommand ("/vis/viewer/changeCutawayPlane", this);
154  fpCommand -> SetGuidance("Change cutaway plane.");
155  G4UIparameter* parameter;
156  parameter  =  new G4UIparameter("index",'i',omitable = false);
157  parameter  -> SetGuidance      ("Index of plane: 0, 1, 2.");
158  fpCommand->SetParameter(parameter);
159  parameter  =  new G4UIparameter("x",'d',omitable = true);
160  parameter  -> SetDefaultValue  (0);
161  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
162  fpCommand->SetParameter(parameter);
163  parameter  =  new G4UIparameter("y",'d',omitable = true);
164  parameter  -> SetDefaultValue  (0);
165  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
166  fpCommand->SetParameter(parameter);
167  parameter  =  new G4UIparameter("z",'d',omitable = true);
168  parameter  -> SetDefaultValue  (0);
169  parameter  -> SetGuidance      ("Coordinate of point on the plane.");
170  fpCommand->SetParameter(parameter);
171  parameter  =  new G4UIparameter("unit",'s',omitable = true);
172  parameter  -> SetDefaultValue  ("m");
173  parameter  -> SetGuidance      ("Unit of point on the plane.");
174  fpCommand->SetParameter(parameter);
175  parameter  =  new G4UIparameter("nx",'d',omitable = true);
176  parameter  -> SetDefaultValue  (1);
177  parameter  -> SetGuidance      ("Component of plane normal.");
178  fpCommand->SetParameter(parameter);
179  parameter  =  new G4UIparameter("ny",'d',omitable = true);
180  parameter  -> SetDefaultValue  (0);
181  parameter  -> SetGuidance      ("Component of plane normal.");
182  fpCommand->SetParameter(parameter);
183  parameter  =  new G4UIparameter("nz",'d',omitable = true);
184  parameter  -> SetDefaultValue  (0);
185  parameter  -> SetGuidance      ("Component of plane normal.");
186  fpCommand->SetParameter(parameter);
187}
188
189G4VisCommandViewerChangeCutawayPlane::~G4VisCommandViewerChangeCutawayPlane () {
190  delete fpCommand;
191}
192
193G4String G4VisCommandViewerChangeCutawayPlane::GetCurrentValue (G4UIcommand*) {
194  return "";
195}
196
197void G4VisCommandViewerChangeCutawayPlane::SetNewValue (G4UIcommand*, G4String newValue) {
198
199  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
200
201  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
202  if (!viewer) {
203    if (verbosity >= G4VisManager::errors) {
204      G4cout <<
205  "ERROR: No current viewer - \"/vis/viewer/list\" to see possibilities."
206             << G4endl;
207    }
208    return;
209  }
210
211  size_t index;
212  G4double x, y, z, nx, ny, nz;
213  G4String unit;
214  std::istringstream is (newValue);
215  is >> index >> x >> y >> z >> unit >> nx >> ny >> nz;
216  G4double F = G4UIcommand::ValueOf(unit);
217  x *= F; y *= F; z *= F;
218
219  G4ViewParameters vp = viewer->GetViewParameters();
220  vp.ChangeCutawayPlane(index,
221                        G4Plane3D(G4Normal3D(nx,ny,nz), G4Point3D(x,y,z)));
222  if (verbosity >= G4VisManager::confirmations) {
223    G4cout << "Cutaway planes for viewer \"" << viewer->GetName() << "\" now:";
224    const G4Planes& cutaways = vp.GetCutawayPlanes();
225    for (size_t i = 0; i < cutaways.size(); ++i)
226      G4cout << "\n  " << i << ": " << cutaways[i];
227    G4cout << G4endl;
228  }
229
230  SetViewParameters(viewer, vp);
231}
232
233////////////// /vis/viewer/clear ///////////////////////////////////////
234
235G4VisCommandViewerClear::G4VisCommandViewerClear () {
236  G4bool omitable, currentAsDefault;
237  fpCommand = new G4UIcmdWithAString ("/vis/viewer/clear", this);
238  fpCommand -> SetGuidance ("Clears viewer.");
239  fpCommand -> SetGuidance
240    ("By default, clears current viewer.  Specified viewer becomes current."
241     "\n\"/vis/viewer/list\" to see  possible viewer names.");
242  fpCommand -> SetParameterName ("viewer-name",
243                                 omitable = true,
244                                 currentAsDefault = true);
245}
246
247G4VisCommandViewerClear::~G4VisCommandViewerClear () {
248  delete fpCommand;
249}
250
251G4String G4VisCommandViewerClear::GetCurrentValue (G4UIcommand*) {
252  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
253  return viewer ? viewer -> GetName () : G4String("none");
254}
255
256void G4VisCommandViewerClear::SetNewValue (G4UIcommand*, G4String newValue) {
257
258  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
259
260  G4String& clearName = newValue;
261  G4VViewer* viewer = fpVisManager -> GetViewer (clearName);
262  if (!viewer) {
263    if (verbosity >= G4VisManager::errors) {
264      G4cout << "ERROR: Viewer \"" << clearName
265             << "\" not found - \"/vis/viewer/list\" to see possibilities."
266             << G4endl;
267    }
268    return;
269  }
270
271#ifdef G4DEBUG_VIS_MANAGEMENT
272  printf("G4VisCommandViewerClear::SetNewValue Call ClearView()\n");
273#endif
274  viewer->ClearView();
275#ifdef G4DEBUG_VIS_MANAGEMENT
276  printf("G4VisCommandViewerClear::SetNewValue Call ClearView() END\n");
277  printf("G4VisCommandViewerClear::SetNewValue Call FinishView()\n");
278#endif
279  viewer->FinishView();
280#ifdef G4DEBUG_VIS_MANAGEMENT
281  printf("G4VisCommandViewerClear::SetNewValue Call FinishView() END\n");
282#endif
283  if (verbosity >= G4VisManager::confirmations) {
284    G4cout << "Viewer \"" << clearName << "\" cleared." << G4endl;
285  }
286
287}
288
289////////////// /vis/viewer/clearCutawayPlanes ///////////////////////////////////////
290
291G4VisCommandViewerClearCutawayPlanes::G4VisCommandViewerClearCutawayPlanes () {
292  fpCommand = new G4UIcmdWithoutParameter
293    ("/vis/viewer/clearCutawayPlanes", this);
294  fpCommand -> SetGuidance ("Clear cutaway planes of current viewer.");
295}
296
297G4VisCommandViewerClearCutawayPlanes::~G4VisCommandViewerClearCutawayPlanes () {
298  delete fpCommand;
299}
300
301G4String G4VisCommandViewerClearCutawayPlanes::GetCurrentValue (G4UIcommand*) {
302  return "";
303}
304
305void G4VisCommandViewerClearCutawayPlanes::SetNewValue (G4UIcommand*, G4String) {
306
307  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
308
309  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
310  if (!viewer) {
311    if (verbosity >= G4VisManager::errors) {
312      G4cout <<
313  "ERROR: No current viewer - \"/vis/viewer/list\" to see possibilities."
314             << G4endl;
315    }
316    return;
317  }
318
319  G4ViewParameters vp = viewer->GetViewParameters();
320  vp.ClearCutawayPlanes();
321  if (verbosity >= G4VisManager::confirmations) {
322    G4cout << "Cutaway planes for viewer \"" << viewer->GetName()
323           << "\" now cleared." << G4endl;
324  }
325
326  SetViewParameters(viewer, vp);
327}
328
329////////////// /vis/viewer/clearTransients //////////////////////////
330
331G4VisCommandViewerClearTransients::G4VisCommandViewerClearTransients () {
332  G4bool omitable, currentAsDefault;
333  fpCommand = new G4UIcmdWithAString ("/vis/viewer/clearTransients", this);
334  fpCommand -> SetGuidance ("Clears transients from viewer.");
335  fpCommand -> SetGuidance
336  ("By default, operates on current viewer.  Specified viewer becomes current."
337     "\n\"/vis/viewer/list\" to see  possible viewer names.");
338  fpCommand -> SetParameterName ("viewer-name",
339                                 omitable = true,
340                                 currentAsDefault = true);
341}
342
343G4VisCommandViewerClearTransients::~G4VisCommandViewerClearTransients () {
344  delete fpCommand;
345}
346
347G4String G4VisCommandViewerClearTransients::GetCurrentValue (G4UIcommand*) {
348  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
349  return viewer ? viewer -> GetName () : G4String("none");
350}
351
352void G4VisCommandViewerClearTransients::SetNewValue (G4UIcommand*, G4String newValue) {
353
354  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
355
356  G4String& clearName = newValue;
357  G4VViewer* viewer = fpVisManager -> GetViewer (clearName);
358  if (!viewer) {
359    if (verbosity >= G4VisManager::errors) {
360      G4cout << "ERROR: Viewer \"" << clearName
361             << "\" not found - \"/vis/viewer/list\" to see possibilities."
362             << G4endl;
363    }
364    return;
365  }
366
367  G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
368  sceneHandler->SetMarkForClearingTransientStore(false);
369  fpVisManager->ResetTransientsDrawnFlags();
370  sceneHandler->ClearTransientStore();
371  if (verbosity >= G4VisManager::confirmations) {
372    G4cout << "Viewer \"" << clearName << "\" cleared of transients."
373           << G4endl;
374  }
375
376}
377
378////////////// /vis/viewer/clone ///////////////////////////////////////
379
380G4VisCommandViewerClone::G4VisCommandViewerClone () {
381  G4bool omitable;
382  fpCommand = new G4UIcommand ("/vis/viewer/clone", this);
383  fpCommand -> SetGuidance ("Clones viewer.");
384  fpCommand -> SetGuidance
385    ("By default, clones current viewer.  Clone becomes current."
386     "\nClone name, if not provided, is derived from the original name."
387     "\n\"/vis/viewer/list\" to see  possible viewer names.");
388  G4UIparameter* parameter;
389  parameter = new G4UIparameter ("original-viewer-name", 's', omitable = true);
390  parameter -> SetCurrentAsDefault (true);
391  fpCommand -> SetParameter (parameter);
392  parameter = new G4UIparameter ("clone-name", 's', omitable = true);
393  parameter -> SetDefaultValue ("none");
394  fpCommand -> SetParameter (parameter);
395}
396
397G4VisCommandViewerClone::~G4VisCommandViewerClone () {
398  delete fpCommand;
399}
400
401G4String G4VisCommandViewerClone::GetCurrentValue (G4UIcommand*) {
402  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
403  G4String originalName = viewer ? viewer -> GetName () : G4String("none");
404  return "\"" + originalName + "\"";
405}
406
407void G4VisCommandViewerClone::SetNewValue (G4UIcommand*, G4String newValue) {
408
409  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
410
411  G4String originalName, cloneName;
412  std::istringstream is (newValue);
413
414  // Need to handle the possibility that the names contain embedded
415  // blanks within quotation marks...
416  char c;
417  while (is.get(c) && c == ' '){}
418  if (c == '"') {
419    while (is.get(c) && c != '"') {originalName += c;}
420  }
421  else {
422    originalName += c;
423    while (is.get(c) && c != ' ') {originalName += c;}
424  }
425  originalName = originalName.strip (G4String::both, ' ');
426  originalName = originalName.strip (G4String::both, '"');
427
428  G4VViewer* originalViewer = fpVisManager -> GetViewer (originalName);
429  if (!originalViewer) {
430    if (verbosity >= G4VisManager::errors) {
431      G4cout << "ERROR: Viewer \"" << originalName
432             << "\" not found - \"/vis/viewer/list\" to see possibilities."
433             << G4endl;
434    }
435    return;
436  }
437  originalName = originalViewer->GetName();  // Ensures long name.
438
439  while (is.get(c) && c == ' '){}
440  if (c == '"') {
441    while (is.get(c) && c != '"') {cloneName += c;}
442  }
443  else {
444    cloneName += c;
445    while (is.get(c) && c != ' ') {cloneName += c;}
446  }
447  cloneName = cloneName.strip (G4String::both, ' ');
448  cloneName = cloneName.strip (G4String::both, '"');
449
450  if (cloneName == "none") {
451    G4int subID = 0;
452    do {
453      cloneName = originalName;
454      std::ostringstream oss;
455      oss << '-' << subID++;
456      G4String::size_type lastDashPosition, nextSpacePosition;
457      if ((lastDashPosition = cloneName.rfind('-')) !=  G4String::npos &&
458          (nextSpacePosition = cloneName.find(" ", lastDashPosition)) !=
459          G4String::npos) {
460        cloneName.insert(nextSpacePosition, oss.str());
461      } else {
462        cloneName.insert(cloneName.find(' '), oss.str());
463      }
464    } while (fpVisManager -> GetViewer (cloneName));
465  }
466
467  if (fpVisManager -> GetViewer (cloneName)) {
468    if (verbosity >= G4VisManager::errors) {
469      G4cout << "ERROR: Putative clone viewer \"" << cloneName
470             << "\" already exists."
471             << G4endl;
472    }
473    return;
474  }
475
476  G4String windowSizeHint =
477    originalViewer->GetViewParameters().GetXGeometryString();
478
479  G4UImanager* UImanager = G4UImanager::GetUIpointer();
480  G4int keepVerbose = UImanager->GetVerboseLevel();
481  G4int newVerbose(0);
482  if (keepVerbose >= 2 ||
483      fpVisManager->GetVerbosity() >= G4VisManager::confirmations)
484    newVerbose = 2;
485  UImanager->SetVerboseLevel(newVerbose);
486  UImanager->ApplyCommand(G4String("/vis/viewer/select " + originalName));
487  UImanager->ApplyCommand
488    (G4String("/vis/viewer/create ! \"" + cloneName + "\" " + windowSizeHint));
489  UImanager->ApplyCommand(G4String("/vis/viewer/set/all " + originalName));
490  UImanager->SetVerboseLevel(keepVerbose);
491
492  if (verbosity >= G4VisManager::confirmations) {
493    G4cout << "Viewer \"" << originalName << "\" cloned." << G4endl;
494    G4cout << "Clone \"" << cloneName << "\" now current." << G4endl;
495  }
496}
497
498////////////// /vis/viewer/create ///////////////////////////////////////
499
500G4VisCommandViewerCreate::G4VisCommandViewerCreate (): fId (0) {
501  G4bool omitable;
502  fpCommand = new G4UIcommand ("/vis/viewer/create", this);
503  fpCommand -> SetGuidance
504    ("Creates a viewer for the specified scene handler.");
505  fpCommand -> SetGuidance
506    ("Default scene handler is the current scene handler.  Invents a name"
507     "\nif not supplied.  (Note: the system adds information to the name"
508     "\nfor identification - only the characters up to the first blank are"
509     "\nused for removing, selecting, etc.)  This scene handler and viewer"
510     "\nbecome current.");
511  G4UIparameter* parameter;
512  parameter = new G4UIparameter ("scene-handler", 's', omitable = true);
513  parameter -> SetCurrentAsDefault (true);
514  fpCommand -> SetParameter (parameter);
515  parameter = new G4UIparameter ("viewer-name", 's', omitable = true);
516  parameter -> SetCurrentAsDefault (true);
517  fpCommand -> SetParameter (parameter);
518  parameter = new G4UIparameter ("window-size-hint", 's', omitable = true);
519  parameter->SetGuidance
520    ("integer (pixels) for square window placed by window manager or"
521     " X-Windows-type geometry string, e.g. 600x600-100+100");
522  parameter->SetDefaultValue("600");
523  fpCommand -> SetParameter (parameter);
524}
525
526G4VisCommandViewerCreate::~G4VisCommandViewerCreate () {
527  delete fpCommand;
528}
529
530G4String G4VisCommandViewerCreate::NextName () {
531  std::ostringstream oss;
532  G4VSceneHandler* sceneHandler = fpVisManager -> GetCurrentSceneHandler ();
533  oss << "viewer-" << fId << " (";
534  if (sceneHandler) {
535    oss << sceneHandler -> GetGraphicsSystem () -> GetName ();
536  }
537  else {
538    oss << "no_scene_handlers";
539  }
540  oss << ")";
541  return oss.str();
542}
543
544G4String G4VisCommandViewerCreate::GetCurrentValue (G4UIcommand*) {
545  G4String currentValue;
546  G4VSceneHandler* currentSceneHandler =
547    fpVisManager -> GetCurrentSceneHandler ();
548  if (currentSceneHandler) {
549    currentValue = currentSceneHandler -> GetName ();
550  }
551  else {
552    currentValue = "none";
553  }
554  currentValue += ' ';
555  currentValue += '"';
556  currentValue += NextName ();
557  currentValue += '"';
558
559  currentValue += " 600";  // Default number of pixels for window size hint.
560
561  return currentValue;
562}
563
564void G4VisCommandViewerCreate::SetNewValue (G4UIcommand*, G4String newValue) {
565
566#ifdef G4DEBUG_VIS_MANAGEMENT
567  printf("G4VisCommandViewerCreate::SetNewValue : %s\n",newValue.c_str());
568#endif
569  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
570
571  G4String sceneHandlerName, newName;
572  G4String windowSizeHintString;
573  std::istringstream is (newValue);
574  is >> sceneHandlerName;
575
576  // Now need to handle the possibility that the second string
577  // contains embedded blanks within quotation marks...
578  char c;
579  while (is.get(c) && c == ' '){}
580  if (c == '"') {
581    while (is.get(c) && c != '"') {newName += c;}
582  }
583  else {
584    newName += c;
585    while (is.get(c) && c != ' ') {newName += c;}
586  }
587  newName = newName.strip (G4String::both, ' ');
588  newName = newName.strip (G4String::both, '"');
589
590  // Now get window size hint...
591  is >> windowSizeHintString;
592
593  const G4SceneHandlerList& sceneHandlerList =
594    fpVisManager -> GetAvailableSceneHandlers ();
595  G4int nHandlers = sceneHandlerList.size ();
596  if (nHandlers <= 0) {
597    if (verbosity >= G4VisManager::errors) {
598      G4cout <<
599        "ERROR: G4VisCommandViewerCreate::SetNewValue: no scene handlers."
600        "\n  Create a scene handler with \"/vis/sceneHandler/create\""
601             << G4endl;
602    }
603    return;
604  }
605
606  G4int iHandler;
607  for (iHandler = 0; iHandler < nHandlers; iHandler++) {
608    if (sceneHandlerList [iHandler] -> GetName () == sceneHandlerName) break;
609  }
610
611  if (iHandler < 0 || iHandler >= nHandlers) {
612    // Invalid command line argument or none.
613    // This shouldn't happen!!!!!!
614    if (verbosity >= G4VisManager::errors) {
615      G4cout << "G4VisCommandViewerCreate::SetNewValue:"
616        " invalid scene handler specified."
617            << G4endl;
618    }
619    return;
620  }
621
622  // Valid index.  Set current scene handler and graphics system in
623  // preparation for creating viewer.
624  G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
625  if (sceneHandler != fpVisManager -> GetCurrentSceneHandler ()) {
626    fpVisManager -> SetCurrentSceneHandler (sceneHandler);
627  }
628
629  // Now deal with name of viewer.
630  G4String nextName = NextName ();
631  if (newName == "") {
632    newName = nextName;
633  }
634  if (newName == nextName) fId++;
635  G4String newShortName = fpVisManager -> ViewerShortName (newName);
636
637  for (iHandler = 0; iHandler < nHandlers; iHandler++) {
638    G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
639    const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
640    for (size_t iViewer = 0; iViewer < viewerList.size (); iViewer++) {
641      if (viewerList [iViewer] -> GetShortName () == newShortName ) {
642        if (verbosity >= G4VisManager::errors) {
643          G4cout << "ERROR: Viewer \"" << newShortName << "\" already exists."
644                 << G4endl;
645        }
646        return;
647      }
648    }
649  }
650
651  // WindowSizeHint and XGeometryString are picked up from the vis
652  // manager in the G4VViewer constructor. In G4VisManager, after Viewer
653  // creation, we will store theses parameters in G4ViewParameters.
654
655  fpVisManager -> CreateViewer (newName,windowSizeHintString);
656
657  G4VViewer* newViewer = fpVisManager -> GetCurrentViewer ();
658  if (newViewer && newViewer -> GetName () == newName) {
659    if (verbosity >= G4VisManager::confirmations) {
660      G4cout << "New viewer \"" << newName << "\" created." << G4endl;
661    }
662  }
663  else {
664    if (verbosity >= G4VisManager::errors) {
665      if (newViewer) {
666        G4cout << "ERROR: New viewer doesn\'t match!!!  Curious!!" << G4endl;
667      } else {
668        G4cout << "WARNING: No viewer created." << G4endl;
669      }
670    }
671  }
672  // Refresh if appropriate...
673  if (newViewer) {
674    if (newViewer->GetViewParameters().IsAutoRefresh()) {
675      G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh");
676    }
677    else {
678      if (verbosity >= G4VisManager::confirmations) {
679        G4cout << "Issue /vis/viewer/refresh to see effect." << G4endl;
680      }
681    }
682  }
683}
684
685////////////// /vis/viewer/dolly and dollyTo ////////////////////////////
686
687G4VisCommandViewerDolly::G4VisCommandViewerDolly ():
688  fDollyIncrement  (0.),
689  fDollyTo (0.)
690{
691  G4bool omitable, currentAsDefault;
692
693  fpCommandDolly = new G4UIcmdWithADoubleAndUnit
694    ("/vis/viewer/dolly", this);
695  fpCommandDolly -> SetGuidance
696    ("Incremental dolly.");
697  fpCommandDolly -> SetGuidance
698    ("Moves the camera incrementally towards target point.");
699  fpCommandDolly -> SetParameterName("increment",
700                                     omitable=true,
701                                     currentAsDefault=true);
702  fpCommandDolly -> SetDefaultUnit("m");
703
704  fpCommandDollyTo = new G4UIcmdWithADoubleAndUnit
705    ("/vis/viewer/dollyTo", this);
706  fpCommandDollyTo -> SetGuidance
707    ("Dolly to specific coordinate.");
708  fpCommandDollyTo -> SetGuidance
709 ("Places the camera towards target point relative to standard camera point.");
710  fpCommandDollyTo -> SetParameterName("distance",
711                                       omitable=true,
712                                       currentAsDefault=true);
713  fpCommandDollyTo -> SetDefaultUnit("m");
714}
715
716G4VisCommandViewerDolly::~G4VisCommandViewerDolly () {
717  delete fpCommandDolly;
718  delete fpCommandDollyTo;
719}
720
721G4String G4VisCommandViewerDolly::GetCurrentValue (G4UIcommand* command) {
722  G4String currentValue;
723  if (command == fpCommandDolly) {
724    currentValue = fpCommandDolly->ConvertToString(fDollyIncrement, "m");
725  }
726  else if (command == fpCommandDollyTo) {
727    currentValue = fpCommandDollyTo->ConvertToString(fDollyTo, "m");
728  }
729  return currentValue;
730}
731
732void G4VisCommandViewerDolly::SetNewValue (G4UIcommand* command,
733                                           G4String newValue) {
734
735
736  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
737
738  G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
739  if (!currentViewer) {
740    if (verbosity >= G4VisManager::errors) {
741      G4cout <<
742        "ERROR: G4VisCommandsViewerDolly::SetNewValue: no current viewer."
743             << G4endl;
744    }
745    return;
746  }
747
748  G4ViewParameters vp = currentViewer->GetViewParameters();
749
750  if (command == fpCommandDolly) {
751    fDollyIncrement = fpCommandDolly->GetNewDoubleValue(newValue);
752    vp.IncrementDolly(fDollyIncrement);
753  }
754  else if (command == fpCommandDollyTo) {
755    fDollyTo = fpCommandDolly->GetNewDoubleValue(newValue);
756    vp.SetDolly(fDollyTo);
757  }
758
759  if (verbosity >= G4VisManager::confirmations) {
760    G4cout << "Dolly distance changed to " << vp.GetDolly() << G4endl;
761  }
762
763  SetViewParameters(currentViewer, vp);
764}
765
766////////////// /vis/viewer/flush ///////////////////////////////////////
767
768G4VisCommandViewerFlush::G4VisCommandViewerFlush () {
769  G4bool omitable, currentAsDefault;
770  fpCommand = new G4UIcmdWithAString ("/vis/viewer/flush", this);
771  fpCommand -> SetGuidance
772    ("Compound command: \"/vis/viewer/refresh\" + \"/vis/viewer/update\".");
773  fpCommand -> SetGuidance
774    ("Useful for refreshing and initiating post-processing for graphics"
775     "\nsystems which need post-processing.  By default, acts on current"
776     "\nviewer.  \"/vis/viewer/list\" to see possible viewers.  Viewer"
777     "\nbecomes current.");
778  fpCommand -> SetParameterName ("viewer-name",
779                                 omitable = true,
780                                 currentAsDefault = true);
781}
782
783G4VisCommandViewerFlush::~G4VisCommandViewerFlush () {
784  delete fpCommand;
785}
786
787G4String G4VisCommandViewerFlush::GetCurrentValue
788(G4UIcommand*) {
789  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
790  return viewer ? viewer -> GetName () : G4String("none");
791}
792
793void G4VisCommandViewerFlush::SetNewValue (G4UIcommand*, G4String newValue) {
794
795  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
796
797  G4String& flushName = newValue;
798  G4VViewer* viewer = fpVisManager -> GetViewer (flushName);
799  if (!viewer) {
800    if (verbosity >= G4VisManager::errors) {
801      G4cout << "ERROR: Viewer \"" << flushName << "\"" <<
802        " not found - \"/vis/viewer/list\"\n  to see possibilities."
803             << G4endl;
804    }
805    return;
806  }
807
808  G4UImanager* ui = G4UImanager::GetUIpointer();
809  G4int keepVerbose = ui->GetVerboseLevel();
810  G4int newVerbose(0);
811  if (keepVerbose >= 2 || verbosity >= G4VisManager::confirmations)
812    newVerbose = 2;
813  ui->SetVerboseLevel(newVerbose);
814  ui->ApplyCommand(G4String("/vis/viewer/refresh " + flushName));
815  ui->ApplyCommand(G4String("/vis/viewer/update " + flushName));
816  ui->SetVerboseLevel(keepVerbose);
817  if (verbosity >= G4VisManager::confirmations) {
818    G4cout << "Viewer \"" << viewer -> GetName () << "\""
819           << " flushed." << G4endl;
820  }
821}
822
823////////////// /vis/viewer/list ///////////////////////////////////////
824
825G4VisCommandViewerList::G4VisCommandViewerList () {
826  G4bool omitable;
827  fpCommand = new G4UIcommand ("/vis/viewer/list", this);
828  fpCommand -> SetGuidance ("Lists viewers(s).");
829  fpCommand -> SetGuidance
830    ("See \"/vis/verbose\" for definition of verbosity.");
831  G4UIparameter* parameter;
832  parameter = new G4UIparameter("viewer-name", 's',
833                                omitable = true);
834  parameter -> SetDefaultValue ("all");
835  fpCommand -> SetParameter (parameter);
836  parameter = new G4UIparameter ("verbosity", 's',
837                                 omitable = true);
838  parameter -> SetDefaultValue ("warnings");
839  fpCommand -> SetParameter (parameter);
840}
841
842G4VisCommandViewerList::~G4VisCommandViewerList () {
843  delete fpCommand;
844}
845
846G4String G4VisCommandViewerList::GetCurrentValue (G4UIcommand*) {
847  return "";
848}
849
850void G4VisCommandViewerList::SetNewValue (G4UIcommand*, G4String newValue) {
851  G4String name, verbosityString;
852  std::istringstream is (newValue);
853  is >> name >> verbosityString;
854  G4String shortName = fpVisManager -> ViewerShortName (name);
855  G4VisManager::Verbosity verbosity =
856    fpVisManager->GetVerbosityValue(verbosityString);
857
858  const G4VViewer* currentViewer = fpVisManager -> GetCurrentViewer ();
859  G4String currentViewerShortName;
860  if (currentViewer) {
861    currentViewerShortName = currentViewer -> GetShortName ();
862  }
863  else {
864    currentViewerShortName = "none";
865  }
866
867  const G4SceneHandlerList& sceneHandlerList = fpVisManager -> GetAvailableSceneHandlers ();
868  G4int nHandlers = sceneHandlerList.size ();
869  G4bool found = false;
870  G4bool foundCurrent = false;
871  for (int iHandler = 0; iHandler < nHandlers; iHandler++) {
872    G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
873    const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
874    G4cout << "Scene handler \"" << sceneHandler -> GetName ();
875    const G4Scene* pScene = sceneHandler -> GetScene ();
876    if (pScene) {
877      G4cout << "\", scene \"" << pScene -> GetName () << "\":";
878    }
879    G4int nViewers = viewerList.size ();
880    if (nViewers == 0) {
881      G4cout << "\n            No viewers for this scene handler." << G4endl;
882    }
883    else {
884      for (int iViewer = 0; iViewer < nViewers; iViewer++) {
885        const G4VViewer* thisViewer = viewerList [iViewer];
886        G4String thisName = thisViewer -> GetName ();
887        G4String thisShortName = thisViewer -> GetShortName ();
888        if (name != "all") {
889          if (thisShortName != shortName) continue;
890        }
891        found = true;
892        G4cout << "\n  ";
893        if (thisShortName == currentViewerShortName) {
894          foundCurrent = true;
895          G4cout << "(current)";
896        }
897        else {
898          G4cout << "         ";
899        }
900        G4cout << " viewer \"" << thisName << "\"";
901        if (verbosity >= G4VisManager::parameters) {
902          G4cout << "\n  " << *thisViewer;
903        }
904      }
905    }
906    G4cout << G4endl;
907  }
908
909  if (!foundCurrent) {
910    G4cout << "No valid current viewer - please create or select one."
911           << G4endl;
912  }
913
914  if (!found) {
915    G4cout << "No viewers";
916    if (name != "all") {
917      G4cout << " of name \"" << name << "\"";
918    }
919    G4cout << " found." << G4endl;
920  }
921}
922
923////////////// /vis/viewer/pan and panTo ////////////////////////////
924
925G4VisCommandViewerPan::G4VisCommandViewerPan ():
926  fPanIncrementRight  (0.),
927  fPanIncrementUp  (0.),
928  fPanToRight (0.),
929  fPanToUp (0.)
930{
931  G4bool omitable;
932
933  fpCommandPan = new G4UIcommand
934    ("/vis/viewer/pan", this);
935  fpCommandPan -> SetGuidance
936    ("Incremental pan.");
937  fpCommandPan -> SetGuidance
938    ("Moves the camera incrementally right and up by these amounts (as seen"
939     "\nfrom viewpoint direction).");
940  G4UIparameter* parameter;
941  parameter = new G4UIparameter("right-increment", 'd', omitable = true);
942  parameter -> SetCurrentAsDefault (true);
943  fpCommandPan -> SetParameter (parameter);
944  parameter = new G4UIparameter("up-increment", 'd', omitable = true);
945  parameter -> SetCurrentAsDefault (true);
946  fpCommandPan -> SetParameter (parameter);
947  parameter = new G4UIparameter ("unit", 's', omitable = true);
948  parameter -> SetDefaultValue ("m");
949  fpCommandPan -> SetParameter (parameter);
950
951  fpCommandPanTo = new G4UIcommand
952    ("/vis/viewer/panTo", this);
953  fpCommandPanTo -> SetGuidance
954    ("Pan to specific coordinate.");
955  fpCommandPanTo -> SetGuidance
956    ("Places the camera in this position right and up relative to standard"
957     "\ntarget point (as seen from viewpoint direction).");
958  parameter = new G4UIparameter("right", 'd', omitable = true);
959  parameter -> SetCurrentAsDefault (true);
960  fpCommandPanTo -> SetParameter (parameter);
961  parameter = new G4UIparameter("up", 'd', omitable = true);
962  parameter -> SetCurrentAsDefault (true);
963  fpCommandPanTo -> SetParameter (parameter);
964  parameter = new G4UIparameter ("unit", 's', omitable = true);
965  parameter -> SetDefaultValue ("m");
966  fpCommandPanTo -> SetParameter (parameter);
967}
968
969G4VisCommandViewerPan::~G4VisCommandViewerPan () {
970  delete fpCommandPan;
971  delete fpCommandPanTo;
972}
973
974G4String G4VisCommandViewerPan::GetCurrentValue (G4UIcommand* command) {
975  G4String currentValue;
976  if (command == fpCommandPan) {
977    currentValue = ConvertToString(fPanIncrementRight, fPanIncrementUp, "m");
978  }
979  else if (command == fpCommandPanTo) {
980    currentValue = ConvertToString(fPanToRight, fPanToUp, "m");
981  }
982  return currentValue;
983}
984
985void G4VisCommandViewerPan::SetNewValue (G4UIcommand* command,
986                                         G4String newValue) {
987
988
989  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
990
991  G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
992  if (!currentViewer) {
993    if (verbosity >= G4VisManager::errors) {
994      G4cout <<
995        "ERROR: G4VisCommandsViewerPan::SetNewValue: no current viewer."
996             << G4endl;
997    }
998    return;
999  }
1000
1001  G4ViewParameters vp = currentViewer->GetViewParameters();
1002
1003  if (command == fpCommandPan) {
1004    ConvertToDoublePair(newValue, fPanIncrementRight, fPanIncrementUp);
1005    vp.IncrementPan(fPanIncrementRight, fPanIncrementUp);
1006  }
1007  else if (command == fpCommandPanTo) {
1008    ConvertToDoublePair(newValue, fPanToRight, fPanToUp);
1009    vp.SetPan(fPanToRight, fPanToUp);
1010  }
1011
1012  if (verbosity >= G4VisManager::confirmations) {
1013    G4cout << "Current target point now " << vp.GetCurrentTargetPoint()
1014           << G4endl;
1015  }
1016
1017  SetViewParameters(currentViewer, vp);
1018}
1019
1020////////////// /vis/viewer/rebuild ///////////////////////////////////////
1021
1022G4VisCommandViewerRebuild::G4VisCommandViewerRebuild () {
1023  G4bool omitable, currentAsDefault;
1024  fpCommand = new G4UIcmdWithAString ("/vis/viewer/rebuild", this);
1025  fpCommand -> SetGuidance ("Forces rebuild of graphical database.");
1026  fpCommand -> SetGuidance
1027    ("By default, acts on current viewer.  \"/vis/viewer/list\""
1028     "\nto see possible viewers.  Viewer becomes current.");
1029  fpCommand -> SetParameterName ("viewer-name",
1030                                 omitable = true,
1031                                 currentAsDefault = true);
1032}
1033
1034G4VisCommandViewerRebuild::~G4VisCommandViewerRebuild () {
1035  delete fpCommand;
1036}
1037
1038G4String G4VisCommandViewerRebuild::GetCurrentValue (G4UIcommand*) {
1039  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1040  if (viewer) {
1041    return viewer -> GetName ();
1042  }
1043  else {
1044    return "none";
1045  }
1046}
1047
1048void G4VisCommandViewerRebuild::SetNewValue (G4UIcommand*, G4String newValue) {
1049
1050  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1051
1052  G4String& rebuildName = newValue;
1053  G4VViewer* viewer = fpVisManager -> GetViewer (rebuildName);
1054  if (!viewer) {
1055    if (verbosity >= G4VisManager::errors) {
1056      G4cout << "ERROR: Viewer \"" << rebuildName
1057             << "\" not found - \"/vis/viewer/list\" to see possibilities."
1058             << G4endl;
1059    }
1060    return;
1061  }
1062
1063  viewer->NeedKernelVisit();
1064
1065  // Check auto-refresh and print confirmations, but without changing
1066  // view paramters...
1067  SetViewParameters(viewer, viewer->GetViewParameters());
1068}
1069
1070////////////// /vis/viewer/refresh ///////////////////////////////////////
1071
1072G4VisCommandViewerRefresh::G4VisCommandViewerRefresh () {
1073  G4bool omitable, currentAsDefault;
1074  fpCommand = new G4UIcmdWithAString ("/vis/viewer/refresh", this);
1075  fpCommand -> SetGuidance
1076    ("Refreshes viewer.");
1077  fpCommand -> SetGuidance
1078    ("By default, acts on current viewer.  \"/vis/viewer/list\""
1079     "\nto see possible viewers.  Viewer becomes current.");
1080  fpCommand -> SetParameterName ("viewer-name",
1081                                 omitable = true,
1082                                 currentAsDefault = true);
1083}
1084
1085G4VisCommandViewerRefresh::~G4VisCommandViewerRefresh () {
1086  delete fpCommand;
1087}
1088
1089G4String G4VisCommandViewerRefresh::GetCurrentValue (G4UIcommand*) {
1090  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1091  return viewer ? viewer -> GetName () : G4String("none");
1092}
1093
1094void G4VisCommandViewerRefresh::SetNewValue (G4UIcommand*, G4String newValue) {
1095
1096  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1097  G4bool warn(verbosity >= G4VisManager::warnings);
1098
1099  G4String& refreshName = newValue;
1100  G4VViewer* viewer = fpVisManager -> GetViewer (refreshName);
1101  if (!viewer) {
1102    if (verbosity >= G4VisManager::errors) {
1103      G4cout << "ERROR: Viewer \"" << refreshName << "\"" <<
1104        " not found - \"/vis/viewer/list\"\n  to see possibilities."
1105             << G4endl;
1106    }
1107    return;
1108  }
1109
1110  G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
1111  if (!sceneHandler) {
1112    if (verbosity >= G4VisManager::errors) {
1113      G4cout << "ERROR: Viewer \"" << refreshName << "\"" <<
1114        " has no scene handler - report serious bug."
1115             << G4endl;
1116    }
1117    return;
1118  }
1119
1120  G4Scene* scene = sceneHandler->GetScene();
1121  if (!scene) {
1122    if (verbosity >= G4VisManager::confirmations) {
1123      G4cout << "NOTE: SceneHandler \"" << sceneHandler->GetName()
1124             << "\", to which viewer \"" << refreshName << "\"" <<
1125        "\n  is attached, has no scene - \"/vis/scene/create\" and"
1126        " \"/vis/sceneHandler/attach\""
1127        "\n  (or use compound command \"/vis/drawVolume\")."
1128             << G4endl;
1129    }
1130    return;
1131  }
1132  if (scene->GetRunDurationModelList().empty()) {
1133    G4bool successful = scene -> AddWorldIfEmpty (warn);
1134    if (!successful) {
1135      if (verbosity >= G4VisManager::warnings) {
1136        G4cout <<
1137          "WARNING: Scene is empty.  Perhaps no geometry exists."
1138          "\n  Try /run/initialize."
1139               << G4endl;
1140      }
1141      return;
1142    }
1143    // Scene has changed.  UpdateVisManagerScene issues
1144    // /vis/scene/notifyHandlers, which does a refresh anyway, so the
1145    // ordinary refresh becomes part of the else phrase...
1146    UpdateVisManagerScene(scene->GetName());
1147  } else {
1148    if (verbosity >= G4VisManager::confirmations) {
1149      G4cout << "Refreshing viewer \"" << viewer -> GetName () << "\"..."
1150             << G4endl;
1151    }
1152#ifdef G4DEBUG_VIS_MANAGEMENT
1153    printf("G4VisCommandViewerRefresh::SetNewValue Call SetView()\n");
1154#endif
1155    viewer -> SetView ();
1156#ifdef G4DEBUG_VIS_MANAGEMENT
1157    printf("G4VisCommandViewerRefresh::SetNewValue Call SetView() END\n");
1158    printf("G4VisCommandViewerRefresh::SetNewValue Call ClearView()\n");
1159#endif
1160    viewer -> ClearView ();
1161#ifdef G4DEBUG_VIS_MANAGEMENT
1162    printf("G4VisCommandViewerRefresh::SetNewValue Call ClearView() END\n");
1163    printf("G4VisCommandViewerRefresh::SetNewValue Call DrawView()\n");
1164#endif
1165    viewer -> DrawView ();
1166#ifdef G4DEBUG_VIS_MANAGEMENT
1167    printf("G4VisCommandViewerRefresh::SetNewValue Call DrawView() END\n");
1168#endif
1169    if (verbosity >= G4VisManager::confirmations) {
1170      G4cout << "Viewer \"" << viewer -> GetName () << "\"" << " refreshed."
1171        "\n  (You might also need \"/vis/viewer/update\".)" << G4endl;
1172    }
1173  }
1174}
1175
1176////////////// /vis/viewer/reset ///////////////////////////////////////
1177
1178G4VisCommandViewerReset::G4VisCommandViewerReset () {
1179  G4bool omitable, currentAsDefault;
1180  fpCommand = new G4UIcmdWithAString ("/vis/viewer/reset", this);
1181  fpCommand -> SetGuidance ("Resets viewer.");
1182  fpCommand -> SetGuidance
1183    ("By default, acts on current viewer.  \"/vis/viewer/list\""
1184     "\nto see possible viewers.  Viewer becomes current.");
1185  fpCommand -> SetParameterName ("viewer-name",
1186                                 omitable = true,
1187                                 currentAsDefault = true);
1188}
1189
1190G4VisCommandViewerReset::~G4VisCommandViewerReset () {
1191  delete fpCommand;
1192}
1193
1194G4String G4VisCommandViewerReset::GetCurrentValue (G4UIcommand*) {
1195  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1196  if (viewer) {
1197    return viewer -> GetName ();
1198  }
1199  else {
1200    return "none";
1201  }
1202}
1203
1204void G4VisCommandViewerReset::SetNewValue (G4UIcommand*, G4String newValue) {
1205
1206  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1207
1208  G4String& resetName = newValue;
1209  G4VViewer* viewer = fpVisManager -> GetViewer (resetName);
1210  if (!viewer) {
1211    if (verbosity >= G4VisManager::errors) {
1212      G4cout << "ERROR: Viewer \"" << resetName
1213             << "\" not found - \"/vis/viewer/list\" to see possibilities."
1214             << G4endl;
1215    }
1216    return;
1217  }
1218
1219  SetViewParameters(viewer, viewer->GetDefaultViewParameters());
1220}
1221
1222////////////// /vis/viewer/scale and scaleTo ////////////////////////////
1223
1224G4VisCommandViewerScale::G4VisCommandViewerScale ():
1225  fScaleMultiplier (G4Vector3D (1., 1., 1.)),
1226  fScaleTo         (G4Vector3D (1., 1., 1.))
1227{
1228  G4bool omitable, currentAsDefault;
1229
1230  fpCommandScale = new G4UIcmdWith3Vector
1231    ("/vis/viewer/scale", this);
1232  fpCommandScale -> SetGuidance ("Incremental (non-uniform) scaling.");
1233  fpCommandScale -> SetGuidance
1234    ("Multiplies components of current scaling by components of this factor."
1235     "\n Scales (x,y,z) by corresponding components of the resulting factor.");
1236  fpCommandScale -> SetGuidance
1237    ("");
1238  fpCommandScale -> SetParameterName
1239    ("x-scale-multiplier","y-scale-multiplier","z-scale-multiplier",
1240     omitable=true, currentAsDefault=true);
1241
1242  fpCommandScaleTo = new G4UIcmdWith3Vector
1243    ("/vis/viewer/scaleTo", this);
1244  fpCommandScaleTo -> SetGuidance ("Absolute (non-uniform) scaling.");
1245  fpCommandScaleTo -> SetGuidance
1246    ("Scales (x,y,z) by corresponding components of this factor.");
1247  fpCommandScaleTo -> SetParameterName
1248    ("x-scale-factor","y-scale-factor","z-scale-factor",
1249     omitable=true, currentAsDefault=true);
1250}
1251
1252G4VisCommandViewerScale::~G4VisCommandViewerScale () {
1253  delete fpCommandScale;
1254  delete fpCommandScaleTo;
1255}
1256
1257G4String G4VisCommandViewerScale::GetCurrentValue (G4UIcommand* command) {
1258  G4String currentValue;
1259  if (command == fpCommandScale) {
1260    currentValue = fpCommandScale->ConvertToString(G4ThreeVector(fScaleMultiplier));
1261  }
1262  else if (command == fpCommandScaleTo) {
1263    currentValue = fpCommandScaleTo->ConvertToString(G4ThreeVector(fScaleTo));
1264  }
1265  return currentValue;
1266}
1267
1268void G4VisCommandViewerScale::SetNewValue (G4UIcommand* command,
1269                                           G4String newValue) {
1270
1271
1272  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1273
1274  G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
1275  if (!currentViewer) {
1276    if (verbosity >= G4VisManager::errors) {
1277      G4cout <<
1278        "ERROR: G4VisCommandsViewerScale::SetNewValue: no current viewer."
1279             << G4endl;
1280    }
1281    return;
1282  }
1283
1284  G4ViewParameters vp = currentViewer->GetViewParameters();
1285
1286  if (command == fpCommandScale) {
1287    fScaleMultiplier = fpCommandScale->GetNew3VectorValue(newValue);
1288    vp.MultiplyScaleFactor(fScaleMultiplier);
1289  }
1290  else if (command == fpCommandScaleTo) {
1291    fScaleTo = fpCommandScale->GetNew3VectorValue(newValue);
1292    vp.SetScaleFactor(fScaleTo);
1293  }
1294
1295  if (verbosity >= G4VisManager::confirmations) {
1296    G4cout << "Scale factor changed to " << vp.GetScaleFactor() << G4endl;
1297  }
1298
1299  SetViewParameters(currentViewer, vp);
1300}
1301
1302////////////// /vis/viewer/select ///////////////////////////////////////
1303
1304G4VisCommandViewerSelect::G4VisCommandViewerSelect () {
1305  G4bool omitable;
1306  fpCommand = new G4UIcmdWithAString ("/vis/viewer/select", this);
1307  fpCommand -> SetGuidance ("Selects viewer.");
1308  fpCommand -> SetGuidance
1309    ("Specify viewer by name.  \"/vis/viewer/list\" to see possible viewers.");
1310  fpCommand -> SetParameterName ("viewer-name", omitable = false);
1311}
1312
1313G4VisCommandViewerSelect::~G4VisCommandViewerSelect () {
1314  delete fpCommand;
1315}
1316
1317G4String G4VisCommandViewerSelect::GetCurrentValue (G4UIcommand*) {
1318  return "";
1319}
1320
1321void G4VisCommandViewerSelect::SetNewValue (G4UIcommand*, G4String newValue) {
1322
1323  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1324
1325  G4String& selectName = newValue;
1326  G4VViewer* viewer = fpVisManager -> GetViewer (selectName);
1327
1328  if (!viewer) {
1329    if (verbosity >= G4VisManager::errors) {
1330      G4cout << "ERROR: Viewer \"" << selectName << "\"";
1331      G4cout << " not found - \"/vis/viewer/list\""
1332        "\n  to see possibilities."
1333             << G4endl;
1334    }
1335    return;
1336  }
1337
1338  if (viewer == fpVisManager -> GetCurrentViewer ()) {
1339    if (verbosity >= G4VisManager::warnings) {
1340      G4cout << "WARNING: Viewer \"" << viewer -> GetName () << "\""
1341             << " already selected." << G4endl;
1342    }
1343    return;
1344  }
1345
1346  fpVisManager -> SetCurrentViewer (viewer);  // Prints confirmation.
1347
1348  SetViewParameters(viewer, viewer->GetViewParameters());
1349}
1350
1351////////////// /vis/viewer/update ///////////////////////////////////////
1352
1353G4VisCommandViewerUpdate::G4VisCommandViewerUpdate () {
1354  G4bool omitable, currentAsDefault;
1355  fpCommand = new G4UIcmdWithAString ("/vis/viewer/update", this);
1356  fpCommand -> SetGuidance
1357    ("Triggers graphical database post-processing for viewers"
1358     "\nusing that technique.");
1359  fpCommand -> SetGuidance
1360    ("For such viewers the view only becomes visible with this command."
1361     "\nBy default, acts on current viewer.  \"/vis/viewer/list\""
1362     "\nto see possible viewers.  Viewer becomes current.");
1363  fpCommand -> SetParameterName ("viewer-name",
1364                                 omitable = true,
1365                                 currentAsDefault = true);
1366}
1367
1368G4VisCommandViewerUpdate::~G4VisCommandViewerUpdate () {
1369  delete fpCommand;
1370}
1371
1372G4String G4VisCommandViewerUpdate::GetCurrentValue (G4UIcommand*) {
1373  G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1374  if (viewer) {
1375    return viewer -> GetName ();
1376  }
1377  else {
1378    return "none";
1379  }
1380}
1381
1382void G4VisCommandViewerUpdate::SetNewValue (G4UIcommand*, G4String newValue) {
1383
1384  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1385
1386  G4String& updateName = newValue;
1387
1388  G4VViewer* viewer = fpVisManager -> GetViewer (updateName);
1389  if (!viewer) {
1390    if (verbosity >= G4VisManager::errors) {
1391      G4cout <<
1392        "ERROR: G4VisCommandsViewerUpdate::SetNewValue: no current viewer."
1393             << G4endl;
1394    }
1395    return;
1396  }
1397
1398  G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
1399  if (!sceneHandler) {
1400    if (verbosity >= G4VisManager::errors) {
1401      G4cout << "ERROR: Viewer \"" << updateName << "\"" <<
1402        " has no scene handler - report serious bug."
1403             << G4endl;
1404    }
1405    return;
1406  }
1407
1408  G4Scene* scene = sceneHandler->GetScene();
1409  if (!scene) {
1410    if (verbosity >= G4VisManager::confirmations) {
1411      G4cout << "NOTE: SceneHandler \"" << sceneHandler->GetName()
1412             << "\", to which viewer \"" << updateName << "\"" <<
1413        "\n  is attached, has no scene - \"/vis/scene/create\" and"
1414        " \"/vis/sceneHandler/attach\""
1415        "\n  (or use compound command \"/vis/drawVolume\")."
1416             << G4endl;
1417    }
1418    return;
1419  }
1420
1421  if (viewer) {
1422    if (verbosity >= G4VisManager::confirmations) {
1423      G4cout << "Viewer \"" << viewer -> GetName () << "\"";
1424      G4cout << " post-processing triggered." << G4endl;
1425    }
1426    viewer -> ShowView ();
1427    // Assume future need to "refresh" transients...
1428    sceneHandler -> SetMarkForClearingTransientStore(true);
1429  }
1430  else {
1431    if (verbosity >= G4VisManager::errors) {
1432      G4cout << "ERROR: Viewer \"" << updateName << "\"";
1433      G4cout << " not found - \"/vis/viewer/list\""
1434        "\n  to see possibilities." << G4endl;
1435    }
1436  }
1437}
1438
1439////////////// /vis/viewer/zoom and zoomTo ////////////////////////////
1440
1441G4VisCommandViewerZoom::G4VisCommandViewerZoom ():
1442  fZoomMultiplier (1.),
1443  fZoomTo         (1.)
1444{
1445  G4bool omitable, currentAsDefault;
1446
1447  fpCommandZoom = new G4UIcmdWithADouble
1448    ("/vis/viewer/zoom", this);
1449  fpCommandZoom -> SetGuidance ("Incremental zoom.");
1450  fpCommandZoom -> SetGuidance
1451    ("Multiplies current magnification by this factor.");
1452  fpCommandZoom -> SetParameterName("multiplier",
1453                                     omitable=true,
1454                                     currentAsDefault=true);
1455
1456  fpCommandZoomTo = new G4UIcmdWithADouble
1457    ("/vis/viewer/zoomTo", this);
1458  fpCommandZoomTo -> SetGuidance ("Absolute zoom.");
1459  fpCommandZoomTo -> SetGuidance
1460    ("Magnifies standard magnification by this factor.");
1461  fpCommandZoomTo -> SetParameterName("factor",
1462                                       omitable=true,
1463                                       currentAsDefault=true);
1464}
1465
1466G4VisCommandViewerZoom::~G4VisCommandViewerZoom () {
1467  delete fpCommandZoom;
1468  delete fpCommandZoomTo;
1469}
1470
1471G4String G4VisCommandViewerZoom::GetCurrentValue (G4UIcommand* command) {
1472  G4String currentValue;
1473  if (command == fpCommandZoom) {
1474    currentValue = fpCommandZoom->ConvertToString(fZoomMultiplier);
1475  }
1476  else if (command == fpCommandZoomTo) {
1477    currentValue = fpCommandZoomTo->ConvertToString(fZoomTo);
1478  }
1479  return currentValue;
1480}
1481
1482void G4VisCommandViewerZoom::SetNewValue (G4UIcommand* command,
1483                                          G4String newValue) {
1484
1485
1486  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1487
1488  G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
1489  if (!currentViewer) {
1490    if (verbosity >= G4VisManager::errors) {
1491      G4cout <<
1492        "ERROR: G4VisCommandsViewerZoom::SetNewValue: no current viewer."
1493             << G4endl;
1494    }
1495    return;
1496  }
1497
1498  G4ViewParameters vp = currentViewer->GetViewParameters();
1499
1500  if (command == fpCommandZoom) {
1501    fZoomMultiplier = fpCommandZoom->GetNewDoubleValue(newValue);
1502    vp.MultiplyZoomFactor(fZoomMultiplier);
1503  }
1504  else if (command == fpCommandZoomTo) {
1505    fZoomTo = fpCommandZoom->GetNewDoubleValue(newValue);
1506    vp.SetZoomFactor(fZoomTo);
1507  }
1508
1509  if (verbosity >= G4VisManager::confirmations) {
1510    G4cout << "Zoom factor changed to " << vp.GetZoomFactor() << G4endl;
1511  }
1512
1513  SetViewParameters(currentViewer, vp);
1514}
Note: See TracBrowser for help on using the repository browser.