Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/management/src/G4VisCommandsViewer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/management/src/G4VisCommandsViewer.cc (Version 11.3.0) and /visualization/management/src/G4VisCommandsViewer.cc (Version 7.1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 //                                                 23 //
                                                   >>  24 // $Id: G4VisCommandsViewer.cc,v 1.45 2005/03/16 17:55:02 allison Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-07-01 $
 27                                                    26 
 28 // /vis/viewer commands - John Allison  25th O     27 // /vis/viewer commands - John Allison  25th October 1998
 29                                                    28 
 30 #include "G4VisCommandsViewer.hh"                  29 #include "G4VisCommandsViewer.hh"
 31                                                    30 
 32 #include "G4VisManager.hh"                         31 #include "G4VisManager.hh"
 33 #include "G4GraphicsSystemList.hh"                 32 #include "G4GraphicsSystemList.hh"
 34 #include "G4VisCommandsScene.hh"                   33 #include "G4VisCommandsScene.hh"
 35 #include "G4UImanager.hh"                          34 #include "G4UImanager.hh"
 36 #include "G4UIcommand.hh"                          35 #include "G4UIcommand.hh"
 37 #include "G4UIcmdWithoutParameter.hh"          << 
 38 #include "G4UIcmdWithAString.hh"                   36 #include "G4UIcmdWithAString.hh"
 39 #include "G4UIcmdWithADouble.hh"                   37 #include "G4UIcmdWithADouble.hh"
 40 #include "G4UIcmdWithADoubleAndUnit.hh"            38 #include "G4UIcmdWithADoubleAndUnit.hh"
 41 #include "G4UIcmdWith3Vector.hh"               << 
 42 #include "G4PhysicalVolumesSearchScene.hh"     << 
 43 #include "G4TransportationManager.hh"          << 
 44 #include "G4Point3D.hh"                        << 
 45 #include "G4SystemOfUnits.hh"                  << 
 46 #include "G4UnitsTable.hh"                         39 #include "G4UnitsTable.hh"
 47 #include "G4Filesystem.hh"                     <<  40 #include "G4ios.hh"
 48 #include <chrono>                              <<  41 #include <strstream>
 49 #include <thread>                              << 
 50 #include <sstream>                             << 
 51 #include <fstream>                             << 
 52 #include <iomanip>                             << 
 53 #include <cstdio>                              << 
 54 #include <regex>                               << 
 55 #include <set>                                 << 
 56                                                    42 
 57 #define G4warn G4cout                          <<  43 G4VVisCommandViewer::G4VVisCommandViewer () {}
 58                                                    44 
 59 ////////////// /vis/viewer/addCutawayPlane /// <<  45 G4VVisCommandViewer::~G4VVisCommandViewer () {}
 60                                                << 
 61 G4VisCommandViewerAddCutawayPlane::G4VisComman << 
 62   G4bool omitable;                             << 
 63   fpCommand = new G4UIcommand ("/vis/viewer/ad << 
 64   fpCommand -> SetGuidance                     << 
 65     ("Add cutaway plane to current viewer.");  << 
 66   G4UIparameter* parameter;                    << 
 67   parameter  =  new G4UIparameter("x",'d',omit << 
 68   parameter  -> SetDefaultValue  (0);          << 
 69   parameter  -> SetGuidance      ("Coordinate  << 
 70   fpCommand->SetParameter(parameter);          << 
 71   parameter  =  new G4UIparameter("y",'d',omit << 
 72   parameter  -> SetDefaultValue  (0);          << 
 73   parameter  -> SetGuidance      ("Coordinate  << 
 74   fpCommand->SetParameter(parameter);          << 
 75   parameter  =  new G4UIparameter("z",'d',omit << 
 76   parameter  -> SetDefaultValue  (0);          << 
 77   parameter  -> SetGuidance      ("Coordinate  << 
 78   fpCommand->SetParameter(parameter);          << 
 79   parameter  =  new G4UIparameter("unit",'s',o << 
 80   parameter  -> SetDefaultValue  ("m");        << 
 81   parameter  -> SetGuidance      ("Unit of poi << 
 82   fpCommand->SetParameter(parameter);          << 
 83   parameter  =  new G4UIparameter("nx",'d',omi << 
 84   parameter  -> SetDefaultValue  (1);          << 
 85   parameter  -> SetGuidance      ("Component o << 
 86   fpCommand->SetParameter(parameter);          << 
 87   parameter  =  new G4UIparameter("ny",'d',omi << 
 88   parameter  -> SetDefaultValue  (0);          << 
 89   parameter  -> SetGuidance      ("Component o << 
 90   fpCommand->SetParameter(parameter);          << 
 91   parameter  =  new G4UIparameter("nz",'d',omi << 
 92   parameter  -> SetDefaultValue  (0);          << 
 93   parameter  -> SetGuidance      ("Component o << 
 94   fpCommand->SetParameter(parameter);          << 
 95 }                                              << 
 96                                                << 
 97 G4VisCommandViewerAddCutawayPlane::~G4VisComma << 
 98   delete fpCommand;                            << 
 99 }                                              << 
100                                                << 
101 G4String G4VisCommandViewerAddCutawayPlane::Ge << 
102   return "";                                   << 
103 }                                              << 
104                                                << 
105 void G4VisCommandViewerAddCutawayPlane::SetNew << 
106                                                    46 
                                                   >>  47 void G4VVisCommandViewer::SetViewParameters
                                                   >>  48 (G4VViewer* viewer, const G4ViewParameters& viewParams) {
107   G4VisManager::Verbosity verbosity = fpVisMan     49   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
108                                                <<  50   viewer->SetViewParameters(viewParams);
109   G4VViewer* viewer = fpVisManager -> GetCurre <<  51   G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
110   if (!viewer) {                               <<  52   if (sceneHandler && sceneHandler->GetScene()) {
111     if (verbosity >= G4VisManager::errors) {   <<  53     if (viewParams.IsAutoRefresh()) {
112       G4warn <<                                <<  54       G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/refresh");
113   "ERROR: No current viewer - \"/vis/viewer/li << 
114        << G4endl;                              << 
115     }                                          << 
116     return;                                    << 
117   }                                            << 
118                                                << 
119   G4double x, y, z, nx, ny, nz;                << 
120   G4String unit;                               << 
121   std::istringstream is (newValue);            << 
122   is >> x >> y >> z >> unit >> nx >> ny >> nz; << 
123   G4double F = G4UIcommand::ValueOf(unit);     << 
124   x *= F; y *= F; z *= F;                      << 
125                                                << 
126   G4ViewParameters vp = viewer->GetViewParamet << 
127   // Make sure normal is normalised.           << 
128   vp.AddCutawayPlane(G4Plane3D(G4Normal3D(nx,n << 
129   if (verbosity >= G4VisManager::confirmations << 
130     G4cout << "Cutaway planes for viewer \"" < << 
131     const G4Planes& cutaways = vp.GetCutawayPl << 
132     for (std::size_t i = 0; i < cutaways.size( << 
133       G4cout << "\n  " << i << ": " << cutaway << 
134     G4cout << G4endl;                          << 
135   }                                            << 
136                                                << 
137   SetViewParameters(viewer, vp);               << 
138 }                                              << 
139                                                << 
140 ////////////// /vis/viewer/centreOn ////////// << 
141                                                << 
142 G4VisCommandViewerCentreOn::G4VisCommandViewer << 
143   G4bool omitable;                             << 
144   fpCommandCentreAndZoomInOn = new G4UIcommand << 
145   fpCommandCentreAndZoomInOn->SetGuidance      << 
146   ("Centre and zoom in on the given physical v << 
147   fpCommandCentreAndZoomInOn->SetGuidance      << 
148   ("The names of all volumes in all worlds are << 
149    "\ncopy-no is supplied, it matches the copy << 
150    "\nform \"/regexp/\", where regexp is a reg << 
151    "\nthe match uses the usual rules of regula << 
152    "\nOtherwise an exact match is required."   << 
153    "\nFor example, \"/Shap/\" matches \"Shape1 << 
154   fpCommandCentreAndZoomInOn->SetGuidance      << 
155   ("It may help to see a textual representatio << 
156    "\nthe worlds. Try \"/vis/drawTree [worlds] << 
157    "\ncombinations that have the required func << 
158   fpCommandCentreAndZoomInOn->SetGuidance      << 
159    ("If there are more than one matching physi << 
160     "\nincluded. If this is not what you want, << 
161     "\nparticular touchable, then select the t << 
162     "\nuse \"/vis/touchable/centreOn\". (You m << 
163   G4UIparameter* parameter;                    << 
164   parameter =  new G4UIparameter("pv-name",'s' << 
165   parameter->SetGuidance      ("Physical volum << 
166   fpCommandCentreAndZoomInOn->SetParameter(par << 
167   parameter =  new G4UIparameter("copy-no",'i' << 
168   parameter->SetDefaultValue  (-1);            << 
169   parameter->SetGuidance      ("Copy number. - << 
170   fpCommandCentreAndZoomInOn->SetParameter(par << 
171                                                << 
172   fpCommandCentreOn = new G4UIcommand ("/vis/v << 
173   fpCommandCentreOn->SetGuidance ("Centre the  << 
174   // Pick up additional guidance from /vis/vie << 
175   CopyGuidanceFrom(fpCommandCentreAndZoomInOn, << 
176   // Pick up parameters from /vis/viewer/centr << 
177   CopyParametersFrom(fpCommandCentreAndZoomInO << 
178 }                                              << 
179                                                << 
180 G4VisCommandViewerCentreOn::~G4VisCommandViewe << 
181   delete fpCommandCentreAndZoomInOn;           << 
182   delete fpCommandCentreOn;                    << 
183 }                                              << 
184                                                << 
185 G4String G4VisCommandViewerCentreOn::GetCurren << 
186   return "";                                   << 
187 }                                              << 
188                                                << 
189 void G4VisCommandViewerCentreOn::SetNewValue ( << 
190                                                << 
191   G4VisManager::Verbosity verbosity = fpVisMan << 
192   G4bool warn = verbosity >= G4VisManager::war << 
193                                                << 
194   G4VViewer* currentViewer = fpVisManager -> G << 
195   if (!currentViewer) {                        << 
196     if (verbosity >= G4VisManager::errors) {   << 
197       G4warn <<                                << 
198       "ERROR: No current viewer - \"/vis/viewe << 
199       << G4endl;                               << 
200     }                                          << 
201     return;                                    << 
202   }                                            << 
203                                                << 
204   G4String pvName;                             << 
205   G4int copyNo;                                << 
206   std::istringstream is (newValue);            << 
207   is >> pvName >> copyNo;                      << 
208                                                << 
209   // Find physical volumes                     << 
210   G4TransportationManager* transportationManag << 
211   G4TransportationManager::GetTransportationMa << 
212   std::size_t nWorlds = transportationManager- << 
213   std::vector<G4PhysicalVolumesSearchScene::Fi << 
214   std::vector<G4VPhysicalVolume*>::iterator it << 
215   transportationManager->GetWorldsIterator();  << 
216   for (std::size_t i = 0; i < nWorlds; ++i, ++ << 
217     G4PhysicalVolumeModel searchModel (*iterWo << 
218     G4ModelingParameters mp;  // Default - no  << 
219     searchModel.SetModelingParameters (&mp);   << 
220     // Find all instances at any position in t << 
221     G4PhysicalVolumesSearchScene searchScene ( << 
222     searchModel.DescribeYourselfTo (searchScen << 
223     for (const auto& findings: searchScene.Get << 
224       findingsVector.push_back(findings);      << 
225     }                                              55     }
226   }                                            <<  56     else {
227                                                <<  57       if (verbosity >= G4VisManager::confirmations) {
228   if (findingsVector.empty()) {                <<  58   G4cout << "Issue /vis/viewer/refresh to see effect." << G4endl;
229     if (verbosity >= G4VisManager::warnings) { << 
230       G4warn                                   << 
231       << "WARNING: Volume \"" << pvName << "\" << 
232       if (copyNo > 0) {                        << 
233         G4warn << "copy number " << copyNo;    << 
234       }                                            59       }
235       G4warn << " not found." << G4endl;       << 
236     }                                          << 
237     return;                                    << 
238   }                                            << 
239                                                << 
240   // A vector of found paths so that we can hi << 
241   std::vector<std::vector<G4PhysicalVolumeMode << 
242                                                << 
243   // Use a temporary scene in order to find vi << 
244   G4Scene tempScene("Centre Scene");           << 
245   G4bool successfullyAdded = true;             << 
246   for (const auto& findings: findingsVector) { << 
247     // To handle paramaterisations we have to  << 
248     findings.fpFoundPV->SetCopyNo(findings.fFo << 
249     // Create a temporary physical volume mode << 
250     // They have to be created on the heap bec << 
251     // to hang about long enough to be conflat << 
252     G4PhysicalVolumeModel* tempPVModel = new G << 
253     (findings.fpFoundPV,                       << 
254      0, // Only interested in top volume       << 
255      findings.fFoundObjectTransformation,      << 
256      0, // No modelling parameters (these are  << 
257      true,  // Use full extent                 << 
258      findings.fFoundBasePVPath);               << 
259     // ...and add it to the scene.             << 
260     auto successful = tempScene.AddRunDuration << 
261     if (!successful) {                         << 
262       successfullyAdded = false;               << 
263       continue;                                << 
264     }                                          << 
265     if (verbosity >= G4VisManager::parameters) << 
266       G4cout << "\"" << findings.fpFoundPV->Ge << 
267       << "\", copy no. " << findings.fFoundPVC << 
268       << ",\n  found in searched volume \""    << 
269       << findings.fpSearchPV->GetName()        << 
270       << "\" at depth " << findings.fFoundDept << 
271       << ",\n  base path: \"" << findings.fFou << 
272       << ",\n  has been added to temporary sce << 
273       << G4endl;                               << 
274     }                                          << 
275     foundPaths.push_back(findings.fFoundFullPV << 
276   }                                            << 
277   // Delete temporary physical volume models   << 
278   for (const auto& sceneModel: tempScene.GetRu << 
279     delete sceneModel.fpModel;                 << 
280   }                                            << 
281   if (!successfullyAdded) return;              << 
282                                                << 
283   // Relevant results                          << 
284   const G4VisExtent& newExtent = tempScene.Get << 
285   const G4ThreeVector& newTargetPoint = newExt << 
286                                                << 
287   G4Scene* currentScene = currentViewer->GetSc << 
288   G4ViewParameters saveVP = currentViewer->Get << 
289   G4ViewParameters newVP = saveVP;             << 
290   if (command == fpCommandCentreAndZoomInOn) { << 
291     // Calculate the new zoom factor           << 
292     const G4double zoomFactor                  << 
293     = currentScene->GetExtent().GetExtentRadiu << 
294     newVP.SetZoomFactor(zoomFactor);           << 
295   }                                            << 
296   // Change the target point                   << 
297   const G4Point3D& standardTargetPoint = curre << 
298   newVP.SetCurrentTargetPoint(newTargetPoint - << 
299                                                << 
300   // If this particular view is simple enough  << 
301   if (currentViewer->GetKernelVisitElapsedTime << 
302     // Interpolate                             << 
303     auto keepVisVerbosity = fpVisManager->GetV << 
304     fpVisManager->SetVerboseLevel(G4VisManager << 
305     if (newVP != saveVP) InterpolateToNewView( << 
306     // ...and twinkle                          << 
307     Twinkle(currentViewer,newVP,foundPaths);   << 
308     fpVisManager->SetVerboseLevel(keepVisVerbo << 
309   }                                            << 
310                                                << 
311   if (verbosity >= G4VisManager::confirmations << 
312     G4cout                                     << 
313     << "Viewer \"" << currentViewer->GetName() << 
314     << "\" centred ";                          << 
315     if (fpCommandCentreAndZoomInOn) {          << 
316       G4cout << "and zoomed in";               << 
317     }                                              60     }
318     G4cout << " on physical volume(s) \"" << p << 
319     << G4endl;                                 << 
320   }                                                61   }
321                                                << 
322   SetViewParameters(currentViewer, newVP);     << 
323 }                                              << 
324                                                << 
325 ////////////// /vis/viewer/changeCutawayPlane  << 
326                                                << 
327 G4VisCommandViewerChangeCutawayPlane::G4VisCom << 
328   G4bool omitable;                             << 
329   fpCommand = new G4UIcommand ("/vis/viewer/ch << 
330   fpCommand -> SetGuidance("Change cutaway pla << 
331   G4UIparameter* parameter;                    << 
332   parameter  =  new G4UIparameter("index",'i', << 
333   parameter  -> SetGuidance      ("Index of pl << 
334   fpCommand->SetParameter(parameter);          << 
335   parameter  =  new G4UIparameter("x",'d',omit << 
336   parameter  -> SetDefaultValue  (0);          << 
337   parameter  -> SetGuidance      ("Coordinate  << 
338   fpCommand->SetParameter(parameter);          << 
339   parameter  =  new G4UIparameter("y",'d',omit << 
340   parameter  -> SetDefaultValue  (0);          << 
341   parameter  -> SetGuidance      ("Coordinate  << 
342   fpCommand->SetParameter(parameter);          << 
343   parameter  =  new G4UIparameter("z",'d',omit << 
344   parameter  -> SetDefaultValue  (0);          << 
345   parameter  -> SetGuidance      ("Coordinate  << 
346   fpCommand->SetParameter(parameter);          << 
347   parameter  =  new G4UIparameter("unit",'s',o << 
348   parameter  -> SetDefaultValue  ("m");        << 
349   parameter  -> SetGuidance      ("Unit of poi << 
350   fpCommand->SetParameter(parameter);          << 
351   parameter  =  new G4UIparameter("nx",'d',omi << 
352   parameter  -> SetDefaultValue  (1);          << 
353   parameter  -> SetGuidance      ("Component o << 
354   fpCommand->SetParameter(parameter);          << 
355   parameter  =  new G4UIparameter("ny",'d',omi << 
356   parameter  -> SetDefaultValue  (0);          << 
357   parameter  -> SetGuidance      ("Component o << 
358   fpCommand->SetParameter(parameter);          << 
359   parameter  =  new G4UIparameter("nz",'d',omi << 
360   parameter  -> SetDefaultValue  (0);          << 
361   parameter  -> SetGuidance      ("Component o << 
362   fpCommand->SetParameter(parameter);          << 
363 }                                              << 
364                                                << 
365 G4VisCommandViewerChangeCutawayPlane::~G4VisCo << 
366   delete fpCommand;                            << 
367 }                                              << 
368                                                << 
369 G4String G4VisCommandViewerChangeCutawayPlane: << 
370   return "";                                   << 
371 }                                              << 
372                                                << 
373 void G4VisCommandViewerChangeCutawayPlane::Set << 
374                                                << 
375   G4VisManager::Verbosity verbosity = fpVisMan << 
376                                                << 
377   G4VViewer* viewer = fpVisManager -> GetCurre << 
378   if (!viewer) {                               << 
379     if (verbosity >= G4VisManager::errors) {   << 
380       G4warn <<                                << 
381   "ERROR: No current viewer - \"/vis/viewer/li << 
382        << G4endl;                              << 
383     }                                          << 
384     return;                                    << 
385   }                                            << 
386                                                << 
387   std::size_t index;                           << 
388   G4double x, y, z, nx, ny, nz;                << 
389   G4String unit;                               << 
390   std::istringstream is (newValue);            << 
391   is >> index >> x >> y >> z >> unit >> nx >>  << 
392   G4double F = G4UIcommand::ValueOf(unit);     << 
393   x *= F; y *= F; z *= F;                      << 
394                                                << 
395   G4ViewParameters vp = viewer->GetViewParamet << 
396   // Make sure normal is normalised.           << 
397   vp.ChangeCutawayPlane(index,                 << 
398       G4Plane3D(G4Normal3D(nx,ny,nz).unit(), G << 
399   if (verbosity >= G4VisManager::confirmations << 
400     G4cout << "Cutaway planes for viewer \"" < << 
401     const G4Planes& cutaways = vp.GetCutawayPl << 
402     for (std::size_t i = 0; i < cutaways.size( << 
403       G4cout << "\n  " << i << ": " << cutaway << 
404     G4cout << G4endl;                          << 
405   }                                            << 
406                                                << 
407   SetViewParameters(viewer, vp);               << 
408 }                                                  62 }
409                                                    63 
410 ////////////// /vis/viewer/clear /////////////     64 ////////////// /vis/viewer/clear ///////////////////////////////////////
411                                                    65 
412 G4VisCommandViewerClear::G4VisCommandViewerCle     66 G4VisCommandViewerClear::G4VisCommandViewerClear () {
413   G4bool omitable, currentAsDefault;               67   G4bool omitable, currentAsDefault;
414   fpCommand = new G4UIcmdWithAString ("/vis/vi     68   fpCommand = new G4UIcmdWithAString ("/vis/viewer/clear", this);
415   fpCommand -> SetGuidance ("Clears viewer.");     69   fpCommand -> SetGuidance ("Clears viewer.");
416   fpCommand -> SetGuidance                         70   fpCommand -> SetGuidance 
417     ("By default, clears current viewer.  Spec     71     ("By default, clears current viewer.  Specified viewer becomes current."
418      "\n\"/vis/viewer/list\" to see  possible      72      "\n\"/vis/viewer/list\" to see  possible viewer names.");
419   fpCommand -> SetParameterName ("viewer-name"     73   fpCommand -> SetParameterName ("viewer-name",
420          omitable = true,                          74          omitable = true,
421          currentAsDefault = true);                 75          currentAsDefault = true);
422 }                                                  76 }
423                                                    77 
424 G4VisCommandViewerClear::~G4VisCommandViewerCl     78 G4VisCommandViewerClear::~G4VisCommandViewerClear () {
425   delete fpCommand;                                79   delete fpCommand;
426 }                                                  80 }
427                                                    81 
428 G4String G4VisCommandViewerClear::GetCurrentVa     82 G4String G4VisCommandViewerClear::GetCurrentValue (G4UIcommand*) {
429   G4VViewer* viewer = fpVisManager -> GetCurre     83   G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
430   return viewer ? viewer -> GetName () : G4Str <<  84     return viewer ? viewer -> GetName () : G4String("none");
431 }                                                  85 }
432                                                    86 
433 void G4VisCommandViewerClear::SetNewValue (G4U     87 void G4VisCommandViewerClear::SetNewValue (G4UIcommand*, G4String newValue) {
434                                                    88 
435   G4VisManager::Verbosity verbosity = fpVisMan     89   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
436                                                    90 
437   G4String& clearName = newValue;                  91   G4String& clearName = newValue;
438   G4VViewer* viewer = fpVisManager -> GetViewe     92   G4VViewer* viewer = fpVisManager -> GetViewer (clearName);
439   if (!viewer) {                                   93   if (!viewer) {
440     if (verbosity >= G4VisManager::errors) {       94     if (verbosity >= G4VisManager::errors) {
441       G4warn << "ERROR: Viewer \"" << clearNam <<  95       G4cout << "ERROR: Viewer \"" << clearName
442        << "\" not found - \"/vis/viewer/list\"     96        << "\" not found - \"/vis/viewer/list\" to see possibilities."
443        << G4endl;                                  97        << G4endl;
444     }                                              98     }
445     return;                                        99     return;
446   }                                               100   }
447                                                   101 
448   viewer->SetView();                           << 
449   viewer->ClearView();                            102   viewer->ClearView();
450   viewer->FinishView();                           103   viewer->FinishView();
451   if (verbosity >= G4VisManager::confirmations    104   if (verbosity >= G4VisManager::confirmations) {
452     G4cout << "Viewer \"" << clearName << "\"     105     G4cout << "Viewer \"" << clearName << "\" cleared." << G4endl;
453   }                                               106   }
454                                                   107 
455 }                                                 108 }
456                                                   109 
457 ////////////// /vis/viewer/clearCutawayPlanes  << 
458                                                << 
459 G4VisCommandViewerClearCutawayPlanes::G4VisCom << 
460   fpCommand = new G4UIcmdWithoutParameter      << 
461     ("/vis/viewer/clearCutawayPlanes", this);  << 
462   fpCommand -> SetGuidance ("Clear cutaway pla << 
463 }                                              << 
464                                                << 
465 G4VisCommandViewerClearCutawayPlanes::~G4VisCo << 
466   delete fpCommand;                            << 
467 }                                              << 
468                                                << 
469 G4String G4VisCommandViewerClearCutawayPlanes: << 
470   return "";                                   << 
471 }                                              << 
472                                                << 
473 void G4VisCommandViewerClearCutawayPlanes::Set << 
474                                                << 
475   G4VisManager::Verbosity verbosity = fpVisMan << 
476                                                << 
477   G4VViewer* viewer = fpVisManager -> GetCurre << 
478   if (!viewer) {                               << 
479     if (verbosity >= G4VisManager::errors) {   << 
480       G4warn <<                                << 
481   "ERROR: No current viewer - \"/vis/viewer/li << 
482        << G4endl;                              << 
483     }                                          << 
484     return;                                    << 
485   }                                            << 
486                                                << 
487   G4ViewParameters vp = viewer->GetViewParamet << 
488   vp.ClearCutawayPlanes();                     << 
489   if (verbosity >= G4VisManager::confirmations << 
490     G4cout << "Cutaway planes for viewer \"" < << 
491      << "\" now cleared." << G4endl;           << 
492   }                                            << 
493                                                << 
494   SetViewParameters(viewer, vp);               << 
495 }                                              << 
496                                                << 
497 ////////////// /vis/viewer/clearTransients /// << 
498                                                << 
499 G4VisCommandViewerClearTransients::G4VisComman << 
500   G4bool omitable, currentAsDefault;           << 
501   fpCommand = new G4UIcmdWithAString ("/vis/vi << 
502   fpCommand -> SetGuidance ("Clears transients << 
503   fpCommand -> SetGuidance                     << 
504   ("By default, operates on current viewer.  S << 
505      "\n\"/vis/viewer/list\" to see  possible  << 
506   fpCommand -> SetParameterName ("viewer-name" << 
507          omitable = true,                      << 
508          currentAsDefault = true);             << 
509 }                                              << 
510                                                << 
511 G4VisCommandViewerClearTransients::~G4VisComma << 
512   delete fpCommand;                            << 
513 }                                              << 
514                                                << 
515 G4String G4VisCommandViewerClearTransients::Ge << 
516   G4VViewer* viewer = fpVisManager -> GetCurre << 
517   return viewer ? viewer -> GetName () : G4Str << 
518 }                                              << 
519                                                << 
520 void G4VisCommandViewerClearTransients::SetNew << 
521                                                << 
522   G4VisManager::Verbosity verbosity = fpVisMan << 
523                                                << 
524   G4String& clearName = newValue;              << 
525   G4VViewer* viewer = fpVisManager -> GetViewe << 
526   if (!viewer) {                               << 
527     if (verbosity >= G4VisManager::errors) {   << 
528       G4warn << "ERROR: Viewer \"" << clearNam << 
529        << "\" not found - \"/vis/viewer/list\" << 
530        << G4endl;                              << 
531     }                                          << 
532     return;                                    << 
533   }                                            << 
534                                                << 
535   G4VSceneHandler* sceneHandler = viewer->GetS << 
536   sceneHandler->SetMarkForClearingTransientSto << 
537   fpVisManager->ResetTransientsDrawnFlags();   << 
538   sceneHandler->ClearTransientStore();         << 
539   if (verbosity >= G4VisManager::confirmations << 
540     G4cout << "Viewer \"" << clearName << "\"  << 
541      << G4endl;                                << 
542   }                                            << 
543                                                << 
544 }                                              << 
545                                                << 
546 ////////////// /vis/viewer/clearVisAttributesM << 
547                                                << 
548 G4VisCommandViewerClearVisAttributesModifiers: << 
549   fpCommand = new G4UIcmdWithoutParameter      << 
550   ("/vis/viewer/clearVisAttributesModifiers",  << 
551   fpCommand -> SetGuidance ("Clear vis attribu << 
552   fpCommand -> SetGuidance ("(These are used f << 
553 }                                              << 
554                                                << 
555 G4VisCommandViewerClearVisAttributesModifiers: << 
556   delete fpCommand;                            << 
557 }                                              << 
558                                                << 
559 G4String G4VisCommandViewerClearVisAttributesM << 
560   return "";                                   << 
561 }                                              << 
562                                                << 
563 void G4VisCommandViewerClearVisAttributesModif << 
564                                                << 
565   G4VisManager::Verbosity verbosity = fpVisMan << 
566                                                << 
567   G4VViewer* viewer = fpVisManager -> GetCurre << 
568   if (!viewer) {                               << 
569     if (verbosity >= G4VisManager::errors) {   << 
570       G4warn <<                                << 
571       "ERROR: No current viewer - \"/vis/viewe << 
572        << G4endl;                              << 
573     }                                          << 
574     return;                                    << 
575   }                                            << 
576                                                << 
577   G4ViewParameters vp = viewer->GetViewParamet << 
578   vp.ClearVisAttributesModifiers();            << 
579   if (verbosity >= G4VisManager::confirmations << 
580     G4cout << "Vis attributes modifiers for vi << 
581      << "\" now cleared." << G4endl;           << 
582   }                                            << 
583                                                << 
584   SetViewParameters(viewer, vp);               << 
585 }                                              << 
586                                                << 
587 ////////////// /vis/viewer/clone ///////////// << 
588                                                << 
589 G4VisCommandViewerClone::G4VisCommandViewerClo << 
590   G4bool omitable;                             << 
591   fpCommand = new G4UIcommand ("/vis/viewer/cl << 
592   fpCommand -> SetGuidance ("Clones viewer."); << 
593   fpCommand -> SetGuidance                     << 
594     ("By default, clones current viewer.  Clon << 
595      "\nClone name, if not provided, is derive << 
596      "\n\"/vis/viewer/list\" to see  possible  << 
597   G4UIparameter* parameter;                    << 
598   parameter = new G4UIparameter ("original-vie << 
599   parameter -> SetCurrentAsDefault (true);     << 
600   fpCommand -> SetParameter (parameter);       << 
601   parameter = new G4UIparameter ("clone-name", << 
602   parameter -> SetDefaultValue ("none");       << 
603   fpCommand -> SetParameter (parameter);       << 
604 }                                              << 
605                                                << 
606 G4VisCommandViewerClone::~G4VisCommandViewerCl << 
607   delete fpCommand;                            << 
608 }                                              << 
609                                                << 
610 G4String G4VisCommandViewerClone::GetCurrentVa << 
611   G4VViewer* viewer = fpVisManager -> GetCurre << 
612   G4String originalName = viewer ? viewer -> G << 
613   return "\"" + originalName + "\"";           << 
614 }                                              << 
615                                                << 
616 void G4VisCommandViewerClone::SetNewValue (G4U << 
617                                                << 
618   G4VisManager::Verbosity verbosity = fpVisMan << 
619                                                << 
620   G4String originalName, cloneName;            << 
621   std::istringstream is (newValue);            << 
622                                                << 
623   // Need to handle the possibility that the n << 
624   // blanks within quotation marks...          << 
625   char c = ' ';                                << 
626   while (is.get(c) && c == ' '){}              << 
627   if (c == '"') {                              << 
628     while (is.get(c) && c != '"') {originalNam << 
629   }                                            << 
630   else {                                       << 
631     originalName += c;                         << 
632     while (is.get(c) && c != ' ') {originalNam << 
633   }                                            << 
634   G4StrUtil::strip(originalName, ' ');         << 
635   G4StrUtil::strip(originalName, '"');         << 
636                                                << 
637   G4VViewer* originalViewer = fpVisManager ->  << 
638   if (!originalViewer) {                       << 
639     if (verbosity >= G4VisManager::errors) {   << 
640       G4warn << "ERROR: Viewer \"" << original << 
641        << "\" not found - \"/vis/viewer/list\" << 
642        << G4endl;                              << 
643     }                                          << 
644     return;                                    << 
645   }                                            << 
646   originalName = originalViewer->GetName();  / << 
647                                                << 
648   while (is.get(c) && c == ' '){}              << 
649   if (c == '"') {                              << 
650     while (is.get(c) && c != '"') {cloneName + << 
651   }                                            << 
652   else {                                       << 
653     cloneName += c;                            << 
654     while (is.get(c) && c != ' ') {cloneName + << 
655   }                                            << 
656   G4StrUtil::strip(cloneName, ' ');            << 
657   G4StrUtil::strip(cloneName, '"');            << 
658                                                << 
659   G4bool errorWhileNaming = false;             << 
660   if (cloneName == "none") {                   << 
661     G4int subID = 0;                           << 
662     do {                                       << 
663       cloneName = originalName;                << 
664       std::ostringstream oss;                  << 
665       oss << '-' << subID++;                   << 
666       G4String::size_type lastDashPosition, ne << 
667       if ((lastDashPosition = cloneName.rfind( << 
668     (nextSpacePosition = cloneName.find(" ", l << 
669     G4String::npos) {                          << 
670   cloneName.insert(nextSpacePosition, oss.str( << 
671       } else {                                 << 
672   G4String::size_type spacePosition = cloneNam << 
673   if (spacePosition != G4String::npos)         << 
674     cloneName.insert(spacePosition, oss.str()) << 
675   else                                         << 
676     errorWhileNaming = true;                   << 
677       }                                        << 
678     } while (!errorWhileNaming && fpVisManager << 
679   }                                            << 
680                                                << 
681   if (errorWhileNaming) {                      << 
682     if (verbosity >= G4VisManager::errors) {   << 
683       G4warn << "ERROR: While naming clone vie << 
684        << "\"."                                << 
685        << G4endl;                              << 
686     }                                          << 
687     return;                                    << 
688   }                                            << 
689                                                << 
690   if (fpVisManager -> GetViewer (cloneName)) { << 
691     if (verbosity >= G4VisManager::errors) {   << 
692       G4warn << "ERROR: Putative clone viewer  << 
693        << "\" already exists."                 << 
694        << G4endl;                              << 
695     }                                          << 
696     return;                                    << 
697   }                                            << 
698                                                << 
699   G4String windowSizeHint =                    << 
700     originalViewer->GetViewParameters().GetXGe << 
701                                                << 
702   G4UImanager* UImanager = G4UImanager::GetUIp << 
703   UImanager->ApplyCommand(G4String("/vis/viewe << 
704   UImanager->ApplyCommand                      << 
705     (G4String("/vis/viewer/create ! \"" + clon << 
706   UImanager->ApplyCommand(G4String("/vis/viewe << 
707                                                << 
708   if (verbosity >= G4VisManager::confirmations << 
709     G4cout << "Viewer \"" << originalName << " << 
710     G4cout << "Clone \"" << cloneName << "\" n << 
711   }                                            << 
712 }                                              << 
713                                                << 
714 ////////////// /vis/viewer/colourByDensity /// << 
715                                                << 
716 G4VisCommandViewerColourByDensity::G4VisComman << 
717   G4bool omitable;                             << 
718   fpCommand = new G4UIcommand ("/vis/viewer/co << 
719   fpCommand -> SetGuidance                     << 
720   ("If a volume has no vis attributes, colour  << 
721   fpCommand -> SetGuidance                     << 
722   ("Provide algorithm number, e.g., \"1\" (or  << 
723    "\nThen a unit of density, e.g., \"g/cm3\". << 
724    "\nThen parameters for the algorithm assume << 
725   fpCommand -> SetGuidance                     << 
726   ("Algorithm 1: Simple algorithm takes 3 para << 
727    "\n  Volumes with density < d0 are invisibl << 
728    "\n  Volumes with d0 <= density < d1 have c << 
729    "\n  Volumes with d1 <= density < d2 have c << 
730    "\n  Volumes with density > d2 are blue."); << 
731   G4UIparameter* parameter;                    << 
732   parameter  =  new G4UIparameter("n",'i',omit << 
733   parameter  -> SetGuidance      ("Algorithm n << 
734   parameter  -> SetDefaultValue  (1);          << 
735   fpCommand->SetParameter(parameter);          << 
736   parameter  =  new G4UIparameter("unit",'s',o << 
737   parameter  -> SetGuidance      ("Unit of fol << 
738   parameter  -> SetDefaultValue  ("g/cm3");    << 
739   fpCommand->SetParameter(parameter);          << 
740   parameter  =  new G4UIparameter("d0",'d',omi << 
741   parameter  -> SetGuidance      ("Density par << 
742   parameter  -> SetDefaultValue  (0.5);        << 
743   fpCommand->SetParameter(parameter);          << 
744   parameter  =  new G4UIparameter("d1",'d',omi << 
745   parameter  -> SetGuidance      ("Density par << 
746   parameter  -> SetDefaultValue  (3.0);        << 
747   fpCommand->SetParameter(parameter);          << 
748   parameter  =  new G4UIparameter("d2",'d',omi << 
749   parameter  -> SetGuidance      ("Density par << 
750   parameter  -> SetDefaultValue  (10.0);       << 
751   fpCommand->SetParameter(parameter);          << 
752 }                                              << 
753                                                << 
754 G4VisCommandViewerColourByDensity::~G4VisComma << 
755   delete fpCommand;                            << 
756 }                                              << 
757                                                << 
758 G4String G4VisCommandViewerColourByDensity::Ge << 
759   return "";                                   << 
760 }                                              << 
761                                                << 
762 void G4VisCommandViewerColourByDensity::SetNew << 
763                                                << 
764   G4VisManager::Verbosity verbosity = fpVisMan << 
765                                                << 
766   G4VViewer* viewer = fpVisManager -> GetCurre << 
767   if (!viewer) {                               << 
768     if (verbosity >= G4VisManager::errors) {   << 
769       G4warn <<                                << 
770       "ERROR: No current viewer - \"/vis/viewe << 
771       << G4endl;                               << 
772     }                                          << 
773     return;                                    << 
774   }                                            << 
775   G4ViewParameters vp = viewer->GetViewParamet << 
776                                                << 
777   G4int algorithmNumber;                       << 
778   G4double d0, d1, d2;                         << 
779   G4String unit;                               << 
780   std::istringstream is (newValue);            << 
781   is >> algorithmNumber >> unit >> d0 >> d1 >> << 
782                                                << 
783   if (algorithmNumber < 0 || algorithmNumber > << 
784     if (verbosity >= G4VisManager::errors) {   << 
785       G4warn <<                                << 
786       "ERROR: Unrecognised algorithm number: " << 
787       << G4endl;                               << 
788     }                                          << 
789     return;                                    << 
790   }                                            << 
791                                                << 
792   std::vector<G4double> parameters;            << 
793   if (algorithmNumber > 0) {                   << 
794     const G4String where = "G4VisCommandViewer << 
795     G4double valueOfUnit;                      << 
796     // "Volumic Mass" is Michel's phrase for " << 
797     if (ProvideValueOfUnit(where,unit,"Volumic << 
798       // Successful outcome of unit search     << 
799       d0 *= valueOfUnit; d1 *= valueOfUnit; d2 << 
800     } else {                                   << 
801       if (verbosity >= G4VisManager::errors) { << 
802         G4warn <<                              << 
803         "ERROR: Unrecognised or inappropriate  << 
804         << G4endl;                             << 
805       }                                        << 
806       return;                                  << 
807     }                                          << 
808     parameters.push_back(d0);                  << 
809     parameters.push_back(d1);                  << 
810     parameters.push_back(d2);                  << 
811   }                                            << 
812   vp.SetCBDAlgorithmNumber(algorithmNumber);   << 
813   vp.SetCBDParameters(parameters);             << 
814                                                << 
815   if (verbosity >= G4VisManager::confirmations << 
816     if (vp.GetCBDAlgorithmNumber() == 0) {     << 
817       G4cout << "Colour by density deactivated << 
818     } else {                                   << 
819       G4cout << "Colour by density algorithm " << 
820       << " selected for viewer \"" << viewer-> << 
821       << "\n  Parameters:";                    << 
822       for (auto p: vp.GetCBDParameters()) {    << 
823         G4cout << ' ' << G4BestUnit(p,"Volumic << 
824       }                                        << 
825       G4cout << G4endl;                        << 
826     }                                          << 
827   }                                            << 
828                                                << 
829   SetViewParameters(viewer, vp);               << 
830 }                                              << 
831                                                << 
832 ////////////// /vis/viewer/copyViewFrom ////// << 
833                                                << 
834 G4VisCommandViewerCopyViewFrom::G4VisCommandVi << 
835   G4bool omitable;                             << 
836   fpCommand = new G4UIcmdWithAString ("/vis/vi << 
837   fpCommand -> SetGuidance                     << 
838   ("Copy the camera-specific parameters from t << 
839   fpCommand -> SetGuidance                     << 
840   ("Note: To copy ALL view parameters, includi << 
841    "\nuse \"/vis/viewer/set/all\"");           << 
842   fpCommand -> SetParameterName ("from-viewer- << 
843 }                                              << 
844                                                << 
845 G4VisCommandViewerCopyViewFrom::~G4VisCommandV << 
846   delete fpCommand;                            << 
847 }                                              << 
848                                                << 
849 G4String G4VisCommandViewerCopyViewFrom::GetCu << 
850   return "";                                   << 
851 }                                              << 
852                                                << 
853 void G4VisCommandViewerCopyViewFrom::SetNewVal << 
854                                                << 
855   G4VisManager::Verbosity verbosity = fpVisMan << 
856                                                << 
857   G4VViewer* currentViewer = fpVisManager->Get << 
858   if (!currentViewer) {                        << 
859     if (verbosity >= G4VisManager::errors) {   << 
860       G4warn <<                                << 
861   "ERROR: G4VisCommandsViewerCopyViewFrom::Set << 
862              << G4endl;                        << 
863     }                                          << 
864     return;                                    << 
865   }                                            << 
866                                                << 
867   const G4String& fromViewerName = newValue;   << 
868   G4VViewer* fromViewer = fpVisManager -> GetV << 
869   if (!fromViewer) {                           << 
870     if (verbosity >= G4VisManager::errors) {   << 
871       G4warn << "ERROR: Viewer \"" << fromView << 
872        << "\" not found - \"/vis/viewer/list\" << 
873        << G4endl;                              << 
874     }                                          << 
875     return;                                    << 
876   }                                            << 
877                                                << 
878   if (fromViewer == currentViewer) {           << 
879     if (verbosity >= G4VisManager::warnings) { << 
880       G4warn <<                                << 
881         "WARNING: G4VisCommandsViewerSet::SetN << 
882         "\n  from-viewer and current viewer ar << 
883              << G4endl;                        << 
884     }                                          << 
885     return;                                    << 
886   }                                            << 
887                                                << 
888   // Copy camera-specific view parameters      << 
889   G4ViewParameters vp = currentViewer->GetView << 
890   CopyCameraParameters(vp, fromViewer->GetView << 
891   SetViewParameters(currentViewer, vp);        << 
892                                                << 
893   if (verbosity >= G4VisManager::confirmations << 
894     G4cout << "Camera parameters of viewer \"" << 
895      << "\"\n  set to those of viewer \"" << f << 
896      << "\"."                                  << 
897      << G4endl;                                << 
898   }                                            << 
899 }                                              << 
900                                                << 
901 ////////////// /vis/viewer/create ////////////    110 ////////////// /vis/viewer/create ///////////////////////////////////////
902                                                   111 
903 G4VisCommandViewerCreate::G4VisCommandViewerCr    112 G4VisCommandViewerCreate::G4VisCommandViewerCreate (): fId (0) {
904   G4bool omitable;                                113   G4bool omitable;
905   fpCommand = new G4UIcommand ("/vis/viewer/cr    114   fpCommand = new G4UIcommand ("/vis/viewer/create", this);
906   fpCommand -> SetGuidance                        115   fpCommand -> SetGuidance
907     ("Creates a viewer. If the scene handler n << 116     ("Creates a viewer for the specified scene handler.");
908      "\nviewer of that scene handler is create << 
909      "\nof the current scene handler is create << 
910   fpCommand -> SetGuidance                     << 
911     ("If the viewer name is not specified a na << 
912      "\nof the scene handler and a serial numb << 
913   fpCommand -> SetGuidance("The scene handler  << 
914   fpCommand -> SetGuidance                     << 
915     ("(Note: the system adds the graphics syst << 
916      "\nfor identification, but for selecting, << 
917      "\nup to the first blank are used. For ex << 
918      "\n\"viewer-0 (G4OpenGLStoredQt)\", it ma << 
919      "\nfor example in \"/vis/viewer/select vi << 
920   fpCommand -> SetGuidance                     << 
921   ("Window size and placement hints, e.g. 600x << 
922   fpCommand -> SetGuidance                     << 
923   ("- single number, e.g., \"600\": square win << 
924   fpCommand -> SetGuidance                     << 
925   ("- two numbers, e.g., \"800x600\": rectangl << 
926   fpCommand -> SetGuidance                     << 
927   ("- two numbers plus placement hint, e.g., \ << 
928    "\n  600x600 100 pixels left and 100 pixels << 
929   fpCommand -> SetGuidance                        117   fpCommand -> SetGuidance
930   ("- If not specified, the default is \"600\" << 118     ("Default scene handler is the current scene handler.  Invents a name"
931    "\n  at the window manager's discretion...o << 119      "\nif not supplied.  (Note: the system adds information to the name"
932   fpCommand -> SetGuidance                     << 120      "\nfor identification - only the characters up to the first blank are"
933   ("- This is an X-Windows-type geometry strin << 121      "\nused for removing, selecting, etc.)  This scene handler and viewer"
934    "\n  https://en.wikibooks.org/wiki/Guide_to << 122      "\nbecome current.");
935    "\n  \"Specifying window geometry\".");     << 
936   G4UIparameter* parameter;                       123   G4UIparameter* parameter;
937   parameter = new G4UIparameter ("scene-handle    124   parameter = new G4UIparameter ("scene-handler", 's', omitable = true);
938   parameter -> SetCurrentAsDefault (true);        125   parameter -> SetCurrentAsDefault (true);
939   fpCommand -> SetParameter (parameter);          126   fpCommand -> SetParameter (parameter);
940   parameter = new G4UIparameter ("viewer-name"    127   parameter = new G4UIparameter ("viewer-name", 's', omitable = true);
941   parameter -> SetCurrentAsDefault (true);        128   parameter -> SetCurrentAsDefault (true);
942   fpCommand -> SetParameter (parameter);          129   fpCommand -> SetParameter (parameter);
943   parameter = new G4UIparameter ("window-size- << 130   parameter = new G4UIparameter ("window-size-hint", 'i', omitable = true);
944   parameter -> SetCurrentAsDefault (true);     << 131   parameter -> SetGuidance ("pixels");
                                                   >> 132   parameter -> SetDefaultValue (600);
945   fpCommand -> SetParameter (parameter);          133   fpCommand -> SetParameter (parameter);
946 }                                                 134 }
947                                                   135 
948 G4VisCommandViewerCreate::~G4VisCommandViewerC    136 G4VisCommandViewerCreate::~G4VisCommandViewerCreate () {
949   delete fpCommand;                               137   delete fpCommand;
950 }                                                 138 }
951                                                   139 
952 G4String G4VisCommandViewerCreate::NextName ()    140 G4String G4VisCommandViewerCreate::NextName () {
953   std::ostringstream oss;                      << 141   const int charLength = 100;
                                                   >> 142   char nextName [charLength];
                                                   >> 143   std::ostrstream ost (nextName, charLength);
954   G4VSceneHandler* sceneHandler = fpVisManager    144   G4VSceneHandler* sceneHandler = fpVisManager -> GetCurrentSceneHandler ();
955   oss << "viewer-" << fId << " (";             << 145   ost << "viewer-" << fId << " (";
956   if (sceneHandler) {                             146   if (sceneHandler) {
957     oss << sceneHandler -> GetGraphicsSystem ( << 147     ost << sceneHandler -> GetGraphicsSystem () -> GetName ();
958   }                                               148   }
959   else {                                          149   else {
960     oss << "no_scene_handlers";                << 150     ost << "no_scene_handlers";
961   }                                               151   }
962   oss << ")";                                  << 152   ost << ")" << std::ends;
963   return oss.str();                            << 153   return nextName;
964 }                                                 154 }
965                                                   155 
966 G4String G4VisCommandViewerCreate::GetCurrentV << 156 G4String G4VisCommandViewerCreate::GetCurrentValue (G4UIcommand*) {
967 {                                              << 157   G4String currentValue;
968   G4String sceneHandlerName;                   << 158   G4VSceneHandler* currentSceneHandler =
969   auto currentSceneHandler = fpVisManager->Get << 159     fpVisManager -> GetCurrentSceneHandler ();
970   if (currentSceneHandler) {  // Get name of l << 160   if (currentSceneHandler) {
971     sceneHandlerName = currentSceneHandler->Ge << 161     currentValue = currentSceneHandler -> GetName ();
972   }                                               162   }
973   else {  // No scene handler - ensure a warni << 163   else {
974     sceneHandlerName = "none";                 << 164     currentValue = "none";
975   }                                               165   }
                                                   >> 166   currentValue += ' ';
                                                   >> 167   currentValue += '"';
                                                   >> 168   currentValue += NextName ();
                                                   >> 169   currentValue += '"';
976                                                   170 
977   // Default name                              << 171   currentValue += " 600";  // Default number of pixels for window size hint.
978   const auto& viewerName = NextName();         << 
979                                                   172 
980   // Size hint                                 << 173   return currentValue;
981   G4String windowSizeHint;                     << 
982   auto currentViewer = fpVisManager->GetCurren << 
983   if (currentViewer) {  // Get hint from last  << 
984     windowSizeHint = currentViewer->GetViewPar << 
985   }                                            << 
986   else {  // No viewer - must be first time    << 
987     windowSizeHint = fpVisManager->GetDefaultX << 
988   }                                            << 
989                                                << 
990   // Add quotes around viewer name             << 
991   return sceneHandlerName + " \"" + viewerName << 
992 }                                                 174 }
993                                                   175 
994 void G4VisCommandViewerCreate::SetNewValue (G4 << 176 void G4VisCommandViewerCreate::SetNewValue (G4UIcommand*, G4String newValue) {
995                                                   177 
996   G4VisManager::Verbosity verbosity = fpVisMan    178   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
997                                                   179 
998   G4String sceneHandlerName, newName;             180   G4String sceneHandlerName, newName;
999   G4String windowSizeHintString;               << 181   G4int windowSizeHint;
1000   std::istringstream is (newValue);           << 182   std::istrstream is (newValue);
1001   is >> sceneHandlerName;                        183   is >> sceneHandlerName;
1002                                                  184 
1003   // Now need to handle the possibility that     185   // Now need to handle the possibility that the second string
1004   // contains embedded blanks within quotatio    186   // contains embedded blanks within quotation marks...
1005   char c = ' ';                               << 187   char c;
1006   while (is.get(c) && c == ' '){}             << 188   while (is.get(c) && c == ' ');
1007   if (c == '"') {                                189   if (c == '"') {
1008     while (is.get(c) && c != '"') {newName += << 190     while (is.get(c) && c != '"') newName += c;
1009   }                                              191   }
1010   else {                                         192   else {
1011     newName += c;                                193     newName += c;
1012     while (is.get(c) && c != ' ') {newName += << 194     while (is.get(c) && c != ' ') newName += c;
1013   }                                              195   }
1014   G4StrUtil::strip(newName, ' ');             << 196   newName = newName.strip (G4String::both, ' ');
1015   G4StrUtil::strip(newName, '"');             << 197   newName = newName.strip (G4String::both, '"');
1016                                                  198 
1017   // Now get window size hint...              << 199   // Now get number of pixels...
1018   is >> windowSizeHintString;                 << 200   is >> windowSizeHint;
1019                                                  201 
1020   const G4SceneHandlerList& sceneHandlerList     202   const G4SceneHandlerList& sceneHandlerList =
1021     fpVisManager -> GetAvailableSceneHandlers    203     fpVisManager -> GetAvailableSceneHandlers ();
1022   std::size_t nHandlers = sceneHandlerList.si << 204   G4int nHandlers = sceneHandlerList.size ();
1023   if (nHandlers == 0) {                       << 205   if (nHandlers <= 0) {
1024     G4ExceptionDescription ed;                << 206     if (verbosity >= G4VisManager::errors) {
1025     ed <<                                     << 207       G4cout <<
1026     "ERROR: G4VisCommandViewerCreate::SetNewV << 208   "ERROR: G4VisCommandViewerCreate::SetNewValue: no scene handlers."
1027     "\n  Create a scene handler with \"/vis/s << 209   "\n  Create a scene handler with \"/vis/sceneHandler/create\""
1028     command->CommandFailed(ed);               << 210        << G4endl;
                                                   >> 211     }
1029     return;                                      212     return;
1030   }                                              213   }
1031                                                  214 
1032   std::size_t iHandler;                       << 215   G4int iHandler;
1033   for (iHandler = 0; iHandler < nHandlers; ++ << 216   for (iHandler = 0; iHandler < nHandlers; iHandler++) {
1034     if (sceneHandlerList [iHandler] -> GetNam    217     if (sceneHandlerList [iHandler] -> GetName () == sceneHandlerName) break;
1035   }                                              218   }
1036                                                  219 
1037   if (iHandler >= nHandlers) {                << 220   if (iHandler < 0 || iHandler >= nHandlers) {
1038     // Invalid command line argument or none.    221     // Invalid command line argument or none.
1039     // This shouldn't happen!!!!!!               222     // This shouldn't happen!!!!!!
1040     G4ExceptionDescription ed;                << 223     if (verbosity >= G4VisManager::errors) {
1041     ed <<                                     << 224       G4cout << "G4VisCommandViewerCreate::SetNewValue:"
1042     "G4VisCommandViewerCreate::SetNewValue: i << 225   " invalid scene handler specified."
1043     command->CommandFailed(ed);               << 226       << G4endl;
                                                   >> 227     }
1044     return;                                      228     return;
1045   }                                              229   }
1046                                                  230 
1047   // Valid index.  Set current scene handler     231   // Valid index.  Set current scene handler and graphics system in
1048   // preparation for creating viewer.            232   // preparation for creating viewer.
1049   G4VSceneHandler* sceneHandler = sceneHandle    233   G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
1050   if (sceneHandler != fpVisManager -> GetCurr    234   if (sceneHandler != fpVisManager -> GetCurrentSceneHandler ()) {
1051     fpVisManager -> SetCurrentSceneHandler (s    235     fpVisManager -> SetCurrentSceneHandler (sceneHandler);
1052   }                                              236   }
1053                                                  237 
1054   // Now deal with name of viewer.               238   // Now deal with name of viewer.
1055   G4String nextName = NextName ();               239   G4String nextName = NextName ();
1056   if (newName == "") {                           240   if (newName == "") {
1057     newName = nextName;                          241     newName = nextName;
1058   }                                              242   }
1059   if (newName == nextName) fId++;                243   if (newName == nextName) fId++;
1060   G4String newShortName = fpVisManager -> Vie    244   G4String newShortName = fpVisManager -> ViewerShortName (newName);
1061                                                  245 
1062   for (std::size_t ih = 0; ih < nHandlers; ++ << 246   for (iHandler = 0; iHandler < nHandlers; iHandler++) {
1063     G4VSceneHandler* sh = sceneHandlerList [i << 247     G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
1064     const G4ViewerList& viewerList = sh -> Ge << 248     const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
1065     for (std::size_t iViewer = 0; iViewer < v << 249     for (size_t iViewer = 0; iViewer < viewerList.size (); iViewer++) {
1066       if (viewerList [iViewer] -> GetShortNam    250       if (viewerList [iViewer] -> GetShortName () == newShortName ) {
1067   G4ExceptionDescription ed;                  << 251   if (verbosity >= G4VisManager::errors) {
1068   ed <<                                       << 252     G4cout << "ERROR: Viewer \"" << newShortName << "\" already exists."
1069   "ERROR: Viewer \"" << newShortName << "\" a << 253      << G4endl;
1070   command->CommandFailed(ed);                 << 254   }
1071   return;                                        255   return;
1072       }                                          256       }
1073     }                                            257     }
1074   }                                              258   }
1075                                                  259 
1076   if (fThereWasAViewer && windowSizeHintStrin << 260   fpVisManager->SetWindowSizeHint (windowSizeHint, windowSizeHint);
1077     // The user did not specify a window size << 261   // These are picked up in the G4VViewer constructor.  The problem is
1078     windowSizeHintString = fExistingVP.GetXGe << 262   // these have to be set *before* construction, i.e., before we have
1079   }                                           << 263   // a viewer.
1080                                               << 
1081   fpVisManager -> CreateViewer (newName,windo << 
1082                                                  264 
1083   // Now we have a new viewer                 << 265   // Create viewer.
                                                   >> 266   fpVisManager -> CreateViewer (newName);
1084   G4VViewer* newViewer = fpVisManager -> GetC    267   G4VViewer* newViewer = fpVisManager -> GetCurrentViewer ();
1085                                               << 268   if (newViewer -> GetName () == newName) {
1086   if (newViewer && newViewer -> GetName () == << 
1087     if (fThereWasAViewer) {                   << 
1088       G4ViewParameters vp = newViewer->GetVie << 
1089       // Copy view parameters from existing v << 
1090       fExistingVP.SetAutoRefresh(vp.IsAutoRef << 
1091       fExistingVP.SetBackgroundColour(vp.GetB << 
1092       fExistingVP.SetGlobalMarkerScale(vp.Get << 
1093       // ...including window hint paramaters  << 
1094       fExistingVP.SetXGeometryString(vp.GetXG << 
1095       vp = fExistingVP;                       << 
1096       newViewer->SetViewParameters(vp);       << 
1097       newViewer->AccessSceneTree() = fExistin << 
1098     }                                         << 
1099     if (verbosity >= G4VisManager::confirmati    269     if (verbosity >= G4VisManager::confirmations) {
1100       G4cout << "New viewer \"" << newName <<    270       G4cout << "New viewer \"" << newName << "\" created." << G4endl;
1101     }                                            271     }
1102     // Keep for next time...                  << 
1103     fThereWasAViewer = true;                  << 
1104     auto viewer = fpVisManager->GetCurrentVie << 
1105     fExistingVP = viewer->GetViewParameters() << 
1106     fExistingSceneTree = viewer->GetSceneTree << 
1107   } else {                                    << 
1108     G4ExceptionDescription ed;                << 
1109     if (newViewer) {                          << 
1110       ed << "ERROR: New viewer doesn\'t match << 
1111     } else {                                  << 
1112       ed << "WARNING: No viewer created.";    << 
1113     }                                         << 
1114     command->CommandFailed(ed);               << 
1115     return;                                   << 
1116   }                                              272   }
1117   // Refresh if appropriate...                << 273   else {
1118   if (newViewer) {                            << 274     if (verbosity >= G4VisManager::errors) {
1119     if (newViewer->GetViewParameters().IsAuto << 275       G4cout << "ERROR: New viewer doesn\'t match!!!  Curious!!" << G4endl;
1120       G4UImanager::GetUIpointer()->ApplyComma << 
1121     }                                         << 
1122     else {                                    << 
1123       if (verbosity >= G4VisManager::warnings << 
1124   G4warn << "Issue /vis/viewer/refresh or flu << 
1125          << G4endl;                           << 
1126       }                                       << 
1127     }                                            276     }
1128   }                                              277   }
                                                   >> 278   // Refresh if appropriate...
                                                   >> 279   SetViewParameters(newViewer, newViewer->GetViewParameters());
1129 }                                                280 }
1130                                                  281 
1131 ////////////// /vis/viewer/dolly and dollyTo     282 ////////////// /vis/viewer/dolly and dollyTo ////////////////////////////
1132                                                  283 
1133 G4VisCommandViewerDolly::G4VisCommandViewerDo    284 G4VisCommandViewerDolly::G4VisCommandViewerDolly ():
1134   fDollyIncrement  (0.),                         285   fDollyIncrement  (0.),
1135   fDollyTo (0.)                                  286   fDollyTo (0.)
1136 {                                                287 {
1137   G4bool omitable, currentAsDefault;             288   G4bool omitable, currentAsDefault;
1138                                                  289 
1139   fpCommandDolly = new G4UIcmdWithADoubleAndU    290   fpCommandDolly = new G4UIcmdWithADoubleAndUnit
1140     ("/vis/viewer/dolly", this);                 291     ("/vis/viewer/dolly", this);
1141   fpCommandDolly -> SetGuidance                  292   fpCommandDolly -> SetGuidance
1142     ("Incremental dolly.");                      293     ("Incremental dolly.");
1143   fpCommandDolly -> SetGuidance                  294   fpCommandDolly -> SetGuidance
1144     ("Moves the camera incrementally towards     295     ("Moves the camera incrementally towards target point.");
1145   fpCommandDolly -> SetParameterName("increme    296   fpCommandDolly -> SetParameterName("increment",
1146              omitable=true,                      297              omitable=true,
1147              currentAsDefault=true);             298              currentAsDefault=true);
1148   fpCommandDolly -> SetDefaultUnit("m");         299   fpCommandDolly -> SetDefaultUnit("m");
1149                                                  300 
1150   fpCommandDollyTo = new G4UIcmdWithADoubleAn    301   fpCommandDollyTo = new G4UIcmdWithADoubleAndUnit
1151     ("/vis/viewer/dollyTo", this);               302     ("/vis/viewer/dollyTo", this);
1152   fpCommandDollyTo -> SetGuidance                303   fpCommandDollyTo -> SetGuidance
1153     ("Dolly to specific coordinate.");           304     ("Dolly to specific coordinate.");
1154   fpCommandDollyTo -> SetGuidance                305   fpCommandDollyTo -> SetGuidance
1155  ("Places the camera towards target point rel    306  ("Places the camera towards target point relative to standard camera point.");
1156   fpCommandDollyTo -> SetParameterName("dista    307   fpCommandDollyTo -> SetParameterName("distance",
1157                omitable=true,                    308                omitable=true,
1158                currentAsDefault=true);           309                currentAsDefault=true);
1159   fpCommandDollyTo -> SetDefaultUnit("m");       310   fpCommandDollyTo -> SetDefaultUnit("m");
1160 }                                                311 }
1161                                                  312 
1162 G4VisCommandViewerDolly::~G4VisCommandViewerD    313 G4VisCommandViewerDolly::~G4VisCommandViewerDolly () {
1163   delete fpCommandDolly;                         314   delete fpCommandDolly;
1164   delete fpCommandDollyTo;                       315   delete fpCommandDollyTo;
1165 }                                                316 }
1166                                                  317 
1167 G4String G4VisCommandViewerDolly::GetCurrentV    318 G4String G4VisCommandViewerDolly::GetCurrentValue (G4UIcommand* command) {
1168   G4String currentValue;                         319   G4String currentValue;
1169   if (command == fpCommandDolly) {               320   if (command == fpCommandDolly) {
1170     currentValue = fpCommandDolly->ConvertToS    321     currentValue = fpCommandDolly->ConvertToString(fDollyIncrement, "m");
1171   }                                              322   }
1172   else if (command == fpCommandDollyTo) {        323   else if (command == fpCommandDollyTo) {
1173     currentValue = fpCommandDollyTo->ConvertT    324     currentValue = fpCommandDollyTo->ConvertToString(fDollyTo, "m");
1174   }                                              325   }
1175   return currentValue;                           326   return currentValue;
1176 }                                                327 }
1177                                                  328 
1178 void G4VisCommandViewerDolly::SetNewValue (G4    329 void G4VisCommandViewerDolly::SetNewValue (G4UIcommand* command,
1179              G4String newValue) {                330              G4String newValue) {
1180                                                  331 
1181                                                  332 
1182   G4VisManager::Verbosity verbosity = fpVisMa    333   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1183                                                  334 
1184   G4VViewer* currentViewer = fpVisManager->Ge    335   G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
1185   if (!currentViewer) {                          336   if (!currentViewer) {
1186     if (verbosity >= G4VisManager::errors) {     337     if (verbosity >= G4VisManager::errors) {
1187       G4warn <<                               << 338       G4cout <<
1188   "ERROR: G4VisCommandsViewerDolly::SetNewVal    339   "ERROR: G4VisCommandsViewerDolly::SetNewValue: no current viewer."
1189        << G4endl;                                340        << G4endl;
1190     }                                            341     }
1191     return;                                      342     return;
1192   }                                              343   }
1193                                                  344 
1194   G4ViewParameters vp = currentViewer->GetVie    345   G4ViewParameters vp = currentViewer->GetViewParameters();
1195                                                  346 
1196   if (command == fpCommandDolly) {               347   if (command == fpCommandDolly) {
1197     fDollyIncrement = fpCommandDolly->GetNewD    348     fDollyIncrement = fpCommandDolly->GetNewDoubleValue(newValue);
1198     vp.IncrementDolly(fDollyIncrement);          349     vp.IncrementDolly(fDollyIncrement);
1199   }                                              350   }
1200   else if (command == fpCommandDollyTo) {        351   else if (command == fpCommandDollyTo) {
1201     fDollyTo = fpCommandDolly->GetNewDoubleVa    352     fDollyTo = fpCommandDolly->GetNewDoubleValue(newValue);
1202     vp.SetDolly(fDollyTo);                       353     vp.SetDolly(fDollyTo);
1203   }                                              354   }
1204                                                  355 
1205   if (verbosity >= G4VisManager::confirmation    356   if (verbosity >= G4VisManager::confirmations) {
1206     G4cout << "Dolly distance changed to " <<    357     G4cout << "Dolly distance changed to " << vp.GetDolly() << G4endl;
1207   }                                              358   }
1208                                                  359 
1209   SetViewParameters(currentViewer, vp);          360   SetViewParameters(currentViewer, vp);
1210 }                                                361 }
1211                                                  362 
1212 ////////////// /vis/viewer/flush ////////////    363 ////////////// /vis/viewer/flush ///////////////////////////////////////
1213                                                  364 
1214 G4VisCommandViewerFlush::G4VisCommandViewerFl    365 G4VisCommandViewerFlush::G4VisCommandViewerFlush () {
1215   G4bool omitable, currentAsDefault;             366   G4bool omitable, currentAsDefault;
1216   fpCommand = new G4UIcmdWithAString ("/vis/v    367   fpCommand = new G4UIcmdWithAString ("/vis/viewer/flush", this);
1217   fpCommand -> SetGuidance                       368   fpCommand -> SetGuidance
1218     ("Compound command: \"/vis/viewer/refresh    369     ("Compound command: \"/vis/viewer/refresh\" + \"/vis/viewer/update\".");
1219   fpCommand -> SetGuidance                       370   fpCommand -> SetGuidance
1220     ("Useful for refreshing and initiating po    371     ("Useful for refreshing and initiating post-processing for graphics"
1221      "\nsystems which need post-processing.      372      "\nsystems which need post-processing.  By default, acts on current"
1222      "\nviewer.  \"/vis/viewer/list\" to see     373      "\nviewer.  \"/vis/viewer/list\" to see possible viewers.  Viewer"
1223      "\nbecomes current.");                      374      "\nbecomes current.");
1224   fpCommand -> SetParameterName ("viewer-name    375   fpCommand -> SetParameterName ("viewer-name",
1225          omitable = true,                        376          omitable = true,
1226          currentAsDefault = true);               377          currentAsDefault = true);
1227 }                                                378 }
1228                                                  379 
1229 G4VisCommandViewerFlush::~G4VisCommandViewerF    380 G4VisCommandViewerFlush::~G4VisCommandViewerFlush () {
1230   delete fpCommand;                              381   delete fpCommand;
1231 }                                                382 }
1232                                                  383 
1233 G4String G4VisCommandViewerFlush::GetCurrentV    384 G4String G4VisCommandViewerFlush::GetCurrentValue 
1234 (G4UIcommand*) {                                 385 (G4UIcommand*) {
1235   G4VViewer* viewer = fpVisManager -> GetCurr    386   G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1236   return viewer ? viewer -> GetName () : G4St    387   return viewer ? viewer -> GetName () : G4String("none");
1237 }                                                388 }
1238                                                  389 
1239 void G4VisCommandViewerFlush::SetNewValue (G4    390 void G4VisCommandViewerFlush::SetNewValue (G4UIcommand*, G4String newValue) {
1240                                                  391 
1241   G4VisManager::Verbosity verbosity = fpVisMa    392   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1242                                                  393 
1243   G4String& flushName = newValue;                394   G4String& flushName = newValue;
1244   G4VViewer* viewer = fpVisManager -> GetView    395   G4VViewer* viewer = fpVisManager -> GetViewer (flushName);
1245   if (!viewer) {                                 396   if (!viewer) {
1246     if (verbosity >= G4VisManager::errors) {     397     if (verbosity >= G4VisManager::errors) {
1247       G4warn << "ERROR: Viewer \"" << flushNa << 398       G4cout << "ERROR: Viewer \"" << flushName << "\"" <<
1248   " not found - \"/vis/viewer/list\"\n  to se    399   " not found - \"/vis/viewer/list\"\n  to see possibilities."
1249        << G4endl;                                400        << G4endl;
1250     }                                            401     }
1251     return;                                      402     return;
1252   }                                              403   }
1253                                                  404 
1254   G4UImanager* ui = G4UImanager::GetUIpointer    405   G4UImanager* ui = G4UImanager::GetUIpointer();
                                                   >> 406   G4int keepVerbose = ui->GetVerboseLevel();
                                                   >> 407   G4int newVerbose(0);
                                                   >> 408   if (keepVerbose >= 2 || verbosity >= G4VisManager::confirmations)
                                                   >> 409     newVerbose = 2;
                                                   >> 410   ui->SetVerboseLevel(newVerbose);
1255   ui->ApplyCommand(G4String("/vis/viewer/refr    411   ui->ApplyCommand(G4String("/vis/viewer/refresh " + flushName));
1256   ui->ApplyCommand(G4String("/vis/viewer/upda    412   ui->ApplyCommand(G4String("/vis/viewer/update " + flushName));
                                                   >> 413   ui->SetVerboseLevel(keepVerbose);
1257   if (verbosity >= G4VisManager::confirmation    414   if (verbosity >= G4VisManager::confirmations) {
1258     G4cout << "Viewer \"" << viewer -> GetNam    415     G4cout << "Viewer \"" << viewer -> GetName () << "\""
1259      << " flushed." << G4endl;                   416      << " flushed." << G4endl;
1260   }                                              417   }
1261 }                                                418 }
1262                                                  419 
1263 ////////////// /vis/viewer/interpolate ////// << 
1264                                               << 
1265 G4VisCommandViewerInterpolate::G4VisCommandVi << 
1266   G4bool omitable;                            << 
1267   fpCommand = new G4UIcommand ("/vis/viewer/i << 
1268   fpCommand -> SetGuidance                    << 
1269   ("Interpolate views defined by the first ar << 
1270    "Unix-shell-style pattern matching charact << 
1271    "- see \"man sh\" and look for \"Pattern M << 
1272    "of each file are assumed to be \"/vis/vie << 
1273    "that specify a particular view. The files << 
1274    "order of filename. The files may be writt << 
1275    "\"/vis/viewer/save\" command.");          << 
1276   fpCommand -> SetGuidance                    << 
1277   ("The default is to search the working dire << 
1278    "extension. Another procedure is to assemb << 
1279    "e.g., \"myviews\"; then they can be inter << 
1280    "\"/vis/viewer/interpolate myviews\".");   << 
1281   fpCommand -> SetGuidance                    << 
1282   ("To export interpolated views to file for  << 
1283    "write \"export\" as 5th parameter (OpenGL << 
1284   G4UIparameter* parameter;                   << 
1285   parameter = new G4UIparameter("pattern", 's << 
1286   parameter -> SetGuidance("Pattern that defi << 
1287   parameter -> SetDefaultValue("*.g4view");   << 
1288   fpCommand -> SetParameter(parameter);       << 
1289   parameter = new G4UIparameter("no-of-points << 
1290   parameter -> SetGuidance ("Number of interp << 
1291   parameter -> SetDefaultValue(50);           << 
1292   fpCommand -> SetParameter(parameter);       << 
1293   parameter = new G4UIparameter("wait-time",  << 
1294   parameter -> SetGuidance("Wait time per int << 
1295   parameter -> SetDefaultValue("20.");        << 
1296   fpCommand -> SetParameter(parameter);       << 
1297   parameter = new G4UIparameter("time-unit",  << 
1298   parameter -> SetDefaultValue("millisecond") << 
1299   fpCommand -> SetParameter (parameter);      << 
1300   parameter = new G4UIparameter("export", 's' << 
1301   parameter -> SetDefaultValue("no");         << 
1302   fpCommand -> SetParameter (parameter);      << 
1303 }                                             << 
1304                                               << 
1305 G4VisCommandViewerInterpolate::~G4VisCommandV << 
1306   delete fpCommand;                           << 
1307 }                                             << 
1308                                               << 
1309 G4String G4VisCommandViewerInterpolate::GetCu << 
1310   return "";                                  << 
1311 }                                             << 
1312                                               << 
1313 void G4VisCommandViewerInterpolate::SetNewVal << 
1314                                               << 
1315   G4VisManager::Verbosity verbosity = fpVisMa << 
1316                                               << 
1317   G4VViewer* currentViewer = fpVisManager->Ge << 
1318   if (!currentViewer) {                       << 
1319     if (verbosity >= G4VisManager::errors) {  << 
1320       G4warn <<                               << 
1321       "ERROR: G4VisCommandViewerInterpolate:: << 
1322        << G4endl;                             << 
1323     }                                         << 
1324     return;                                   << 
1325   }                                           << 
1326                                               << 
1327   G4String pattern;                           << 
1328   G4int nInterpolationPoints;                 << 
1329   G4String waitTimePerPointString;            << 
1330   G4String timeUnit;                          << 
1331   G4String exportString;                      << 
1332                                               << 
1333   std::istringstream iss (newValue);          << 
1334   iss                                         << 
1335   >> pattern                                  << 
1336   >> nInterpolationPoints                     << 
1337   >> waitTimePerPointString                   << 
1338   >> timeUnit                                 << 
1339   >> exportString;                            << 
1340   G4String waitTimePerPointDimString(waitTime << 
1341   const G4double waitTimePerPoint =           << 
1342   G4UIcommand::ConvertToDimensionedDouble(wai << 
1343   G4int waitTimePerPointmilliseconds = waitTi << 
1344   if (waitTimePerPointmilliseconds < 0) waitT << 
1345                                               << 
1346   G4UImanager* uiManager = G4UImanager::GetUI << 
1347                                               << 
1348   // Save current view parameters             << 
1349   G4ViewParameters saveVP = currentViewer->Ge << 
1350                                               << 
1351   // Save current verbosities                 << 
1352   G4VisManager::Verbosity keepVisVerbosity =  << 
1353   G4int keepUIVerbosity = uiManager->GetVerbo << 
1354                                               << 
1355   // Set verbosities for this operation       << 
1356   fpVisManager->SetVerboseLevel(G4VisManager: << 
1357   uiManager->SetVerboseLevel(0);              << 
1358                                               << 
1359   // Switch off auto-refresh while we read in << 
1360   // restored later).  Note: the view files d << 
1361   G4ViewParameters non_auto = saveVP;         << 
1362   non_auto.SetAutoRefresh(false);             << 
1363   currentViewer->SetViewParameters(non_auto); << 
1364                                               << 
1365   const G4int safety = 99;                    << 
1366   G4int safetyCount = 0;                      << 
1367   G4fs::path pathPattern = pattern.c_str();   << 
1368                                               << 
1369   // Parent path - add "./" for empty directo << 
1370   G4String parentPathString                   << 
1371   (pathPattern.parent_path().string().length( << 
1372    pathPattern.parent_path().string() :       << 
1373    std::string("./"));                        << 
1374   G4fs::path parentPath = parentPathString.c_ << 
1375                                               << 
1376   // Fill selected paths                      << 
1377   std::set<G4fs::path> paths;  // Use std::se << 
1378                                               << 
1379   if (G4fs::is_directory(pathPattern)) {      << 
1380                                               << 
1381     // The user has specified a directory. Fi << 
1382     for (const auto& path: G4fs::directory_it << 
1383       if (safetyCount++ >= safety) break;     << 
1384       paths.insert(path);                     << 
1385     }                                         << 
1386                                               << 
1387   } else {                                    << 
1388                                               << 
1389     // Assume user has specified a Unix "glob << 
1390     // Default pattern is *.g4view, which tra << 
1391     // Convert pattern into a regexp          << 
1392     G4String regexp_pattern("^");             << 
1393     for (G4int i = 0; i < (G4int)pattern.leng << 
1394       if (pattern[i] == '.') {                << 
1395   regexp_pattern += "\\.";                    << 
1396       } else if (pattern[i] == '*') {         << 
1397   regexp_pattern += ".*";                     << 
1398       } else if (pattern[i] == '?') {         << 
1399   regexp_pattern += "(.{1,1})";               << 
1400       } else {                                << 
1401   regexp_pattern += pattern[i];               << 
1402       }                                       << 
1403     }                                         << 
1404     std::regex regexp(regexp_pattern, std::re << 
1405                                               << 
1406     for (const auto& path: G4fs::directory_it << 
1407       const auto& pathname = path.path().rela << 
1408       if (std::regex_match(pathname, regexp)) << 
1409   if (safetyCount++ >= safety) break;         << 
1410   paths.insert(path);                         << 
1411       }                                       << 
1412     }                                         << 
1413   }                                           << 
1414                                               << 
1415   if (safetyCount > safety) {                 << 
1416     if (verbosity >= G4VisManager::errors) {  << 
1417       G4warn <<                               << 
1418       "/vis/viewer/interpolate:"              << 
1419       "\n  the number of way points has been  << 
1420       << safety << G4endl;                    << 
1421     }                                         << 
1422   }                                           << 
1423                                               << 
1424   // Fill view vector of way points           << 
1425   std::vector<G4ViewParameters> viewVector;   << 
1426   for (const auto& path: paths) {             << 
1427     uiManager->ApplyCommand("/control/execute << 
1428     G4ViewParameters vp = currentViewer->GetV << 
1429     // Set original auto-refresh status.      << 
1430     vp.SetAutoRefresh(saveVP.IsAutoRefresh()) << 
1431     viewVector.push_back(vp);                 << 
1432   }                                           << 
1433                                               << 
1434   InterpolateViews                            << 
1435   (currentViewer,viewVector,                  << 
1436    nInterpolationPoints,waitTimePerPointmilli << 
1437                                               << 
1438   // Restore original verbosities             << 
1439   uiManager->SetVerboseLevel(keepUIVerbosity) << 
1440   fpVisManager->SetVerboseLevel(keepVisVerbos << 
1441                                               << 
1442   // Restore original view parameters         << 
1443   currentViewer->SetViewParameters(saveVP);   << 
1444   currentViewer->RefreshView();               << 
1445   if (verbosity >= G4VisManager::confirmation << 
1446     G4cout << "Viewer \"" << currentViewer -> << 
1447     << " restored." << G4endl;                << 
1448   }                                           << 
1449 }                                             << 
1450                                               << 
1451 ////////////// /vis/viewer/list /////////////    420 ////////////// /vis/viewer/list ///////////////////////////////////////
1452                                                  421 
1453 G4VisCommandViewerList::G4VisCommandViewerLis    422 G4VisCommandViewerList::G4VisCommandViewerList () {
1454   G4bool omitable;                               423   G4bool omitable;
1455   fpCommand = new G4UIcommand ("/vis/viewer/l    424   fpCommand = new G4UIcommand ("/vis/viewer/list", this);
1456   fpCommand -> SetGuidance ("Lists viewers(s)    425   fpCommand -> SetGuidance ("Lists viewers(s).");
1457   fpCommand -> SetGuidance                       426   fpCommand -> SetGuidance
1458     ("See \"/vis/verbose\" for definition of     427     ("See \"/vis/verbose\" for definition of verbosity.");
1459   G4UIparameter* parameter;                      428   G4UIparameter* parameter;
1460   parameter = new G4UIparameter("viewer-name"    429   parameter = new G4UIparameter("viewer-name", 's',
1461         omitable = true);                        430         omitable = true);
1462   parameter -> SetDefaultValue ("all");          431   parameter -> SetDefaultValue ("all");
1463   fpCommand -> SetParameter (parameter);         432   fpCommand -> SetParameter (parameter);
1464   parameter = new G4UIparameter ("verbosity",    433   parameter = new G4UIparameter ("verbosity", 's',
1465          omitable = true);                       434          omitable = true);
1466   parameter -> SetDefaultValue ("warnings");  << 435   parameter -> SetDefaultValue (0);
1467   fpCommand -> SetParameter (parameter);         436   fpCommand -> SetParameter (parameter);
1468 }                                                437 }
1469                                                  438 
1470 G4VisCommandViewerList::~G4VisCommandViewerLi    439 G4VisCommandViewerList::~G4VisCommandViewerList () {
1471   delete fpCommand;                              440   delete fpCommand;
1472 }                                                441 }
1473                                                  442 
1474 G4String G4VisCommandViewerList::GetCurrentVa    443 G4String G4VisCommandViewerList::GetCurrentValue (G4UIcommand*) {
1475   return "";                                     444   return "";
1476 }                                                445 }
1477                                                  446 
1478 void G4VisCommandViewerList::SetNewValue (G4U    447 void G4VisCommandViewerList::SetNewValue (G4UIcommand*, G4String newValue) {
1479   G4String name, verbosityString;                448   G4String name, verbosityString;
1480   std::istringstream is (newValue);           << 449   std::istrstream is (newValue);
1481   is >> name >> verbosityString;                 450   is >> name >> verbosityString;
1482   G4String shortName = fpVisManager -> Viewer    451   G4String shortName = fpVisManager -> ViewerShortName (name);
1483   G4VisManager::Verbosity verbosity =            452   G4VisManager::Verbosity verbosity =
1484     fpVisManager->GetVerbosityValue(verbosity    453     fpVisManager->GetVerbosityValue(verbosityString);
1485                                                  454 
1486   const G4VViewer* currentViewer = fpVisManag    455   const G4VViewer* currentViewer = fpVisManager -> GetCurrentViewer ();
1487   G4String currentViewerShortName;               456   G4String currentViewerShortName;
1488   if (currentViewer) {                           457   if (currentViewer) {
1489     currentViewerShortName = currentViewer ->    458     currentViewerShortName = currentViewer -> GetShortName ();
1490   }                                              459   }
1491   else {                                         460   else {
1492     currentViewerShortName = "none";             461     currentViewerShortName = "none";
1493   }                                              462   }
1494                                                  463 
1495   const G4SceneHandlerList& sceneHandlerList  << 464   const G4SceneHandlerList& sceneHandlerList = fpVisManager -> GetAvailableSceneHandlers ();
1496     fpVisManager -> GetAvailableSceneHandlers << 465   G4int nHandlers = sceneHandlerList.size ();
1497   std::size_t nHandlers = sceneHandlerList.si << 
1498   G4bool found = false;                          466   G4bool found = false;
1499   G4bool foundCurrent = false;                   467   G4bool foundCurrent = false;
1500   for (std::size_t iHandler = 0; iHandler < n << 468   for (int iHandler = 0; iHandler < nHandlers; iHandler++) {
1501     G4VSceneHandler* sceneHandler = sceneHand    469     G4VSceneHandler* sceneHandler = sceneHandlerList [iHandler];
1502     const G4ViewerList& viewerList = sceneHan    470     const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
1503     G4cout                                    << 471     G4cout << "Scene handler \"" << sceneHandler -> GetName ();
1504     << "Scene handler \"" << sceneHandler ->  << 
1505     << sceneHandler->GetGraphicsSystem()->Get << 
1506     const G4Scene* pScene = sceneHandler -> G    472     const G4Scene* pScene = sceneHandler -> GetScene ();
1507     if (pScene) {                                473     if (pScene) {
1508       G4cout << ", scene \"" << pScene -> Get << 474       G4cout << "\", scene \"" << pScene -> GetName () << "\":";
1509     }                                            475     }
1510     G4cout << ':';                            << 476     G4int nViewers = viewerList.size ();
1511     std::size_t nViewers = viewerList.size () << 
1512     if (nViewers == 0) {                         477     if (nViewers == 0) {
1513       G4cout << "\n            No viewers for    478       G4cout << "\n            No viewers for this scene handler." << G4endl;
1514     }                                            479     }
1515     else {                                       480     else {
1516       for (std::size_t iViewer = 0; iViewer < << 481       for (int iViewer = 0; iViewer < nViewers; iViewer++) {
1517   const G4VViewer* thisViewer = viewerList [i    482   const G4VViewer* thisViewer = viewerList [iViewer];
1518   G4String thisName = thisViewer -> GetName (    483   G4String thisName = thisViewer -> GetName ();
1519   G4String thisShortName = thisViewer -> GetS    484   G4String thisShortName = thisViewer -> GetShortName ();
1520   if (name != "all") {                           485   if (name != "all") {
1521     if (thisShortName != shortName) continue;    486     if (thisShortName != shortName) continue;
1522   }                                              487   }
1523   found = true;                                  488   found = true;
1524   G4cout << "\n  ";                              489   G4cout << "\n  ";
1525   if (thisShortName == currentViewerShortName    490   if (thisShortName == currentViewerShortName) {
1526     foundCurrent = true;                         491     foundCurrent = true;
1527     G4cout << "(current)";                       492     G4cout << "(current)";
1528   }                                              493   }
1529   else {                                         494   else {
1530     G4cout << "         ";                       495     G4cout << "         ";
1531   }                                              496   }
1532   G4cout << " viewer \"" << thisName << "\"";    497   G4cout << " viewer \"" << thisName << "\"";
1533   if (verbosity >= G4VisManager::parameters)     498   if (verbosity >= G4VisManager::parameters) {
1534     G4cout << "\n  " << *thisViewer;             499     G4cout << "\n  " << *thisViewer;
1535   }                                              500   }
1536       }                                          501       }
1537     }                                            502     }
1538     G4cout << G4endl;                            503     G4cout << G4endl;
1539   }                                              504   }
1540                                                  505 
1541   if (!foundCurrent) {                           506   if (!foundCurrent) {
1542     G4cout << "No valid current viewer - plea    507     G4cout << "No valid current viewer - please create or select one."
1543      << G4endl;                                  508      << G4endl;
1544   }                                              509   }
1545                                                  510 
1546   if (!found) {                                  511   if (!found) {
1547     G4cout << "No viewers";                      512     G4cout << "No viewers";
1548     if (name != "all") {                         513     if (name != "all") {
1549       G4cout << " of name \"" << name << "\""    514       G4cout << " of name \"" << name << "\"";
1550     }                                            515     }
1551     G4cout << " found." << G4endl;               516     G4cout << " found." << G4endl;
1552   }                                              517   }
1553 }                                                518 }
1554                                                  519 
1555 ////////////// /vis/viewer/pan and panTo ////    520 ////////////// /vis/viewer/pan and panTo ////////////////////////////
1556                                                  521 
1557 G4VisCommandViewerPan::G4VisCommandViewerPan     522 G4VisCommandViewerPan::G4VisCommandViewerPan ():
1558   fPanIncrementRight  (0.),                      523   fPanIncrementRight  (0.),
1559   fPanIncrementUp  (0.),                         524   fPanIncrementUp  (0.),
1560   fPanToRight (0.),                              525   fPanToRight (0.),
1561   fPanToUp (0.)                                  526   fPanToUp (0.)
1562 {                                                527 {
1563   G4bool omitable;                               528   G4bool omitable;
1564                                                  529 
1565   fpCommandPan = new G4UIcommand                 530   fpCommandPan = new G4UIcommand
1566     ("/vis/viewer/pan", this);                   531     ("/vis/viewer/pan", this);
1567   fpCommandPan -> SetGuidance                    532   fpCommandPan -> SetGuidance
1568     ("Incremental pan.");                        533     ("Incremental pan.");
1569   fpCommandPan -> SetGuidance                    534   fpCommandPan -> SetGuidance
1570     ("Moves the camera incrementally right an    535     ("Moves the camera incrementally right and up by these amounts (as seen"
1571      "\nfrom viewpoint direction).");            536      "\nfrom viewpoint direction).");
1572   G4UIparameter* parameter;                      537   G4UIparameter* parameter;
1573   parameter = new G4UIparameter("right-increm    538   parameter = new G4UIparameter("right-increment", 'd', omitable = true);
1574   parameter -> SetCurrentAsDefault (true);       539   parameter -> SetCurrentAsDefault (true);
1575   fpCommandPan -> SetParameter (parameter);      540   fpCommandPan -> SetParameter (parameter);
1576   parameter = new G4UIparameter("up-increment    541   parameter = new G4UIparameter("up-increment", 'd', omitable = true);
1577   parameter -> SetCurrentAsDefault (true);       542   parameter -> SetCurrentAsDefault (true);
1578   fpCommandPan -> SetParameter (parameter);      543   fpCommandPan -> SetParameter (parameter);
1579   parameter = new G4UIparameter ("unit", 's',    544   parameter = new G4UIparameter ("unit", 's', omitable = true);
1580   parameter -> SetDefaultValue ("m");            545   parameter -> SetDefaultValue ("m");
1581   fpCommandPan -> SetParameter (parameter);      546   fpCommandPan -> SetParameter (parameter);
1582                                                  547 
1583   fpCommandPanTo = new G4UIcommand               548   fpCommandPanTo = new G4UIcommand
1584     ("/vis/viewer/panTo", this);                 549     ("/vis/viewer/panTo", this);
1585   fpCommandPanTo -> SetGuidance                  550   fpCommandPanTo -> SetGuidance
1586     ("Pan to specific coordinate.");             551     ("Pan to specific coordinate.");
1587   fpCommandPanTo -> SetGuidance                  552   fpCommandPanTo -> SetGuidance
1588     ("Places the camera in this position righ    553     ("Places the camera in this position right and up relative to standard"
1589      "\ntarget point (as seen from viewpoint     554      "\ntarget point (as seen from viewpoint direction).");
1590   parameter = new G4UIparameter("right", 'd',    555   parameter = new G4UIparameter("right", 'd', omitable = true);
1591   parameter -> SetCurrentAsDefault (true);       556   parameter -> SetCurrentAsDefault (true);
1592   fpCommandPanTo -> SetParameter (parameter);    557   fpCommandPanTo -> SetParameter (parameter);
1593   parameter = new G4UIparameter("up", 'd', om    558   parameter = new G4UIparameter("up", 'd', omitable = true);
1594   parameter -> SetCurrentAsDefault (true);       559   parameter -> SetCurrentAsDefault (true);
1595   fpCommandPanTo -> SetParameter (parameter);    560   fpCommandPanTo -> SetParameter (parameter);
1596   parameter = new G4UIparameter ("unit", 's',    561   parameter = new G4UIparameter ("unit", 's', omitable = true);
1597   parameter -> SetDefaultValue ("m");            562   parameter -> SetDefaultValue ("m");
1598   fpCommandPanTo -> SetParameter (parameter);    563   fpCommandPanTo -> SetParameter (parameter);
1599 }                                                564 }
1600                                                  565 
1601 G4VisCommandViewerPan::~G4VisCommandViewerPan    566 G4VisCommandViewerPan::~G4VisCommandViewerPan () {
1602   delete fpCommandPan;                           567   delete fpCommandPan;
1603   delete fpCommandPanTo;                         568   delete fpCommandPanTo;
1604 }                                                569 }
1605                                                  570 
1606 G4String G4VisCommandViewerPan::GetCurrentVal    571 G4String G4VisCommandViewerPan::GetCurrentValue (G4UIcommand* command) {
1607   G4String currentValue;                         572   G4String currentValue;
1608   if (command == fpCommandPan) {                 573   if (command == fpCommandPan) {
1609     currentValue = ConvertToString(fPanIncrem    574     currentValue = ConvertToString(fPanIncrementRight, fPanIncrementUp, "m");
1610   }                                              575   }
1611   else if (command == fpCommandPanTo) {          576   else if (command == fpCommandPanTo) {
1612     currentValue = ConvertToString(fPanToRigh    577     currentValue = ConvertToString(fPanToRight, fPanToUp, "m");
1613   }                                              578   }
1614   return currentValue;                           579   return currentValue;
1615 }                                                580 }
1616                                                  581 
1617 void G4VisCommandViewerPan::SetNewValue (G4UI    582 void G4VisCommandViewerPan::SetNewValue (G4UIcommand* command,
1618            G4String newValue) {                  583            G4String newValue) {
1619                                                  584 
1620                                                  585 
1621   G4VisManager::Verbosity verbosity = fpVisMa    586   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1622                                                  587 
1623   G4VViewer* currentViewer = fpVisManager->Ge    588   G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
1624   if (!currentViewer) {                          589   if (!currentViewer) {
1625     if (verbosity >= G4VisManager::errors) {     590     if (verbosity >= G4VisManager::errors) {
1626       G4warn <<                               << 591       G4cout <<
1627   "ERROR: G4VisCommandsViewerPan::SetNewValue    592   "ERROR: G4VisCommandsViewerPan::SetNewValue: no current viewer."
1628        << G4endl;                                593        << G4endl;
1629     }                                            594     }
1630     return;                                      595     return;
1631   }                                              596   }
1632                                                  597 
1633   G4ViewParameters vp = currentViewer->GetVie    598   G4ViewParameters vp = currentViewer->GetViewParameters();
1634                                                  599 
1635   if (command == fpCommandPan) {                 600   if (command == fpCommandPan) {
1636     ConvertToDoublePair(newValue, fPanIncreme    601     ConvertToDoublePair(newValue, fPanIncrementRight, fPanIncrementUp);
1637     vp.IncrementPan(fPanIncrementRight, fPanI    602     vp.IncrementPan(fPanIncrementRight, fPanIncrementUp);
1638   }                                              603   }
1639   else if (command == fpCommandPanTo) {          604   else if (command == fpCommandPanTo) {
1640     ConvertToDoublePair(newValue, fPanToRight    605     ConvertToDoublePair(newValue, fPanToRight, fPanToUp);
1641     vp.SetPan(fPanToRight, fPanToUp);            606     vp.SetPan(fPanToRight, fPanToUp);
1642   }                                              607   }
1643                                                  608 
1644   if (verbosity >= G4VisManager::confirmation    609   if (verbosity >= G4VisManager::confirmations) {
1645     G4cout << "Current target point now " <<     610     G4cout << "Current target point now " << vp.GetCurrentTargetPoint()
1646      << G4endl;                                  611      << G4endl;
1647   }                                              612   }
1648                                                  613 
1649   SetViewParameters(currentViewer, vp);          614   SetViewParameters(currentViewer, vp);
1650 }                                                615 }
1651                                                  616 
1652 ////////////// /vis/viewer/rebuild ////////// << 
1653                                               << 
1654 G4VisCommandViewerRebuild::G4VisCommandViewer << 
1655   G4bool omitable, currentAsDefault;          << 
1656   fpCommand = new G4UIcmdWithAString ("/vis/v << 
1657   fpCommand -> SetGuidance ("Forces rebuild o << 
1658   fpCommand -> SetGuidance                    << 
1659     ("By default, acts on current viewer.  \" << 
1660      "\nto see possible viewers.  Viewer beco << 
1661   fpCommand -> SetParameterName ("viewer-name << 
1662          omitable = true,                     << 
1663          currentAsDefault = true);            << 
1664 }                                             << 
1665                                               << 
1666 G4VisCommandViewerRebuild::~G4VisCommandViewe << 
1667   delete fpCommand;                           << 
1668 }                                             << 
1669                                               << 
1670 G4String G4VisCommandViewerRebuild::GetCurren << 
1671   G4VViewer* viewer = fpVisManager -> GetCurr << 
1672   if (viewer) {                               << 
1673     return viewer -> GetName ();              << 
1674   }                                           << 
1675   else {                                      << 
1676     return "none";                            << 
1677   }                                           << 
1678 }                                             << 
1679                                               << 
1680 void G4VisCommandViewerRebuild::SetNewValue ( << 
1681                                               << 
1682   G4VisManager::Verbosity verbosity = fpVisMa << 
1683                                               << 
1684   G4String& rebuildName = newValue;           << 
1685                                               << 
1686   G4VViewer* viewer = fpVisManager -> GetView << 
1687   if (!viewer) {                              << 
1688     if (verbosity >= G4VisManager::errors) {  << 
1689       G4warn << "ERROR: Viewer \"" << rebuild << 
1690        << "\" not found - \"/vis/viewer/list\ << 
1691        << G4endl;                             << 
1692     }                                         << 
1693     return;                                   << 
1694   }                                           << 
1695                                               << 
1696   G4VSceneHandler* sceneHandler = viewer->Get << 
1697   if (!sceneHandler) {                        << 
1698     if (verbosity >= G4VisManager::errors) {  << 
1699       G4warn << "ERROR: Viewer \"" << viewer- << 
1700   " has no scene handler - report serious bug << 
1701        << G4endl;                             << 
1702     }                                         << 
1703     return;                                   << 
1704   }                                           << 
1705                                               << 
1706   sceneHandler->ClearTransientStore();        << 
1707   viewer->NeedKernelVisit();                  << 
1708   viewer->SetView();                          << 
1709   viewer->ClearView();                        << 
1710   viewer->DrawView();                         << 
1711                                               << 
1712   // Check auto-refresh and print confirmatio << 
1713   RefreshIfRequired(viewer);                  << 
1714 }                                             << 
1715                                               << 
1716 ////////////// /vis/viewer/refresh //////////    617 ////////////// /vis/viewer/refresh ///////////////////////////////////////
1717                                                  618 
1718 G4VisCommandViewerRefresh::G4VisCommandViewer    619 G4VisCommandViewerRefresh::G4VisCommandViewerRefresh () {
1719   G4bool omitable, currentAsDefault;             620   G4bool omitable, currentAsDefault;
1720   fpCommand = new G4UIcmdWithAString ("/vis/v    621   fpCommand = new G4UIcmdWithAString ("/vis/viewer/refresh", this);
1721   fpCommand -> SetGuidance                       622   fpCommand -> SetGuidance
1722     ("Refreshes viewer.");                       623     ("Refreshes viewer.");
1723   fpCommand -> SetGuidance                       624   fpCommand -> SetGuidance 
1724     ("By default, acts on current viewer.  \"    625     ("By default, acts on current viewer.  \"/vis/viewer/list\""
1725      "\nto see possible viewers.  Viewer beco    626      "\nto see possible viewers.  Viewer becomes current.");
1726   fpCommand -> SetParameterName ("viewer-name    627   fpCommand -> SetParameterName ("viewer-name",
1727          omitable = true,                        628          omitable = true,
1728          currentAsDefault = true);               629          currentAsDefault = true);
1729 }                                                630 }
1730                                                  631 
1731 G4VisCommandViewerRefresh::~G4VisCommandViewe    632 G4VisCommandViewerRefresh::~G4VisCommandViewerRefresh () {
1732   delete fpCommand;                              633   delete fpCommand;
1733 }                                                634 }
1734                                                  635 
1735 G4String G4VisCommandViewerRefresh::GetCurren    636 G4String G4VisCommandViewerRefresh::GetCurrentValue (G4UIcommand*) {
1736   G4VViewer* viewer = fpVisManager -> GetCurr    637   G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1737   return viewer ? viewer -> GetName () : G4St    638   return viewer ? viewer -> GetName () : G4String("none");
1738 }                                                639 }
1739                                                  640 
1740 void G4VisCommandViewerRefresh::SetNewValue (    641 void G4VisCommandViewerRefresh::SetNewValue (G4UIcommand*, G4String newValue) {
1741                                                  642 
1742   G4VisManager::Verbosity verbosity = fpVisMa    643   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1743   G4bool warn(verbosity >= G4VisManager::warn    644   G4bool warn(verbosity >= G4VisManager::warnings);
1744                                                  645 
1745   G4String& refreshName = newValue;              646   G4String& refreshName = newValue;
1746   G4VViewer* viewer = fpVisManager -> GetView    647   G4VViewer* viewer = fpVisManager -> GetViewer (refreshName);
1747   if (!viewer) {                                 648   if (!viewer) {
1748     if (verbosity >= G4VisManager::errors) {     649     if (verbosity >= G4VisManager::errors) {
1749       G4warn << "ERROR: Viewer \"" << refresh << 650       G4cout << "ERROR: Viewer \"" << refreshName << "\"" <<
1750   " not found - \"/vis/viewer/list\"\n  to se    651   " not found - \"/vis/viewer/list\"\n  to see possibilities."
1751        << G4endl;                                652        << G4endl;
1752     }                                            653     }
1753     return;                                      654     return;
1754   }                                              655   }
1755                                                  656 
1756   G4VSceneHandler* sceneHandler = viewer->Get    657   G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
1757   if (!sceneHandler) {                           658   if (!sceneHandler) {
1758     if (verbosity >= G4VisManager::errors) {     659     if (verbosity >= G4VisManager::errors) {
1759       G4warn << "ERROR: Viewer \"" << refresh << 660       G4cout << "ERROR: Viewer \"" << refreshName << "\"" <<
1760   " has no scene handler - report serious bug    661   " has no scene handler - report serious bug."
1761        << G4endl;                                662        << G4endl;
1762     }                                            663     }
1763     return;                                      664     return;
1764   }                                              665   }
1765                                                  666 
1766   G4Scene* scene = sceneHandler->GetScene();     667   G4Scene* scene = sceneHandler->GetScene();
1767   if (!scene) {                                  668   if (!scene) {
1768     if (verbosity >= G4VisManager::confirmati << 669     if (verbosity >= G4VisManager::warnings) {
1769       G4cout << "NOTE: SceneHandler \"" << sc << 670       G4cout << "WARNING: SceneHandler \"" << sceneHandler->GetName()
1770        << "\", to which viewer \"" << refresh    671        << "\", to which viewer \"" << refreshName << "\"" <<
1771   "\n  is attached, has no scene - \"/vis/sce    672   "\n  is attached, has no scene - \"/vis/scene/create\" and"
1772   " \"/vis/sceneHandler/attach\""             << 673   "\"/vis/sceneHandler/attach\""
1773   "\n  (or use compound command \"/vis/drawVo    674   "\n  (or use compound command \"/vis/drawVolume\")."
1774        << G4endl;                                675        << G4endl;
1775     }                                            676     }
1776     return;                                      677     return;
1777   }                                              678   }
1778   if (scene->GetRunDurationModelList().empty( << 679   G4bool successful = scene -> AddWorldIfEmpty (warn);
1779     G4bool successful = scene -> AddWorldIfEm << 680   if (!successful) {
1780     if (!successful) {                        << 681     if (verbosity >= G4VisManager::warnings) {
1781       if (verbosity >= G4VisManager::warnings << 682       G4cout <<
1782   G4warn <<                                   << 683   "WARNING: Scene is empty.  Perhaps no geometry exists."
1783     "WARNING: Scene is empty.  Perhaps no geo << 684   "\n  Try /run/initialize."
1784     "\n  Try /run/initialize."                << 685        << G4endl;
1785          << G4endl;                           << 686    }
1786       }                                       << 687     return;
1787       return;                                 << 688   }
1788     }                                         << 689 
1789     // Scene has changed.  CheckSceneAndNotif << 690   if (verbosity >= G4VisManager::confirmations) {
1790     // /vis/scene/notifyHandlers, which does  << 691     G4cout << "Refreshing viewer \"" << viewer -> GetName () << "\"..."
1791     // ordinary refresh becomes part of the e << 692      << G4endl;
1792     CheckSceneAndNotifyHandlers(scene);       << 693   }
1793   } else {                                    << 694   //??viewer -> SetView ();
1794     if (verbosity >= G4VisManager::confirmati << 695   //??viewer -> ClearView ();
1795       G4cout << "Refreshing viewer \"" << vie << 696   viewer -> DrawView ();
1796        << G4endl;                             << 697   if (verbosity >= G4VisManager::confirmations) {
1797     }                                         << 698     G4cout << "Viewer \"" << viewer -> GetName () << "\"" << " refreshed."
1798     viewer -> SetView ();                     << 699       "\n  (You might also need \"/vis/viewer/update\".)" << G4endl;
1799     viewer -> ClearView ();                   << 
1800     viewer -> DrawView ();                    << 
1801     if (verbosity >= G4VisManager::confirmati << 
1802       G4cout << "Viewer \"" << viewer -> GetN << 
1803   "\n  (You might also need \"/vis/viewer/upd << 
1804     }                                         << 
1805   }                                              700   }
1806 }                                                701 }
1807                                                  702 
1808 ////////////// /vis/viewer/reset ////////////    703 ////////////// /vis/viewer/reset ///////////////////////////////////////
1809                                                  704 
1810 G4VisCommandViewerReset::G4VisCommandViewerRe    705 G4VisCommandViewerReset::G4VisCommandViewerReset () {
1811   G4bool omitable, currentAsDefault;             706   G4bool omitable, currentAsDefault;
1812   fpCommand = new G4UIcmdWithAString ("/vis/v    707   fpCommand = new G4UIcmdWithAString ("/vis/viewer/reset", this);
1813   fpCommand -> SetGuidance ("Resets viewer.")    708   fpCommand -> SetGuidance ("Resets viewer.");
1814   fpCommand -> SetGuidance                       709   fpCommand -> SetGuidance 
1815     ("By default, acts on current viewer.  \"    710     ("By default, acts on current viewer.  \"/vis/viewer/list\""
1816      "\nto see possible viewers.  Viewer beco    711      "\nto see possible viewers.  Viewer becomes current.");
1817   fpCommand -> SetParameterName ("viewer-name    712   fpCommand -> SetParameterName ("viewer-name",
1818          omitable = true,                        713          omitable = true,
1819          currentAsDefault = true);               714          currentAsDefault = true);
1820 }                                                715 }
1821                                                  716 
1822 G4VisCommandViewerReset::~G4VisCommandViewerR    717 G4VisCommandViewerReset::~G4VisCommandViewerReset () {
1823   delete fpCommand;                              718   delete fpCommand;
1824 }                                                719 }
1825                                                  720 
1826 G4String G4VisCommandViewerReset::GetCurrentV    721 G4String G4VisCommandViewerReset::GetCurrentValue (G4UIcommand*) {
1827   G4VViewer* viewer = fpVisManager -> GetCurr    722   G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
1828   if (viewer) {                                  723   if (viewer) {
1829     return viewer -> GetName ();                 724     return viewer -> GetName ();
1830   }                                              725   }
1831   else {                                         726   else {
1832     return "none";                               727     return "none";
1833   }                                              728   }
1834 }                                                729 }
1835                                                  730 
1836 void G4VisCommandViewerReset::SetNewValue (G4    731 void G4VisCommandViewerReset::SetNewValue (G4UIcommand*, G4String newValue) {
1837                                                  732 
1838   G4VisManager::Verbosity verbosity = fpVisMa    733   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1839                                                  734 
1840   G4String& resetName = newValue;                735   G4String& resetName = newValue;
1841   G4VViewer* viewer = fpVisManager -> GetView    736   G4VViewer* viewer = fpVisManager -> GetViewer (resetName);
1842   if (!viewer) {                                 737   if (!viewer) {
1843     if (verbosity >= G4VisManager::errors) {     738     if (verbosity >= G4VisManager::errors) {
1844       G4warn << "ERROR: Viewer \"" << resetNa << 739       G4cout << "ERROR: Viewer \"" << resetName
1845        << "\" not found - \"/vis/viewer/list\    740        << "\" not found - \"/vis/viewer/list\" to see possibilities."
1846        << G4endl;                                741        << G4endl;
1847     }                                            742     }
1848     return;                                      743     return;
1849   }                                              744   }
1850                                                  745 
1851   viewer->ResetView();                        << 746   SetViewParameters(viewer, viewer->GetDefaultViewParameters());
1852   RefreshIfRequired(viewer);                  << 
1853 }                                             << 
1854                                               << 
1855 ////////////// /vis/viewer/resetCameraParamet << 
1856                                               << 
1857 G4VisCommandViewerResetCameraParameters::G4Vi << 
1858   G4bool omitable, currentAsDefault;          << 
1859   fpCommand = new G4UIcmdWithAString ("/vis/v << 
1860   fpCommand -> SetGuidance ("Resets only the  << 
1861   fpCommand -> SetGuidance                    << 
1862   ("By default, acts on current viewer.  \"/v << 
1863    "\nto see possible viewers.  Viewer become << 
1864   fpCommand -> SetParameterName ("viewer-name << 
1865                                  omitable = t << 
1866                                  currentAsDef << 
1867 }                                             << 
1868                                               << 
1869 G4VisCommandViewerResetCameraParameters::~G4V << 
1870   delete fpCommand;                           << 
1871 }                                             << 
1872                                               << 
1873 G4String G4VisCommandViewerResetCameraParamet << 
1874   G4VViewer* viewer = fpVisManager -> GetCurr << 
1875   if (viewer) {                               << 
1876     return viewer -> GetName ();              << 
1877   }                                           << 
1878   else {                                      << 
1879     return "none";                            << 
1880   }                                           << 
1881 }                                             << 
1882                                               << 
1883 void G4VisCommandViewerResetCameraParameters: << 
1884                                               << 
1885   G4VisManager::Verbosity verbosity = fpVisMa << 
1886                                               << 
1887   G4String& resetName = newValue;             << 
1888   G4VViewer* viewer = fpVisManager -> GetView << 
1889   if (!viewer) {                              << 
1890     if (verbosity >= G4VisManager::errors) {  << 
1891       G4warn << "ERROR: Viewer \"" << resetNa << 
1892       << "\" not found - \"/vis/viewer/list\" << 
1893       << G4endl;                              << 
1894     }                                         << 
1895     return;                                   << 
1896   }                                           << 
1897                                               << 
1898   G4ViewParameters newVP = viewer->GetViewPar << 
1899   CopyCameraParameters(newVP,viewer->GetDefau << 
1900   viewer->SetViewParameters(newVP);           << 
1901   RefreshIfRequired(viewer);                  << 
1902 }                                             << 
1903                                               << 
1904 ////////////// /vis/viewer/save ///////////// << 
1905                                               << 
1906 G4VisCommandViewerSave::G4VisCommandViewerSav << 
1907   G4bool omitable;                            << 
1908   fpCommand = new G4UIcmdWithAString ("/vis/v << 
1909   fpCommand -> SetGuidance                    << 
1910   ("Write commands that define the current vi << 
1911   fpCommand -> SetGuidance                    << 
1912   ("Read them back into the same or any viewe << 
1913   fpCommand -> SetGuidance                    << 
1914   ("If the filename is omitted the view is sa << 
1915    "\"g4_nn.g4view\", where nn is a sequentia << 
1916   fpCommand -> SetGuidance                    << 
1917   ("If the filename is \"-\", the data are wr << 
1918   fpCommand -> SetGuidance                    << 
1919   ("If you are wanting to save views for futu << 
1920    "procedure is: save views to \"g4_nn.g4vie << 
1921    "into a sub-directory, say, \"views\", the << 
1922    "\"/vis/viewer/interpolate views\"");      << 
1923   fpCommand -> SetParameterName ("filename",  << 
1924   fpCommand -> SetDefaultValue ("");          << 
1925 }                                             << 
1926                                               << 
1927 G4VisCommandViewerSave::~G4VisCommandViewerSa << 
1928   delete fpCommand;                           << 
1929 }                                             << 
1930                                               << 
1931 G4String G4VisCommandViewerSave::GetCurrentVa << 
1932 (G4UIcommand*) {                              << 
1933   return "";                                  << 
1934 }                                             << 
1935                                               << 
1936 namespace {                                   << 
1937   void WriteCommands                          << 
1938   (std::ostream& os,                          << 
1939    const G4ViewParameters& vp,                << 
1940    const G4Point3D& stp)  // Standard Target  << 
1941   {                                           << 
1942     os                                        << 
1943     << vp.CameraAndLightingCommands(stp)      << 
1944     << vp.DrawingStyleCommands()              << 
1945     << vp.SceneModifyingCommands()            << 
1946     << vp.TouchableCommands()                 << 
1947     << vp.TimeWindowCommands()                << 
1948     << std::endl;                             << 
1949   }                                           << 
1950 }                                             << 
1951                                               << 
1952 void G4VisCommandViewerSave::SetNewValue (G4U << 
1953                                               << 
1954   G4VisManager::Verbosity verbosity = fpVisMa << 
1955                                               << 
1956   const G4VViewer* currentViewer = fpVisManag << 
1957   if (!currentViewer) {                       << 
1958     if (verbosity >= G4VisManager::errors) {  << 
1959       G4warn <<                               << 
1960       "ERROR: G4VisCommandsViewerSave::SetNew << 
1961       << G4endl;                              << 
1962     }                                         << 
1963     return;                                   << 
1964   }                                           << 
1965                                               << 
1966   const G4Scene* currentScene = currentViewer << 
1967   if (!currentScene) {                        << 
1968     if (verbosity >= G4VisManager::errors) {  << 
1969       G4warn <<                               << 
1970       "ERROR: G4VisCommandsViewerSave::SetNew << 
1971       << G4endl;                              << 
1972     }                                         << 
1973     return;                                   << 
1974   }                                           << 
1975                                               << 
1976   // Get view parameters and ther relevant in << 
1977   G4ViewParameters vp = currentViewer->GetVie << 
1978   // Concatenate any private vis attributes m << 
1979   const std::vector<G4ModelingParameters::Vis << 
1980   privateVAMs = currentViewer->GetPrivateVisA << 
1981   if (privateVAMs) {                          << 
1982     std::vector<G4ModelingParameters::VisAttr << 
1983     for (i = privateVAMs->begin(); i != priva << 
1984       vp.AddVisAttributesModifier(*i);        << 
1985     }                                         << 
1986   }                                           << 
1987   const G4Point3D& stp = currentScene->GetSta << 
1988                                               << 
1989   G4String filename = newValue;               << 
1990                                               << 
1991   if (newValue.length() == 0) {               << 
1992     // Null filename - generate a filename    << 
1993     const G4int maxNoOfFiles = 100;           << 
1994     static G4int sequenceNumber = 0;          << 
1995     if (sequenceNumber >= maxNoOfFiles) {     << 
1996       if (verbosity >= G4VisManager::errors)  << 
1997         G4warn                                << 
1998         << "ERROR: G4VisCommandsViewerSave::S << 
1999         << maxNoOfFiles                       << 
2000         << ", of files exceeded."             << 
2001         << G4endl;                            << 
2002       }                                       << 
2003       return;                                 << 
2004     }                                         << 
2005     std::ostringstream oss;                   << 
2006     oss << std::setw(2) << std::setfill('0')  << 
2007     filename = "g4_" + oss.str() + ".g4view"; << 
2008   }                                           << 
2009                                               << 
2010   if (filename == "-") {                      << 
2011     // Write to standard output               << 
2012     WriteCommands(G4cout,vp,stp);             << 
2013   } else {                                    << 
2014     // Write to file - but add extension if n << 
2015     if (!G4StrUtil::contains(filename, '.'))  << 
2016       // No extension supplied - add .g4view  << 
2017       filename += ".g4view";                  << 
2018     }                                         << 
2019     std::ofstream ofs(filename);              << 
2020     if (!ofs) {                               << 
2021       if (verbosity >= G4VisManager::errors)  << 
2022         G4warn <<                             << 
2023         "ERROR: G4VisCommandsViewerSave::SetN << 
2024         << filename << "\"."                  << 
2025         << G4endl;                            << 
2026       }                                       << 
2027       ofs.close();                            << 
2028       return;                                 << 
2029     }                                         << 
2030     WriteCommands(ofs,vp,stp);                << 
2031     ofs.close();                              << 
2032   }                                           << 
2033                                               << 
2034   if (verbosity >= G4VisManager::warnings) {  << 
2035     G4warn << "Viewer \"" << currentViewer -> << 
2036     << "\"" << " saved to ";                  << 
2037     if (filename == "-") {                    << 
2038       G4warn << "G4cout.";                    << 
2039     } else {                                  << 
2040       G4warn << "file \'" << filename << "\". << 
2041       "\n  Read the view back into this or an << 
2042       "\n  \"/control/execute " << filename < << 
2043       "\n  \"/vis/viewer/interpolate\" if you << 
2044       "\n  see \"help /vis/viewer/interpolate << 
2045     }                                         << 
2046     G4warn << G4endl;                         << 
2047   }                                           << 
2048 }                                             << 
2049                                               << 
2050 ////////////// /vis/viewer/scale and scaleTo  << 
2051                                               << 
2052 G4VisCommandViewerScale::G4VisCommandViewerSc << 
2053   fScaleMultiplier (G4Vector3D (1., 1., 1.)), << 
2054   fScaleTo         (G4Vector3D (1., 1., 1.))  << 
2055 {                                             << 
2056   G4bool omitable, currentAsDefault;          << 
2057                                               << 
2058   fpCommandScale = new G4UIcmdWith3Vector     << 
2059     ("/vis/viewer/scale", this);              << 
2060   fpCommandScale -> SetGuidance ("Incremental << 
2061   fpCommandScale -> SetGuidance               << 
2062     ("Multiplies components of current scalin << 
2063      "\n Scales (x,y,z) by corresponding comp << 
2064   fpCommandScale -> SetGuidance               << 
2065     ("");                                     << 
2066   fpCommandScale -> SetParameterName          << 
2067     ("x-scale-multiplier","y-scale-multiplier << 
2068      omitable=true, currentAsDefault=true);   << 
2069                                               << 
2070   fpCommandScaleTo = new G4UIcmdWith3Vector   << 
2071     ("/vis/viewer/scaleTo", this);            << 
2072   fpCommandScaleTo -> SetGuidance ("Absolute  << 
2073   fpCommandScaleTo -> SetGuidance             << 
2074     ("Scales (x,y,z) by corresponding compone << 
2075   fpCommandScaleTo -> SetParameterName        << 
2076     ("x-scale-factor","y-scale-factor","z-sca << 
2077      omitable=true, currentAsDefault=true);   << 
2078 }                                             << 
2079                                               << 
2080 G4VisCommandViewerScale::~G4VisCommandViewerS << 
2081   delete fpCommandScale;                      << 
2082   delete fpCommandScaleTo;                    << 
2083 }                                             << 
2084                                               << 
2085 G4String G4VisCommandViewerScale::GetCurrentV << 
2086   G4String currentValue;                      << 
2087   if (command == fpCommandScale) {            << 
2088     currentValue = fpCommandScale->ConvertToS << 
2089   }                                           << 
2090   else if (command == fpCommandScaleTo) {     << 
2091     currentValue = fpCommandScaleTo->ConvertT << 
2092   }                                           << 
2093   return currentValue;                        << 
2094 }                                             << 
2095                                               << 
2096 void G4VisCommandViewerScale::SetNewValue (G4 << 
2097              G4String newValue) {             << 
2098                                               << 
2099                                               << 
2100   G4VisManager::Verbosity verbosity = fpVisMa << 
2101                                               << 
2102   G4VViewer* currentViewer = fpVisManager->Ge << 
2103   if (!currentViewer) {                       << 
2104     if (verbosity >= G4VisManager::errors) {  << 
2105       G4warn <<                               << 
2106   "ERROR: G4VisCommandsViewerScale::SetNewVal << 
2107        << G4endl;                             << 
2108     }                                         << 
2109     return;                                   << 
2110   }                                           << 
2111                                               << 
2112   G4ViewParameters vp = currentViewer->GetVie << 
2113                                               << 
2114   if (command == fpCommandScale) {            << 
2115     fScaleMultiplier = fpCommandScale->GetNew << 
2116     vp.MultiplyScaleFactor(fScaleMultiplier); << 
2117   }                                           << 
2118   else if (command == fpCommandScaleTo) {     << 
2119     fScaleTo = fpCommandScale->GetNew3VectorV << 
2120     vp.SetScaleFactor(fScaleTo);              << 
2121   }                                           << 
2122                                               << 
2123   if (verbosity >= G4VisManager::confirmation << 
2124     G4cout << "Scale factor changed to " << v << 
2125   }                                           << 
2126                                               << 
2127   SetViewParameters(currentViewer, vp);       << 
2128 }                                                747 }
2129                                                  748 
2130 ////////////// /vis/viewer/select ///////////    749 ////////////// /vis/viewer/select ///////////////////////////////////////
2131                                                  750 
2132 G4VisCommandViewerSelect::G4VisCommandViewerS    751 G4VisCommandViewerSelect::G4VisCommandViewerSelect () {
2133   G4bool omitable;                               752   G4bool omitable;
2134   fpCommand = new G4UIcmdWithAString ("/vis/v    753   fpCommand = new G4UIcmdWithAString ("/vis/viewer/select", this);
2135   fpCommand -> SetGuidance ("Selects viewer."    754   fpCommand -> SetGuidance ("Selects viewer.");
2136   fpCommand -> SetGuidance                       755   fpCommand -> SetGuidance
2137     ("Specify viewer by name.  \"/vis/viewer/    756     ("Specify viewer by name.  \"/vis/viewer/list\" to see possible viewers.");
2138   fpCommand -> SetParameterName ("viewer-name    757   fpCommand -> SetParameterName ("viewer-name", omitable = false);
2139 }                                                758 }
2140                                                  759 
2141 G4VisCommandViewerSelect::~G4VisCommandViewer    760 G4VisCommandViewerSelect::~G4VisCommandViewerSelect () {
2142   delete fpCommand;                              761   delete fpCommand;
2143 }                                                762 }
2144                                                  763 
2145 G4String G4VisCommandViewerSelect::GetCurrent    764 G4String G4VisCommandViewerSelect::GetCurrentValue (G4UIcommand*) {
2146   return "";                                     765   return "";
2147 }                                                766 }
2148                                                  767 
2149 void G4VisCommandViewerSelect::SetNewValue (G    768 void G4VisCommandViewerSelect::SetNewValue (G4UIcommand*, G4String newValue) {
2150                                                  769 
2151   G4VisManager::Verbosity verbosity = fpVisMa    770   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2152                                                  771 
2153   G4String& selectName = newValue;               772   G4String& selectName = newValue;
2154   G4VViewer* viewer = fpVisManager -> GetView    773   G4VViewer* viewer = fpVisManager -> GetViewer (selectName);
2155                                                  774 
2156   if (!viewer) {                                 775   if (!viewer) {
2157     if (verbosity >= G4VisManager::errors) {     776     if (verbosity >= G4VisManager::errors) {
2158       G4warn << "ERROR: Viewer \"" << selectN << 777       G4cout << "ERROR: Viewer \"" << selectName << "\"";
2159       G4warn << " not found - \"/vis/viewer/l << 778       G4cout << " not found - \"/vis/viewer/list\""
2160   "\n  to see possibilities."                    779   "\n  to see possibilities."
2161        << G4endl;                                780        << G4endl;
2162     }                                            781     }
2163     return;                                      782     return;
2164   }                                              783   }
2165                                                  784 
2166   if (viewer == fpVisManager -> GetCurrentVie    785   if (viewer == fpVisManager -> GetCurrentViewer ()) {
2167     if (verbosity >= G4VisManager::warnings)     786     if (verbosity >= G4VisManager::warnings) {
2168       G4warn << "WARNING: Viewer \"" << viewe << 787       G4cout << "WARNING: Viewer \"" << viewer -> GetName () << "\""
2169        << " already selected." << G4endl;        788        << " already selected." << G4endl;
2170     }                                            789     }
2171     return;                                      790     return;
2172   }                                              791   }
2173                                                  792 
2174   // Set pointers, call SetView and print con << 793   fpVisManager -> SetCurrentViewer (viewer);  // Prints confirmation.
2175   fpVisManager -> SetCurrentViewer (viewer);  << 
2176                                                  794 
2177   RefreshIfRequired(viewer);                  << 
2178                                               << 
2179   // Update GUI scene tree (make sure it's in << 
2180   viewer->UpdateGUISceneTree();               << 
2181 }                                                795 }
2182                                                  796 
2183 ////////////// /vis/viewer/update ///////////    797 ////////////// /vis/viewer/update ///////////////////////////////////////
2184                                                  798 
2185 G4VisCommandViewerUpdate::G4VisCommandViewerU    799 G4VisCommandViewerUpdate::G4VisCommandViewerUpdate () {
2186   G4bool omitable, currentAsDefault;             800   G4bool omitable, currentAsDefault;
2187   fpCommand = new G4UIcmdWithAString ("/vis/v    801   fpCommand = new G4UIcmdWithAString ("/vis/viewer/update", this);
2188   fpCommand -> SetGuidance                       802   fpCommand -> SetGuidance
2189     ("Triggers graphical database post-proces    803     ("Triggers graphical database post-processing for viewers"
2190      "\nusing that technique.");                 804      "\nusing that technique.");
2191   fpCommand -> SetGuidance                       805   fpCommand -> SetGuidance
2192     ("For such viewers the view only becomes     806     ("For such viewers the view only becomes visible with this command."
2193      "\nBy default, acts on current viewer.      807      "\nBy default, acts on current viewer.  \"/vis/viewer/list\""
2194      "\nto see possible viewers.  Viewer beco    808      "\nto see possible viewers.  Viewer becomes current.");
2195   fpCommand -> SetParameterName ("viewer-name    809   fpCommand -> SetParameterName ("viewer-name",
2196          omitable = true,                        810          omitable = true,
2197          currentAsDefault = true);               811          currentAsDefault = true);
2198 }                                                812 }
2199                                                  813 
2200 G4VisCommandViewerUpdate::~G4VisCommandViewer    814 G4VisCommandViewerUpdate::~G4VisCommandViewerUpdate () {
2201   delete fpCommand;                              815   delete fpCommand;
2202 }                                                816 }
2203                                                  817 
2204 G4String G4VisCommandViewerUpdate::GetCurrent    818 G4String G4VisCommandViewerUpdate::GetCurrentValue (G4UIcommand*) {
2205   G4VViewer* viewer = fpVisManager -> GetCurr    819   G4VViewer* viewer = fpVisManager -> GetCurrentViewer ();
2206   if (viewer) {                                  820   if (viewer) {
2207     return viewer -> GetName ();                 821     return viewer -> GetName ();
2208   }                                              822   }
2209   else {                                         823   else {
2210     return "none";                               824     return "none";
2211   }                                              825   }
2212 }                                                826 }
2213                                                  827 
2214 void G4VisCommandViewerUpdate::SetNewValue (G    828 void G4VisCommandViewerUpdate::SetNewValue (G4UIcommand*, G4String newValue) {
2215                                                  829 
2216   G4VisManager::Verbosity verbosity = fpVisMa    830   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2217                                                  831 
2218   G4String& updateName = newValue;               832   G4String& updateName = newValue;
2219                                               << 
2220   G4VViewer* viewer = fpVisManager -> GetView    833   G4VViewer* viewer = fpVisManager -> GetViewer (updateName);
2221   if (!viewer) {                              << 
2222     if (verbosity >= G4VisManager::errors) {  << 
2223       G4warn <<                               << 
2224   "WARNING: command \"/vis/viewer/update\" co << 
2225        << G4endl;                             << 
2226     }                                         << 
2227     return;                                   << 
2228   }                                           << 
2229                                                  834 
2230   G4VSceneHandler* sceneHandler = viewer->Get    835   G4VSceneHandler* sceneHandler = viewer->GetSceneHandler();
2231   if (!sceneHandler) {                           836   if (!sceneHandler) {
2232     if (verbosity >= G4VisManager::errors) {     837     if (verbosity >= G4VisManager::errors) {
2233       G4warn << "ERROR: Viewer \"" << updateN << 838       G4cout << "ERROR: Viewer \"" << updateName << "\"" <<
2234   " has no scene handler - report serious bug    839   " has no scene handler - report serious bug."
2235        << G4endl;                                840        << G4endl;
2236     }                                            841     }
2237     return;                                      842     return;
2238   }                                              843   }
2239                                                  844 
2240   G4Scene* scene = sceneHandler->GetScene();     845   G4Scene* scene = sceneHandler->GetScene();
2241   if (!scene) {                                  846   if (!scene) {
2242     if (verbosity >= G4VisManager::confirmati << 847     if (verbosity >= G4VisManager::warnings) {
2243       G4cout << "NOTE: SceneHandler \"" << sc << 848       G4cout << "WARNING: SceneHandler \"" << sceneHandler->GetName()
2244        << "\", to which viewer \"" << updateN    849        << "\", to which viewer \"" << updateName << "\"" <<
2245   "\n  is attached, has no scene - \"/vis/sce    850   "\n  is attached, has no scene - \"/vis/scene/create\" and"
2246   " \"/vis/sceneHandler/attach\""             << 851   "\"/vis/sceneHandler/attach\""
2247   "\n  (or use compound command \"/vis/drawVo    852   "\n  (or use compound command \"/vis/drawVolume\")."
2248        << G4endl;                                853        << G4endl;
2249     }                                            854     }
2250     return;                                      855     return;
2251   }                                              856   }
2252                                                  857 
2253   if (verbosity >= G4VisManager::confirmation << 858   if (viewer) {
2254     G4cout << "Viewer \"" << viewer -> GetNam << 859     if (verbosity >= G4VisManager::confirmations) {
2255     G4cout << " post-processing triggered." < << 860       G4cout << "Viewer \"" << viewer -> GetName () << "\"";
                                                   >> 861       G4cout << " post-processing triggered." << G4endl;
                                                   >> 862     }
                                                   >> 863     viewer -> ShowView ();
                                                   >> 864   }
                                                   >> 865   else {
                                                   >> 866     if (verbosity >= G4VisManager::errors) {
                                                   >> 867       G4cout << "ERROR: Viewer \"" << updateName << "\"";
                                                   >> 868       G4cout << " not found - \"/vis/viewer/list\""
                                                   >> 869   "\n  to see possibilities." << G4endl;
                                                   >> 870     }
2256   }                                              871   }
2257   viewer -> ShowView ();                      << 
2258   // Assume future need to "refresh" transien << 
2259   sceneHandler -> SetMarkForClearingTransient << 
2260 }                                                872 }
2261                                                  873 
2262 ////////////// /vis/viewer/zoom and zoomTo //    874 ////////////// /vis/viewer/zoom and zoomTo ////////////////////////////
2263                                                  875 
2264 G4VisCommandViewerZoom::G4VisCommandViewerZoo    876 G4VisCommandViewerZoom::G4VisCommandViewerZoom ():
2265   fZoomMultiplier (1.),                          877   fZoomMultiplier (1.),
2266   fZoomTo         (1.)                           878   fZoomTo         (1.)
2267 {                                                879 {
2268   G4bool omitable, currentAsDefault;             880   G4bool omitable, currentAsDefault;
2269                                                  881 
2270   fpCommandZoom = new G4UIcmdWithADouble         882   fpCommandZoom = new G4UIcmdWithADouble
2271     ("/vis/viewer/zoom", this);                  883     ("/vis/viewer/zoom", this);
2272   fpCommandZoom -> SetGuidance ("Incremental     884   fpCommandZoom -> SetGuidance ("Incremental zoom.");
2273   fpCommandZoom -> SetGuidance                   885   fpCommandZoom -> SetGuidance
2274     ("Multiplies current magnification by thi    886     ("Multiplies current magnification by this factor.");
2275   fpCommandZoom -> SetParameterName("multipli    887   fpCommandZoom -> SetParameterName("multiplier",
2276              omitable=true,                      888              omitable=true,
2277              currentAsDefault=true);             889              currentAsDefault=true);
2278                                                  890 
2279   fpCommandZoomTo = new G4UIcmdWithADouble       891   fpCommandZoomTo = new G4UIcmdWithADouble
2280     ("/vis/viewer/zoomTo", this);                892     ("/vis/viewer/zoomTo", this);
2281   fpCommandZoomTo -> SetGuidance ("Absolute z    893   fpCommandZoomTo -> SetGuidance ("Absolute zoom.");
2282   fpCommandZoomTo -> SetGuidance                 894   fpCommandZoomTo -> SetGuidance
2283     ("Magnifies standard magnification by thi    895     ("Magnifies standard magnification by this factor.");
2284   fpCommandZoomTo -> SetParameterName("factor    896   fpCommandZoomTo -> SetParameterName("factor",
2285                omitable=true,                    897                omitable=true,
2286                currentAsDefault=true);           898                currentAsDefault=true);
2287 }                                                899 }
2288                                                  900 
2289 G4VisCommandViewerZoom::~G4VisCommandViewerZo    901 G4VisCommandViewerZoom::~G4VisCommandViewerZoom () {
2290   delete fpCommandZoom;                          902   delete fpCommandZoom;
2291   delete fpCommandZoomTo;                        903   delete fpCommandZoomTo;
2292 }                                                904 }
2293                                                  905 
2294 G4String G4VisCommandViewerZoom::GetCurrentVa    906 G4String G4VisCommandViewerZoom::GetCurrentValue (G4UIcommand* command) {
2295   G4String currentValue;                         907   G4String currentValue;
2296   if (command == fpCommandZoom) {                908   if (command == fpCommandZoom) {
2297     currentValue = fpCommandZoom->ConvertToSt    909     currentValue = fpCommandZoom->ConvertToString(fZoomMultiplier);
2298   }                                              910   }
2299   else if (command == fpCommandZoomTo) {         911   else if (command == fpCommandZoomTo) {
2300     currentValue = fpCommandZoomTo->ConvertTo    912     currentValue = fpCommandZoomTo->ConvertToString(fZoomTo);
2301   }                                              913   }
2302   return currentValue;                           914   return currentValue;
2303 }                                                915 }
2304                                                  916 
2305 void G4VisCommandViewerZoom::SetNewValue (G4U    917 void G4VisCommandViewerZoom::SetNewValue (G4UIcommand* command,
2306             G4String newValue) {                 918             G4String newValue) {
2307                                                  919 
2308                                                  920 
2309   G4VisManager::Verbosity verbosity = fpVisMa    921   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2310                                                  922 
2311   G4VViewer* currentViewer = fpVisManager->Ge    923   G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
2312   if (!currentViewer) {                          924   if (!currentViewer) {
2313     if (verbosity >= G4VisManager::errors) {     925     if (verbosity >= G4VisManager::errors) {
2314       G4warn <<                               << 926       G4cout <<
2315   "ERROR: G4VisCommandsViewerZoom::SetNewValu    927   "ERROR: G4VisCommandsViewerZoom::SetNewValue: no current viewer."
2316        << G4endl;                                928        << G4endl;
2317     }                                            929     }
2318     return;                                      930     return;
2319   }                                              931   }
2320                                                  932 
2321   G4ViewParameters vp = currentViewer->GetVie    933   G4ViewParameters vp = currentViewer->GetViewParameters();
2322                                                  934 
2323   if (command == fpCommandZoom) {                935   if (command == fpCommandZoom) {
2324     fZoomMultiplier = fpCommandZoom->GetNewDo    936     fZoomMultiplier = fpCommandZoom->GetNewDoubleValue(newValue);
2325     vp.MultiplyZoomFactor(fZoomMultiplier);      937     vp.MultiplyZoomFactor(fZoomMultiplier);
2326   }                                              938   }
2327   else if (command == fpCommandZoomTo) {         939   else if (command == fpCommandZoomTo) {
2328     fZoomTo = fpCommandZoom->GetNewDoubleValu    940     fZoomTo = fpCommandZoom->GetNewDoubleValue(newValue);
2329     vp.SetZoomFactor(fZoomTo);                   941     vp.SetZoomFactor(fZoomTo);
2330   }                                              942   }
2331                                                  943 
2332   if (verbosity >= G4VisManager::confirmation    944   if (verbosity >= G4VisManager::confirmations) {
2333     G4cout << "Zoom factor changed to " << vp    945     G4cout << "Zoom factor changed to " << vp.GetZoomFactor() << G4endl;
2334   }                                              946   }
2335                                                  947 
2336   SetViewParameters(currentViewer, vp);          948   SetViewParameters(currentViewer, vp);
2337 }                                                949 }
2338                                                  950