Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/management/src/G4VisCommandsSceneAdd.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/G4VisCommandsSceneAdd.cc (Version 11.3.0) and /visualization/management/src/G4VisCommandsSceneAdd.cc (Version 9.6.p4)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
                                                   >>  27 // $Id$
 27 // /vis/scene/add commands - John Allison  9th     28 // /vis/scene/add commands - John Allison  9th August 1998
 28                                                    29 
 29 #include "G4VisCommandsSceneAdd.hh"                30 #include "G4VisCommandsSceneAdd.hh"
 30                                                    31 
 31 #include "G4TransportationManager.hh"              32 #include "G4TransportationManager.hh"
 32 #include "G4LogicalVolumeStore.hh"                 33 #include "G4LogicalVolumeStore.hh"
 33 #include "G4PhysicalVolumeModel.hh"                34 #include "G4PhysicalVolumeModel.hh"
 34 #include "G4LogicalVolumeModel.hh"                 35 #include "G4LogicalVolumeModel.hh"
 35 #include "G4ModelingParameters.hh"                 36 #include "G4ModelingParameters.hh"
 36 #include "G4HitsModel.hh"                          37 #include "G4HitsModel.hh"
 37 #include "G4DigiModel.hh"                          38 #include "G4DigiModel.hh"
 38 #include "G4GPSModel.hh"                       << 
 39 #include "G4ElectricFieldModel.hh"             << 
 40 #include "G4MagneticFieldModel.hh"             << 
 41 #include "G4PSHitsModel.hh"                        39 #include "G4PSHitsModel.hh"
 42 #include "G4TrajectoriesModel.hh"                  40 #include "G4TrajectoriesModel.hh"
                                                   >>  41 #include "G4ScaleModel.hh"
 43 #include "G4TextModel.hh"                          42 #include "G4TextModel.hh"
 44 #include "G4ArrowModel.hh"                         43 #include "G4ArrowModel.hh"
 45 #include "G4AxesModel.hh"                          44 #include "G4AxesModel.hh"
 46 #include "G4PlotterModel.hh"                   <<  45 #include "G4PhysicalVolumeSearchScene.hh"
 47 #include "G4PhysicalVolumesSearchScene.hh"     <<  46 #include "G4VGlobalFastSimulationManager.hh"
 48 #include "G4ParticleTable.hh"                      47 #include "G4ParticleTable.hh"
 49 #include "G4ParticleDefinition.hh"                 48 #include "G4ParticleDefinition.hh"
                                                   >>  49 #include "G4FlavoredParallelWorldModel.hh"
 50 #include "G4ApplicationState.hh"                   50 #include "G4ApplicationState.hh"
 51 #include "G4VUserVisAction.hh"                     51 #include "G4VUserVisAction.hh"
 52 #include "G4CallbackModel.hh"                      52 #include "G4CallbackModel.hh"
 53 #include "G4UnionSolid.hh"                         53 #include "G4UnionSolid.hh"
 54 #include "G4SubtractionSolid.hh"                   54 #include "G4SubtractionSolid.hh"
 55 #include "G4Polyhedron.hh"                         55 #include "G4Polyhedron.hh"
 56 #include "G4UImanager.hh"                          56 #include "G4UImanager.hh"
 57 #include "G4UIcommandTree.hh"                  << 
 58 #include "G4UIcommand.hh"                          57 #include "G4UIcommand.hh"
 59 #include "G4UIcmdWithAString.hh"                   58 #include "G4UIcmdWithAString.hh"
 60 #include "G4UIcmdWithoutParameter.hh"              59 #include "G4UIcmdWithoutParameter.hh"
 61 #include "G4UIcmdWithAnInteger.hh"             << 
 62 #include "G4Tokenizer.hh"                          60 #include "G4Tokenizer.hh"
 63 #include "G4RunManager.hh"                         61 #include "G4RunManager.hh"
 64 #include "G4RunManagerFactory.hh"              << 
 65 #include "G4StateManager.hh"                       62 #include "G4StateManager.hh"
 66 #include "G4Run.hh"                                63 #include "G4Run.hh"
 67 #include "G4Event.hh"                              64 #include "G4Event.hh"
                                                   >>  65 #include "G4IdentityTrajectoryFilter.hh"
                                                   >>  66 #include "G4TransportationManager.hh"
                                                   >>  67 #include "G4PropagatorInField.hh"
 68 #include "G4Trajectory.hh"                         68 #include "G4Trajectory.hh"
 69 #include "G4TrajectoryPoint.hh"                    69 #include "G4TrajectoryPoint.hh"
 70 #include "G4RichTrajectory.hh"                     70 #include "G4RichTrajectory.hh"
 71 #include "G4RichTrajectoryPoint.hh"                71 #include "G4RichTrajectoryPoint.hh"
 72 #include "G4SmoothTrajectory.hh"                   72 #include "G4SmoothTrajectory.hh"
 73 #include "G4SmoothTrajectoryPoint.hh"              73 #include "G4SmoothTrajectoryPoint.hh"
 74 #include "G4AttDef.hh"                             74 #include "G4AttDef.hh"
 75 #include "G4AttCheck.hh"                       << 
 76 #include "G4Polyline.hh"                           75 #include "G4Polyline.hh"
 77 #include "G4UnitsTable.hh"                         76 #include "G4UnitsTable.hh"
 78 #include "G4PhysicalConstants.hh"                  77 #include "G4PhysicalConstants.hh"
 79 #include "G4SystemOfUnits.hh"                      78 #include "G4SystemOfUnits.hh"
 80 #include "G4GeneralParticleSourceData.hh"      << 
 81 #include "G4PlotterManager.hh"                 << 
 82                                                    79 
 83 #include <sstream>                                 80 #include <sstream>
 84                                                    81 
 85 #define G4warn G4cout                          <<  82 // Local function with some frequently used error printing...
                                                   >>  83 static void G4VisCommandsSceneAddUnsuccessful
                                                   >>  84 (G4VisManager::Verbosity verbosity) {
                                                   >>  85   if (verbosity >= G4VisManager::warnings) {
                                                   >>  86     G4cout <<
                                                   >>  87       "WARNING: For some reason, possibly mentioned above, it has not been"
                                                   >>  88       "\n  possible to add to the scene."
                                                   >>  89      << G4endl;
                                                   >>  90   }
                                                   >>  91 }
 86                                                    92 
 87 ////////////// /vis/scene/add/arrow //////////     93 ////////////// /vis/scene/add/arrow ///////////////////////////////////////
 88                                                    94 
 89 G4VisCommandSceneAddArrow::G4VisCommandSceneAd     95 G4VisCommandSceneAddArrow::G4VisCommandSceneAddArrow () {
 90   fpCommand = new G4UIcommand("/vis/scene/add/     96   fpCommand = new G4UIcommand("/vis/scene/add/arrow", this);
 91   fpCommand -> SetGuidance ("Adds arrow to cur     97   fpCommand -> SetGuidance ("Adds arrow to current scene.");
 92   G4bool omitable;                                 98   G4bool omitable;
 93   G4UIparameter* parameter;                        99   G4UIparameter* parameter;
 94   parameter = new G4UIparameter ("x1", 'd', om    100   parameter = new G4UIparameter ("x1", 'd', omitable = false);
 95   fpCommand -> SetParameter (parameter);          101   fpCommand -> SetParameter (parameter);
 96   parameter = new G4UIparameter ("y1", 'd', om    102   parameter = new G4UIparameter ("y1", 'd', omitable = false);
 97   fpCommand -> SetParameter (parameter);          103   fpCommand -> SetParameter (parameter);
 98   parameter = new G4UIparameter ("z1", 'd', om    104   parameter = new G4UIparameter ("z1", 'd', omitable = false);
 99   fpCommand -> SetParameter (parameter);          105   fpCommand -> SetParameter (parameter);
100   parameter = new G4UIparameter ("x2", 'd', om    106   parameter = new G4UIparameter ("x2", 'd', omitable = false);
101   fpCommand -> SetParameter (parameter);          107   fpCommand -> SetParameter (parameter);
102   parameter = new G4UIparameter ("y2", 'd', om    108   parameter = new G4UIparameter ("y2", 'd', omitable = false);
103   fpCommand -> SetParameter (parameter);          109   fpCommand -> SetParameter (parameter);
104   parameter = new G4UIparameter ("z2", 'd', om    110   parameter = new G4UIparameter ("z2", 'd', omitable = false);
105   fpCommand -> SetParameter (parameter);          111   fpCommand -> SetParameter (parameter);
106   parameter =  new G4UIparameter ("unit", 's',    112   parameter =  new G4UIparameter ("unit", 's', omitable = true);
107   parameter->SetDefaultValue ("m");               113   parameter->SetDefaultValue ("m");
108   fpCommand->SetParameter    (parameter);         114   fpCommand->SetParameter    (parameter);
109 }                                                 115 }
110                                                   116 
111 G4VisCommandSceneAddArrow::~G4VisCommandSceneA    117 G4VisCommandSceneAddArrow::~G4VisCommandSceneAddArrow () {
112   delete fpCommand;                               118   delete fpCommand;
113 }                                                 119 }
114                                                   120 
115 G4String G4VisCommandSceneAddArrow::GetCurrent    121 G4String G4VisCommandSceneAddArrow::GetCurrentValue (G4UIcommand*) {
116   return "";                                      122   return "";
117 }                                                 123 }
118                                                   124 
119 void G4VisCommandSceneAddArrow::SetNewValue (G    125 void G4VisCommandSceneAddArrow::SetNewValue (G4UIcommand*, G4String newValue)
120 {                                                 126 {
121   G4VisManager::Verbosity verbosity = fpVisMan    127   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
122   G4bool warn(verbosity >= G4VisManager::warni    128   G4bool warn(verbosity >= G4VisManager::warnings);
123                                                   129 
124   G4Scene* pScene = fpVisManager->GetCurrentSc    130   G4Scene* pScene = fpVisManager->GetCurrentScene();
125   if (!pScene) {                                  131   if (!pScene) {
126     if (verbosity >= G4VisManager::errors) {      132     if (verbosity >= G4VisManager::errors) {
127       G4warn << "ERROR: No current scene.  Ple << 133       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
128     }                                             134     }
129     return;                                       135     return;
130   }                                               136   }
131                                                   137 
132   G4String unitString;                            138   G4String unitString;
133   G4double x1, y1, z1, x2, y2, z2;                139   G4double x1, y1, z1, x2, y2, z2;
134   std::istringstream is(newValue);                140   std::istringstream is(newValue);
135   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> un    141   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> unitString;
136   G4double unit = G4UIcommand::ValueOf(unitStr    142   G4double unit = G4UIcommand::ValueOf(unitString);
137   x1 *= unit; y1 *= unit; z1 *= unit;             143   x1 *= unit; y1 *= unit; z1 *= unit;
138   x2 *= unit; y2 *= unit; z2 *= unit;             144   x2 *= unit; y2 *= unit; z2 *= unit;
139                                                   145 
140   // Consult scene for arrow width.               146   // Consult scene for arrow width.
141   const G4VisExtent& sceneExtent = pScene->Get    147   const G4VisExtent& sceneExtent = pScene->GetExtent();
142   G4double arrowWidth =                           148   G4double arrowWidth =
143     0.005 * fCurrentLineWidth * sceneExtent.Ge    149     0.005 * fCurrentLineWidth * sceneExtent.GetExtentRadius();
144                                                   150 
145   G4VModel* model = new G4ArrowModel              151   G4VModel* model = new G4ArrowModel
146     (x1, y1, z1, x2, y2, z2,                      152     (x1, y1, z1, x2, y2, z2,
147      arrowWidth, fCurrentColour, newValue,     << 153      arrowWidth, fCurrentColour, newValue);
148      fCurrentArrow3DLineSegmentsPerCircle);    << 
149                                                   154 
150   const G4String& currentSceneName = pScene ->    155   const G4String& currentSceneName = pScene -> GetName ();
151   G4bool successful = pScene -> AddRunDuration    156   G4bool successful = pScene -> AddRunDurationModel (model, warn);
152   if (successful) {                               157   if (successful) {
153     if (verbosity >= G4VisManager::confirmatio    158     if (verbosity >= G4VisManager::confirmations) {
154       G4cout << "Arrow has been added to scene    159       G4cout << "Arrow has been added to scene \""
155        << currentSceneName << "\"."               160        << currentSceneName << "\"."
156        << G4endl;                                 161        << G4endl;
157     }                                             162     }
158   }                                               163   }
159   else G4VisCommandsSceneAddUnsuccessful(verbo    164   else G4VisCommandsSceneAddUnsuccessful(verbosity);
160                                                << 165   UpdateVisManagerScene (currentSceneName);
161   CheckSceneAndNotifyHandlers (pScene);        << 
162 }                                                 166 }
163                                                   167 
164 ////////////// /vis/scene/add/arrow2D ////////    168 ////////////// /vis/scene/add/arrow2D ///////////////////////////////////////
165                                                   169 
166 G4VisCommandSceneAddArrow2D::G4VisCommandScene    170 G4VisCommandSceneAddArrow2D::G4VisCommandSceneAddArrow2D () {
167   fpCommand = new G4UIcommand("/vis/scene/add/    171   fpCommand = new G4UIcommand("/vis/scene/add/arrow2D", this);
168   fpCommand -> SetGuidance ("Adds 2D arrow to     172   fpCommand -> SetGuidance ("Adds 2D arrow to current scene.");
169   fpCommand -> SetGuidance ("x,y in range [-1, << 
170   G4bool omitable;                                173   G4bool omitable;
171   G4UIparameter* parameter;                       174   G4UIparameter* parameter;
172   parameter = new G4UIparameter ("x1", 'd', om    175   parameter = new G4UIparameter ("x1", 'd', omitable = false);
173   fpCommand -> SetParameter (parameter);          176   fpCommand -> SetParameter (parameter);
174   parameter = new G4UIparameter ("y1", 'd', om    177   parameter = new G4UIparameter ("y1", 'd', omitable = false);
175   fpCommand -> SetParameter (parameter);          178   fpCommand -> SetParameter (parameter);
176   parameter = new G4UIparameter ("x2", 'd', om    179   parameter = new G4UIparameter ("x2", 'd', omitable = false);
177   fpCommand -> SetParameter (parameter);          180   fpCommand -> SetParameter (parameter);
178   parameter = new G4UIparameter ("y2", 'd', om    181   parameter = new G4UIparameter ("y2", 'd', omitable = false);
179   fpCommand -> SetParameter (parameter);          182   fpCommand -> SetParameter (parameter);
180 }                                                 183 }
181                                                   184 
182 G4VisCommandSceneAddArrow2D::~G4VisCommandScen    185 G4VisCommandSceneAddArrow2D::~G4VisCommandSceneAddArrow2D () {
183   delete fpCommand;                               186   delete fpCommand;
184 }                                                 187 }
185                                                   188 
186 G4String G4VisCommandSceneAddArrow2D::GetCurre    189 G4String G4VisCommandSceneAddArrow2D::GetCurrentValue (G4UIcommand*) {
187   return "";                                      190   return "";
188 }                                                 191 }
189                                                   192 
190 void G4VisCommandSceneAddArrow2D::SetNewValue     193 void G4VisCommandSceneAddArrow2D::SetNewValue (G4UIcommand*, G4String newValue)
191 {                                                 194 {
192   G4VisManager::Verbosity verbosity = fpVisMan    195   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
193   G4bool warn(verbosity >= G4VisManager::warni    196   G4bool warn(verbosity >= G4VisManager::warnings);
194                                                   197 
195   G4Scene* pScene = fpVisManager->GetCurrentSc    198   G4Scene* pScene = fpVisManager->GetCurrentScene();
196   if (!pScene) {                                  199   if (!pScene) {
197     if (verbosity >= G4VisManager::errors) {      200     if (verbosity >= G4VisManager::errors) {
198       G4warn << "ERROR: No current scene.  Ple << 201       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
199     }                                             202     }
200     return;                                       203     return;
201   }                                               204   }
202                                                   205 
203   G4double x1, y1, x2, y2;                        206   G4double x1, y1, x2, y2;
204   std::istringstream is(newValue);                207   std::istringstream is(newValue);
205   is >> x1 >> y1 >> x2 >> y2;                     208   is >> x1 >> y1 >> x2 >> y2;
206                                                   209 
207   Arrow2D* arrow2D = new Arrow2D                  210   Arrow2D* arrow2D = new Arrow2D
208     (x1, y1, x2, y2, fCurrentLineWidth, fCurre    211     (x1, y1, x2, y2, fCurrentLineWidth, fCurrentColour);
209   G4VModel* model =                               212   G4VModel* model =
210     new G4CallbackModel<G4VisCommandSceneAddAr    213     new G4CallbackModel<G4VisCommandSceneAddArrow2D::Arrow2D>(arrow2D);
211   model->SetType("Arrow2D");                      214   model->SetType("Arrow2D");
212   model->SetGlobalTag("Arrow2D");                 215   model->SetGlobalTag("Arrow2D");
213   model->SetGlobalDescription("Arrow2D: " + ne    216   model->SetGlobalDescription("Arrow2D: " + newValue);
214   const G4String& currentSceneName = pScene ->    217   const G4String& currentSceneName = pScene -> GetName ();
215   G4bool successful = pScene -> AddRunDuration    218   G4bool successful = pScene -> AddRunDurationModel (model, warn);
216   if (successful) {                               219   if (successful) {
217     if (verbosity >= G4VisManager::confirmatio    220     if (verbosity >= G4VisManager::confirmations) {
218       G4cout << "A 2D arrow has been added to     221       G4cout << "A 2D arrow has been added to scene \""
219        << currentSceneName << "\"."               222        << currentSceneName << "\"."
220        << G4endl;                                 223        << G4endl;
221     }                                             224     }
222   }                                               225   }
223   else G4VisCommandsSceneAddUnsuccessful(verbo    226   else G4VisCommandsSceneAddUnsuccessful(verbosity);
224                                                << 227   UpdateVisManagerScene (currentSceneName);
225   CheckSceneAndNotifyHandlers (pScene);        << 
226 }                                                 228 }
227                                                   229 
228 G4VisCommandSceneAddArrow2D::Arrow2D::Arrow2D     230 G4VisCommandSceneAddArrow2D::Arrow2D::Arrow2D
229 (G4double x1, G4double y1,                        231 (G4double x1, G4double y1,
230  G4double x2, G4double y2,                        232  G4double x2, G4double y2,
231  G4double width, const G4Colour& colour):         233  G4double width, const G4Colour& colour):
232   fWidth(width), fColour(colour)                  234   fWidth(width), fColour(colour)
233 {                                                 235 {
234   fShaftPolyline.push_back(G4Point3D(x1,y1,0))    236   fShaftPolyline.push_back(G4Point3D(x1,y1,0));
235   fShaftPolyline.push_back(G4Point3D(x2,y2,0))    237   fShaftPolyline.push_back(G4Point3D(x2,y2,0));
236   G4Vector3D arrowDirection = G4Vector3D(x2-x1    238   G4Vector3D arrowDirection = G4Vector3D(x2-x1,y2-y1,0).unit();
237   G4Vector3D arrowPointLeftDirection(arrowDire    239   G4Vector3D arrowPointLeftDirection(arrowDirection);
238   arrowPointLeftDirection.rotateZ(150.*deg);      240   arrowPointLeftDirection.rotateZ(150.*deg);
239   G4Vector3D arrowPointRightDirection(arrowDir    241   G4Vector3D arrowPointRightDirection(arrowDirection);
240   arrowPointRightDirection.rotateZ(-150.*deg);    242   arrowPointRightDirection.rotateZ(-150.*deg);
241   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0    243   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0.04*arrowPointLeftDirection);
242   fHeadPolyline.push_back(G4Point3D(x2,y2,0));    244   fHeadPolyline.push_back(G4Point3D(x2,y2,0));
243   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0    245   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0.04*arrowPointRightDirection);
244   G4VisAttributes va;                             246   G4VisAttributes va;
245   va.SetLineWidth(fWidth);                        247   va.SetLineWidth(fWidth);
246   va.SetColour(fColour);                          248   va.SetColour(fColour);
247   fShaftPolyline.SetVisAttributes(va);            249   fShaftPolyline.SetVisAttributes(va);
248   fHeadPolyline.SetVisAttributes(va);             250   fHeadPolyline.SetVisAttributes(va);
249 }                                                 251 }
250                                                   252 
251 void G4VisCommandSceneAddArrow2D::Arrow2D::ope    253 void G4VisCommandSceneAddArrow2D::Arrow2D::operator()
252   (G4VGraphicsScene& sceneHandler, const G4Mod << 254   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
253 {                                                 255 {
254   sceneHandler.BeginPrimitives2D();               256   sceneHandler.BeginPrimitives2D();
255   sceneHandler.AddPrimitive(fShaftPolyline);      257   sceneHandler.AddPrimitive(fShaftPolyline);
256   sceneHandler.AddPrimitive(fHeadPolyline);       258   sceneHandler.AddPrimitive(fHeadPolyline);
257   sceneHandler.EndPrimitives2D();                 259   sceneHandler.EndPrimitives2D();
258 }                                                 260 }
259                                                   261 
260 ////////////// /vis/scene/add/axes ///////////    262 ////////////// /vis/scene/add/axes //////////////////////////////////
261                                                   263 
262 G4VisCommandSceneAddAxes::G4VisCommandSceneAdd    264 G4VisCommandSceneAddAxes::G4VisCommandSceneAddAxes () {
263   G4bool omitable;                                265   G4bool omitable;
264   fpCommand = new G4UIcommand ("/vis/scene/add    266   fpCommand = new G4UIcommand ("/vis/scene/add/axes", this);
265   fpCommand -> SetGuidance ("Add axes.");         267   fpCommand -> SetGuidance ("Add axes.");
266   fpCommand -> SetGuidance                        268   fpCommand -> SetGuidance
267   ("Draws axes at (x0, y0, z0) of given length << 269     ("Draws axes at (x0, y0, z0) of given length and colour.");
268   fpCommand -> SetGuidance                     << 
269   ("If \"colour-string\" is \"auto\", x, y and << 
270    "\n  respectively.  Otherwise it can be one << 
271    "\n  colours - see information printed by t << 
272    "\n  use \"/vis/list\".");                  << 
273   fpCommand -> SetGuidance                     << 
274   ("If \"length\" is negative, it is set to ab << 
275   fpCommand -> SetGuidance                     << 
276   ("If \"showtext\" is false, annotations are  << 
277   G4UIparameter* parameter;                       270   G4UIparameter* parameter;
278   parameter =  new G4UIparameter ("x0", 'd', o    271   parameter =  new G4UIparameter ("x0", 'd', omitable = true);
279   parameter->SetDefaultValue (0.);                272   parameter->SetDefaultValue (0.);
280   fpCommand->SetParameter (parameter);            273   fpCommand->SetParameter (parameter);
281   parameter =  new G4UIparameter ("y0", 'd', o    274   parameter =  new G4UIparameter ("y0", 'd', omitable = true);
282   parameter->SetDefaultValue (0.);                275   parameter->SetDefaultValue (0.);
283   fpCommand->SetParameter (parameter);            276   fpCommand->SetParameter (parameter);
284   parameter =  new G4UIparameter ("z0", 'd', o    277   parameter =  new G4UIparameter ("z0", 'd', omitable = true);
285   parameter->SetDefaultValue (0.);                278   parameter->SetDefaultValue (0.);
286   fpCommand->SetParameter (parameter);            279   fpCommand->SetParameter (parameter);
287   parameter =  new G4UIparameter ("length", 'd    280   parameter =  new G4UIparameter ("length", 'd', omitable = true);
288   parameter->SetDefaultValue (-1.);               281   parameter->SetDefaultValue (-1.);
                                                   >> 282   parameter->SetGuidance
                                                   >> 283     ("If negative, length automatic, about 25% of scene extent.");
289   fpCommand->SetParameter (parameter);            284   fpCommand->SetParameter (parameter);
290   parameter =  new G4UIparameter ("unit", 's',    285   parameter =  new G4UIparameter ("unit", 's', omitable = true);
291   parameter->SetDefaultValue ("m");               286   parameter->SetDefaultValue ("m");
292   fpCommand->SetParameter (parameter);            287   fpCommand->SetParameter (parameter);
293   parameter =  new G4UIparameter ("colour-stri << 288   parameter =  new G4UIparameter ("unitcolour", 's', omitable = true);
294   parameter->SetDefaultValue  ("auto");           289   parameter->SetDefaultValue  ("auto");
295   fpCommand->SetParameter (parameter);         << 290   parameter->SetGuidance
296   parameter =  new G4UIparameter ("showtext",  << 291     ("If \"auto\", x, y and z will be red, green and blue respectively.");
297   parameter->SetDefaultValue  ("true");        << 292   parameter->SetGuidance
                                                   >> 293     ("Otherwise choose from the pre-defined text-specified colours - "
                                                   >> 294      "\n  see information printed by the vis manager at start-up or"
                                                   >> 295      "\n  use \"/vis/list\".");
298   fpCommand->SetParameter (parameter);            296   fpCommand->SetParameter (parameter);
299 }                                                 297 }
300                                                   298 
301 G4VisCommandSceneAddAxes::~G4VisCommandSceneAd    299 G4VisCommandSceneAddAxes::~G4VisCommandSceneAddAxes () {
302   delete fpCommand;                               300   delete fpCommand;
303 }                                                 301 }
304                                                   302 
305 G4String G4VisCommandSceneAddAxes::GetCurrentV    303 G4String G4VisCommandSceneAddAxes::GetCurrentValue (G4UIcommand*) {
306   return "";                                      304   return "";
307 }                                                 305 }
308                                                   306 
309 void G4VisCommandSceneAddAxes::SetNewValue (G4    307 void G4VisCommandSceneAddAxes::SetNewValue (G4UIcommand*, G4String newValue) {
310                                                   308 
311   G4VisManager::Verbosity verbosity = fpVisMan    309   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
312   G4bool warn(verbosity >= G4VisManager::warni    310   G4bool warn(verbosity >= G4VisManager::warnings);
313                                                   311 
314   G4Scene* pScene = fpVisManager->GetCurrentSc    312   G4Scene* pScene = fpVisManager->GetCurrentScene();
315   if (!pScene) {                                  313   if (!pScene) {
316     if (verbosity >= G4VisManager::errors) {      314     if (verbosity >= G4VisManager::errors) {
317       G4warn << "ERROR: No current scene.  Ple << 315       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
318     }                                             316     }
319     return;                                       317     return;
320   } else {                                     << 
321     if (pScene->GetExtent().GetExtentRadius()  << 
322       if (verbosity >= G4VisManager::errors) { << 
323         G4warn                                 << 
324   << "ERROR: Scene has no extent. Add volumes  << 
325         << G4endl;                             << 
326       }                                        << 
327       return;                                  << 
328     }                                          << 
329   }                                               318   }
330                                                   319 
331   G4String unitString, colourString, showTextS << 320   G4String unitString, colourString;
332   G4double x0, y0, z0, length;                    321   G4double x0, y0, z0, length;
333   std::istringstream is (newValue);               322   std::istringstream is (newValue);
334   is >> x0 >> y0 >> z0 >> length >> unitString << 323   is >> x0 >> y0 >> z0 >> length >> unitString  >> colourString;
335   >> colourString >> showTextString;           << 
336   G4bool showText = G4UIcommand::ConvertToBool << 
337                                                << 
338                                                   324 
339   G4double unit = G4UIcommand::ValueOf(unitStr    325   G4double unit = G4UIcommand::ValueOf(unitString);
340   x0 *= unit; y0 *= unit; z0 *= unit;             326   x0 *= unit; y0 *= unit; z0 *= unit;
341   const G4VisExtent& sceneExtent = pScene->Get    327   const G4VisExtent& sceneExtent = pScene->GetExtent();  // Existing extent.
342   if (length < 0.) {                              328   if (length < 0.) {
343     const G4double lengthMax = 0.5 * sceneExte << 329     length = 0.5 * sceneExtent.GetExtentRadius();
344     const G4double intLog10Length = std::floor << 330     G4double intLog10Length = std::floor(std::log10(length));
345     length = std::pow(10,intLog10Length);         331     length = std::pow(10,intLog10Length);
346     if (5.*length < lengthMax) length *= 5.;   << 
347     else if (2.*length < lengthMax) length *=  << 
348   } else {                                        332   } else {
349     length *= unit;                               333     length *= unit;
350   }                                               334   }
                                                   >> 335   G4String annotation = G4BestUnit(length,"Length");
351                                                   336 
352   // Consult scene for arrow width...             337   // Consult scene for arrow width...
353   G4double arrowWidth =                           338   G4double arrowWidth =
354     0.05 * fCurrentLineWidth * sceneExtent.Get << 339     0.005 * fCurrentLineWidth * sceneExtent.GetExtentRadius();
355   // ...but limit it to length/30.             << 340   // ...but limit it to length/50.
356   if (arrowWidth > length/30.) arrowWidth = le << 341   if (arrowWidth > length/50.) arrowWidth = length/50.;
357                                                   342 
358   G4VModel* model = new G4AxesModel               343   G4VModel* model = new G4AxesModel
359     (x0, y0, z0, length, arrowWidth, colourStr << 344     (x0, y0, z0, length, arrowWidth, colourString, newValue);
360      showText, fCurrentTextSize);              << 
361                                                   345 
362   G4bool successful = pScene -> AddRunDuration    346   G4bool successful = pScene -> AddRunDurationModel (model, warn);
363   const G4String& currentSceneName = pScene ->    347   const G4String& currentSceneName = pScene -> GetName ();
364   if (successful) {                               348   if (successful) {
365     if (verbosity >= G4VisManager::confirmatio    349     if (verbosity >= G4VisManager::confirmations) {
366       G4cout << "Axes of length " << G4BestUni << 350       G4cout << "Axes have been added to scene \"" << currentSceneName << "\"."
367       << "have been added to scene \"" << curr << 351        << G4endl;
368       << G4endl;                               << 
369     }                                             352     }
370   }                                               353   }
371   else G4VisCommandsSceneAddUnsuccessful(verbo    354   else G4VisCommandsSceneAddUnsuccessful(verbosity);
372                                                << 355   UpdateVisManagerScene (currentSceneName);
373   CheckSceneAndNotifyHandlers (pScene);        << 
374 }                                                 356 }
375                                                   357 
376 ////////////// /vis/scene/add/date ///////////    358 ////////////// /vis/scene/add/date ///////////////////////////////////////
377                                                   359 
378 G4VisCommandSceneAddDate::G4VisCommandSceneAdd    360 G4VisCommandSceneAddDate::G4VisCommandSceneAddDate () {
379   G4bool omitable;                                361   G4bool omitable;
380   fpCommand = new G4UIcommand ("/vis/scene/add    362   fpCommand = new G4UIcommand ("/vis/scene/add/date", this);
381   fpCommand -> SetGuidance ("Adds date to curr    363   fpCommand -> SetGuidance ("Adds date to current scene.");
382   fpCommand -> SetGuidance                     << 
383   ("If \"date\"is omitted, the current date an << 
384    "\nOtherwise, the string, including the res << 
385   G4UIparameter* parameter;                       364   G4UIparameter* parameter;
386   parameter = new G4UIparameter ("size", 'i',     365   parameter = new G4UIparameter ("size", 'i', omitable = true);
387   parameter -> SetGuidance ("Screen size of te    366   parameter -> SetGuidance ("Screen size of text in pixels.");
388   parameter -> SetDefaultValue (18);              367   parameter -> SetDefaultValue (18);
389   fpCommand -> SetParameter (parameter);          368   fpCommand -> SetParameter (parameter);
390   parameter = new G4UIparameter ("x-position",    369   parameter = new G4UIparameter ("x-position", 'd', omitable = true);
391   parameter -> SetGuidance ("x screen position    370   parameter -> SetGuidance ("x screen position in range -1 < x < 1.");
392   parameter -> SetDefaultValue (0.95);         << 371   parameter -> SetDefaultValue (0.0);  // Would prefer 0.95 right.
393   fpCommand -> SetParameter (parameter);          372   fpCommand -> SetParameter (parameter);
394   parameter = new G4UIparameter ("y-position",    373   parameter = new G4UIparameter ("y-position", 'd', omitable = true);
395   parameter -> SetGuidance ("y screen position    374   parameter -> SetGuidance ("y screen position in range -1 < y < 1.");
396   parameter -> SetDefaultValue (0.9);             375   parameter -> SetDefaultValue (0.9);
397   fpCommand -> SetParameter (parameter);          376   fpCommand -> SetParameter (parameter);
398   parameter = new G4UIparameter ("layout", 's'    377   parameter = new G4UIparameter ("layout", 's', omitable = true);
399   parameter -> SetGuidance ("Layout, i.e., adj    378   parameter -> SetGuidance ("Layout, i.e., adjustment: left|centre|right.");
400   parameter -> SetDefaultValue ("right");      << 379   parameter -> SetDefaultValue ("left");  // Would prefer right.
401   fpCommand -> SetParameter (parameter);          380   fpCommand -> SetParameter (parameter);
402   parameter = new G4UIparameter ("date", 's',     381   parameter = new G4UIparameter ("date", 's', omitable = true);
                                                   >> 382   parameter -> SetGuidance
                                                   >> 383   ("The date you want to appear on the view of the scene (this includes the"
                                                   >> 384    "\nrest of the line, including spaces).  The default, \'-\', writes the"
                                                   >> 385    "\ndate and time of the moment of drawing.");
403   parameter -> SetDefaultValue ("-");             386   parameter -> SetDefaultValue ("-");
404   fpCommand -> SetParameter (parameter);          387   fpCommand -> SetParameter (parameter);
405 }                                                 388 }
406                                                   389 
407 G4VisCommandSceneAddDate::~G4VisCommandSceneAd    390 G4VisCommandSceneAddDate::~G4VisCommandSceneAddDate () {
408   delete fpCommand;                               391   delete fpCommand;
409 }                                                 392 }
410                                                   393 
411 G4String G4VisCommandSceneAddDate::GetCurrentV    394 G4String G4VisCommandSceneAddDate::GetCurrentValue (G4UIcommand*) {
412   return "";                                      395   return "";
413 }                                                 396 }
414                                                   397 
415 void G4VisCommandSceneAddDate::SetNewValue (G4    398 void G4VisCommandSceneAddDate::SetNewValue (G4UIcommand*, G4String newValue)
416 {                                                 399 {
417   G4VisManager::Verbosity verbosity = fpVisMan    400   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
418   G4bool warn(verbosity >= G4VisManager::warni    401   G4bool warn(verbosity >= G4VisManager::warnings);
419                                                   402 
420   G4Scene* pScene = fpVisManager->GetCurrentSc    403   G4Scene* pScene = fpVisManager->GetCurrentScene();
421   if (!pScene) {                                  404   if (!pScene) {
422     if (verbosity >= G4VisManager::errors) {      405     if (verbosity >= G4VisManager::errors) {
423       G4warn << "ERROR: No current scene.  Ple << 406       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
424     }                                             407     }
425     return;                                       408     return;
426   }                                               409   }
427                                                   410 
428   G4int size;                                     411   G4int size;
429   G4double x, y;                                  412   G4double x, y;
430   G4String layoutString, dateString;              413   G4String layoutString, dateString;
431   std::istringstream is(newValue);                414   std::istringstream is(newValue);
432   is >> size >> x >> y >> layoutString >> date    415   is >> size >> x >> y >> layoutString >> dateString;
433   // Read rest of line, if any.                   416   // Read rest of line, if any.
434   const size_t NREMAINDER = 100;                  417   const size_t NREMAINDER = 100;
435   char remainder[NREMAINDER];                     418   char remainder[NREMAINDER];
436   remainder[0]='\0';  // In case there is noth << 
437   is.getline(remainder, NREMAINDER);              419   is.getline(remainder, NREMAINDER);
438   dateString += remainder;                        420   dateString += remainder;
439   G4Text::Layout layout = G4Text::right;          421   G4Text::Layout layout = G4Text::right;
440   if (layoutString[0] == 'l') layout = G4Text: << 422   if (layoutString(0) == 'l') layout = G4Text::left;
441   else if (layoutString[0] == 'c') layout = G4 << 423   else if (layoutString(0) == 'c') layout = G4Text::centre;
442   else if (layoutString[0] == 'r') layout = G4 << 424   else if (layoutString(0) == 'r') layout = G4Text::right;
443                                                   425 
444   Date* date = new Date(fpVisManager, size, x,    426   Date* date = new Date(fpVisManager, size, x, y, layout, dateString);
445   G4VModel* model =                               427   G4VModel* model =
446     new G4CallbackModel<G4VisCommandSceneAddDa    428     new G4CallbackModel<G4VisCommandSceneAddDate::Date>(date);
447   model->SetType("Date");                         429   model->SetType("Date");
448   model->SetGlobalTag("Date");                    430   model->SetGlobalTag("Date");
449   model->SetGlobalDescription("Date: " + newVa << 431   model->SetGlobalDescription("Date");
450   const G4String& currentSceneName = pScene ->    432   const G4String& currentSceneName = pScene -> GetName ();
451   G4bool successful = pScene -> AddEndOfEventM << 433   G4bool successful = pScene -> AddRunDurationModel (model, warn);
452   if (successful) {                               434   if (successful) {
453     if (verbosity >= G4VisManager::confirmatio    435     if (verbosity >= G4VisManager::confirmations) {
454       G4cout << "Date has been added to scene     436       G4cout << "Date has been added to scene \""
455        << currentSceneName << "\"."               437        << currentSceneName << "\"."
456        << G4endl;                                 438        << G4endl;
457     }                                             439     }
458   }                                               440   }
459   else G4VisCommandsSceneAddUnsuccessful(verbo    441   else G4VisCommandsSceneAddUnsuccessful(verbosity);
460                                                << 442   UpdateVisManagerScene (currentSceneName);
461   CheckSceneAndNotifyHandlers (pScene);        << 
462 }                                                 443 }
463                                                   444 
464 void G4VisCommandSceneAddDate::Date::operator(    445 void G4VisCommandSceneAddDate::Date::operator()
465   (G4VGraphicsScene& sceneHandler, const G4Mod << 446   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
466 {                                                 447 {
467   G4String time;                                  448   G4String time;
468   if (fDate == "-") {                             449   if (fDate == "-") {
469     time = fTimer.GetClockTime();                 450     time = fTimer.GetClockTime();
470   } else {                                        451   } else {
471     time = fDate;                                 452     time = fDate;
472   }                                               453   }
473   // Check for \n, starting from back, and era    454   // Check for \n, starting from back, and erase.
474   std::string::size_type i = time.rfind('\n');    455   std::string::size_type i = time.rfind('\n');
475   if (i != std::string::npos) time.erase(i);      456   if (i != std::string::npos) time.erase(i);
476   G4Text text(time, G4Point3D(fX, fY, 0.));       457   G4Text text(time, G4Point3D(fX, fY, 0.));
477   text.SetScreenSize(fSize);                      458   text.SetScreenSize(fSize);
478   text.SetLayout(fLayout);                        459   text.SetLayout(fLayout);
479   G4VisAttributes textAtts(G4Colour(0.,1.,1));    460   G4VisAttributes textAtts(G4Colour(0.,1.,1));
480   text.SetVisAttributes(textAtts);                461   text.SetVisAttributes(textAtts);
481   sceneHandler.BeginPrimitives2D();               462   sceneHandler.BeginPrimitives2D();
482   sceneHandler.AddPrimitive(text);                463   sceneHandler.AddPrimitive(text);
483   sceneHandler.EndPrimitives2D();                 464   sceneHandler.EndPrimitives2D();
484 }                                                 465 }
485                                                   466 
486 ////////////// /vis/scene/add/digis //////////    467 ////////////// /vis/scene/add/digis ///////////////////////////////////////
487                                                   468 
488 G4VisCommandSceneAddDigis::G4VisCommandSceneAd    469 G4VisCommandSceneAddDigis::G4VisCommandSceneAddDigis () {
489   fpCommand = new G4UIcmdWithoutParameter ("/v    470   fpCommand = new G4UIcmdWithoutParameter ("/vis/scene/add/digis", this);
490   fpCommand -> SetGuidance ("Adds digis to cur    471   fpCommand -> SetGuidance ("Adds digis to current scene.");
491   fpCommand -> SetGuidance                        472   fpCommand -> SetGuidance
492     ("Digis are drawn at end of event when the    473     ("Digis are drawn at end of event when the scene in which"
493      "\nthey are added is current.");             474      "\nthey are added is current.");
494 }                                                 475 }
495                                                   476 
496 G4VisCommandSceneAddDigis::~G4VisCommandSceneA    477 G4VisCommandSceneAddDigis::~G4VisCommandSceneAddDigis () {
497   delete fpCommand;                               478   delete fpCommand;
498 }                                                 479 }
499                                                   480 
500 G4String G4VisCommandSceneAddDigis::GetCurrent    481 G4String G4VisCommandSceneAddDigis::GetCurrentValue (G4UIcommand*) {
501   return "";                                      482   return "";
502 }                                                 483 }
503                                                   484 
504 void G4VisCommandSceneAddDigis::SetNewValue (G    485 void G4VisCommandSceneAddDigis::SetNewValue (G4UIcommand*, G4String) {
505                                                   486 
506   G4VisManager::Verbosity verbosity = fpVisMan    487   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
507   G4bool warn(verbosity >= G4VisManager::warni    488   G4bool warn(verbosity >= G4VisManager::warnings);
508                                                   489 
509   G4Scene* pScene = fpVisManager->GetCurrentSc    490   G4Scene* pScene = fpVisManager->GetCurrentScene();
510   if (!pScene) {                                  491   if (!pScene) {
511     if (verbosity >= G4VisManager::errors) {      492     if (verbosity >= G4VisManager::errors) {
512       G4warn << "ERROR: No current scene.  Ple << 493       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
513     }                                             494     }
514     return;                                       495     return;
515   }                                               496   }
516                                                   497 
517   G4VModel* model = new G4DigiModel;           << 498   G4DigiModel* model = new G4DigiModel;
518   const G4String& currentSceneName = pScene ->    499   const G4String& currentSceneName = pScene -> GetName ();
519   G4bool successful = pScene -> AddEndOfEventM    500   G4bool successful = pScene -> AddEndOfEventModel (model, warn);
520   if (successful) {                               501   if (successful) {
521     if (verbosity >= G4VisManager::confirmatio    502     if (verbosity >= G4VisManager::confirmations) {
522       G4cout << "Digis, if any, will be drawn     503       G4cout << "Digis, if any, will be drawn at end of run in scene \""
523        << currentSceneName << "\"."               504        << currentSceneName << "\"."
524        << G4endl;                                 505        << G4endl;
525     }                                             506     }
526   }                                               507   }
527   else G4VisCommandsSceneAddUnsuccessful(verbo    508   else G4VisCommandsSceneAddUnsuccessful(verbosity);
528                                                << 509   UpdateVisManagerScene (currentSceneName);
529   CheckSceneAndNotifyHandlers (pScene);        << 
530 }                                              << 
531                                                << 
532 ////////////// /vis/scene/add/electricField // << 
533                                                << 
534 G4VisCommandSceneAddElectricField::G4VisComman << 
535   G4bool omitable;                             << 
536   fpCommand = new G4UIcommand ("/vis/scene/add << 
537   fpCommand -> SetGuidance                     << 
538   ("Adds electric field representation to curr << 
539   fpCommand -> SetGuidance                     << 
540   ("The first parameter is no. of data points  << 
541    "\nmaximum, the number of data points sampl << 
542    "\nlarge--be warned!"                       << 
543    "\nThe default value is 10, i.e., a 21x21x2 << 
544    "\nThat may swamp your view, but usually, a << 
545    "\nthe extent, so it's not a problem. But i << 
546    "\nyou can do:"                             << 
547    "\n- reduce the number of data points per h << 
548    "\n- specify \"lightArrow\" (second paramet << 
549    "\n- restrict the region sampled with \"/vi << 
550    "\n- restrict the drawing to a specific vol << 
551    "\n    \"/vis/set/volumeForField\" or \"/vi << 
552    "\nNote: you might have to deactivate exist << 
553    "\n  \"/vis/scene/activateModel Field false << 
554    "\n  \"/vis/scene/add/...Field\" command ag << 
555   fpCommand -> SetGuidance                     << 
556   ("In the arrow representation, the length of << 
557    "\nto the magnitude of the field and the co << 
558    "\nas a fraction of the maximum magnitude:  << 
559   G4UIparameter* parameter;                    << 
560   parameter = new G4UIparameter ("nDataPointsP << 
561   parameter -> SetDefaultValue (10);           << 
562   fpCommand -> SetParameter (parameter);       << 
563   parameter = new G4UIparameter ("representati << 
564   parameter -> SetParameterCandidates("fullArr << 
565   parameter -> SetDefaultValue ("fullArrow");  << 
566   fpCommand -> SetParameter (parameter);       << 
567 }                                              << 
568                                                << 
569 G4VisCommandSceneAddElectricField::~G4VisComma << 
570   delete fpCommand;                            << 
571 }                                              << 
572                                                << 
573 G4String G4VisCommandSceneAddElectricField::Ge << 
574   return "";                                   << 
575 }                                              << 
576                                                << 
577 void G4VisCommandSceneAddElectricField::SetNew << 
578 (G4UIcommand*, G4String newValue) {            << 
579                                                << 
580   G4VisManager::Verbosity verbosity = fpVisMan << 
581   G4bool warn(verbosity >= G4VisManager::warni << 
582                                                << 
583   G4Scene* pScene = fpVisManager->GetCurrentSc << 
584   if (!pScene) {                               << 
585     if (verbosity >= G4VisManager::errors) {   << 
586       G4warn <<  "ERROR: No current scene.  Pl << 
587     }                                          << 
588     return;                                    << 
589   }                                            << 
590                                                << 
591   G4int nDataPointsPerHalfExtent;              << 
592   G4String representation;                     << 
593   std::istringstream iss(newValue);            << 
594   iss >> nDataPointsPerHalfExtent >> represent << 
595   G4ElectricFieldModel::Representation         << 
596   modelRepresentation = G4ElectricFieldModel:: << 
597   if (representation == "lightArrow") {        << 
598     modelRepresentation = G4ElectricFieldModel << 
599   }                                            << 
600   G4VModel* model;                             << 
601   model = new G4ElectricFieldModel             << 
602   (nDataPointsPerHalfExtent,modelRepresentatio << 
603    fCurrentArrow3DLineSegmentsPerCircle,       << 
604    fCurrentExtentForField,                     << 
605    fCurrrentPVFindingsForField);               << 
606   const G4String& currentSceneName = pScene -> << 
607   G4bool successful = pScene -> AddRunDuration << 
608   if (successful) {                            << 
609     if (verbosity >= G4VisManager::confirmatio << 
610       G4cout                                   << 
611       << "Electric field, if any, will be draw << 
612       << currentSceneName                      << 
613       << "\"\n  with "                         << 
614       << nDataPointsPerHalfExtent              << 
615       << " data points per half extent and wit << 
616       << representation                        << 
617       << '\"'                                  << 
618       << G4endl;                               << 
619     }                                          << 
620   }                                            << 
621   else G4VisCommandsSceneAddUnsuccessful(verbo << 
622                                                << 
623   CheckSceneAndNotifyHandlers (pScene);        << 
624 }                                                 510 }
625                                                   511 
626 ////////////// /vis/scene/add/eventID ////////    512 ////////////// /vis/scene/add/eventID ///////////////////////////////////////
627                                                   513 
628 G4VisCommandSceneAddEventID::G4VisCommandScene    514 G4VisCommandSceneAddEventID::G4VisCommandSceneAddEventID () {
629   G4bool omitable;                                515   G4bool omitable;
630   fpCommand = new G4UIcommand ("/vis/scene/add    516   fpCommand = new G4UIcommand ("/vis/scene/add/eventID", this);
631   fpCommand -> SetGuidance ("Adds eventID to c    517   fpCommand -> SetGuidance ("Adds eventID to current scene.");
632   fpCommand -> SetGuidance                        518   fpCommand -> SetGuidance
633     ("Run and event numbers are drawn at end o    519     ("Run and event numbers are drawn at end of event or run when"
634      "\n the scene in which they are added is     520      "\n the scene in which they are added is current.");
635   G4UIparameter* parameter;                       521   G4UIparameter* parameter;
636   parameter = new G4UIparameter ("size", 'i',     522   parameter = new G4UIparameter ("size", 'i', omitable = true);
637   parameter -> SetGuidance ("Screen size of te    523   parameter -> SetGuidance ("Screen size of text in pixels.");
638   parameter -> SetDefaultValue (18);              524   parameter -> SetDefaultValue (18);
639   fpCommand -> SetParameter (parameter);          525   fpCommand -> SetParameter (parameter);
640   parameter = new G4UIparameter ("x-position",    526   parameter = new G4UIparameter ("x-position", 'd', omitable = true);
641   parameter -> SetGuidance ("x screen position    527   parameter -> SetGuidance ("x screen position in range -1 < x < 1.");
642   parameter -> SetDefaultValue (-0.95);           528   parameter -> SetDefaultValue (-0.95);
643   fpCommand -> SetParameter (parameter);          529   fpCommand -> SetParameter (parameter);
644   parameter = new G4UIparameter ("y-position",    530   parameter = new G4UIparameter ("y-position", 'd', omitable = true);
645   parameter -> SetGuidance ("y screen position    531   parameter -> SetGuidance ("y screen position in range -1 < y < 1.");
646   parameter -> SetDefaultValue (0.9);             532   parameter -> SetDefaultValue (0.9);
647   fpCommand -> SetParameter (parameter);          533   fpCommand -> SetParameter (parameter);
648   parameter = new G4UIparameter ("layout", 's'    534   parameter = new G4UIparameter ("layout", 's', omitable = true);
649   parameter -> SetGuidance ("Layout, i.e., adj    535   parameter -> SetGuidance ("Layout, i.e., adjustment: left|centre|right.");
650   parameter -> SetDefaultValue ("left");          536   parameter -> SetDefaultValue ("left");
651   fpCommand -> SetParameter (parameter);          537   fpCommand -> SetParameter (parameter);
652 }                                                 538 }
653                                                   539 
654 G4VisCommandSceneAddEventID::~G4VisCommandScen    540 G4VisCommandSceneAddEventID::~G4VisCommandSceneAddEventID () {
655   delete fpCommand;                               541   delete fpCommand;
656 }                                                 542 }
657                                                   543 
658 G4String G4VisCommandSceneAddEventID::GetCurre    544 G4String G4VisCommandSceneAddEventID::GetCurrentValue (G4UIcommand*) {
659   return "";                                      545   return "";
660 }                                                 546 }
661                                                   547 
662 void G4VisCommandSceneAddEventID::SetNewValue     548 void G4VisCommandSceneAddEventID::SetNewValue (G4UIcommand*, G4String newValue)
663 {                                                 549 {
664   G4VisManager::Verbosity verbosity = fpVisMan    550   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
665   G4bool warn(verbosity >= G4VisManager::warni    551   G4bool warn(verbosity >= G4VisManager::warnings);
666                                                   552 
667   G4Scene* pScene = fpVisManager->GetCurrentSc    553   G4Scene* pScene = fpVisManager->GetCurrentScene();
668   if (!pScene) {                                  554   if (!pScene) {
669     if (verbosity >= G4VisManager::errors) {      555     if (verbosity >= G4VisManager::errors) {
670       G4warn << "ERROR: No current scene.  Ple << 556       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
671     }                                             557     }
672     return;                                       558     return;
673   }                                               559   }
674                                                   560 
675   G4int size;                                     561   G4int size;
676   G4double x, y;                                  562   G4double x, y;
677   G4String layoutString;                          563   G4String layoutString;
678   std::istringstream is(newValue);                564   std::istringstream is(newValue);
679   is >> size >> x >> y >> layoutString;           565   is >> size >> x >> y >> layoutString;
680                                                   566 
681   G4Text::Layout layout = G4Text::right;          567   G4Text::Layout layout = G4Text::right;
682   if (layoutString[0] == 'l') layout = G4Text: << 568   if (layoutString(0) == 'l') layout = G4Text::left;
683   else if (layoutString[0] == 'c') layout = G4 << 569   else if (layoutString(0) == 'c') layout = G4Text::centre;
684   else if (layoutString[0] == 'r') layout = G4 << 570   else if (layoutString(0) == 'r') layout = G4Text::right;
685                                                << 
686   // For End of Event (only for reviewing kept << 
687   EventID* eoeEventID                          << 
688   = new EventID(forEndOfEvent, fpVisManager, s << 
689   G4VModel* eoeModel =                         << 
690     new G4CallbackModel<G4VisCommandSceneAddEv << 
691   eoeModel->SetType("EoEEventID");             << 
692   eoeModel->SetGlobalTag("EoEEventID");        << 
693   eoeModel->SetGlobalDescription("EoEEventID:  << 
694   G4bool successfulEoE = pScene -> AddEndOfEve << 
695                                                << 
696   // For End of Run                            << 
697   EventID* eorEventID                          << 
698   = new EventID(forEndOfRun, fpVisManager, siz << 
699   G4VModel* eorModel =                         << 
700   new G4CallbackModel<G4VisCommandSceneAddEven << 
701   eorModel->SetType("EoREventID");             << 
702   eorModel->SetGlobalTag("EoREventID");        << 
703   eorModel->SetGlobalDescription("EoREventID:  << 
704   G4bool successfulEoR = pScene -> AddEndOfRun << 
705                                                   571 
706   if (successfulEoE && successfulEoR) {        << 572   EventID* eventID = new EventID(fpVisManager, size, x, y, layout);
                                                   >> 573   G4VModel* model =
                                                   >> 574     new G4CallbackModel<G4VisCommandSceneAddEventID::EventID>(eventID);
                                                   >> 575   model->SetType("EventID");
                                                   >> 576   model->SetGlobalTag("EventID");
                                                   >> 577   model->SetGlobalDescription("EventID");
                                                   >> 578   const G4String& currentSceneName = pScene -> GetName ();
                                                   >> 579   G4bool successful = pScene -> AddEndOfEventModel (model, warn);
                                                   >> 580   if (successful) {
707     if (verbosity >= G4VisManager::confirmatio    581     if (verbosity >= G4VisManager::confirmations) {
708       const G4String& currentSceneName = pScen << 
709       G4cout << "EventID has been added to sce    582       G4cout << "EventID has been added to scene \""
710       << currentSceneName << "\"."             << 583        << currentSceneName << "\"."
711       << G4endl;                               << 584        << G4endl;
712     }                                             585     }
713   }                                               586   }
714   else G4VisCommandsSceneAddUnsuccessful(verbo    587   else G4VisCommandsSceneAddUnsuccessful(verbosity);
715                                                << 588   UpdateVisManagerScene (currentSceneName);
716   CheckSceneAndNotifyHandlers (pScene);        << 
717 }                                                 589 }
718                                                   590 
719 void G4VisCommandSceneAddEventID::EventID::ope    591 void G4VisCommandSceneAddEventID::EventID::operator()
720 (G4VGraphicsScene& sceneHandler, const G4Model << 592   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
721 {                                              << 
722   G4RunManager* runManager = G4RunManagerFacto << 
723   if(!runManager)                              << 
724     return;                                    << 
725                                                << 
726   const G4Run* currentRun = runManager->GetCur << 
727   if (!currentRun) return;                     << 
728                                                << 
729   const G4int currentRunID = currentRun->GetRu << 
730                                                << 
731   std::ostringstream oss;                      << 
732   switch (fForWhat) {                          << 
733     case forEndOfEvent:                        << 
734     {                                          << 
735       // Only use if reviewing kept events     << 
736       if (!fpVisManager->GetReviewingKeptEvent << 
737       const G4Event* currentEvent = mp->GetEve << 
738       if (!currentEvent) return;               << 
739       G4int eventID = currentEvent->GetEventID << 
740       oss << "Run " << currentRunID << " Event << 
741       break;                                   << 
742     }                                          << 
743     case forEndOfRun:                          << 
744     {                                          << 
745       // Only use if NOT reviewing kept events << 
746       if (fpVisManager->GetReviewingKeptEvents << 
747       const G4int nEvents = currentRun->GetNum << 
748       size_t nKeptEvents = (size_t)(currentRun << 
749       oss << "Run " << currentRunID << " (" << << 
750       if (nEvents != 1) oss << 's';            << 
751       oss << ", " << nKeptEvents << " kept)";  << 
752       break;                                   << 
753     }                                          << 
754     default:                                   << 
755       return;                                  << 
756   }                                            << 
757                                                << 
758   G4Text text(oss.str(), G4Point3D(fX, fY, 0.) << 
759   text.SetScreenSize(fSize);                   << 
760   text.SetLayout(fLayout);                     << 
761   G4VisAttributes textAtts(G4Colour(0.,1.,1)); << 
762   text.SetVisAttributes(textAtts);             << 
763   sceneHandler.BeginPrimitives2D();            << 
764   sceneHandler.AddPrimitive(text);             << 
765   sceneHandler.EndPrimitives2D();              << 
766 }                                              << 
767                                                << 
768 ////////////// /vis/scene/add/extent ///////// << 
769                                                << 
770 G4VisCommandSceneAddExtent::G4VisCommandSceneA << 
771   fpCommand = new G4UIcommand("/vis/scene/add/ << 
772   fpCommand -> SetGuidance                     << 
773   ("Adds a dummy model with given extent to th << 
774    "\nRequires the limits: xmin, xmax, ymin, y << 
775    "\nThis can be used to provide an extent to << 
776    "\nno other models with extent are availabl << 
777    "\neven if there is no geometry.  In that c << 
778    "\n  /vis/open OGL"                         << 
779    "\n  /vis/scene/create"                     << 
780    "\n  /vis/scene/add/extent -300 300 -300 30 << 
781    "\n  /vis/sceneHandler/attach");            << 
782   G4bool omitable;                             << 
783   G4UIparameter* parameter;                    << 
784   parameter = new G4UIparameter ("xmin", 'd',  << 
785   parameter -> SetDefaultValue (0.);           << 
786   fpCommand -> SetParameter (parameter);       << 
787   parameter = new G4UIparameter ("xmax", 'd',  << 
788   parameter -> SetDefaultValue (0.);           << 
789   fpCommand -> SetParameter (parameter);       << 
790   parameter = new G4UIparameter ("ymin", 'd',  << 
791   parameter -> SetDefaultValue (0.);           << 
792   fpCommand -> SetParameter (parameter);       << 
793   parameter = new G4UIparameter ("ymax", 'd',  << 
794   parameter -> SetDefaultValue (0.);           << 
795   fpCommand -> SetParameter (parameter);       << 
796   parameter = new G4UIparameter ("zmin", 'd',  << 
797   parameter -> SetDefaultValue (0.);           << 
798   fpCommand -> SetParameter (parameter);       << 
799   parameter = new G4UIparameter ("zmax", 'd',  << 
800   parameter -> SetDefaultValue (0.);           << 
801   fpCommand -> SetParameter (parameter);       << 
802   parameter =  new G4UIparameter ("unit", 's', << 
803   parameter -> SetDefaultValue ("m");          << 
804   fpCommand -> SetParameter (parameter);       << 
805 }                                              << 
806                                                << 
807 G4VisCommandSceneAddExtent::~G4VisCommandScene << 
808   delete fpCommand;                            << 
809 }                                              << 
810                                                << 
811 G4String G4VisCommandSceneAddExtent::GetCurren << 
812   return "";                                   << 
813 }                                              << 
814                                                << 
815 void G4VisCommandSceneAddExtent::SetNewValue ( << 
816 {                                                 593 {
817   G4VisManager::Verbosity verbosity = fpVisMan << 594   const G4Run* currentRun = 0;
818   G4bool warn(verbosity >= G4VisManager::warni << 595   G4RunManager* runManager = G4RunManager::GetRunManager();
819                                                << 596   if (runManager) currentRun = runManager->GetCurrentRun();
820   G4Scene* pScene = fpVisManager->GetCurrentSc << 597 
821   if (!pScene) {                               << 598   G4VModel* model = fpVisManager->GetCurrentSceneHandler()->GetModel();
                                                   >> 599   const G4ModelingParameters* mp = 0;
                                                   >> 600   const G4Event* currentEvent = 0;
                                                   >> 601   if (model) {
                                                   >> 602    mp = model->GetModelingParameters();
                                                   >> 603    currentEvent = mp->GetEvent();
                                                   >> 604   } else {
                                                   >> 605     G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
822     if (verbosity >= G4VisManager::errors) {      606     if (verbosity >= G4VisManager::errors) {
823       G4warn << "ERROR: No current scene.  Ple << 607       G4cout << "ERROR: No model defined for this SceneHandler : "
                                                   >> 608        << fpVisManager->GetCurrentSceneHandler()->GetName()
                                                   >> 609        << G4endl;
824     }                                             610     }
825     return;                                    << 
826   }                                               611   }
827                                                << 612   if (currentRun && currentEvent) {
828   G4double xmin, xmax, ymin, ymax, zmin, zmax; << 613     G4int runID = currentRun->GetRunID();
829   G4String unitString;                         << 614     G4int eventID = currentEvent->GetEventID();
830   std::istringstream is(newValue);             << 615     std::ostringstream oss;
831   is >> xmin >> xmax >> ymin >> ymax >> zmin > << 616     if (fpVisManager->GetCurrentScene()->GetRefreshAtEndOfEvent()) {
832   G4double unit = G4UIcommand::ValueOf(unitStr << 617       oss << "Run " << runID << " Event " << eventID;
833   xmin *= unit; xmax *= unit;                  << 618     } else {
834   ymin *= unit; ymax *= unit;                  << 619       G4int nEvents = 0;
835   zmin *= unit; zmax *= unit;                  << 620       G4StateManager* stateManager = G4StateManager::GetStateManager();
836                                                << 621       G4ApplicationState state = stateManager->GetCurrentState();
837   G4VisExtent visExtent(xmin, xmax, ymin, ymax << 622       if (state == G4State_EventProc) {
838   Extent* extent = new Extent(xmin, xmax, ymin << 623   nEvents = currentRun->GetNumberOfEventToBeProcessed();
839   G4VModel* model =                            << 624       } else {
840   new G4CallbackModel<G4VisCommandSceneAddExte << 625   const std::vector<const G4Event*>* events =
841   model->SetType("Extent");                    << 626     currentRun->GetEventVector();
842   model->SetGlobalTag("Extent");               << 627   if (events) nEvents = events->size();
843   model->SetGlobalDescription("Extent: " + new << 628       }
844   model->SetExtent(visExtent);                 << 629       if (eventID < nEvents - 1) return;  // Not last event.
845   const G4String& currentSceneName = pScene -> << 630       else {
846   G4bool successful = pScene -> AddRunDuration << 631   oss << "Run " << runID << " (" << nEvents << " event";
847   if (successful) {                            << 632   if (nEvents != 1) oss << 's';
848     if (verbosity >= G4VisManager::confirmatio << 633   oss << ')';
849       G4cout << "A benign model with extent "  << 634       }
850       << visExtent                             << 
851       << " has been added to scene \""         << 
852        << currentSceneName << "\"."            << 
853        << G4endl;                              << 
854     }                                             635     }
                                                   >> 636     G4Text text(oss.str(), G4Point3D(fX, fY, 0.));
                                                   >> 637     text.SetScreenSize(fSize);
                                                   >> 638     text.SetLayout(fLayout);
                                                   >> 639     G4VisAttributes textAtts(G4Colour(0.,1.,1));
                                                   >> 640     text.SetVisAttributes(textAtts);
                                                   >> 641     sceneHandler.BeginPrimitives2D();
                                                   >> 642     sceneHandler.AddPrimitive(text);
                                                   >> 643     sceneHandler.EndPrimitives2D();
855   }                                               644   }
856   else G4VisCommandsSceneAddUnsuccessful(verbo << 
857                                                << 
858   CheckSceneAndNotifyHandlers (pScene);        << 
859 }                                                 645 }
860                                                   646 
861 G4VisCommandSceneAddExtent::Extent::Extent     << 
862 (G4double xmin, G4double xmax,                 << 
863  G4double ymin, G4double ymax,                 << 
864  G4double zmin, G4double zmax):                << 
865 fExtent(xmin,xmax,ymin,ymax,zmin,zmax)         << 
866 {}                                             << 
867                                                << 
868 void G4VisCommandSceneAddExtent::Extent::opera << 
869 (G4VGraphicsScene&, const G4ModelingParameters << 
870 {}                                             << 
871                                                << 
872 ////////////// /vis/scene/add/frame //////////    647 ////////////// /vis/scene/add/frame ///////////////////////////////////////
873                                                   648 
874 G4VisCommandSceneAddFrame::G4VisCommandSceneAd    649 G4VisCommandSceneAddFrame::G4VisCommandSceneAddFrame () {
875   fpCommand = new G4UIcommand("/vis/scene/add/    650   fpCommand = new G4UIcommand("/vis/scene/add/frame", this);
876   fpCommand -> SetGuidance ("Add frame to curr << 651   fpCommand -> SetGuidance ("Adds frame to current scene.");
877   G4bool omitable;                                652   G4bool omitable;
878   G4UIparameter* parameter;                       653   G4UIparameter* parameter;
879   parameter = new G4UIparameter ("size", 'd',     654   parameter = new G4UIparameter ("size", 'd', omitable = true);
880   parameter -> SetGuidance ("Size of frame.  1    655   parameter -> SetGuidance ("Size of frame.  1 = full window.");
881   parameter -> SetParameterRange ("size > 0 &&    656   parameter -> SetParameterRange ("size > 0 && size <=1");
882   parameter -> SetDefaultValue (0.97);            657   parameter -> SetDefaultValue (0.97);
883   fpCommand -> SetParameter (parameter);          658   fpCommand -> SetParameter (parameter);
884 }                                                 659 }
885                                                   660 
886 G4VisCommandSceneAddFrame::~G4VisCommandSceneA    661 G4VisCommandSceneAddFrame::~G4VisCommandSceneAddFrame () {
887   delete fpCommand;                               662   delete fpCommand;
888 }                                                 663 }
889                                                   664 
890 G4String G4VisCommandSceneAddFrame::GetCurrent    665 G4String G4VisCommandSceneAddFrame::GetCurrentValue (G4UIcommand*) {
891   return "";                                      666   return "";
892 }                                                 667 }
893                                                   668 
894 void G4VisCommandSceneAddFrame::SetNewValue (G    669 void G4VisCommandSceneAddFrame::SetNewValue (G4UIcommand*, G4String newValue)
895 {                                                 670 {
896   G4VisManager::Verbosity verbosity = fpVisMan    671   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
897   G4bool warn(verbosity >= G4VisManager::warni    672   G4bool warn(verbosity >= G4VisManager::warnings);
898                                                   673 
899   G4Scene* pScene = fpVisManager->GetCurrentSc    674   G4Scene* pScene = fpVisManager->GetCurrentScene();
900   if (!pScene) {                                  675   if (!pScene) {
901     if (verbosity >= G4VisManager::errors) {      676     if (verbosity >= G4VisManager::errors) {
902       G4warn << "ERROR: No current scene.  Ple << 677       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
903     }                                             678     }
904     return;                                       679     return;
905   }                                               680   }
906                                                   681 
907   G4double size;                                  682   G4double size;
908   std::istringstream is(newValue);                683   std::istringstream is(newValue);
909   is >> size;                                     684   is >> size;
910                                                   685 
911   Frame* frame = new Frame(size, fCurrentLineW    686   Frame* frame = new Frame(size, fCurrentLineWidth, fCurrentColour);
912   G4VModel* model =                               687   G4VModel* model =
913     new G4CallbackModel<G4VisCommandSceneAddFr    688     new G4CallbackModel<G4VisCommandSceneAddFrame::Frame>(frame);
914   model->SetType("Frame");                        689   model->SetType("Frame");
915   model->SetGlobalTag("Frame");                   690   model->SetGlobalTag("Frame");
916   model->SetGlobalDescription("Frame: " + newV    691   model->SetGlobalDescription("Frame: " + newValue);
917   const G4String& currentSceneName = pScene ->    692   const G4String& currentSceneName = pScene -> GetName ();
918   G4bool successful = pScene -> AddRunDuration    693   G4bool successful = pScene -> AddRunDurationModel (model, warn);
919   if (successful) {                               694   if (successful) {
920     if (verbosity >= G4VisManager::confirmatio    695     if (verbosity >= G4VisManager::confirmations) {
921       G4cout << "Frame has been added to scene    696       G4cout << "Frame has been added to scene \""
922        << currentSceneName << "\"."               697        << currentSceneName << "\"."
923        << G4endl;                                 698        << G4endl;
924     }                                             699     }
925   }                                               700   }
926   else G4VisCommandsSceneAddUnsuccessful(verbo    701   else G4VisCommandsSceneAddUnsuccessful(verbosity);
927                                                << 702   UpdateVisManagerScene (currentSceneName);
928   CheckSceneAndNotifyHandlers (pScene);        << 
929 }                                                 703 }
930                                                   704 
931 void G4VisCommandSceneAddFrame::Frame::operato    705 void G4VisCommandSceneAddFrame::Frame::operator()
932   (G4VGraphicsScene& sceneHandler, const G4Mod << 706   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
933 {                                                 707 {
934   G4Polyline frame;                               708   G4Polyline frame;
935   frame.push_back(G4Point3D( fSize,  fSize, 0.    709   frame.push_back(G4Point3D( fSize,  fSize, 0.));
936   frame.push_back(G4Point3D(-fSize,  fSize, 0.    710   frame.push_back(G4Point3D(-fSize,  fSize, 0.));
937   frame.push_back(G4Point3D(-fSize, -fSize, 0.    711   frame.push_back(G4Point3D(-fSize, -fSize, 0.));
938   frame.push_back(G4Point3D( fSize, -fSize, 0.    712   frame.push_back(G4Point3D( fSize, -fSize, 0.));
939   frame.push_back(G4Point3D( fSize,  fSize, 0.    713   frame.push_back(G4Point3D( fSize,  fSize, 0.));
940   G4VisAttributes va;                             714   G4VisAttributes va;
941   va.SetLineWidth(fWidth);                        715   va.SetLineWidth(fWidth);
942   va.SetColour(fColour);                          716   va.SetColour(fColour);
943   frame.SetVisAttributes(va);                     717   frame.SetVisAttributes(va);
944   sceneHandler.BeginPrimitives2D();               718   sceneHandler.BeginPrimitives2D();
945   sceneHandler.AddPrimitive(frame);               719   sceneHandler.AddPrimitive(frame);
946   sceneHandler.EndPrimitives2D();                 720   sceneHandler.EndPrimitives2D();
947 }                                                 721 }
948                                                   722 
949 ////////////// /vis/scene/add/gps //////////// << 723 ////////////// /vis/scene/add/ghosts ///////////////////////////////////////
950                                                   724 
951 G4VisCommandSceneAddGPS::G4VisCommandSceneAddG << 725 G4VisCommandSceneAddGhosts::G4VisCommandSceneAddGhosts () {
952   G4bool omitable;                                726   G4bool omitable;
953   G4UIparameter* parameter;                    << 727   fpCommand = new G4UIcmdWithAString ("/vis/scene/add/ghosts", this);
954   fpCommand = new G4UIcommand ("/vis/scene/add << 
955   fpCommand -> SetGuidance                        728   fpCommand -> SetGuidance
956   ("A representation of the source(s) of the G << 729     ("Adds ghost volumes (G4FlavoredParallelWorld) to the current scene.");
957    "\nwill be added to current scene and drawn << 730   fpCommand -> SetGuidance ("Selects by particle.");
958   fpCommand->SetGuidance(ConvertToColourGuidan << 731   fpCommand -> SetParameterName ("particle", omitable = true);
959   fpCommand->SetGuidance("Default: red and tra << 732   fpCommand -> SetDefaultValue ("all");
960   parameter = new G4UIparameter("red_or_string << 
961   parameter -> SetDefaultValue ("1.");         << 
962   fpCommand -> SetParameter (parameter);       << 
963   parameter = new G4UIparameter("green", 'd',  << 
964   parameter -> SetDefaultValue (0.);           << 
965   fpCommand -> SetParameter (parameter);       << 
966   parameter = new G4UIparameter ("blue", 'd',  << 
967   parameter -> SetDefaultValue (0.);           << 
968   fpCommand -> SetParameter (parameter);       << 
969   parameter = new G4UIparameter ("opacity", 'd << 
970   parameter -> SetDefaultValue (0.3);          << 
971   fpCommand -> SetParameter (parameter);       << 
972 }                                                 733 }
973                                                   734 
974 G4VisCommandSceneAddGPS::~G4VisCommandSceneAdd << 735 G4VisCommandSceneAddGhosts::~G4VisCommandSceneAddGhosts () {
975   delete fpCommand;                               736   delete fpCommand;
976 }                                                 737 }
977                                                   738 
978 G4String G4VisCommandSceneAddGPS::GetCurrentVa << 739 G4String G4VisCommandSceneAddGhosts::GetCurrentValue (G4UIcommand*) {
979   return "";                                      740   return "";
980 }                                                 741 }
981                                                   742 
982 void G4VisCommandSceneAddGPS::SetNewValue (G4U << 743 void G4VisCommandSceneAddGhosts::SetNewValue(G4UIcommand*, G4String newValue) {
983                                                   744 
984   G4VisManager::Verbosity verbosity = fpVisMan    745   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
985   G4bool warn(verbosity >= G4VisManager::warni    746   G4bool warn(verbosity >= G4VisManager::warnings);
986                                                   747 
987   G4Scene* pScene = fpVisManager->GetCurrentSc    748   G4Scene* pScene = fpVisManager->GetCurrentScene();
988   if (!pScene) {                                  749   if (!pScene) {
989     if (verbosity >= G4VisManager::errors) {      750     if (verbosity >= G4VisManager::errors) {
990       G4warn << "ERROR: No current scene.  Ple << 751       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
991     }                                             752     }
992     return;                                       753     return;
993   }                                               754   }
994                                                << 
995   G4String redOrString;                        << 
996   G4double green, blue, opacity;               << 
997   std::istringstream iss(newValue);            << 
998   iss >> redOrString >> green >> blue >> opaci << 
999   G4Colour colour(1.,0.,0.,0.3);  // Default r << 
1000   ConvertToColour(colour, redOrString, green, << 
1001                                               << 
1002   G4VModel* model = new G4GPSModel(colour);   << 
1003   const G4String& currentSceneName = pScene -    755   const G4String& currentSceneName = pScene -> GetName ();
1004   G4bool successful = pScene -> AddRunDuratio << 756 
1005   if (successful) {                           << 757   // Gets the G4GlobalFastSimulationManager pointer if any.
1006     if (verbosity >= G4VisManager::confirmati << 758   G4VGlobalFastSimulationManager* theGlobalFastSimulationManager;
1007       G4cout <<                               << 759   if(!(theGlobalFastSimulationManager = 
1008       "A representation of the source(s) of t << 760        G4VGlobalFastSimulationManager::GetConcreteInstance ())){
1009       "\n  in colour " << colour << " for sce << 761     if (verbosity >= G4VisManager::errors) {
1010       << currentSceneName << "\" if applicabl << 762       G4cout << "ERROR: no G4GlobalFastSimulationManager" << G4endl;
1011       << G4endl;                              << 
1012     }                                            763     }
                                                   >> 764     return;
1013   }                                              765   }
1014   else G4VisCommandsSceneAddUnsuccessful(verb << 
1015                                               << 
1016   CheckSceneAndNotifyHandlers (pScene);       << 
1017 }                                             << 
1018                                                  766   
                                                   >> 767   // Gets the G4ParticleTable pointer.
                                                   >> 768   G4ParticleTable* theParticleTable=G4ParticleTable::GetParticleTable();
                                                   >> 769   
                                                   >> 770   // If "all" (the default) loops on all known particles
                                                   >> 771   if(newValue=="all") 
                                                   >> 772     {
                                                   >> 773       G4VFlavoredParallelWorld* CurrentFlavoredWorld = 0;
                                                   >> 774       G4bool successful = false;
                                                   >> 775       for (G4int iParticle=0; iParticle<theParticleTable->entries(); 
                                                   >> 776      iParticle++)
                                                   >> 777   {
                                                   >> 778     CurrentFlavoredWorld = theGlobalFastSimulationManager->
                                                   >> 779       GetFlavoredWorldForThis(theParticleTable->GetParticle(iParticle));
                                                   >> 780     
                                                   >> 781     if(CurrentFlavoredWorld)
                                                   >> 782       successful = successful || pScene -> 
                                                   >> 783         AddRunDurationModel(new G4FlavoredParallelWorldModel 
                                                   >> 784           (CurrentFlavoredWorld), warn);
                                                   >> 785   }
                                                   >> 786       if (successful) 
                                                   >> 787   {
                                                   >> 788     if (verbosity >= G4VisManager::confirmations) 
                                                   >> 789       G4cout << "Ghosts have been added to scene \""
                                                   >> 790        << currentSceneName << "\"."
                                                   >> 791        << G4endl;
                                                   >> 792     UpdateVisManagerScene (currentSceneName);
                                                   >> 793   }
                                                   >> 794       else 
                                                   >> 795   {
                                                   >> 796     G4cout << "ERROR: There are no ghosts."<<G4endl;
                                                   >> 797     G4VisCommandsSceneAddUnsuccessful(verbosity);
                                                   >> 798   }
                                                   >> 799       return;
                                                   >> 800     }
                                                   >> 801   
                                                   >> 802   // Given a particle name looks just for the concerned Ghosts, if any.
                                                   >> 803   G4ParticleDefinition* currentParticle = 
                                                   >> 804     theParticleTable->FindParticle(newValue);
                                                   >> 805   
                                                   >> 806   if (currentParticle == NULL) 
                                                   >> 807     {
                                                   >> 808       if (verbosity >= G4VisManager::errors) 
                                                   >> 809   G4cout << "ERROR: \"" << newValue
                                                   >> 810          << "\": not found this particle name!" << G4endl;
                                                   >> 811       return;
                                                   >> 812     }
                                                   >> 813   
                                                   >> 814   G4VFlavoredParallelWorld* worldForThis =
                                                   >> 815     theGlobalFastSimulationManager->GetFlavoredWorldForThis(currentParticle);
                                                   >> 816   if(worldForThis) 
                                                   >> 817     {
                                                   >> 818       G4bool successful = pScene -> AddRunDurationModel
                                                   >> 819   (new G4FlavoredParallelWorldModel (worldForThis), warn);
                                                   >> 820       if (successful) {
                                                   >> 821   if (verbosity >= G4VisManager::confirmations) 
                                                   >> 822     G4cout << "Ghosts have been added to scene \""
                                                   >> 823      << currentSceneName << "\"."
                                                   >> 824      << G4endl;
                                                   >> 825   UpdateVisManagerScene (currentSceneName);
                                                   >> 826       }
                                                   >> 827     }
                                                   >> 828   else 
                                                   >> 829     if (verbosity >= G4VisManager::errors) 
                                                   >> 830       {
                                                   >> 831   G4cout << "ERROR: There are no ghosts for \""<<newValue<<"\""<<G4endl;
                                                   >> 832   G4VisCommandsSceneAddUnsuccessful(verbosity);
                                                   >> 833       }
                                                   >> 834 }
                                                   >> 835 
                                                   >> 836 
1019 ////////////// /vis/scene/add/hits //////////    837 ////////////// /vis/scene/add/hits ///////////////////////////////////////
1020                                                  838 
1021 G4VisCommandSceneAddHits::G4VisCommandSceneAd    839 G4VisCommandSceneAddHits::G4VisCommandSceneAddHits () {
1022   fpCommand = new G4UIcmdWithoutParameter ("/    840   fpCommand = new G4UIcmdWithoutParameter ("/vis/scene/add/hits", this);
1023   fpCommand -> SetGuidance ("Adds hits to cur    841   fpCommand -> SetGuidance ("Adds hits to current scene.");
1024   fpCommand -> SetGuidance                       842   fpCommand -> SetGuidance
1025     ("Hits are drawn at end of event when the    843     ("Hits are drawn at end of event when the scene in which"
1026      "\nthey are added is current.");            844      "\nthey are added is current.");
1027 }                                                845 }
1028                                                  846 
1029 G4VisCommandSceneAddHits::~G4VisCommandSceneA    847 G4VisCommandSceneAddHits::~G4VisCommandSceneAddHits () {
1030   delete fpCommand;                              848   delete fpCommand;
1031 }                                                849 }
1032                                                  850 
1033 G4String G4VisCommandSceneAddHits::GetCurrent    851 G4String G4VisCommandSceneAddHits::GetCurrentValue (G4UIcommand*) {
1034   return "";                                     852   return "";
1035 }                                                853 }
1036                                                  854 
1037 void G4VisCommandSceneAddHits::SetNewValue (G    855 void G4VisCommandSceneAddHits::SetNewValue (G4UIcommand*, G4String) {
1038                                                  856 
1039   G4VisManager::Verbosity verbosity = fpVisMa    857   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1040   G4bool warn(verbosity >= G4VisManager::warn    858   G4bool warn(verbosity >= G4VisManager::warnings);
1041                                                  859 
1042   G4Scene* pScene = fpVisManager->GetCurrentS    860   G4Scene* pScene = fpVisManager->GetCurrentScene();
1043   if (!pScene) {                                 861   if (!pScene) {
1044     if (verbosity >= G4VisManager::errors) {     862     if (verbosity >= G4VisManager::errors) {
1045       G4warn << "ERROR: No current scene.  Pl << 863       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1046     }                                            864     }
1047     return;                                      865     return;
1048   }                                              866   }
1049                                                  867 
1050   G4VModel* model = new G4HitsModel;          << 868   G4HitsModel* model = new G4HitsModel;
1051   const G4String& currentSceneName = pScene -    869   const G4String& currentSceneName = pScene -> GetName ();
1052   G4bool successful = pScene -> AddEndOfEvent    870   G4bool successful = pScene -> AddEndOfEventModel (model, warn);
1053   if (successful) {                              871   if (successful) {
1054     if (verbosity >= G4VisManager::confirmati    872     if (verbosity >= G4VisManager::confirmations) {
1055       G4cout << "Hits, if any, will be drawn     873       G4cout << "Hits, if any, will be drawn at end of run in scene \""
1056        << currentSceneName << "\"."              874        << currentSceneName << "\"."
1057        << G4endl;                                875        << G4endl;
1058     }                                            876     }
1059   }                                              877   }
1060   else G4VisCommandsSceneAddUnsuccessful(verb    878   else G4VisCommandsSceneAddUnsuccessful(verbosity);
1061                                               << 879   UpdateVisManagerScene (currentSceneName);
1062   CheckSceneAndNotifyHandlers (pScene);       << 
1063 }                                                880 }
1064                                                  881 
1065 ////////////// /vis/scene/add/line //////////    882 ////////////// /vis/scene/add/line ///////////////////////////////////////
1066                                                  883 
1067 G4VisCommandSceneAddLine::G4VisCommandSceneAd    884 G4VisCommandSceneAddLine::G4VisCommandSceneAddLine () {
1068   fpCommand = new G4UIcommand("/vis/scene/add    885   fpCommand = new G4UIcommand("/vis/scene/add/line", this);
1069   fpCommand -> SetGuidance ("Adds line to cur    886   fpCommand -> SetGuidance ("Adds line to current scene.");
1070   G4bool omitable;                               887   G4bool omitable;
1071   G4UIparameter* parameter;                      888   G4UIparameter* parameter;
1072   parameter = new G4UIparameter ("x1", 'd', o    889   parameter = new G4UIparameter ("x1", 'd', omitable = false);
1073   fpCommand -> SetParameter (parameter);         890   fpCommand -> SetParameter (parameter);
1074   parameter = new G4UIparameter ("y1", 'd', o    891   parameter = new G4UIparameter ("y1", 'd', omitable = false);
1075   fpCommand -> SetParameter (parameter);         892   fpCommand -> SetParameter (parameter);
1076   parameter = new G4UIparameter ("z1", 'd', o    893   parameter = new G4UIparameter ("z1", 'd', omitable = false);
1077   fpCommand -> SetParameter (parameter);         894   fpCommand -> SetParameter (parameter);
1078   parameter = new G4UIparameter ("x2", 'd', o    895   parameter = new G4UIparameter ("x2", 'd', omitable = false);
1079   fpCommand -> SetParameter (parameter);         896   fpCommand -> SetParameter (parameter);
1080   parameter = new G4UIparameter ("y2", 'd', o    897   parameter = new G4UIparameter ("y2", 'd', omitable = false);
1081   fpCommand -> SetParameter (parameter);         898   fpCommand -> SetParameter (parameter);
1082   parameter = new G4UIparameter ("z2", 'd', o    899   parameter = new G4UIparameter ("z2", 'd', omitable = false);
1083   fpCommand -> SetParameter (parameter);         900   fpCommand -> SetParameter (parameter);
1084   parameter =  new G4UIparameter ("unit", 's'    901   parameter =  new G4UIparameter ("unit", 's', omitable = true);
1085   parameter->SetDefaultValue ("m");              902   parameter->SetDefaultValue ("m");
1086   fpCommand->SetParameter    (parameter);        903   fpCommand->SetParameter    (parameter);
1087 }                                                904 }
1088                                                  905 
1089 G4VisCommandSceneAddLine::~G4VisCommandSceneA    906 G4VisCommandSceneAddLine::~G4VisCommandSceneAddLine () {
1090   delete fpCommand;                              907   delete fpCommand;
1091 }                                                908 }
1092                                                  909 
1093 G4String G4VisCommandSceneAddLine::GetCurrent    910 G4String G4VisCommandSceneAddLine::GetCurrentValue (G4UIcommand*) {
1094   return "";                                     911   return "";
1095 }                                                912 }
1096                                                  913 
1097 void G4VisCommandSceneAddLine::SetNewValue (G    914 void G4VisCommandSceneAddLine::SetNewValue (G4UIcommand*, G4String newValue)
1098 {                                                915 {
1099   G4VisManager::Verbosity verbosity = fpVisMa    916   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1100   G4bool warn(verbosity >= G4VisManager::warn    917   G4bool warn(verbosity >= G4VisManager::warnings);
1101                                                  918 
1102   G4Scene* pScene = fpVisManager->GetCurrentS    919   G4Scene* pScene = fpVisManager->GetCurrentScene();
1103   if (!pScene) {                                 920   if (!pScene) {
1104     if (verbosity >= G4VisManager::errors) {     921     if (verbosity >= G4VisManager::errors) {
1105       G4warn << "ERROR: No current scene.  Pl << 922       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1106     }                                            923     }
1107     return;                                      924     return;
1108   }                                              925   }
1109                                                  926 
1110   G4String unitString;                           927   G4String unitString;
1111   G4double x1, y1, z1, x2, y2, z2;               928   G4double x1, y1, z1, x2, y2, z2;
1112   std::istringstream is(newValue);               929   std::istringstream is(newValue);
1113   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> u    930   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> unitString;
1114   G4double unit = G4UIcommand::ValueOf(unitSt    931   G4double unit = G4UIcommand::ValueOf(unitString);
1115   x1 *= unit; y1 *= unit; z1 *= unit;            932   x1 *= unit; y1 *= unit; z1 *= unit;
1116   x2 *= unit; y2 *= unit; z2 *= unit;            933   x2 *= unit; y2 *= unit; z2 *= unit;
1117                                                  934 
1118   Line* line = new Line(x1, y1, z1, x2, y2, z    935   Line* line = new Line(x1, y1, z1, x2, y2, z2,
1119       fCurrentLineWidth, fCurrentColour);        936       fCurrentLineWidth, fCurrentColour);
1120   G4VModel* model =                              937   G4VModel* model =
1121     new G4CallbackModel<G4VisCommandSceneAddL    938     new G4CallbackModel<G4VisCommandSceneAddLine::Line>(line);
1122   model->SetType("Line");                        939   model->SetType("Line");
1123   model->SetGlobalTag("Line");                   940   model->SetGlobalTag("Line");
1124   model->SetGlobalDescription("Line: " + newV    941   model->SetGlobalDescription("Line: " + newValue);
1125   const G4String& currentSceneName = pScene -    942   const G4String& currentSceneName = pScene -> GetName ();
1126   G4bool successful = pScene -> AddRunDuratio    943   G4bool successful = pScene -> AddRunDurationModel (model, warn);
1127   if (successful) {                              944   if (successful) {
1128     if (verbosity >= G4VisManager::confirmati    945     if (verbosity >= G4VisManager::confirmations) {
1129       G4cout << "Line has been added to scene    946       G4cout << "Line has been added to scene \""
1130        << currentSceneName << "\"."              947        << currentSceneName << "\"."
1131        << G4endl;                                948        << G4endl;
1132     }                                            949     }
1133   }                                              950   }
1134   else G4VisCommandsSceneAddUnsuccessful(verb    951   else G4VisCommandsSceneAddUnsuccessful(verbosity);
1135                                               << 952   UpdateVisManagerScene (currentSceneName);
1136   CheckSceneAndNotifyHandlers (pScene);       << 
1137 }                                                953 }
1138                                                  954 
1139 G4VisCommandSceneAddLine::Line::Line             955 G4VisCommandSceneAddLine::Line::Line
1140 (G4double x1, G4double y1, G4double z1,          956 (G4double x1, G4double y1, G4double z1,
1141  G4double x2, G4double y2, G4double z2,          957  G4double x2, G4double y2, G4double z2,
1142  G4double width, const G4Colour& colour):        958  G4double width, const G4Colour& colour):
1143   fWidth(width), fColour(colour)                 959   fWidth(width), fColour(colour)
1144 {                                                960 {
1145   fPolyline.push_back(G4Point3D(x1,y1,z1));      961   fPolyline.push_back(G4Point3D(x1,y1,z1));
1146   fPolyline.push_back(G4Point3D(x2,y2,z2));      962   fPolyline.push_back(G4Point3D(x2,y2,z2));
1147   G4VisAttributes va;                            963   G4VisAttributes va;
1148   va.SetLineWidth(fWidth);                       964   va.SetLineWidth(fWidth);
1149   va.SetColour(fColour);                         965   va.SetColour(fColour);
1150   fPolyline.SetVisAttributes(va);                966   fPolyline.SetVisAttributes(va);
1151 }                                                967 }
1152                                                  968 
1153 void G4VisCommandSceneAddLine::Line::operator    969 void G4VisCommandSceneAddLine::Line::operator()
1154   (G4VGraphicsScene& sceneHandler, const G4Mo << 970   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
1155 {                                                971 {
1156   sceneHandler.BeginPrimitives();                972   sceneHandler.BeginPrimitives();
1157   sceneHandler.AddPrimitive(fPolyline);          973   sceneHandler.AddPrimitive(fPolyline);
1158   sceneHandler.EndPrimitives();                  974   sceneHandler.EndPrimitives();
1159 }                                                975 }
1160                                                  976 
1161 ////////////// /vis/scene/add/line2D ////////    977 ////////////// /vis/scene/add/line2D ///////////////////////////////////////
1162                                                  978 
1163 G4VisCommandSceneAddLine2D::G4VisCommandScene    979 G4VisCommandSceneAddLine2D::G4VisCommandSceneAddLine2D () {
1164   fpCommand = new G4UIcommand("/vis/scene/add    980   fpCommand = new G4UIcommand("/vis/scene/add/line2D", this);
1165   fpCommand -> SetGuidance ("Adds 2D line to     981   fpCommand -> SetGuidance ("Adds 2D line to current scene.");
1166   fpCommand -> SetGuidance ("x,y in range [-1 << 
1167   G4bool omitable;                               982   G4bool omitable;
1168   G4UIparameter* parameter;                      983   G4UIparameter* parameter;
1169   parameter = new G4UIparameter ("x1", 'd', o    984   parameter = new G4UIparameter ("x1", 'd', omitable = false);
1170   fpCommand -> SetParameter (parameter);         985   fpCommand -> SetParameter (parameter);
1171   parameter = new G4UIparameter ("y1", 'd', o    986   parameter = new G4UIparameter ("y1", 'd', omitable = false);
1172   fpCommand -> SetParameter (parameter);         987   fpCommand -> SetParameter (parameter);
1173   parameter = new G4UIparameter ("x2", 'd', o    988   parameter = new G4UIparameter ("x2", 'd', omitable = false);
1174   fpCommand -> SetParameter (parameter);         989   fpCommand -> SetParameter (parameter);
1175   parameter = new G4UIparameter ("y2", 'd', o    990   parameter = new G4UIparameter ("y2", 'd', omitable = false);
1176   fpCommand -> SetParameter (parameter);         991   fpCommand -> SetParameter (parameter);
1177 }                                                992 }
1178                                                  993 
1179 G4VisCommandSceneAddLine2D::~G4VisCommandScen    994 G4VisCommandSceneAddLine2D::~G4VisCommandSceneAddLine2D () {
1180   delete fpCommand;                              995   delete fpCommand;
1181 }                                                996 }
1182                                                  997 
1183 G4String G4VisCommandSceneAddLine2D::GetCurre    998 G4String G4VisCommandSceneAddLine2D::GetCurrentValue (G4UIcommand*) {
1184   return "";                                     999   return "";
1185 }                                                1000 }
1186                                                  1001 
1187 void G4VisCommandSceneAddLine2D::SetNewValue     1002 void G4VisCommandSceneAddLine2D::SetNewValue (G4UIcommand*, G4String newValue)
1188 {                                                1003 {
1189   G4VisManager::Verbosity verbosity = fpVisMa    1004   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1190   G4bool warn(verbosity >= G4VisManager::warn    1005   G4bool warn(verbosity >= G4VisManager::warnings);
1191                                                  1006 
1192   G4Scene* pScene = fpVisManager->GetCurrentS    1007   G4Scene* pScene = fpVisManager->GetCurrentScene();
1193   if (!pScene) {                                 1008   if (!pScene) {
1194     if (verbosity >= G4VisManager::errors) {     1009     if (verbosity >= G4VisManager::errors) {
1195       G4warn << "ERROR: No current scene.  Pl << 1010       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1196     }                                            1011     }
1197     return;                                      1012     return;
1198   }                                              1013   }
1199                                                  1014 
1200   G4double x1, y1, x2, y2;                       1015   G4double x1, y1, x2, y2;
1201   std::istringstream is(newValue);               1016   std::istringstream is(newValue);
1202   is >> x1 >> y1 >> x2 >> y2;                    1017   is >> x1 >> y1 >> x2 >> y2;
1203                                                  1018 
1204   Line2D* line2D = new Line2D                    1019   Line2D* line2D = new Line2D
1205     (x1, y1, x2, y2, fCurrentLineWidth, fCurr    1020     (x1, y1, x2, y2, fCurrentLineWidth, fCurrentColour);
1206   G4VModel* model =                              1021   G4VModel* model =
1207     new G4CallbackModel<G4VisCommandSceneAddL    1022     new G4CallbackModel<G4VisCommandSceneAddLine2D::Line2D>(line2D);
1208   model->SetType("Line2D");                      1023   model->SetType("Line2D");
1209   model->SetGlobalTag("Line2D");                 1024   model->SetGlobalTag("Line2D");
1210   model->SetGlobalDescription("Line2D: " + ne    1025   model->SetGlobalDescription("Line2D: " + newValue);
1211   const G4String& currentSceneName = pScene -    1026   const G4String& currentSceneName = pScene -> GetName ();
1212   G4bool successful = pScene -> AddRunDuratio    1027   G4bool successful = pScene -> AddRunDurationModel (model, warn);
1213   if (successful) {                              1028   if (successful) {
1214     if (verbosity >= G4VisManager::confirmati    1029     if (verbosity >= G4VisManager::confirmations) {
1215       G4cout << "A 2D line has been added to     1030       G4cout << "A 2D line has been added to scene \""
1216        << currentSceneName << "\"."              1031        << currentSceneName << "\"."
1217        << G4endl;                                1032        << G4endl;
1218     }                                            1033     }
1219   }                                              1034   }
1220   else G4VisCommandsSceneAddUnsuccessful(verb    1035   else G4VisCommandsSceneAddUnsuccessful(verbosity);
1221                                               << 1036   UpdateVisManagerScene (currentSceneName);
1222   CheckSceneAndNotifyHandlers (pScene);       << 
1223 }                                                1037 }
1224                                                  1038 
1225 G4VisCommandSceneAddLine2D::Line2D::Line2D       1039 G4VisCommandSceneAddLine2D::Line2D::Line2D
1226 (G4double x1, G4double y1,                       1040 (G4double x1, G4double y1,
1227  G4double x2, G4double y2,                       1041  G4double x2, G4double y2,
1228  G4double width, const G4Colour& colour):        1042  G4double width, const G4Colour& colour):
1229   fWidth(width), fColour(colour)                 1043   fWidth(width), fColour(colour)
1230 {                                                1044 {
1231   fPolyline.push_back(G4Point3D(x1,y1,0));       1045   fPolyline.push_back(G4Point3D(x1,y1,0));
1232   fPolyline.push_back(G4Point3D(x2,y2,0));       1046   fPolyline.push_back(G4Point3D(x2,y2,0));
1233   G4VisAttributes va;                            1047   G4VisAttributes va;
1234   va.SetLineWidth(fWidth);                       1048   va.SetLineWidth(fWidth);
1235   va.SetColour(fColour);                         1049   va.SetColour(fColour);
1236   fPolyline.SetVisAttributes(va);                1050   fPolyline.SetVisAttributes(va);
1237 }                                                1051 }
1238                                                  1052 
1239 void G4VisCommandSceneAddLine2D::Line2D::oper    1053 void G4VisCommandSceneAddLine2D::Line2D::operator()
1240   (G4VGraphicsScene& sceneHandler, const G4Mo << 1054   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
1241 {                                                1055 {
1242   sceneHandler.BeginPrimitives2D();              1056   sceneHandler.BeginPrimitives2D();
1243   sceneHandler.AddPrimitive(fPolyline);          1057   sceneHandler.AddPrimitive(fPolyline);
1244   sceneHandler.EndPrimitives2D();                1058   sceneHandler.EndPrimitives2D();
1245 }                                                1059 }
1246                                                  1060 
1247 ////////////// /vis/scene/add/localAxes ///// << 
1248                                               << 
1249 G4VisCommandSceneAddLocalAxes::G4VisCommandSc << 
1250   G4bool omitable;                            << 
1251   fpCommand = new G4UIcommand ("/vis/scene/ad << 
1252   fpCommand -> SetGuidance                    << 
1253   ("Adds local axes to physical volume(s)."); << 
1254   G4UIparameter* parameter;                   << 
1255   parameter = new G4UIparameter ("physical-vo << 
1256   fpCommand -> SetParameter (parameter);      << 
1257   parameter = new G4UIparameter ("copy-no", ' << 
1258   parameter -> SetGuidance ("If negative, mat << 
1259   parameter -> SetDefaultValue (-1);          << 
1260   fpCommand -> SetParameter (parameter);      << 
1261 }                                             << 
1262                                               << 
1263 G4VisCommandSceneAddLocalAxes::~G4VisCommandS << 
1264   delete fpCommand;                           << 
1265 }                                             << 
1266                                               << 
1267 G4String G4VisCommandSceneAddLocalAxes::GetCu << 
1268   return "world 0 -1";                        << 
1269 }                                             << 
1270                                               << 
1271 void G4VisCommandSceneAddLocalAxes::SetNewVal << 
1272              G4String newValue) {             << 
1273                                               << 
1274   G4VisManager::Verbosity verbosity = fpVisMa << 
1275   G4bool warn = verbosity >= G4VisManager::wa << 
1276                                               << 
1277   G4Scene* pScene = fpVisManager->GetCurrentS << 
1278   if (!pScene) {                              << 
1279     if (verbosity >= G4VisManager::errors) {  << 
1280       G4warn << "ERROR: No current scene.  Pl << 
1281     }                                         << 
1282     return;                                   << 
1283   }                                           << 
1284                                               << 
1285   G4String name;                              << 
1286   G4int copyNo;                               << 
1287   std::istringstream is (newValue);           << 
1288   is >> name >> copyNo;                       << 
1289                                               << 
1290   std::vector<G4PhysicalVolumesSearchScene::F << 
1291                                               << 
1292   // Search all worlds...                     << 
1293   G4TransportationManager* transportationMana << 
1294   G4TransportationManager::GetTransportationM << 
1295   std::vector<G4VPhysicalVolume*>::iterator i << 
1296   transportationManager->GetWorldsIterator(); << 
1297   size_t nWorlds = transportationManager->Get << 
1298   for (size_t i = 0; i < nWorlds; ++i, ++iter << 
1299     G4ModelingParameters mp;  // Default - no << 
1300     G4PhysicalVolumeModel searchModel         << 
1301     (*iterWorld,                              << 
1302      G4PhysicalVolumeModel::UNLIMITED,        << 
1303      G4Transform3D(),                         << 
1304      &mp,                                     << 
1305      true);  // Use full extent (avoids initi << 
1306     G4PhysicalVolumesSearchScene searchScene  << 
1307     (&searchModel, name, copyNo);             << 
1308     searchModel.DescribeYourselfTo (searchSce << 
1309     for (const auto& findings: searchScene.Ge << 
1310       findingsVector.push_back(findings);     << 
1311     }                                         << 
1312   }                                           << 
1313                                               << 
1314   G4int id = 0;  // To distinguish axes model << 
1315   for (const auto& findings: findingsVector)  << 
1316                                               << 
1317     // Create axes model based on size and tr << 
1318     const auto& extent = findings.fpFoundPV-> << 
1319     const auto& transform = findings.fFoundOb << 
1320                                               << 
1321     const G4double lengthMax = extent.GetExte << 
1322     const G4double intLog10LengthMax = std::f << 
1323     G4double length = std::pow(10,intLog10Len << 
1324     if (5.*length < lengthMax) length *= 5.;  << 
1325     else if (2.*length < lengthMax) length *= << 
1326                                               << 
1327     const auto& axesModel = new G4AxesModel(0 << 
1328     axesModel->SetGlobalTag("LocalAxesModel") << 
1329     std::ostringstream oss; oss               << 
1330     << "Local Axes for " << findings.fpFoundP << 
1331     << ':' << findings.fFoundPVCopyNo << ':'  << 
1332     axesModel->SetGlobalDescription(oss.str() << 
1333     // ...so add it to the scene.             << 
1334     G4bool successful = pScene->AddRunDuratio << 
1335     if (successful) {                         << 
1336       if (verbosity >= G4VisManager::confirma << 
1337   G4cout << "\"" << findings.fpFoundPV->GetNa << 
1338   << "\", copy no. " << findings.fFoundPVCopy << 
1339   << ",\n  found in searched volume \""       << 
1340   << findings.fpSearchPV->GetName()           << 
1341   << "\" at depth " << findings.fFoundDepth   << 
1342   << ",\n  base path: \"" << findings.fFoundB << 
1343   << "\".\n  Local axes have been added to sc << 
1344   << pScene->GetName() << "\".";              << 
1345   if (verbosity >= G4VisManager::parameters)  << 
1346     G4cout << "  With extent " << extent      << 
1347     << "\n  at " << transform.getRotation()   << 
1348     << "  " << transform.getTranslation();    << 
1349   }                                           << 
1350   G4cout << G4endl;                           << 
1351       }                                       << 
1352     } else {                                  << 
1353       G4VisCommandsSceneAddUnsuccessful(verbo << 
1354     }                                         << 
1355   }                                           << 
1356                                               << 
1357   if (findingsVector.empty()) {               << 
1358     if (verbosity >= G4VisManager::errors) {  << 
1359       G4warn << "ERROR: Volume \"" << name << << 
1360       if (copyNo >= 0) {                      << 
1361   G4warn << ", copy no. " << copyNo << ",";   << 
1362       }                                       << 
1363       G4warn << " not found." << G4endl;      << 
1364     }                                         << 
1365     G4VisCommandsSceneAddUnsuccessful(verbosi << 
1366     return;                                   << 
1367   }                                           << 
1368                                               << 
1369   CheckSceneAndNotifyHandlers(pScene);        << 
1370 }                                             << 
1371                                               << 
1372 ////////////// /vis/scene/add/logicalVolume /    1061 ////////////// /vis/scene/add/logicalVolume //////////////////////////////////
1373                                                  1062 
1374 G4VisCommandSceneAddLogicalVolume::G4VisComma    1063 G4VisCommandSceneAddLogicalVolume::G4VisCommandSceneAddLogicalVolume () {
1375   G4bool omitable;                               1064   G4bool omitable;
1376   fpCommand = new G4UIcommand ("/vis/scene/ad    1065   fpCommand = new G4UIcommand ("/vis/scene/add/logicalVolume", this);
1377   fpCommand -> SetGuidance ("Adds a logical v    1066   fpCommand -> SetGuidance ("Adds a logical volume to the current scene,");
1378   fpCommand -> SetGuidance                       1067   fpCommand -> SetGuidance
1379   ("Shows boolean components (if any), voxels << 1068     ("Shows boolean components (if any), voxels (if any) and readout geometry"
1380    "\n  (if any), local axes and overlaps (if << 1069      "\n(if any).  Note: voxels are not constructed until start of run -"
1381    "\n  appropriate flag."                    << 1070      "\n \"/run/beamOn\".");
1382    "\n  Note: voxels are not constructed unti << 
1383    "\n \"/run/beamOn\".  (For voxels without  << 
1384   G4UIparameter* parameter;                      1071   G4UIparameter* parameter;
1385   parameter = new G4UIparameter ("logical-vol    1072   parameter = new G4UIparameter ("logical-volume-name", 's', omitable = false);
1386   fpCommand -> SetParameter (parameter);         1073   fpCommand -> SetParameter (parameter);
1387   parameter = new G4UIparameter ("depth-of-de    1074   parameter = new G4UIparameter ("depth-of-descent", 'i', omitable = true);
1388   parameter -> SetGuidance ("Depth of descent    1075   parameter -> SetGuidance ("Depth of descent of geometry hierarchy.");
1389   parameter -> SetDefaultValue (1);              1076   parameter -> SetDefaultValue (1);
1390   fpCommand -> SetParameter (parameter);         1077   fpCommand -> SetParameter (parameter);
1391   parameter = new G4UIparameter ("booleans-fl    1078   parameter = new G4UIparameter ("booleans-flag", 'b', omitable = true);
1392   parameter -> SetDefaultValue (true);           1079   parameter -> SetDefaultValue (true);
1393   fpCommand -> SetParameter (parameter);         1080   fpCommand -> SetParameter (parameter);
1394   parameter = new G4UIparameter ("voxels-flag    1081   parameter = new G4UIparameter ("voxels-flag", 'b', omitable = true);
1395   parameter -> SetDefaultValue (true);           1082   parameter -> SetDefaultValue (true);
1396   fpCommand -> SetParameter (parameter);         1083   fpCommand -> SetParameter (parameter);
1397   parameter = new G4UIparameter ("readout-fla    1084   parameter = new G4UIparameter ("readout-flag", 'b', omitable = true);
1398   parameter -> SetDefaultValue (true);           1085   parameter -> SetDefaultValue (true);
1399   fpCommand -> SetParameter (parameter);         1086   fpCommand -> SetParameter (parameter);
1400   parameter = new G4UIparameter ("axes-flag", << 
1401   parameter -> SetDefaultValue (true);        << 
1402   parameter -> SetGuidance ("Set \"false\" to << 
1403   fpCommand -> SetParameter (parameter);      << 
1404   parameter = new G4UIparameter("check-overla << 
1405   parameter->SetDefaultValue(true);           << 
1406   parameter -> SetGuidance ("Set \"false\" to << 
1407   fpCommand->SetParameter(parameter);         << 
1408 }                                                1087 }
1409                                                  1088 
1410 G4VisCommandSceneAddLogicalVolume::~G4VisComm    1089 G4VisCommandSceneAddLogicalVolume::~G4VisCommandSceneAddLogicalVolume () {
1411   delete fpCommand;                              1090   delete fpCommand;
1412 }                                                1091 }
1413                                                  1092 
1414 G4String G4VisCommandSceneAddLogicalVolume::G    1093 G4String G4VisCommandSceneAddLogicalVolume::GetCurrentValue (G4UIcommand*) {
1415   return "";                                     1094   return "";
1416 }                                                1095 }
1417                                                  1096 
1418 void G4VisCommandSceneAddLogicalVolume::SetNe    1097 void G4VisCommandSceneAddLogicalVolume::SetNewValue (G4UIcommand*,
1419                  G4String newValue) {            1098                  G4String newValue) {
1420                                                  1099 
1421   G4VisManager::Verbosity verbosity = fpVisMa    1100   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1422   G4bool warn(verbosity >= G4VisManager::warn    1101   G4bool warn(verbosity >= G4VisManager::warnings);
1423                                                  1102 
1424   G4Scene* pScene = fpVisManager->GetCurrentS    1103   G4Scene* pScene = fpVisManager->GetCurrentScene();
1425   if (!pScene) {                                 1104   if (!pScene) {
1426     if (verbosity >= G4VisManager::errors) {     1105     if (verbosity >= G4VisManager::errors) {
1427       G4warn << "ERROR: No current scene.  Pl << 1106       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1428     }                                            1107     }
1429     return;                                      1108     return;
1430   }                                              1109   }
1431                                                  1110 
1432   G4String name;                                 1111   G4String name;
1433   G4int requestedDepthOfDescent;                 1112   G4int requestedDepthOfDescent;
1434   G4String booleansString, voxelsString, read << 1113   G4String booleansString, voxelsString, readoutString;
1435   G4String overlapString;                     << 
1436   std::istringstream is (newValue);              1114   std::istringstream is (newValue);
1437   is >> name >> requestedDepthOfDescent          1115   is >> name >> requestedDepthOfDescent
1438      >>  booleansString >> voxelsString >> re << 1116      >>  booleansString >> voxelsString >> readoutString;
1439      >> overlapString;                        << 
1440   G4bool booleans = G4UIcommand::ConvertToBoo    1117   G4bool booleans = G4UIcommand::ConvertToBool(booleansString);
1441   G4bool voxels = G4UIcommand::ConvertToBool(    1118   G4bool voxels = G4UIcommand::ConvertToBool(voxelsString);
1442   G4bool readout = G4UIcommand::ConvertToBool    1119   G4bool readout = G4UIcommand::ConvertToBool(readoutString);
1443   G4bool axes = G4UIcommand::ConvertToBool(ax << 
1444   G4bool checkOverlaps = G4UIcommand::Convert << 
1445                                                  1120 
1446   G4LogicalVolumeStore *pLVStore = G4LogicalV    1121   G4LogicalVolumeStore *pLVStore = G4LogicalVolumeStore::GetInstance();
1447   G4LogicalVolume* pLV = nullptr;             << 1122   int nLV = pLVStore -> size ();
1448   pLV = pLVStore->GetVolume(name);            << 1123   int iLV;
1449   if (pLV == nullptr) return;  // Volume not  << 1124   G4LogicalVolume* pLV = 0;
                                                   >> 1125   for (iLV = 0; iLV < nLV; iLV++ ) {
                                                   >> 1126     pLV = (*pLVStore) [iLV];
                                                   >> 1127     if (pLV -> GetName () == name) break;
                                                   >> 1128   }
                                                   >> 1129   if (iLV == nLV) {
                                                   >> 1130     if (verbosity >= G4VisManager::errors) {
                                                   >> 1131       G4cout << "ERROR: Logical volume " << name
                                                   >> 1132        << " not found in logical volume store." << G4endl;
                                                   >> 1133     }
                                                   >> 1134     return;
                                                   >> 1135   }
1450                                                  1136 
1451   const std::vector<G4Scene::Model>& rdModelL << 1137   const std::vector<G4Scene::Model>& rdModelList = pScene -> GetRunDurationModelList();
1452     pScene -> GetRunDurationModelList();      << 
1453   std::vector<G4Scene::Model>::const_iterator    1138   std::vector<G4Scene::Model>::const_iterator i;
1454   for (i = rdModelList.begin(); i != rdModelL    1139   for (i = rdModelList.begin(); i != rdModelList.end(); ++i) {
1455     if (i->fpModel->GetGlobalDescription().fi    1140     if (i->fpModel->GetGlobalDescription().find("Volume") != std::string::npos) break;
1456   }                                              1141   }
1457   if (i != rdModelList.end()) {                  1142   if (i != rdModelList.end()) {
1458     if (verbosity >= G4VisManager::errors) {     1143     if (verbosity >= G4VisManager::errors) {
1459       G4warn << "There is already a volume, \ << 1144       G4cout << "There is already a volume, \""
1460              << i->fpModel->GetGlobalDescript    1145              << i->fpModel->GetGlobalDescription()
1461              << "\",\n in the run-duration mo    1146              << "\",\n in the run-duration model list of scene \""
1462              << pScene -> GetName()              1147              << pScene -> GetName()
1463              << "\".\n Your logical volume mu    1148              << "\".\n Your logical volume must be the only volume in the scene."
1464        << "\n Create a new scene and try agai    1149        << "\n Create a new scene and try again:"
1465        << "\n  /vis/specify " << name            1150        << "\n  /vis/specify " << name
1466        << "\n or"                                1151        << "\n or"
1467        << "\n  /vis/scene/create"                1152        << "\n  /vis/scene/create"
1468        << "\n  /vis/scene/add/logicalVolume "    1153        << "\n  /vis/scene/add/logicalVolume " << name
1469        << "\n  /vis/sceneHandler/attach"         1154        << "\n  /vis/sceneHandler/attach"
1470        << "\n (and also, if necessary, /vis/v    1155        << "\n (and also, if necessary, /vis/viewer/flush)"
1471              << G4endl;                          1156              << G4endl;
1472     }                                            1157     }
1473     return;                                   << 
1474   }                                              1158   }
1475                                                  1159 
1476   G4LogicalVolumeModel* model = new G4Logical << 1160   G4VModel* model = new G4LogicalVolumeModel
1477     (pLV, requestedDepthOfDescent, booleans,  << 1161     (pLV, requestedDepthOfDescent, booleans, voxels, readout);
1478   const G4String& currentSceneName = pScene -    1162   const G4String& currentSceneName = pScene -> GetName ();
1479   G4bool successful = pScene -> AddRunDuratio    1163   G4bool successful = pScene -> AddRunDurationModel (model, warn);
1480                                               << 
1481   if (successful) {                              1164   if (successful) {
1482                                               << 
1483     G4bool axesSuccessful = false;            << 
1484     if (axes) {                               << 
1485       const G4double radius = model->GetExten << 
1486       const G4double axisLengthMax = radius / << 
1487       const G4double intLog10Length = std::fl << 
1488       G4double axisLength = std::pow(10,intLo << 
1489       if (5.*axisLength < axisLengthMax) axis << 
1490       else if (2.*axisLength < axisLengthMax) << 
1491       const G4double axisWidth = axisLength / << 
1492       G4VModel* axesModel = new G4AxesModel(0 << 
1493       axesSuccessful = pScene -> AddRunDurati << 
1494     }                                         << 
1495                                               << 
1496 //    if (verbosity >= G4VisManager::warnings << 
1497 //      const std::map<G4String,G4AttDef>* at << 
1498 //      std::vector<G4AttValue>* attValues =  << 
1499 //      G4warn << G4AttCheck(attValues, attDe << 
1500 //      delete attValues;                     << 
1501 //    }                                       << 
1502                                               << 
1503     if (verbosity >= G4VisManager::confirmati    1165     if (verbosity >= G4VisManager::confirmations) {
1504       G4cout << "Logical volume \"" << pLV ->    1166       G4cout << "Logical volume \"" << pLV -> GetName ()
1505        << "\" with requested depth of descent << 1167        << " with requested depth of descent "
1506        << requestedDepthOfDescent                1168        << requestedDepthOfDescent
1507        << ",\n  with";                        << 1169        << ",\n with";
1508       if (!booleans) G4cout << "out";            1170       if (!booleans) G4cout << "out";
1509       G4cout << " boolean components, with";     1171       G4cout << " boolean components, with";
1510       if (!voxels) G4cout << "out";              1172       if (!voxels) G4cout << "out";
1511       G4cout << " voxels,\n  with";           << 1173       G4cout << " voxels and with";
1512       if (!readout) G4cout << "out";             1174       if (!readout) G4cout << "out";
1513       G4cout << " readout geometry and with"; << 1175       G4cout << " readout geometry,"
1514       if (!checkOverlaps) G4cout << "out";    << 1176        << "\n  has been added to scene \"" << currentSceneName << "\"."
1515       G4cout << " overlap checking"           << 1177        << G4endl;
1516        << "\n  has been added to scene \"" << << 
1517       if (axes) {                             << 
1518         if (axesSuccessful) {                 << 
1519           G4cout <<                           << 
1520           "\n  Axes have also been added at t << 
1521         } else {                              << 
1522           G4cout <<                           << 
1523           "\n  Axes have not been added for s << 
1524         }                                     << 
1525       }                                       << 
1526       G4cout << G4endl;                       << 
1527     }                                            1178     }
1528   }                                              1179   }
1529   else {                                         1180   else {
1530     G4VisCommandsSceneAddUnsuccessful(verbosi    1181     G4VisCommandsSceneAddUnsuccessful(verbosity);
1531     return;                                      1182     return;
1532   }                                              1183   }
1533                                                  1184 
1534   CheckSceneAndNotifyHandlers (pScene);       << 1185   UpdateVisManagerScene (currentSceneName);
1535 }                                                1186 }
1536                                                  1187 
1537                                                  1188 
1538 ////////////// /vis/scene/add/logo //////////    1189 ////////////// /vis/scene/add/logo //////////////////////////////////
1539                                                  1190 
1540 G4VisCommandSceneAddLogo::G4VisCommandSceneAd    1191 G4VisCommandSceneAddLogo::G4VisCommandSceneAddLogo () {
1541   G4bool omitable;                               1192   G4bool omitable;
1542   fpCommand = new G4UIcommand ("/vis/scene/ad    1193   fpCommand = new G4UIcommand ("/vis/scene/add/logo", this);
1543   fpCommand -> SetGuidance ("Adds a G4 logo t    1194   fpCommand -> SetGuidance ("Adds a G4 logo to the current scene.");
1544   fpCommand -> SetGuidance                    << 
1545   ("If \"unit\" is \"auto\", height is roughl << 
1546   fpCommand -> SetGuidance                    << 
1547   ("\"direction\" is that of outward-facing n << 
1548    "\nIf \"direction\" is \"auto\", logo face << 
1549   fpCommand -> SetGuidance                    << 
1550   ("\nIf \"placement\" is \"auto\", logo is p << 
1551    "\n  when viewed from logo direction.");   << 
1552   G4UIparameter* parameter;                      1195   G4UIparameter* parameter;
1553   parameter = new G4UIparameter ("height", 'd    1196   parameter = new G4UIparameter ("height", 'd', omitable = true);
1554   parameter->SetDefaultValue (1.);               1197   parameter->SetDefaultValue (1.);
1555   fpCommand->SetParameter (parameter);           1198   fpCommand->SetParameter (parameter);
1556   parameter =  new G4UIparameter ("unit", 's'    1199   parameter =  new G4UIparameter ("unit", 's', omitable = true);
                                                   >> 1200   parameter->SetGuidance
                                                   >> 1201     ("auto or valid length unit - defaults to auto."
                                                   >> 1202      "\nIf auto, height is roughly one tenth of scene extent.");
1557   parameter->SetDefaultValue ("auto");           1203   parameter->SetDefaultValue ("auto");
1558   fpCommand->SetParameter (parameter);           1204   fpCommand->SetParameter (parameter);
1559   parameter =  new G4UIparameter ("direction"    1205   parameter =  new G4UIparameter ("direction", 's', omitable = true);
1560   parameter->SetGuidance ("auto|[-]x|[-]y|[-] << 1206   parameter->SetGuidance
                                                   >> 1207     ("auto|[-]x|[-]y|[-]z - defaults to auto."
                                                   >> 1208      "\nDirection of outward-facing normal to front face of logo."
                                                   >> 1209      "\nIf automatic, logo faces the user in the current viewer.");
1561   parameter->SetDefaultValue ("auto");           1210   parameter->SetDefaultValue ("auto");
1562   fpCommand->SetParameter (parameter);           1211   fpCommand->SetParameter (parameter);
1563   parameter =  new G4UIparameter ("red", 'd',    1212   parameter =  new G4UIparameter ("red", 'd', omitable = true);
1564   parameter->SetDefaultValue (0.);               1213   parameter->SetDefaultValue (0.);
1565   fpCommand->SetParameter (parameter);           1214   fpCommand->SetParameter (parameter);
1566   parameter =  new G4UIparameter ("green", 'd    1215   parameter =  new G4UIparameter ("green", 'd', omitable = true);
1567   parameter->SetDefaultValue (1.);               1216   parameter->SetDefaultValue (1.);
1568   fpCommand->SetParameter (parameter);           1217   fpCommand->SetParameter (parameter);
1569   parameter =  new G4UIparameter ("blue", 'd'    1218   parameter =  new G4UIparameter ("blue", 'd', omitable = true);
1570   parameter->SetDefaultValue (0.);               1219   parameter->SetDefaultValue (0.);
1571   fpCommand->SetParameter (parameter);           1220   fpCommand->SetParameter (parameter);
1572   parameter =  new G4UIparameter ("placement" << 1221   parameter =  new G4UIparameter ("auto|manual", 's', omitable = true);
                                                   >> 1222   parameter->SetGuidance
                                                   >> 1223     ("Automatic placement or manual placement at (xmid,ymid,zmid).");
                                                   >> 1224   parameter->SetGuidance
                                                   >> 1225     ("If automatic, placed at bottom right of screen when viewed from");
                                                   >> 1226   parameter->SetGuidance
                                                   >> 1227     ("logo direction.");
1573   parameter -> SetParameterCandidates("auto m    1228   parameter -> SetParameterCandidates("auto manual");
1574   parameter->SetDefaultValue  ("auto");          1229   parameter->SetDefaultValue  ("auto");
1575   fpCommand->SetParameter     (parameter);       1230   fpCommand->SetParameter     (parameter);
1576   parameter =  new G4UIparameter ("xmid", 'd'    1231   parameter =  new G4UIparameter ("xmid", 'd', omitable = true);
1577   parameter->SetDefaultValue (0.);               1232   parameter->SetDefaultValue (0.);
1578   fpCommand->SetParameter (parameter);           1233   fpCommand->SetParameter (parameter);
1579   parameter =  new G4UIparameter ("ymid", 'd'    1234   parameter =  new G4UIparameter ("ymid", 'd', omitable = true);
1580   parameter->SetDefaultValue (0.);               1235   parameter->SetDefaultValue (0.);
1581   fpCommand->SetParameter (parameter);           1236   fpCommand->SetParameter (parameter);
1582   parameter =  new G4UIparameter ("zmid", 'd'    1237   parameter =  new G4UIparameter ("zmid", 'd', omitable = true);
1583   parameter->SetDefaultValue (0.);               1238   parameter->SetDefaultValue (0.);
1584   fpCommand->SetParameter (parameter);           1239   fpCommand->SetParameter (parameter);
1585   parameter =  new G4UIparameter ("unit", 's'    1240   parameter =  new G4UIparameter ("unit", 's', omitable = true);
1586   parameter->SetDefaultValue ("m");              1241   parameter->SetDefaultValue ("m");
1587   fpCommand->SetParameter (parameter);           1242   fpCommand->SetParameter (parameter);
1588 }                                                1243 }
1589                                                  1244 
1590 G4VisCommandSceneAddLogo::~G4VisCommandSceneA    1245 G4VisCommandSceneAddLogo::~G4VisCommandSceneAddLogo () {
1591   delete fpCommand;                              1246   delete fpCommand;
1592 }                                                1247 }
1593                                                  1248 
1594 G4String G4VisCommandSceneAddLogo::GetCurrent    1249 G4String G4VisCommandSceneAddLogo::GetCurrentValue (G4UIcommand*) {
1595   return "";                                     1250   return "";
1596 }                                                1251 }
1597                                                  1252 
1598 void G4VisCommandSceneAddLogo::SetNewValue (G    1253 void G4VisCommandSceneAddLogo::SetNewValue (G4UIcommand*, G4String newValue) {
1599                                                  1254 
1600   G4VisManager::Verbosity verbosity = fpVisMa    1255   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1601   G4bool warn = verbosity >= G4VisManager::wa    1256   G4bool warn = verbosity >= G4VisManager::warnings;
1602                                                  1257 
1603   G4Scene* pScene = fpVisManager->GetCurrentS    1258   G4Scene* pScene = fpVisManager->GetCurrentScene();
1604   if (!pScene) {                                 1259   if (!pScene) {
1605     if (verbosity >= G4VisManager::errors) {     1260     if (verbosity >= G4VisManager::errors) {
1606       G4warn << "ERROR: No current scene.  Pl << 1261       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1607     }                                            1262     }
1608     return;                                      1263     return;
1609   } else {                                    << 
1610     if (pScene->GetExtent().GetExtentRadius() << 
1611       if (verbosity >= G4VisManager::errors)  << 
1612         G4warn                                << 
1613   << "ERROR: Scene has no extent. Add volumes << 
1614         << G4endl;                            << 
1615       }                                       << 
1616       return;                                 << 
1617     }                                         << 
1618   }                                              1264   }
1619                                                  1265 
1620   G4VViewer* pViewer = fpVisManager->GetCurre    1266   G4VViewer* pViewer = fpVisManager->GetCurrentViewer();
1621   if (!pViewer) {                                1267   if (!pViewer) {
1622     if (verbosity >= G4VisManager::errors) {     1268     if (verbosity >= G4VisManager::errors) {
1623       G4warn <<                               << 1269       G4cout << 
1624   "ERROR: G4VisCommandSceneAddLogo::SetNewVal    1270   "ERROR: G4VisCommandSceneAddLogo::SetNewValue: no viewer."
1625   "\n  Auto direction needs a viewer."           1271   "\n  Auto direction needs a viewer."
1626        << G4endl;                                1272        << G4endl;
1627     }                                            1273     }
1628     return;                                      1274     return;
1629   }                                              1275   }
1630                                                  1276 
1631   G4double userHeight, red, green, blue, xmid    1277   G4double userHeight, red, green, blue, xmid, ymid, zmid;
1632   G4String userHeightUnit, direction, placeme << 1278   G4String userHeightUnit, direction, auto_manual, positionUnit;
1633   std::istringstream is (newValue);              1279   std::istringstream is (newValue);
1634   is >> userHeight >> userHeightUnit >> direc    1280   is >> userHeight >> userHeightUnit >> direction
1635      >> red >> green >> blue                     1281      >> red >> green >> blue
1636      >> placement                             << 1282      >> auto_manual
1637      >> xmid >> ymid >> zmid >> positionUnit;    1283      >> xmid >> ymid >> zmid >> positionUnit;
1638                                                  1284 
1639   G4double height = userHeight;                  1285   G4double height = userHeight;
1640   const G4VisExtent& sceneExtent = pScene->Ge    1286   const G4VisExtent& sceneExtent = pScene->GetExtent();  // Existing extent.
1641   if (userHeightUnit == "auto") {                1287   if (userHeightUnit == "auto") {
1642     height *= 0.2 * sceneExtent.GetExtentRadi    1288     height *= 0.2 * sceneExtent.GetExtentRadius();
1643   } else {                                       1289   } else {
1644     height *= G4UIcommand::ValueOf(userHeight    1290     height *= G4UIcommand::ValueOf(userHeightUnit);
1645   }                                              1291   }
1646                                                  1292 
1647   G4double unit = G4UIcommand::ValueOf(positi    1293   G4double unit = G4UIcommand::ValueOf(positionUnit);
1648   xmid *= unit; ymid *= unit; zmid *= unit;      1294   xmid *= unit; ymid *= unit; zmid *= unit;
1649                                                  1295 
1650   Direction logoDirection = X;  // Initialise    1296   Direction logoDirection = X;  // Initialise to keep some compilers happy.
1651   if (direction == "auto") {                     1297   if (direction == "auto") {
1652     // Take cue from viewer                      1298     // Take cue from viewer
1653     const G4Vector3D& vp =                       1299     const G4Vector3D& vp =
1654       pViewer->GetViewParameters().GetViewpoi    1300       pViewer->GetViewParameters().GetViewpointDirection();
1655     if (vp.x() > vp.y() && vp.x() > vp.z()) l    1301     if (vp.x() > vp.y() && vp.x() > vp.z()) logoDirection = X;
1656     else if (vp.x() < vp.y() && vp.x() < vp.z    1302     else if (vp.x() < vp.y() && vp.x() < vp.z()) logoDirection = minusX;
1657     else if (vp.y() > vp.x() && vp.y() > vp.z    1303     else if (vp.y() > vp.x() && vp.y() > vp.z()) logoDirection = Y;
1658     else if (vp.y() < vp.x() && vp.y() < vp.z    1304     else if (vp.y() < vp.x() && vp.y() < vp.z()) logoDirection = minusY;
1659     else if (vp.z() > vp.x() && vp.z() > vp.y    1305     else if (vp.z() > vp.x() && vp.z() > vp.y()) logoDirection = Z;
1660     else if (vp.z() < vp.x() && vp.z() < vp.y    1306     else if (vp.z() < vp.x() && vp.z() < vp.y()) logoDirection = minusZ;
1661   }                                              1307   }
1662   else if (direction[0] == 'x') logoDirection << 1308   else if (direction(0) == 'x') logoDirection = X;
1663   else if (direction[0] == 'y') logoDirection << 1309   else if (direction(0) == 'y') logoDirection = Y;
1664   else if (direction[0] == 'z') logoDirection << 1310   else if (direction(0) == 'z') logoDirection = Z;
1665   else if (direction[0] == '-') {             << 1311   else if (direction(0) == '-') {
1666     if (direction[1] == 'x') logoDirection =  << 1312     if (direction(1) == 'x') logoDirection = minusX;
1667     else if (direction[1] == 'y') logoDirecti << 1313     else if (direction(1) == 'y') logoDirection = minusY;
1668     else if (direction[1] == 'z') logoDirecti << 1314     else if (direction(1) == 'z') logoDirection = minusZ;
1669   } else {                                       1315   } else {
1670     if (verbosity >= G4VisManager::errors) {     1316     if (verbosity >= G4VisManager::errors) {
1671       G4warn << "ERROR: Unrecogniseed directi << 1317       G4cout << "ERROR: Unrecogniseed direction: \""
1672        << direction << "\"." << G4endl;          1318        << direction << "\"." << G4endl;
1673       return;                                    1319       return;
1674     }                                            1320     }
1675   }                                              1321   }
1676                                                  1322 
1677   G4bool autoPlacing = false; if (placement = << 1323   G4bool autoPlacing = false; if (auto_manual == "auto") autoPlacing = true;
1678   // Parameters read and interpreted.            1324   // Parameters read and interpreted.
1679                                                  1325 
1680   // Current scene extent                        1326   // Current scene extent
1681   const G4double xmin = sceneExtent.GetXmin()    1327   const G4double xmin = sceneExtent.GetXmin();
1682   const G4double xmax = sceneExtent.GetXmax()    1328   const G4double xmax = sceneExtent.GetXmax();
1683   const G4double ymin = sceneExtent.GetYmin()    1329   const G4double ymin = sceneExtent.GetYmin();
1684   const G4double ymax = sceneExtent.GetYmax()    1330   const G4double ymax = sceneExtent.GetYmax();
1685   const G4double zmin = sceneExtent.GetZmin()    1331   const G4double zmin = sceneExtent.GetZmin();
1686   const G4double zmax = sceneExtent.GetZmax()    1332   const G4double zmax = sceneExtent.GetZmax();
1687                                                  1333 
1688   // Test existing extent and issue warnings.    1334   // Test existing extent and issue warnings...
1689   G4bool worried = false;                        1335   G4bool worried = false;
1690   if (sceneExtent.GetExtentRadius() == 0) {      1336   if (sceneExtent.GetExtentRadius() == 0) {
1691     worried = true;                              1337     worried = true;
1692     if (verbosity >= G4VisManager::warnings)     1338     if (verbosity >= G4VisManager::warnings) {
1693       G4warn <<                               << 1339       G4cout <<
1694   "WARNING: Existing scene does not yet have     1340   "WARNING: Existing scene does not yet have any extent."
1695   "\n  Maybe you have not yet added any geome    1341   "\n  Maybe you have not yet added any geometrical object."
1696        << G4endl;                                1342        << G4endl;
1697     }                                            1343     }
1698   }                                              1344   }
1699                                                  1345 
1700   // Useful constants, etc...                    1346   // Useful constants, etc...
1701   const G4double halfHeight(height / 2.);        1347   const G4double halfHeight(height / 2.);
1702   const G4double comfort(0.01);  // 0.15 seem    1348   const G4double comfort(0.01);  // 0.15 seems too big.  0.05 might be better.
1703   const G4double freeHeightFraction (1. + 2.     1349   const G4double freeHeightFraction (1. + 2. * comfort);
1704                                                  1350 
1705   // Test existing scene for room...             1351   // Test existing scene for room...
1706   G4bool room = true;                            1352   G4bool room = true;
1707   switch (logoDirection) {                       1353   switch (logoDirection) {
1708   case X:                                        1354   case X:
1709   case minusX:                                   1355   case minusX:
1710     if (freeHeightFraction * (xmax - xmin) <  << 1356     if (freeHeightFraction * (xmax - xmin) < height) room = false; break;
1711     break;                                    << 
1712   case Y:                                        1357   case Y:
1713   case minusY:                                   1358   case minusY:
1714     if (freeHeightFraction * (ymax - ymin) <  << 1359     if (freeHeightFraction * (ymax - ymin) < height) room = false; break;
1715     break;                                    << 
1716   case Z:                                        1360   case Z:
1717   case minusZ:                                   1361   case minusZ:
1718     if (freeHeightFraction * (zmax - zmin) <  << 1362     if (freeHeightFraction * (zmax - zmin) < height) room = false; break;
1719     break;                                    << 
1720   }                                              1363   }
1721   if (!room) {                                   1364   if (!room) {
1722     worried = true;                              1365     worried = true;
1723     if (verbosity >= G4VisManager::warnings)     1366     if (verbosity >= G4VisManager::warnings) {
1724       G4warn <<                               << 1367       G4cout <<
1725   "WARNING: Not enough room in existing scene    1368   "WARNING: Not enough room in existing scene.  Maybe logo is too large."
1726        << G4endl;                                1369        << G4endl;
1727     }                                            1370     }
1728   }                                              1371   }
1729   if (worried) {                                 1372   if (worried) {
1730     if (verbosity >= G4VisManager::warnings)     1373     if (verbosity >= G4VisManager::warnings) {
1731       G4warn <<                               << 1374       G4cout <<
1732   "WARNING: The logo you have asked for is bi    1375   "WARNING: The logo you have asked for is bigger than the existing"
1733   "\n  scene.  Maybe you have added it too so    1376   "\n  scene.  Maybe you have added it too soon.  It is recommended that"
1734   "\n  you add the logo last so that it can b    1377   "\n  you add the logo last so that it can be correctly auto-positioned"
1735   "\n  so as not to be obscured by any existi    1378   "\n  so as not to be obscured by any existing object and so that the"
1736   "\n  view parameters can be correctly recal    1379   "\n  view parameters can be correctly recalculated."
1737        << G4endl;                                1380        << G4endl;
1738     }                                            1381     }
1739   }                                              1382   }
1740                                                  1383 
1741   G4double sxmid(xmid), symid(ymid), szmid(zm    1384   G4double sxmid(xmid), symid(ymid), szmid(zmid);
1742   if (autoPlacing) {                             1385   if (autoPlacing) {
1743     // Aim to place at bottom right of screen    1386     // Aim to place at bottom right of screen when viewed from logoDirection.
1744     // Give some comfort zone.                   1387     // Give some comfort zone.
1745     const G4double xComfort = comfort * (xmax    1388     const G4double xComfort = comfort * (xmax - xmin);
1746     const G4double yComfort = comfort * (ymax    1389     const G4double yComfort = comfort * (ymax - ymin);
1747     const G4double zComfort = comfort * (zmax    1390     const G4double zComfort = comfort * (zmax - zmin);
1748     switch (logoDirection) {                     1391     switch (logoDirection) {
1749     case X:  // y-axis up, z-axis to left?       1392     case X:  // y-axis up, z-axis to left?
1750       sxmid = xmax + halfHeight + xComfort;      1393       sxmid = xmax + halfHeight + xComfort;
1751       symid = ymin - yComfort;                   1394       symid = ymin - yComfort;
1752       szmid = zmin - zComfort;                   1395       szmid = zmin - zComfort;
1753       break;                                     1396       break;
1754     case minusX:  // y-axis up, z-axis to rig    1397     case minusX:  // y-axis up, z-axis to right?
1755       sxmid = xmin - halfHeight - xComfort;      1398       sxmid = xmin - halfHeight - xComfort;
1756       symid = ymin - yComfort;                   1399       symid = ymin - yComfort;
1757       szmid = zmax + zComfort;                   1400       szmid = zmax + zComfort;
1758       break;                                     1401       break;
1759     case Y:  // z-axis up, x-axis to left?       1402     case Y:  // z-axis up, x-axis to left?
1760       sxmid = xmin - xComfort;                   1403       sxmid = xmin - xComfort;
1761       symid = ymax + halfHeight + yComfort;      1404       symid = ymax + halfHeight + yComfort;
1762       szmid = zmin - zComfort;                   1405       szmid = zmin - zComfort;
1763       break;                                     1406       break;
1764     case minusY:  // z-axis up, x-axis to rig    1407     case minusY:  // z-axis up, x-axis to right?
1765       sxmid = xmax + xComfort;                   1408       sxmid = xmax + xComfort;
1766       symid = ymin - halfHeight - yComfort;      1409       symid = ymin - halfHeight - yComfort;
1767       szmid = zmin - zComfort;                   1410       szmid = zmin - zComfort;
1768       break;                                     1411       break;
1769     case Z:  // y-axis up, x-axis to right?      1412     case Z:  // y-axis up, x-axis to right?
1770       sxmid = xmax + xComfort;                   1413       sxmid = xmax + xComfort;
1771       symid = ymin - yComfort;                   1414       symid = ymin - yComfort;
1772       szmid = zmax + halfHeight + zComfort;      1415       szmid = zmax + halfHeight + zComfort;
1773       break;                                     1416       break;
1774     case minusZ:  // y-axis up, x-axis to lef    1417     case minusZ:  // y-axis up, x-axis to left?
1775       sxmid = xmin - xComfort;                   1418       sxmid = xmin - xComfort;
1776       symid = ymin - yComfort;                   1419       symid = ymin - yComfort;
1777       szmid = zmin - halfHeight - zComfort;      1420       szmid = zmin - halfHeight - zComfort;
1778       break;                                     1421       break;
1779     }                                            1422     }
1780   }                                              1423   }
1781                                                  1424 
1782   G4Transform3D transform;                       1425   G4Transform3D transform;
1783   switch (logoDirection) {                       1426   switch (logoDirection) {
1784   case X:  // y-axis up, z-axis to left?         1427   case X:  // y-axis up, z-axis to left?
1785     transform = G4RotateY3D(halfpi);             1428     transform = G4RotateY3D(halfpi);
1786     break;                                       1429     break;
1787   case minusX:  // y-axis up, z-axis to right    1430   case minusX:  // y-axis up, z-axis to right?
1788     transform = G4RotateY3D(-halfpi);            1431     transform = G4RotateY3D(-halfpi);
1789     break;                                       1432     break;
1790   case Y:  // z-axis up, x-axis to left?         1433   case Y:  // z-axis up, x-axis to left?
1791     transform = G4RotateX3D(-halfpi) * G4Rota    1434     transform = G4RotateX3D(-halfpi) * G4RotateZ3D(pi);
1792     break;                                       1435     break;
1793   case minusY:  // z-axis up, x-axis to right    1436   case minusY:  // z-axis up, x-axis to right?
1794     transform = G4RotateX3D(halfpi);             1437     transform = G4RotateX3D(halfpi);
1795     break;                                       1438     break;
1796   case Z:  // y-axis up, x-axis to right?        1439   case Z:  // y-axis up, x-axis to right?
1797     // No transformation required.               1440     // No transformation required.
1798     break;                                       1441     break;
1799   case minusZ:  // y-axis up, x-axis to left?    1442   case minusZ:  // y-axis up, x-axis to left?
1800     transform = G4RotateY3D(pi);                 1443     transform = G4RotateY3D(pi);
1801     break;                                       1444     break;
1802   }                                              1445   }
1803   transform = G4Translate3D(sxmid,symid,szmid    1446   transform = G4Translate3D(sxmid,symid,szmid) * transform;
1804                                                  1447 
1805   G4VisAttributes visAtts(G4Colour(red, green    1448   G4VisAttributes visAtts(G4Colour(red, green, blue));
1806   visAtts.SetForceSolid(true);         // Alw    1449   visAtts.SetForceSolid(true);         // Always solid.
1807                                                  1450 
1808   G4Logo* logo = new G4Logo(height,visAtts,tr << 1451   G4Logo* logo = new G4Logo(height,visAtts);
1809   G4VModel* model =                              1452   G4VModel* model =
1810     new G4CallbackModel<G4VisCommandSceneAddL    1453     new G4CallbackModel<G4VisCommandSceneAddLogo::G4Logo>(logo);
1811   model->SetType("G4Logo");                      1454   model->SetType("G4Logo");
1812   model->SetGlobalTag("G4Logo");                 1455   model->SetGlobalTag("G4Logo");
1813   model->SetGlobalDescription("G4Logo: " + ne    1456   model->SetGlobalDescription("G4Logo: " + newValue);
                                                   >> 1457   model->SetTransformation(transform);
                                                   >> 1458   // Note: it is the responsibility of the model to act upon this, but
                                                   >> 1459   // the extent is in local coordinates...
1814   G4double& h = height;                          1460   G4double& h = height;
1815   G4double h2 = h/2.;                            1461   G4double h2 = h/2.;
1816   G4VisExtent extent(-h,h,-h2,h2,-h2,h2);        1462   G4VisExtent extent(-h,h,-h2,h2,-h2,h2);
1817   model->SetExtent(extent.Transform(transform << 1463   model->SetExtent(extent);
1818   // This extent gets "added" to existing sce    1464   // This extent gets "added" to existing scene extent in
1819   // AddRunDurationModel below.                  1465   // AddRunDurationModel below.
1820   const G4String& currentSceneName = pScene -    1466   const G4String& currentSceneName = pScene -> GetName ();
1821   G4bool successful = pScene -> AddRunDuratio    1467   G4bool successful = pScene -> AddRunDurationModel (model, warn);
1822   if (successful) {                              1468   if (successful) {
1823     if (verbosity >= G4VisManager::confirmati    1469     if (verbosity >= G4VisManager::confirmations) {
1824       G4cout << "G4 Logo of height " << userH    1470       G4cout << "G4 Logo of height " << userHeight << ' ' << userHeightUnit
1825        << ", " << direction << "-direction, a    1471        << ", " << direction << "-direction, added to scene \""
1826        << currentSceneName << "\"";              1472        << currentSceneName << "\"";
1827       if (verbosity >= G4VisManager::paramete    1473       if (verbosity >= G4VisManager::parameters) {
1828   G4cout << "\n  with extent " << extent         1474   G4cout << "\n  with extent " << extent
1829          << "\n  at " << transform.getRotatio    1475          << "\n  at " << transform.getRotation()
1830          << "  " << transform.getTranslation( << 1476          << transform.getTranslation();
1831       }                                          1477       }
1832       G4cout << G4endl;                          1478       G4cout << G4endl;
1833     }                                            1479     }
1834   }                                              1480   }
1835   else G4VisCommandsSceneAddUnsuccessful(verb    1481   else G4VisCommandsSceneAddUnsuccessful(verbosity);
1836                                               << 1482   UpdateVisManagerScene (currentSceneName);
1837   CheckSceneAndNotifyHandlers (pScene);       << 
1838 }                                                1483 }
1839                                                  1484 
1840 G4VisCommandSceneAddLogo::G4Logo::G4Logo         1485 G4VisCommandSceneAddLogo::G4Logo::G4Logo
1841 (G4double height, const G4VisAttributes& visA << 1486 (G4double height, const G4VisAttributes& visAtts):
1842 {                                             << 1487   fHeight(height),
                                                   >> 1488   fVisAtts(visAtts)
                                                   >> 1489  {
1843   const G4double& h =  height;                   1490   const G4double& h =  height;
1844   const G4double h2  = 0.5 * h;   // Half hei    1491   const G4double h2  = 0.5 * h;   // Half height.
1845   const G4double ri  = 0.25 * h;  // Inner ra    1492   const G4double ri  = 0.25 * h;  // Inner radius.
1846   const G4double ro  = 0.5 * h;   // Outer ra    1493   const G4double ro  = 0.5 * h;   // Outer radius.
1847   const G4double ro2 = 0.5 * ro;  // Half out    1494   const G4double ro2 = 0.5 * ro;  // Half outer radius.
1848   const G4double w   = ro - ri;   // Width.      1495   const G4double w   = ro - ri;   // Width.
1849   const G4double w2  = 0.5 * w;   // Half wid    1496   const G4double w2  = 0.5 * w;   // Half width.
1850   const G4double d2  = 0.2 * h;   // Half dep    1497   const G4double d2  = 0.2 * h;   // Half depth.
1851   const G4double f1  = 0.05 * h;  // left edg    1498   const G4double f1  = 0.05 * h;  // left edge of stem of "4".
1852   const G4double f2  = -0.3 * h;  // bottom e    1499   const G4double f2  = -0.3 * h;  // bottom edge of cross of "4".
1853   const G4double e = 1.e-4 * h;   // epsilon.    1500   const G4double e = 1.e-4 * h;   // epsilon.
1854   const G4double xt = f1, yt = h2;      // To    1501   const G4double xt = f1, yt = h2;      // Top of slope.
1855   const G4double xb = -h2, yb = f2 + w; // Bo    1502   const G4double xb = -h2, yb = f2 + w; // Bottom of slope.
1856   const G4double dx = xt - xb, dy = yt - yb;     1503   const G4double dx = xt - xb, dy = yt - yb;
1857   const G4double angle = std::atan2(dy,dx);      1504   const G4double angle = std::atan2(dy,dx);
1858   G4RotationMatrix rm;                           1505   G4RotationMatrix rm;
1859   rm.rotateZ(angle*rad);                         1506   rm.rotateZ(angle*rad);
1860   const G4double d = std::sqrt(dx * dx + dy *    1507   const G4double d = std::sqrt(dx * dx + dy * dy);
1861   const G4double ss = h;  // Half height of s    1508   const G4double ss = h;  // Half height of square subtractor
1862   const G4double y8 = ss; // Choose y of subt    1509   const G4double y8 = ss; // Choose y of subtractor for outer slope.
1863   const G4double x8 = ((-ss * d - dx * (yt -     1510   const G4double x8 = ((-ss * d - dx * (yt - y8)) / dy) + xt;
1864   G4double y9 = ss; // Choose y of subtractor    1511   G4double y9 = ss; // Choose y of subtractor for inner slope.
1865   G4double x9 = ((-(ss - w) * d - dx * (yt -     1512   G4double x9 = ((-(ss - w) * d - dx * (yt - y8)) / dy) + xt;
1866   // But to get inner, we make a triangle tra    1513   // But to get inner, we make a triangle translated by...
1867   const G4double xtr = ss - f1, ytr = -ss - f    1514   const G4double xtr = ss - f1, ytr = -ss - f2 -w;
1868   x9 += xtr; y9 += ytr;                          1515   x9 += xtr; y9 += ytr;
1869                                                  1516 
1870   // The idea here is to create a polyhedron  << 
1871   // this we use Geant4 geometry solids and m << 
1872   // Note that we do not need to keep the sol << 
1873   // which, of course, are deleted on leaving << 
1874   // is contrary to the usual requirement for << 
1875   // detector for which solids MUST be create << 
1876   // Finally we invoke CreatePolyhedron, whic << 
1877   // and returns a pointer.  It is the user's << 
1878   // which is done in the destructor of this  << 
1879   // created here, remain on the heap for the << 
1880                                               << 
1881   // G...                                        1517   // G...
1882   G4Tubs tG("tG",ri,ro,d2,0.15*pi,1.85*pi);      1518   G4Tubs tG("tG",ri,ro,d2,0.15*pi,1.85*pi);
1883   G4Box bG("bG",w2,ro2,d2);                      1519   G4Box bG("bG",w2,ro2,d2);
1884   G4UnionSolid logoG("logoG",&tG,&bG,G4Transl    1520   G4UnionSolid logoG("logoG",&tG,&bG,G4Translate3D(ri+w2,-ro2,0.));
1885   // Create with these vis atts (force solid) << 
1886   G4Polyhedron::SetNumberOfRotationSteps      << 
1887   (fpVisManager->GetCurrentViewer()->GetViewP << 
1888   fpG = logoG.CreatePolyhedron();                1521   fpG = logoG.CreatePolyhedron();
1889   G4Polyhedron::ResetNumberOfRotationSteps () << 1522   fpG->SetVisAttributes(&fVisAtts);
1890   fpG->SetVisAttributes(visAtts);             << 
1891   fpG->Transform(G4Translate3D(-0.55*h,0.,0.)    1523   fpG->Transform(G4Translate3D(-0.55*h,0.,0.));
1892   fpG->Transform(transform);                  << 
1893                                                  1524 
1894   // 4...                                        1525   // 4...
1895   G4Box b1("b1",h2,h2,d2);                       1526   G4Box b1("b1",h2,h2,d2);
1896   G4Box bS("bS",ss,ss,d2+e);  // Subtractor.     1527   G4Box bS("bS",ss,ss,d2+e);  // Subtractor.
1897   G4Box bS2("bS2",ss,ss,d2+2.*e);  // 2nd Sub    1528   G4Box bS2("bS2",ss,ss,d2+2.*e);  // 2nd Subtractor.
1898   G4SubtractionSolid s1("s1",&b1,&bS,G4Transl    1529   G4SubtractionSolid s1("s1",&b1,&bS,G4Translate3D(f1-ss,f2-ss,0.));
1899   G4SubtractionSolid s2("s2",&s1,&bS,G4Transl    1530   G4SubtractionSolid s2("s2",&s1,&bS,G4Translate3D(f1+ss+w,f2-ss,0.));
1900   G4SubtractionSolid s3("s3",&s2,&bS,G4Transl    1531   G4SubtractionSolid s3("s3",&s2,&bS,G4Translate3D(f1+ss+w,f2+ss+w,0.));
1901   G4SubtractionSolid s4                          1532   G4SubtractionSolid s4
1902     ("s4",&s3,&bS,G4Transform3D(rm,G4ThreeVec    1533     ("s4",&s3,&bS,G4Transform3D(rm,G4ThreeVector(x8,y8,0.)));
1903   G4SubtractionSolid s5    // Triangular hole    1534   G4SubtractionSolid s5    // Triangular hole.
1904     ("s5",&bS,&bS2,G4Transform3D(rm,G4ThreeVe    1535     ("s5",&bS,&bS2,G4Transform3D(rm,G4ThreeVector(x9,y9,0.)));
1905   G4SubtractionSolid logo4("logo4",&s4,&s5,G4    1536   G4SubtractionSolid logo4("logo4",&s4,&s5,G4Translate3D(-xtr,-ytr,0.));
1906   fp4 = logo4.CreatePolyhedron();                1537   fp4 = logo4.CreatePolyhedron();
1907   /* Experiment with creating own polyhedron.    1538   /* Experiment with creating own polyhedron...
1908   int nNodes = 4;                                1539   int nNodes = 4;
1909   int nFaces = 4;                                1540   int nFaces = 4;
1910   double xyz[][3] = {{0,0,0},{1*m,0,0},{0,1*m    1541   double xyz[][3] = {{0,0,0},{1*m,0,0},{0,1*m,0},{0,0,1*m}};
1911   int faces[][4] = {{1,3,2,0},{1,2,4,0},{1,4,    1542   int faces[][4] = {{1,3,2,0},{1,2,4,0},{1,4,3,0},{2,3,4,0}};
1912   fp4 = new G4Polyhedron();                      1543   fp4 = new G4Polyhedron();
1913   fp4->createPolyhedron(nNodes,nFaces,xyz,fac    1544   fp4->createPolyhedron(nNodes,nFaces,xyz,faces);
1914   */                                             1545   */
1915   fp4->SetVisAttributes(visAtts);             << 1546   fp4->SetVisAttributes(&fVisAtts);
1916   fp4->Transform(G4Translate3D(0.55*h,0.,0.))    1547   fp4->Transform(G4Translate3D(0.55*h,0.,0.));
1917   fp4->Transform(transform);                  << 
1918 }                                                1548 }
1919                                                  1549 
1920 G4VisCommandSceneAddLogo::G4Logo::~G4Logo() {    1550 G4VisCommandSceneAddLogo::G4Logo::~G4Logo() {
1921   delete fpG;                                    1551   delete fpG;
1922   delete fp4;                                    1552   delete fp4;
1923 }                                                1553 }
1924                                                  1554 
1925 void G4VisCommandSceneAddLogo::G4Logo::operat    1555 void G4VisCommandSceneAddLogo::G4Logo::operator()
1926   (G4VGraphicsScene& sceneHandler, const G4Mo << 1556   (G4VGraphicsScene& sceneHandler, const G4Transform3D& transform) {
1927   sceneHandler.BeginPrimitives();             << 1557   sceneHandler.BeginPrimitives(transform);
1928   sceneHandler.AddPrimitive(*fpG);               1558   sceneHandler.AddPrimitive(*fpG);
1929   sceneHandler.AddPrimitive(*fp4);               1559   sceneHandler.AddPrimitive(*fp4);
1930   sceneHandler.EndPrimitives();                  1560   sceneHandler.EndPrimitives();
1931 }                                                1561 }
1932                                                  1562 
1933 ////////////// /vis/scene/add/logo2D ////////    1563 ////////////// /vis/scene/add/logo2D ///////////////////////////////////////
1934                                                  1564 
1935 G4VisCommandSceneAddLogo2D::G4VisCommandScene    1565 G4VisCommandSceneAddLogo2D::G4VisCommandSceneAddLogo2D () {
1936   G4bool omitable;                               1566   G4bool omitable;
1937   fpCommand = new G4UIcommand ("/vis/scene/ad    1567   fpCommand = new G4UIcommand ("/vis/scene/add/logo2D", this);
1938   fpCommand -> SetGuidance ("Adds 2D logo to     1568   fpCommand -> SetGuidance ("Adds 2D logo to current scene.");
1939   G4UIparameter* parameter;                      1569   G4UIparameter* parameter;
1940   parameter = new G4UIparameter ("size", 'i',    1570   parameter = new G4UIparameter ("size", 'i', omitable = true);
1941   parameter -> SetGuidance ("Screen size of t    1571   parameter -> SetGuidance ("Screen size of text in pixels.");
1942   parameter -> SetDefaultValue (48);             1572   parameter -> SetDefaultValue (48);
1943   fpCommand -> SetParameter (parameter);         1573   fpCommand -> SetParameter (parameter);
1944   parameter = new G4UIparameter ("x-position"    1574   parameter = new G4UIparameter ("x-position", 'd', omitable = true);
1945   parameter -> SetGuidance ("x screen positio    1575   parameter -> SetGuidance ("x screen position in range -1 < x < 1.");
1946   parameter -> SetDefaultValue (-0.9);           1576   parameter -> SetDefaultValue (-0.9);
1947   fpCommand -> SetParameter (parameter);         1577   fpCommand -> SetParameter (parameter);
1948   parameter = new G4UIparameter ("y-position"    1578   parameter = new G4UIparameter ("y-position", 'd', omitable = true);
1949   parameter -> SetGuidance ("y screen positio    1579   parameter -> SetGuidance ("y screen position in range -1 < y < 1.");
1950   parameter -> SetDefaultValue (-0.9);           1580   parameter -> SetDefaultValue (-0.9);
1951   fpCommand -> SetParameter (parameter);         1581   fpCommand -> SetParameter (parameter);
1952   parameter = new G4UIparameter ("layout", 's    1582   parameter = new G4UIparameter ("layout", 's', omitable = true);
1953   parameter -> SetGuidance ("Layout, i.e., ad    1583   parameter -> SetGuidance ("Layout, i.e., adjustment: left|centre|right.");
1954   parameter -> SetDefaultValue ("left");         1584   parameter -> SetDefaultValue ("left");
1955   fpCommand -> SetParameter (parameter);         1585   fpCommand -> SetParameter (parameter);
1956 }                                                1586 }
1957                                                  1587 
1958 G4VisCommandSceneAddLogo2D::~G4VisCommandScen    1588 G4VisCommandSceneAddLogo2D::~G4VisCommandSceneAddLogo2D () {
1959   delete fpCommand;                              1589   delete fpCommand;
1960 }                                                1590 }
1961                                                  1591 
1962 G4String G4VisCommandSceneAddLogo2D::GetCurre    1592 G4String G4VisCommandSceneAddLogo2D::GetCurrentValue (G4UIcommand*) {
1963   return "";                                     1593   return "";
1964 }                                                1594 }
1965                                                  1595 
1966 void G4VisCommandSceneAddLogo2D::SetNewValue     1596 void G4VisCommandSceneAddLogo2D::SetNewValue (G4UIcommand*, G4String newValue)
1967 {                                                1597 {
1968   G4VisManager::Verbosity verbosity = fpVisMa    1598   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1969   G4bool warn(verbosity >= G4VisManager::warn    1599   G4bool warn(verbosity >= G4VisManager::warnings);
1970                                                  1600 
1971   G4Scene* pScene = fpVisManager->GetCurrentS    1601   G4Scene* pScene = fpVisManager->GetCurrentScene();
1972   if (!pScene) {                                 1602   if (!pScene) {
1973     if (verbosity >= G4VisManager::errors) {     1603     if (verbosity >= G4VisManager::errors) {
1974       G4warn << "ERROR: No current scene.  Pl << 1604       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
1975     }                                            1605     }
1976     return;                                      1606     return;
1977   }                                              1607   }
1978                                                  1608 
1979   G4int size;                                    1609   G4int size;
1980   G4double x, y;                                 1610   G4double x, y;
1981   G4String layoutString;                         1611   G4String layoutString;
1982   std::istringstream is(newValue);               1612   std::istringstream is(newValue);
1983   is >> size >> x >> y >> layoutString;          1613   is >> size >> x >> y >> layoutString;
1984   G4Text::Layout layout = G4Text::right;         1614   G4Text::Layout layout = G4Text::right;
1985   if (layoutString[0] == 'l') layout = G4Text << 1615   if (layoutString(0) == 'l') layout = G4Text::left;
1986   else if (layoutString[0] == 'c') layout = G << 1616   else if (layoutString(0) == 'c') layout = G4Text::centre;
1987   else if (layoutString[0] == 'r') layout = G << 1617   else if (layoutString(0) == 'r') layout = G4Text::right;
1988                                                  1618 
1989   Logo2D* logo2D = new Logo2D(fpVisManager, s    1619   Logo2D* logo2D = new Logo2D(fpVisManager, size, x, y, layout);
1990   G4VModel* model =                              1620   G4VModel* model =
1991     new G4CallbackModel<G4VisCommandSceneAddL    1621     new G4CallbackModel<G4VisCommandSceneAddLogo2D::Logo2D>(logo2D);
1992   model->SetType("G4Logo2D");                    1622   model->SetType("G4Logo2D");
1993   model->SetGlobalTag("G4Logo2D");               1623   model->SetGlobalTag("G4Logo2D");
1994   model->SetGlobalDescription("G4Logo2D: " +     1624   model->SetGlobalDescription("G4Logo2D: " + newValue);
1995   const G4String& currentSceneName = pScene -    1625   const G4String& currentSceneName = pScene -> GetName ();
1996   G4bool successful = pScene -> AddRunDuratio    1626   G4bool successful = pScene -> AddRunDurationModel (model, warn);
1997   if (successful) {                              1627   if (successful) {
1998     if (verbosity >= G4VisManager::confirmati    1628     if (verbosity >= G4VisManager::confirmations) {
1999       G4cout << "2D logo has been added to sc    1629       G4cout << "2D logo has been added to scene \""
2000        << currentSceneName << "\"."              1630        << currentSceneName << "\"."
2001        << G4endl;                                1631        << G4endl;
2002     }                                            1632     }
2003   }                                              1633   }
2004   else G4VisCommandsSceneAddUnsuccessful(verb    1634   else G4VisCommandsSceneAddUnsuccessful(verbosity);
2005                                               << 1635   UpdateVisManagerScene (currentSceneName);
2006   CheckSceneAndNotifyHandlers (pScene);       << 
2007 }                                                1636 }
2008                                                  1637 
2009 void G4VisCommandSceneAddLogo2D::Logo2D::oper    1638 void G4VisCommandSceneAddLogo2D::Logo2D::operator()
2010   (G4VGraphicsScene& sceneHandler, const G4Mo << 1639   (G4VGraphicsScene& sceneHandler, const G4Transform3D&)
2011 {                                                1640 {
2012   G4Text text("Geant4", G4Point3D(fX, fY, 0.)    1641   G4Text text("Geant4", G4Point3D(fX, fY, 0.));
2013   text.SetScreenSize(fSize);                     1642   text.SetScreenSize(fSize);
2014   text.SetLayout(fLayout);                       1643   text.SetLayout(fLayout);
2015   G4VisAttributes textAtts(G4Colour::Brown())    1644   G4VisAttributes textAtts(G4Colour::Brown());
2016   text.SetVisAttributes(textAtts);               1645   text.SetVisAttributes(textAtts);
2017   sceneHandler.BeginPrimitives2D();              1646   sceneHandler.BeginPrimitives2D();
2018   sceneHandler.AddPrimitive(text);               1647   sceneHandler.AddPrimitive(text);
2019   sceneHandler.EndPrimitives2D();                1648   sceneHandler.EndPrimitives2D();
2020 }                                                1649 }
2021                                                  1650 
2022 ////////////// /vis/scene/add/magneticField / << 
2023                                               << 
2024 G4VisCommandSceneAddMagneticField::G4VisComma << 
2025   fpCommand = new G4UIcommand ("/vis/scene/ad << 
2026   fpCommand -> SetGuidance                    << 
2027   ("Adds magnetic field representation to cur << 
2028   const G4UIcommandTree* tree = G4UImanager:: << 
2029   const G4UIcommand* addElecFieldCmd = tree-> << 
2030   // Pick up additional guidance from /vis/sc << 
2031   CopyGuidanceFrom(addElecFieldCmd,fpCommand, << 
2032   // Pick up parameters from /vis/scene/add/e << 
2033   CopyParametersFrom(addElecFieldCmd,fpComman << 
2034 }                                             << 
2035                                               << 
2036 G4VisCommandSceneAddMagneticField::~G4VisComm << 
2037   delete fpCommand;                           << 
2038 }                                             << 
2039                                               << 
2040 G4String G4VisCommandSceneAddMagneticField::G << 
2041   return "";                                  << 
2042 }                                             << 
2043                                               << 
2044 void G4VisCommandSceneAddMagneticField::SetNe << 
2045 (G4UIcommand*, G4String newValue) {           << 
2046                                               << 
2047   G4VisManager::Verbosity verbosity = fpVisMa << 
2048   G4bool warn(verbosity >= G4VisManager::warn << 
2049                                               << 
2050   G4Scene* pScene = fpVisManager->GetCurrentS << 
2051   if (!pScene) {                              << 
2052     if (verbosity >= G4VisManager::errors) {  << 
2053       G4warn <<  "ERROR: No current scene.  P << 
2054     }                                         << 
2055     return;                                   << 
2056   }                                           << 
2057                                               << 
2058   G4int nDataPointsPerHalfScene;              << 
2059   G4String representation;                    << 
2060   std::istringstream iss(newValue);           << 
2061   iss >> nDataPointsPerHalfScene >> represent << 
2062   G4ElectricFieldModel::Representation        << 
2063   modelRepresentation = G4ElectricFieldModel: << 
2064   if (representation == "lightArrow") {       << 
2065     modelRepresentation = G4ElectricFieldMode << 
2066   }                                           << 
2067   G4VModel* model;                            << 
2068   model = new G4MagneticFieldModel            << 
2069   (nDataPointsPerHalfScene,modelRepresentatio << 
2070    fCurrentArrow3DLineSegmentsPerCircle,      << 
2071    fCurrentExtentForField,                    << 
2072    fCurrrentPVFindingsForField);              << 
2073   const G4String& currentSceneName = pScene - << 
2074   G4bool successful = pScene -> AddRunDuratio << 
2075   if (successful) {                           << 
2076     if (verbosity >= G4VisManager::confirmati << 
2077       G4cout                                  << 
2078       << "Magnetic field, if any, will be dra << 
2079       << currentSceneName                     << 
2080       << "\"\n  with "                        << 
2081       << nDataPointsPerHalfScene              << 
2082       << " data points per half extent and wi << 
2083       << representation                       << 
2084       << '\"'                                 << 
2085       << G4endl;                              << 
2086     }                                         << 
2087   }                                           << 
2088   else G4VisCommandsSceneAddUnsuccessful(verb << 
2089                                               << 
2090   CheckSceneAndNotifyHandlers (pScene);       << 
2091 }                                             << 
2092                                               << 
2093 ////////////// /vis/scene/add/psHits ////////    1651 ////////////// /vis/scene/add/psHits ///////////////////////////////////////
2094                                                  1652 
2095 G4VisCommandSceneAddPSHits::G4VisCommandScene    1653 G4VisCommandSceneAddPSHits::G4VisCommandSceneAddPSHits () {
2096   G4bool omitable;                               1654   G4bool omitable;
2097   fpCommand = new G4UIcmdWithAString ("/vis/s    1655   fpCommand = new G4UIcmdWithAString ("/vis/scene/add/psHits", this);
2098   fpCommand -> SetGuidance                       1656   fpCommand -> SetGuidance
2099     ("Adds Primitive Scorer Hits (PSHits) to     1657     ("Adds Primitive Scorer Hits (PSHits) to current scene.");
2100   fpCommand -> SetGuidance                       1658   fpCommand -> SetGuidance
2101     ("PSHits are drawn at end of run when the    1659     ("PSHits are drawn at end of run when the scene in which"
2102      "\nthey are added is current.");            1660      "\nthey are added is current.");
2103   fpCommand -> SetGuidance                       1661   fpCommand -> SetGuidance
2104     ("Optional parameter specifies name of sc    1662     ("Optional parameter specifies name of scoring map.  By default all"
2105      "\nscoring maps registered with the G4Sc    1663      "\nscoring maps registered with the G4ScoringManager are drawn.");
2106   fpCommand -> SetParameterName ("mapname", o    1664   fpCommand -> SetParameterName ("mapname", omitable = true);
2107   fpCommand -> SetDefaultValue ("all");          1665   fpCommand -> SetDefaultValue ("all");
2108 }                                                1666 }
2109                                                  1667 
2110 G4VisCommandSceneAddPSHits::~G4VisCommandScen    1668 G4VisCommandSceneAddPSHits::~G4VisCommandSceneAddPSHits () {
2111   delete fpCommand;                              1669   delete fpCommand;
2112 }                                                1670 }
2113                                                  1671 
2114 G4String G4VisCommandSceneAddPSHits::GetCurre    1672 G4String G4VisCommandSceneAddPSHits::GetCurrentValue (G4UIcommand*) {
2115   return "";                                     1673   return "";
2116 }                                                1674 }
2117                                                  1675 
2118 void G4VisCommandSceneAddPSHits::SetNewValue     1676 void G4VisCommandSceneAddPSHits::SetNewValue
2119 (G4UIcommand*, G4String newValue)                1677 (G4UIcommand*, G4String newValue)
2120 {                                                1678 {
2121   G4VisManager::Verbosity verbosity = fpVisMa    1679   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2122   G4bool warn(verbosity >= G4VisManager::warn    1680   G4bool warn(verbosity >= G4VisManager::warnings);
2123                                                  1681 
2124   G4Scene* pScene = fpVisManager->GetCurrentS    1682   G4Scene* pScene = fpVisManager->GetCurrentScene();
2125   if (!pScene) {                                 1683   if (!pScene) {
2126     if (verbosity >= G4VisManager::errors) {     1684     if (verbosity >= G4VisManager::errors) {
2127       G4warn << "ERROR: No current scene.  Pl << 1685       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2128     }                                            1686     }
2129     return;                                      1687     return;
2130   }                                              1688   }
2131                                                  1689 
2132   G4VModel* model = new G4PSHitsModel(newValu << 1690   G4PSHitsModel* model = new G4PSHitsModel(newValue);
2133   const G4String& currentSceneName = pScene -    1691   const G4String& currentSceneName = pScene -> GetName ();
2134   G4bool successful = pScene -> AddEndOfRunMo    1692   G4bool successful = pScene -> AddEndOfRunModel (model, warn);
2135   if (successful) {                              1693   if (successful) {
2136     if (verbosity >= G4VisManager::confirmati    1694     if (verbosity >= G4VisManager::confirmations) {
2137       if (newValue == "all") {                   1695       if (newValue == "all") {
2138   G4cout << "All Primitive Scorer hits";         1696   G4cout << "All Primitive Scorer hits";
2139       } else {                                   1697       } else {
2140   G4cout << "Hits of Primitive Scorer \"" <<     1698   G4cout << "Hits of Primitive Scorer \"" << newValue << '"';
2141       }                                          1699       }
2142       G4cout << " will be drawn at end of run    1700       G4cout << " will be drawn at end of run in scene \""
2143        << currentSceneName << "\"."              1701        << currentSceneName << "\"."
2144        << G4endl;                                1702        << G4endl;
2145     }                                            1703     }
2146   }                                              1704   }
2147   else G4VisCommandsSceneAddUnsuccessful(verb    1705   else G4VisCommandsSceneAddUnsuccessful(verbosity);
2148                                               << 1706   UpdateVisManagerScene (currentSceneName);
2149   CheckSceneAndNotifyHandlers (pScene);       << 
2150 }                                                1707 }
2151                                                  1708 
2152 ////////////// /vis/scene/add/scale /////////    1709 ////////////// /vis/scene/add/scale //////////////////////////////////
2153                                                  1710 
2154 G4VisCommandSceneAddScale::G4VisCommandSceneA    1711 G4VisCommandSceneAddScale::G4VisCommandSceneAddScale () {
2155   G4bool omitable;                               1712   G4bool omitable;
2156   fpCommand = new G4UIcommand ("/vis/scene/ad    1713   fpCommand = new G4UIcommand ("/vis/scene/add/scale", this);
2157   fpCommand -> SetGuidance                    << 1714   fpCommand -> SetGuidance 
2158   ("Adds an annotated scale line to the curre << 1715     ("Adds an annotated scale line to the current scene.");
2159   fpCommand -> SetGuidance                    << 1716   fpCommand -> SetGuidance (G4Scale::GetGuidanceString());
2160   ("If \"unit\" is \"auto\", length is roughl << 
2161   fpCommand -> SetGuidance                    << 
2162   ("If \"direction\" is \"auto\", scale is ro << 
2163   fpCommand -> SetGuidance                    << 
2164   ("If \"placement\" is \"auto\", scale is pl << 
2165    "\n  Otherwise placed at (xmid,ymid,zmid). << 
2166   fpCommand -> SetGuidance                    << 
2167   ("An annotated line in the specified direct << 
2168    "\nend.  If autoPlacing is true it is requ << 
2169    "\nfront, right, bottom corner of the worl << 
2170    "\nthe existing bounding box/sphere so tha << 
2171    "\nobscure it.  Otherwise it is required t << 
2172    "\n(xmid, ymid, zmid)."                    << 
2173    "\n"                                       << 
2174    "\nThe auto placing algorithm is (approx): << 
2175    "\n  x = xmin + (1 + comfort) * (xmax - xm << 
2176    "\n  y = ymin - comfort * (ymax - ymin);"  << 
2177    "\n  z = zmin + (1 + comfort) * (zmax - zm << 
2178    "\n  if direction == x then (x - length,y, << 
2179    "\n  if direction == y then (x,y,z) to (x, << 
2180    "\n  if direction == z then (x,y,z - lengt << 
2181    );                                         << 
2182   G4UIparameter* parameter;                      1717   G4UIparameter* parameter;
2183   parameter = new G4UIparameter ("length", 'd    1718   parameter = new G4UIparameter ("length", 'd', omitable = true);
2184   parameter->SetDefaultValue (1.);               1719   parameter->SetDefaultValue (1.);
2185   fpCommand->SetParameter (parameter);           1720   fpCommand->SetParameter (parameter);
2186   parameter =  new G4UIparameter ("unit", 's'    1721   parameter =  new G4UIparameter ("unit", 's', omitable = true);
                                                   >> 1722   parameter->SetGuidance
                                                   >> 1723   ("auto or valid length unit - defaults to auto."
                                                   >> 1724    "\nIf auto, length is roughly one tenth of the scene extent.");
2187   parameter->SetDefaultValue ("auto");           1725   parameter->SetDefaultValue ("auto");
2188   fpCommand->SetParameter (parameter);           1726   fpCommand->SetParameter (parameter);
2189   parameter =  new G4UIparameter ("direction"    1727   parameter =  new G4UIparameter ("direction", 's', omitable = true);
2190   parameter->SetGuidance ("auto|x|y|z");      << 1728   parameter->SetGuidance
                                                   >> 1729   ("auto|x|y|z - defaults to auto."
                                                   >> 1730    "\nIf auto, scale is roughly in the plane of the current view.");
2191   parameter->SetDefaultValue ("auto");           1731   parameter->SetDefaultValue ("auto");
2192   fpCommand->SetParameter (parameter);           1732   fpCommand->SetParameter (parameter);
2193   parameter =  new G4UIparameter ("red", 'd',    1733   parameter =  new G4UIparameter ("red", 'd', omitable = true);
2194   parameter->SetDefaultValue (1.);               1734   parameter->SetDefaultValue (1.);
2195   fpCommand->SetParameter (parameter);           1735   fpCommand->SetParameter (parameter);
2196   parameter =  new G4UIparameter ("green", 'd    1736   parameter =  new G4UIparameter ("green", 'd', omitable = true);
2197   parameter->SetDefaultValue (0.);               1737   parameter->SetDefaultValue (0.);
2198   fpCommand->SetParameter (parameter);           1738   fpCommand->SetParameter (parameter);
2199   parameter =  new G4UIparameter ("blue", 'd'    1739   parameter =  new G4UIparameter ("blue", 'd', omitable = true);
2200   parameter->SetDefaultValue (0.);               1740   parameter->SetDefaultValue (0.);
2201   fpCommand->SetParameter (parameter);           1741   fpCommand->SetParameter (parameter);
2202   parameter =  new G4UIparameter ("placement" << 1742   parameter =  new G4UIparameter ("auto|manual", 's', omitable = true);
                                                   >> 1743   parameter->SetGuidance
                                                   >> 1744   ("Automatic placement or manual placement at (xmid,ymid,zmid)."
                                                   >> 1745    "\nIf automatic, scale is placed at bottom left of current view.");
2203   parameter -> SetParameterCandidates("auto m    1746   parameter -> SetParameterCandidates("auto manual");
2204   parameter->SetDefaultValue  ("auto");          1747   parameter->SetDefaultValue  ("auto");
2205   fpCommand->SetParameter     (parameter);       1748   fpCommand->SetParameter     (parameter);
2206   parameter =  new G4UIparameter ("xmid", 'd'    1749   parameter =  new G4UIparameter ("xmid", 'd', omitable = true);
2207   parameter->SetDefaultValue (0.);               1750   parameter->SetDefaultValue (0.);
2208   fpCommand->SetParameter (parameter);           1751   fpCommand->SetParameter (parameter);
2209   parameter =  new G4UIparameter ("ymid", 'd'    1752   parameter =  new G4UIparameter ("ymid", 'd', omitable = true);
2210   parameter->SetDefaultValue (0.);               1753   parameter->SetDefaultValue (0.);
2211   fpCommand->SetParameter (parameter);           1754   fpCommand->SetParameter (parameter);
2212   parameter =  new G4UIparameter ("zmid", 'd'    1755   parameter =  new G4UIparameter ("zmid", 'd', omitable = true);
2213   parameter->SetDefaultValue (0.);               1756   parameter->SetDefaultValue (0.);
2214   fpCommand->SetParameter (parameter);           1757   fpCommand->SetParameter (parameter);
2215   parameter =  new G4UIparameter ("unit", 's'    1758   parameter =  new G4UIparameter ("unit", 's', omitable = true);
2216   parameter->SetDefaultValue ("m");              1759   parameter->SetDefaultValue ("m");
2217   fpCommand->SetParameter (parameter);           1760   fpCommand->SetParameter (parameter);
2218 }                                                1761 }
2219                                                  1762 
2220 G4VisCommandSceneAddScale::~G4VisCommandScene    1763 G4VisCommandSceneAddScale::~G4VisCommandSceneAddScale () {
2221   delete fpCommand;                              1764   delete fpCommand;
2222 }                                                1765 }
2223                                                  1766 
2224 G4String G4VisCommandSceneAddScale::GetCurren    1767 G4String G4VisCommandSceneAddScale::GetCurrentValue (G4UIcommand*) {
2225   return "";                                     1768   return "";
2226 }                                                1769 }
2227                                                  1770 
2228 void G4VisCommandSceneAddScale::SetNewValue (    1771 void G4VisCommandSceneAddScale::SetNewValue (G4UIcommand*, G4String newValue) {
2229                                                  1772 
2230   G4VisManager::Verbosity verbosity = fpVisMa    1773   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2231   G4bool warn = verbosity >= G4VisManager::wa    1774   G4bool warn = verbosity >= G4VisManager::warnings;
2232                                                  1775 
2233   G4Scene* pScene = fpVisManager->GetCurrentS    1776   G4Scene* pScene = fpVisManager->GetCurrentScene();
2234   if (!pScene) {                                 1777   if (!pScene) {
2235     if (verbosity >= G4VisManager::errors) {     1778     if (verbosity >= G4VisManager::errors) {
2236       G4warn << "ERROR: No current scene.  Pl << 1779       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2237     }                                            1780     }
2238     return;                                      1781     return;
2239   } else {                                    << 
2240     if (pScene->GetExtent().GetExtentRadius() << 
2241       if (verbosity >= G4VisManager::errors)  << 
2242         G4warn                                << 
2243   << "ERROR: Scene has no extent. Add volumes << 
2244         << G4endl;                            << 
2245       }                                       << 
2246       return;                                 << 
2247     }                                         << 
2248   }                                              1782   }
2249                                                  1783 
2250   G4double userLength, red, green, blue, xmid    1784   G4double userLength, red, green, blue, xmid, ymid, zmid;
2251   G4String userLengthUnit, direction, placeme << 1785   G4String userLengthUnit, direction, auto_manual, positionUnit;
2252   std::istringstream is (newValue);              1786   std::istringstream is (newValue);
2253   is >> userLength >> userLengthUnit >> direc    1787   is >> userLength >> userLengthUnit >> direction
2254      >> red >> green >> blue                     1788      >> red >> green >> blue
2255      >> placement                             << 1789      >> auto_manual
2256      >> xmid >> ymid >> zmid >> positionUnit;    1790      >> xmid >> ymid >> zmid >> positionUnit;
2257                                                  1791 
2258   G4double length = userLength;                  1792   G4double length = userLength;
2259   const G4VisExtent& sceneExtent = pScene->Ge    1793   const G4VisExtent& sceneExtent = pScene->GetExtent();  // Existing extent.
2260   if (userLengthUnit == "auto") {                1794   if (userLengthUnit == "auto") {
2261     const G4double lengthMax = 0.5 * sceneExt << 1795     length *= sceneExtent.GetExtentRadius();
2262     const G4double intLog10Length = std::floo << 1796     G4double intLog10Length = std::floor(std::log10(length));
2263     length = std::pow(10,intLog10Length);        1797     length = std::pow(10,intLog10Length);
2264     if (5.*length < lengthMax) length *= 5.;  << 
2265     else if (2.*length < lengthMax) length *= << 
2266   } else {                                       1798   } else {
2267     length *= G4UIcommand::ValueOf(userLength    1799     length *= G4UIcommand::ValueOf(userLengthUnit);
2268   }                                              1800   }
2269   G4String annotation = G4BestUnit(length,"Le    1801   G4String annotation = G4BestUnit(length,"Length");
2270                                                  1802 
2271   G4double unit = G4UIcommand::ValueOf(positi    1803   G4double unit = G4UIcommand::ValueOf(positionUnit);
2272   xmid *= unit; ymid *= unit; zmid *= unit;      1804   xmid *= unit; ymid *= unit; zmid *= unit;
2273                                                  1805 
2274   Scale::Direction scaleDirection (Scale::x); << 1806   G4Scale::Direction scaleDirection (G4Scale::x);
2275   if (direction[0] == 'y') scaleDirection = S << 1807   if (direction(0) == 'y') scaleDirection = G4Scale::y;
2276   if (direction[0] == 'z') scaleDirection = S << 1808   if (direction(0) == 'z') scaleDirection = G4Scale::z;
2277                                                  1809 
2278   G4VViewer* pViewer = fpVisManager->GetCurre    1810   G4VViewer* pViewer = fpVisManager->GetCurrentViewer();
2279   if (!pViewer) {                                1811   if (!pViewer) {
2280     if (verbosity >= G4VisManager::errors) {     1812     if (verbosity >= G4VisManager::errors) {
2281       G4warn <<                               << 1813       G4cout << 
2282   "ERROR: G4VisCommandSceneAddScale::SetNewVa    1814   "ERROR: G4VisCommandSceneAddScale::SetNewValue: no viewer."
2283   "\n  Auto direction needs a viewer."           1815   "\n  Auto direction needs a viewer."
2284        << G4endl;                                1816        << G4endl;
2285     }                                            1817     }
2286     return;                                      1818     return;
2287   }                                              1819   }
2288                                                  1820 
2289   const G4Vector3D& vp =                         1821   const G4Vector3D& vp =
2290     pViewer->GetViewParameters().GetViewpoint    1822     pViewer->GetViewParameters().GetViewpointDirection();
2291   const G4Vector3D& up =                         1823   const G4Vector3D& up =
2292     pViewer->GetViewParameters().GetUpVector(    1824     pViewer->GetViewParameters().GetUpVector();
2293                                                  1825 
2294   if (direction == "auto") {  // Takes cue fr    1826   if (direction == "auto") {  // Takes cue from viewer.
2295     if (std::abs(vp.x()) > std::abs(vp.y()) &    1827     if (std::abs(vp.x()) > std::abs(vp.y()) &&
2296   std::abs(vp.x()) > std::abs(vp.z())) {  //     1828   std::abs(vp.x()) > std::abs(vp.z())) {  // x viewpoint
2297       if (std::abs(up.y()) > std::abs(up.z()) << 1829       if (std::abs(up.y()) > std::abs(up.z())) scaleDirection = G4Scale::z;
2298     else scaleDirection = Scale::y;           << 1830     else scaleDirection = G4Scale::y;
2299     }                                            1831     }
2300     else if (std::abs(vp.y()) > std::abs(vp.x    1832     else if (std::abs(vp.y()) > std::abs(vp.x()) &&
2301        std::abs(vp.y()) > std::abs(vp.z())) {    1833        std::abs(vp.y()) > std::abs(vp.z())) {  // y viewpoint
2302       if (std::abs(up.x()) > std::abs(up.z()) << 1834       if (std::abs(up.x()) > std::abs(up.z())) scaleDirection = G4Scale::z;
2303     else scaleDirection = Scale::x;           << 1835     else scaleDirection = G4Scale::x;
2304     }                                            1836     }
2305     else if (std::abs(vp.z()) > std::abs(vp.x    1837     else if (std::abs(vp.z()) > std::abs(vp.x()) &&
2306        std::abs(vp.z()) > std::abs(vp.y())) {    1838        std::abs(vp.z()) > std::abs(vp.y())) {  // z viewpoint
2307       if (std::abs(up.y()) > std::abs(up.x()) << 1839       if (std::abs(up.y()) > std::abs(up.x())) scaleDirection = G4Scale::x;
2308     else scaleDirection = Scale::y;           << 1840     else scaleDirection = G4Scale::y;
2309     }                                            1841     }
2310   }                                              1842   }
2311                                                  1843 
2312   G4bool autoPlacing = false; if (placement = << 1844   G4bool autoPlacing = false; if (auto_manual == "auto") autoPlacing = true;
2313   // Parameters read and interpreted.            1845   // Parameters read and interpreted.
2314                                                  1846 
2315   // Useful constants, etc...                    1847   // Useful constants, etc...
2316   const G4double halfLength(length / 2.);        1848   const G4double halfLength(length / 2.);
2317   const G4double comfort(0.01);  // 0.15 seem    1849   const G4double comfort(0.01);  // 0.15 seems too big.  0.05 might be better.
2318   const G4double freeLengthFraction (1. + 2.     1850   const G4double freeLengthFraction (1. + 2. * comfort);
2319                                                  1851 
2320   const G4double xmin = sceneExtent.GetXmin()    1852   const G4double xmin = sceneExtent.GetXmin();
2321   const G4double xmax = sceneExtent.GetXmax()    1853   const G4double xmax = sceneExtent.GetXmax();
2322   const G4double ymin = sceneExtent.GetYmin()    1854   const G4double ymin = sceneExtent.GetYmin();
2323   const G4double ymax = sceneExtent.GetYmax()    1855   const G4double ymax = sceneExtent.GetYmax();
2324   const G4double zmin = sceneExtent.GetZmin()    1856   const G4double zmin = sceneExtent.GetZmin();
2325   const G4double zmax = sceneExtent.GetZmax()    1857   const G4double zmax = sceneExtent.GetZmax();
2326                                                  1858 
2327   // Test existing extent and issue warnings.    1859   // Test existing extent and issue warnings...
2328   G4bool worried = false;                        1860   G4bool worried = false;
2329   if (sceneExtent.GetExtentRadius() == 0) {      1861   if (sceneExtent.GetExtentRadius() == 0) {
2330     worried = true;                              1862     worried = true;
2331     if (verbosity >= G4VisManager::warnings)     1863     if (verbosity >= G4VisManager::warnings) {
2332       G4warn <<                               << 1864       G4cout <<
2333   "WARNING: Existing scene does not yet have     1865   "WARNING: Existing scene does not yet have any extent."
2334   "\n  Maybe you have not yet added any geome    1866   "\n  Maybe you have not yet added any geometrical object."
2335        << G4endl;                                1867        << G4endl;
2336     }                                            1868     }
2337   }                                              1869   }
2338                                               << 
2339   // Test existing scene for room...             1870   // Test existing scene for room...
2340   G4bool room  = true;                           1871   G4bool room  = true;
2341   switch (scaleDirection) {                      1872   switch (scaleDirection) {
2342   case Scale::x:                              << 1873   case G4Scale::x:
2343     if (freeLengthFraction * (xmax - xmin) <  << 1874     if (freeLengthFraction * (xmax - xmin) < length) room = false; break;
2344     break;                                    << 1875   case G4Scale::y:
2345   case Scale::y:                              << 1876     if (freeLengthFraction * (ymax - ymin) < length) room = false; break;
2346     if (freeLengthFraction * (ymax - ymin) <  << 1877   case G4Scale::z:
2347     break;                                    << 1878     if (freeLengthFraction * (zmax - zmin) < length) room = false; break;
2348   case Scale::z:                              << 
2349     if (freeLengthFraction * (zmax - zmin) <  << 
2350     break;                                    << 
2351   }                                              1879   }
2352   if (!room) {                                   1880   if (!room) {
2353     worried = true;                              1881     worried = true;
2354     if (verbosity >= G4VisManager::warnings)     1882     if (verbosity >= G4VisManager::warnings) {
2355       G4warn <<                               << 1883       G4cout <<
2356   "WARNING: Not enough room in existing scene    1884   "WARNING: Not enough room in existing scene.  Maybe scale is too long."
2357        << G4endl;                                1885        << G4endl;
2358     }                                            1886     }
2359   }                                              1887   }
2360   if (worried) {                                 1888   if (worried) {
2361     if (verbosity >= G4VisManager::warnings)     1889     if (verbosity >= G4VisManager::warnings) {
2362       G4warn <<                               << 1890       G4cout <<
2363   "WARNING: The scale you have asked for is b    1891   "WARNING: The scale you have asked for is bigger than the existing"
2364   "\n  scene.  Maybe you have added it too so    1892   "\n  scene.  Maybe you have added it too soon.  It is recommended that"
2365   "\n  you add the scale last so that it can     1893   "\n  you add the scale last so that it can be correctly auto-positioned"
2366   "\n  so as not to be obscured by any existi    1894   "\n  so as not to be obscured by any existing object and so that the"
2367   "\n  view parameters can be correctly recal    1895   "\n  view parameters can be correctly recalculated."
2368        << G4endl;                                1896        << G4endl;
2369     }                                            1897     }
2370   }                                              1898   }
2371                                                  1899 
                                                   >> 1900   // Let's go ahead a construct a scale and a scale model.  Since the
                                                   >> 1901   // placing is done here, this G4Scale is *not* auto-placed...
                                                   >> 1902   G4Scale scale(length, annotation, scaleDirection,
                                                   >> 1903     false, xmid, ymid, zmid);
                                                   >> 1904   G4VisAttributes* pVisAttr = new G4VisAttributes(G4Colour(red, green, blue));
                                                   >> 1905   // Created of the heap because it needs a long lifetime.  This is a
                                                   >> 1906   // mess.  The model determines the life but the vis atttributes are
                                                   >> 1907   // associated with the scale.  There's no way of knowing when to
                                                   >> 1908   // delete the vis atttributes!!!
                                                   >> 1909   scale.SetVisAttributes(pVisAttr);
                                                   >> 1910   G4VModel* model = new G4ScaleModel(scale);
                                                   >> 1911 
2372   // Now figure out the extent...                1912   // Now figure out the extent...
2373   //                                             1913   //
                                                   >> 1914   // From the G4Scale.hh:
                                                   >> 1915   //
2374   // This creates a representation of annotat    1916   // This creates a representation of annotated line in the specified
2375   // direction with tick marks at the end.  I    1917   // direction with tick marks at the end.  If autoPlacing is true it
2376   // is required to be centred at the front,     1918   // is required to be centred at the front, right, bottom corner of
2377   // the world space, comfortably outside the    1919   // the world space, comfortably outside the existing bounding
2378   // box/sphere so that existing objects do n    1920   // box/sphere so that existing objects do not obscure it.  Otherwise
2379   // it is required to be drawn with mid-poin    1921   // it is required to be drawn with mid-point at (xmid, ymid, zmid).
2380   //                                             1922   //
2381   // The auto placing algorithm might be:        1923   // The auto placing algorithm might be:
2382   //   x = xmin + (1 + comfort) * (xmax - xmi    1924   //   x = xmin + (1 + comfort) * (xmax - xmin)
2383   //   y = ymin - comfort * (ymax - ymin)        1925   //   y = ymin - comfort * (ymax - ymin)
2384   //   z = zmin + (1 + comfort) * (zmax - zmi    1926   //   z = zmin + (1 + comfort) * (zmax - zmin)
2385   //   if direction == x then (x - length,y,z    1927   //   if direction == x then (x - length,y,z) to (x,y,z)
2386   //   if direction == y then (x,y,z) to (x,y    1928   //   if direction == y then (x,y,z) to (x,y + length,z)
2387   //   if direction == z then (x,y,z - length    1929   //   if direction == z then (x,y,z - length) to (x,y,z)
2388   //                                             1930   //
                                                   >> 1931   // End of clip from G4Scale.hh:
                                                   >> 1932   //
2389   // Implement this in two parts.  Here, use     1933   // Implement this in two parts.  Here, use the scale's extent to
2390   // "expand" the scene's extent.  Then rende    1934   // "expand" the scene's extent.  Then rendering - in
2391   // G4VSceneHandler::AddPrimitive(const G4Sc    1935   // G4VSceneHandler::AddPrimitive(const G4Scale&) - simply has to
2392   // ensure it's within the new extent.          1936   // ensure it's within the new extent.
2393   //                                             1937   //
2394                                                  1938 
2395   G4double sxmid(xmid), symid(ymid), szmid(zm    1939   G4double sxmid(xmid), symid(ymid), szmid(zmid);
2396   if (autoPlacing) {                             1940   if (autoPlacing) {
2397     // Aim to place at bottom right of screen    1941     // Aim to place at bottom right of screen in current view.
2398     // Give some comfort zone.                   1942     // Give some comfort zone.
2399     const G4double xComfort = comfort * (xmax    1943     const G4double xComfort = comfort * (xmax - xmin);
2400     const G4double yComfort = comfort * (ymax    1944     const G4double yComfort = comfort * (ymax - ymin);
2401     const G4double zComfort = comfort * (zmax    1945     const G4double zComfort = comfort * (zmax - zmin);
2402     switch (scaleDirection) {                    1946     switch (scaleDirection) {
2403     case Scale::x:                            << 1947     case G4Scale::x:
2404       if (vp.z() > 0.) {                         1948       if (vp.z() > 0.) {
2405   sxmid = xmax + xComfort;                       1949   sxmid = xmax + xComfort;
2406   symid = ymin - yComfort;                       1950   symid = ymin - yComfort;
2407   szmid = zmin - zComfort;                       1951   szmid = zmin - zComfort;
2408       } else {                                   1952       } else {
2409   sxmid = xmin - xComfort;                       1953   sxmid = xmin - xComfort;
2410   symid = ymin - yComfort;                       1954   symid = ymin - yComfort;
2411   szmid = zmax + zComfort;                       1955   szmid = zmax + zComfort;
2412       }                                          1956       }
2413       break;                                     1957       break;
2414     case Scale::y:                            << 1958     case G4Scale::y:
2415       if (vp.x() > 0.) {                         1959       if (vp.x() > 0.) {
2416   sxmid = xmin - xComfort;                       1960   sxmid = xmin - xComfort;
2417   symid = ymax + yComfort;                       1961   symid = ymax + yComfort;
2418   szmid = zmin - zComfort;                       1962   szmid = zmin - zComfort;
2419       } else {                                   1963       } else {
2420   sxmid = xmax + xComfort;                       1964   sxmid = xmax + xComfort;
2421   symid = ymin - yComfort;                       1965   symid = ymin - yComfort;
2422   szmid = zmin - zComfort;                       1966   szmid = zmin - zComfort;
2423       }                                          1967       }
2424       break;                                     1968       break;
2425     case Scale::z:                            << 1969     case G4Scale::z:
2426       if (vp.x() > 0.) {                         1970       if (vp.x() > 0.) {
2427   sxmid = xmax + xComfort;                       1971   sxmid = xmax + xComfort;
2428   symid = ymin - yComfort;                       1972   symid = ymin - yComfort;
2429   szmid = zmax + zComfort;                       1973   szmid = zmax + zComfort;
2430       } else {                                   1974       } else {
2431   sxmid = xmin - xComfort;                       1975   sxmid = xmin - xComfort;
2432   symid = ymin - yComfort;                       1976   symid = ymin - yComfort;
2433   szmid = zmax + zComfort;                       1977   szmid = zmax + zComfort;
2434       }                                          1978       }
2435       break;                                     1979       break;
2436     }                                            1980     }
2437   }                                              1981   }
2438                                                  1982 
                                                   >> 1983   /* Old code - kept for future reference.
                                                   >> 1984   G4double sxmid(xmid), symid(ymid), szmid(zmid);
                                                   >> 1985   if (autoPlacing) {
                                                   >> 1986     sxmid = xmin + onePlusComfort * (xmax - xmin);
                                                   >> 1987     symid = ymin - comfort * (ymax - ymin);
                                                   >> 1988     szmid = zmin + onePlusComfort * (zmax - zmin);
                                                   >> 1989     switch (scaleDirection) {
                                                   >> 1990     case G4Scale::x:
                                                   >> 1991       sxmid -= halfLength;
                                                   >> 1992       break;
                                                   >> 1993     case G4Scale::y:
                                                   >> 1994       symid += halfLength;
                                                   >> 1995       break;
                                                   >> 1996     case G4Scale::z:
                                                   >> 1997       szmid -= halfLength;
                                                   >> 1998       break;
                                                   >> 1999     }
                                                   >> 2000   }
                                                   >> 2001   */
                                                   >> 2002 
                                                   >> 2003   /* sxmin, etc., not actually used.  Comment out to prevent compiler
                                                   >> 2004      warnings but keep in case need in future.  Extract transform and
                                                   >> 2005      scaleExtent into reduced code below.
                                                   >> 2006   G4double sxmin(sxmid), sxmax(sxmid);
                                                   >> 2007   G4double symin(symid), symax(symid);
                                                   >> 2008   G4double szmin(szmid), szmax(szmid);
2439   G4Transform3D transform;                       2009   G4Transform3D transform;
2440   const G4double h = halfLength;              << 2010   G4VisExtent scaleExtent;
2441   const G4double t = h/5.;                    << 
2442   G4VisExtent scaleExtent(-h,h,-t,t,-t,t);    << 
2443   switch (scaleDirection) {                      2011   switch (scaleDirection) {
2444   case Scale::x:                              << 2012   case G4Scale::x:
                                                   >> 2013     sxmin = sxmid - halfLength;
                                                   >> 2014     sxmax = sxmid + halfLength;
                                                   >> 2015     scaleExtent = G4VisExtent(-halfLength,halfLength,0,0,0,0);
2445     break;                                       2016     break;
2446   case Scale::y:                              << 2017   case G4Scale::y:
                                                   >> 2018     symin = symid - halfLength;
                                                   >> 2019     symax = symid + halfLength;
2447     transform = G4RotateZ3D(halfpi);             2020     transform = G4RotateZ3D(halfpi);
                                                   >> 2021     scaleExtent = G4VisExtent(0,0,-halfLength,halfLength,0,0);
2448     break;                                       2022     break;
2449   case Scale::z:                              << 2023   case G4Scale::z:
                                                   >> 2024     szmin = szmid - halfLength;
                                                   >> 2025     szmax = szmid + halfLength;
2450     transform = G4RotateY3D(halfpi);             2026     transform = G4RotateY3D(halfpi);
                                                   >> 2027     scaleExtent = G4VisExtent(0,0,0,0,-halfLength,halfLength);
                                                   >> 2028     break;
                                                   >> 2029   }
                                                   >> 2030   */
                                                   >> 2031   G4Transform3D transform;
                                                   >> 2032   G4VisExtent scaleExtent;
                                                   >> 2033   switch (scaleDirection) {
                                                   >> 2034   case G4Scale::x:
                                                   >> 2035     scaleExtent = G4VisExtent(-halfLength,halfLength,0,0,0,0);
                                                   >> 2036     break;
                                                   >> 2037   case G4Scale::y:
                                                   >> 2038     transform = G4RotateZ3D(halfpi);
                                                   >> 2039     scaleExtent = G4VisExtent(0,0,-halfLength,halfLength,0,0);
                                                   >> 2040     break;
                                                   >> 2041   case G4Scale::z:
                                                   >> 2042     transform = G4RotateY3D(halfpi);
                                                   >> 2043     scaleExtent = G4VisExtent(0,0,0,0,-halfLength,halfLength);
2451     break;                                       2044     break;
2452   }                                              2045   }
2453   transform = G4Translate3D(sxmid,symid,szmid    2046   transform = G4Translate3D(sxmid,symid,szmid) * transform;
2454   scaleExtent = scaleExtent.Transform(transfo << 2047   /////////  G4VisExtent scaleExtent(sxmin, sxmax, symin, symax, szmin, szmax);
2455                                                  2048 
2456   G4Colour colour(red, green, blue);          << 
2457   if (direction == "auto") {                  << 
2458     switch (scaleDirection) {                 << 
2459       case Scale::x:                          << 
2460   colour = G4Colour::Red();                   << 
2461   break;                                      << 
2462       case Scale::y:                          << 
2463   colour = G4Colour::Green();                 << 
2464   break;                                      << 
2465       case Scale::z:                          << 
2466   colour = G4Colour::Blue();                  << 
2467   break;                                      << 
2468     }                                         << 
2469   }                                           << 
2470   G4VisAttributes visAttr(colour);            << 
2471                                                  2049 
2472   Scale* scale = new Scale                    << 2050   model->SetTransformation(transform);
2473   (visAttr, length, transform,                << 2051   // Note: it is the responsibility of the model to act upon this, but
2474    annotation, fCurrentTextSize, colour);     << 2052   // the extent is in local coordinates...
2475   G4VModel* model = new G4CallbackModel<Scale << 
2476   model->SetType("Scale");                    << 
2477   model->SetGlobalTag("Scale");               << 
2478   model->SetGlobalDescription("Scale: " + new << 
2479   model->SetExtent(scaleExtent);                 2053   model->SetExtent(scaleExtent);
                                                   >> 2054   // This extent gets "added" to existing scene extent in
                                                   >> 2055   // AddRunDurationModel below.
2480                                                  2056 
2481   const G4String& currentSceneName = pScene -    2057   const G4String& currentSceneName = pScene -> GetName ();
2482   G4bool successful = pScene -> AddRunDuratio    2058   G4bool successful = pScene -> AddRunDurationModel (model, warn);
2483   if (successful) {                              2059   if (successful) {
2484     if (verbosity >= G4VisManager::confirmati    2060     if (verbosity >= G4VisManager::confirmations) {
2485       G4cout << "Scale of " << annotation        2061       G4cout << "Scale of " << annotation
2486        << " added to scene \"" << currentScen    2062        << " added to scene \"" << currentSceneName << "\".";
2487       if (verbosity >= G4VisManager::paramete    2063       if (verbosity >= G4VisManager::parameters) {
2488   G4cout << "\n  with extent " << scaleExtent    2064   G4cout << "\n  with extent " << scaleExtent
2489          << "\n  at " << transform.getRotatio    2065          << "\n  at " << transform.getRotation()
2490          << "  " << transform.getTranslation( << 2066          << transform.getTranslation();
2491       }                                          2067       }
2492       G4cout << G4endl;                          2068       G4cout << G4endl;
2493     }                                            2069     }
2494   }                                              2070   }
2495   else G4VisCommandsSceneAddUnsuccessful(verb    2071   else G4VisCommandsSceneAddUnsuccessful(verbosity);
2496                                               << 2072   UpdateVisManagerScene (currentSceneName);
2497   CheckSceneAndNotifyHandlers (pScene);       << 
2498 }                                                2073 }
2499                                                  2074 
2500 G4VisCommandSceneAddScale::Scale::Scale       << 
2501  (const G4VisAttributes& visAtts,             << 
2502   G4double length, const G4Transform3D& trans << 
2503   const G4String& annotation, G4double annota << 
2504   const G4Colour& annotationColour):          << 
2505 fVisAtts(visAtts)                             << 
2506 {                                             << 
2507   // Useful constants...                      << 
2508   const G4double halfLength(length / 2.);     << 
2509   const G4double tickLength(length / 20.);    << 
2510                                               << 
2511   // Create (empty) polylines having the same << 
2512   // (OK to pass address since fVisAtts is lo << 
2513   fScaleLine.SetVisAttributes(&fVisAtts);     << 
2514   fTick11.SetVisAttributes(&fVisAtts);        << 
2515   fTick12.SetVisAttributes(&fVisAtts);        << 
2516   fTick21.SetVisAttributes(&fVisAtts);        << 
2517   fTick22.SetVisAttributes(&fVisAtts);        << 
2518                                               << 
2519   // Add points to the polylines to represent << 
2520   // x-axis centred on the origin...          << 
2521   G4Point3D r1(G4Point3D(-halfLength, 0., 0.) << 
2522   G4Point3D r2(G4Point3D( halfLength, 0., 0.) << 
2523   fScaleLine.push_back(r1);                   << 
2524   fScaleLine.push_back(r2);                   << 
2525   G4Point3D ticky(0., tickLength, 0.);        << 
2526   G4Point3D tickz(0., 0., tickLength);        << 
2527   fTick11.push_back(r1 + ticky);              << 
2528   fTick11.push_back(r1 - ticky);              << 
2529   fTick12.push_back(r1 + tickz);              << 
2530   fTick12.push_back(r1 - tickz);              << 
2531   fTick21.push_back(r2 + ticky);              << 
2532   fTick21.push_back(r2 - ticky);              << 
2533   fTick22.push_back(r2 + tickz);              << 
2534   fTick22.push_back(r2 - tickz);              << 
2535   // ...and transform to chosen position and  << 
2536   fScaleLine.transform(transform);            << 
2537   fTick11.transform(transform);               << 
2538   fTick12.transform(transform);               << 
2539   fTick21.transform(transform);               << 
2540   fTick22.transform(transform);               << 
2541   // Similarly for annotation                 << 
2542   G4Point3D textPosition(0., tickLength, 0.); << 
2543   textPosition.transform(transform);          << 
2544   fText = G4Text(annotation,textPosition);    << 
2545   fText.SetVisAttributes(annotationColour);   << 
2546   fText.SetScreenSize(annotationSize);        << 
2547 }                                             << 
2548                                               << 
2549 void G4VisCommandSceneAddScale::Scale::operat << 
2550 (G4VGraphicsScene& sceneHandler,const G4Model << 
2551 {                                             << 
2552   // Draw...                                  << 
2553   sceneHandler.BeginPrimitives();             << 
2554   sceneHandler.AddPrimitive(fScaleLine);      << 
2555   sceneHandler.AddPrimitive(fTick11);         << 
2556   sceneHandler.AddPrimitive(fTick12);         << 
2557   sceneHandler.AddPrimitive(fTick21);         << 
2558   sceneHandler.AddPrimitive(fTick22);         << 
2559   sceneHandler.AddPrimitive(fText);           << 
2560   sceneHandler.EndPrimitives();               << 
2561 }                                             << 
2562                                                  2075 
2563 ////////////// /vis/scene/add/text //////////    2076 ////////////// /vis/scene/add/text //////////////////////////////////
2564                                                  2077 
2565 G4VisCommandSceneAddText::G4VisCommandSceneAd    2078 G4VisCommandSceneAddText::G4VisCommandSceneAddText () {
2566   G4bool omitable;                               2079   G4bool omitable;
2567   fpCommand = new G4UIcommand ("/vis/scene/ad    2080   fpCommand = new G4UIcommand ("/vis/scene/add/text", this);
2568   fpCommand -> SetGuidance ("Adds text to cur    2081   fpCommand -> SetGuidance ("Adds text to current scene.");
2569   fpCommand -> SetGuidance                       2082   fpCommand -> SetGuidance
2570     ("Use \"/vis/set/textColour\" to set colo    2083     ("Use \"/vis/set/textColour\" to set colour.");
2571   fpCommand -> SetGuidance                       2084   fpCommand -> SetGuidance
2572     ("Use \"/vis/set/textLayout\" to set layo    2085     ("Use \"/vis/set/textLayout\" to set layout:");
2573   G4UIparameter* parameter;                      2086   G4UIparameter* parameter;
2574   parameter = new G4UIparameter ("x", 'd', om    2087   parameter = new G4UIparameter ("x", 'd', omitable = true);
2575   parameter->SetDefaultValue (0);                2088   parameter->SetDefaultValue (0);
                                                   >> 2089   parameter->SetGuidance ("x");
2576   fpCommand->SetParameter (parameter);           2090   fpCommand->SetParameter (parameter);
2577   parameter =  new G4UIparameter ("y", 'd', o    2091   parameter =  new G4UIparameter ("y", 'd', omitable = true);
2578   parameter->SetDefaultValue (0);                2092   parameter->SetDefaultValue (0);
                                                   >> 2093   parameter->SetGuidance ("y");
2579   fpCommand->SetParameter (parameter);           2094   fpCommand->SetParameter (parameter);
2580   parameter =  new G4UIparameter ("z", 'd', o    2095   parameter =  new G4UIparameter ("z", 'd', omitable = true);
2581   parameter->SetDefaultValue (0);                2096   parameter->SetDefaultValue (0);
                                                   >> 2097   parameter->SetGuidance ("z");
2582   fpCommand->SetParameter (parameter);           2098   fpCommand->SetParameter (parameter);
2583   parameter =  new G4UIparameter ("unit", 's'    2099   parameter =  new G4UIparameter ("unit", 's', omitable = true);
2584   parameter->SetDefaultValue ("m");              2100   parameter->SetDefaultValue ("m");
2585   fpCommand->SetParameter     (parameter);       2101   fpCommand->SetParameter     (parameter);
2586   parameter =  new G4UIparameter ("font_size"    2102   parameter =  new G4UIparameter ("font_size", 'd', omitable = true);
2587   parameter->SetDefaultValue (12);               2103   parameter->SetDefaultValue (12);
2588   parameter->SetGuidance ("pixels");             2104   parameter->SetGuidance ("pixels");
2589   fpCommand->SetParameter (parameter);           2105   fpCommand->SetParameter (parameter);
2590   parameter =  new G4UIparameter ("x_offset",    2106   parameter =  new G4UIparameter ("x_offset", 'd', omitable = true);
2591   parameter->SetDefaultValue (0);                2107   parameter->SetDefaultValue (0);
2592   parameter->SetGuidance ("pixels");             2108   parameter->SetGuidance ("pixels");
2593   fpCommand->SetParameter (parameter);           2109   fpCommand->SetParameter (parameter);
2594   parameter =  new G4UIparameter ("y_offset",    2110   parameter =  new G4UIparameter ("y_offset", 'd', omitable = true);
2595   parameter->SetDefaultValue (0);                2111   parameter->SetDefaultValue (0);
2596   parameter->SetGuidance ("pixels");             2112   parameter->SetGuidance ("pixels");
2597   fpCommand->SetParameter (parameter);           2113   fpCommand->SetParameter (parameter);
2598   parameter =  new G4UIparameter ("text", 's'    2114   parameter =  new G4UIparameter ("text", 's', omitable = true);
2599   parameter->SetGuidance ("The rest of the li    2115   parameter->SetGuidance ("The rest of the line is text.");
2600   parameter->SetDefaultValue ("Hello G4");       2116   parameter->SetDefaultValue ("Hello G4");
2601   fpCommand->SetParameter (parameter);           2117   fpCommand->SetParameter (parameter);
2602 }                                                2118 }
2603                                                  2119 
2604 G4VisCommandSceneAddText::~G4VisCommandSceneA    2120 G4VisCommandSceneAddText::~G4VisCommandSceneAddText () {
2605   delete fpCommand;                              2121   delete fpCommand;
2606 }                                                2122 }
2607                                                  2123 
2608 G4String G4VisCommandSceneAddText::GetCurrent    2124 G4String G4VisCommandSceneAddText::GetCurrentValue (G4UIcommand*) {
2609   return "";                                     2125   return "";
2610 }                                                2126 }
2611                                                  2127 
2612 void G4VisCommandSceneAddText::SetNewValue (G    2128 void G4VisCommandSceneAddText::SetNewValue (G4UIcommand*, G4String newValue) {
2613                                                  2129 
2614   G4VisManager::Verbosity verbosity = fpVisMa    2130   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2615   G4bool warn = verbosity >= G4VisManager::wa    2131   G4bool warn = verbosity >= G4VisManager::warnings;
2616                                                  2132 
2617   G4Scene* pScene = fpVisManager->GetCurrentS    2133   G4Scene* pScene = fpVisManager->GetCurrentScene();
2618   if (!pScene) {                                 2134   if (!pScene) {
2619     if (verbosity >= G4VisManager::errors) {     2135     if (verbosity >= G4VisManager::errors) {
2620       G4warn << "ERROR: No current scene.  Pl << 2136       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2621     }                                            2137     }
2622     return;                                      2138     return;
2623   }                                              2139   }
2624                                                  2140 
2625   G4Tokenizer next(newValue);                    2141   G4Tokenizer next(newValue);
2626   G4double x = StoD(next());                     2142   G4double x = StoD(next());
2627   G4double y = StoD(next());                     2143   G4double y = StoD(next());
2628   G4double z = StoD(next());                     2144   G4double z = StoD(next());
2629   G4String unitString = next();                  2145   G4String unitString = next();
2630   G4double font_size = StoD(next());             2146   G4double font_size = StoD(next());
2631   G4double x_offset = StoD(next());              2147   G4double x_offset = StoD(next());
2632   G4double y_offset = StoD(next());              2148   G4double y_offset = StoD(next());
2633   G4String text = next("\n");                    2149   G4String text = next("\n");
2634                                                  2150 
2635   G4double unit = G4UIcommand::ValueOf(unitSt    2151   G4double unit = G4UIcommand::ValueOf(unitString);
2636   x *= unit; y *= unit; z *= unit;               2152   x *= unit; y *= unit; z *= unit;
2637                                                  2153 
2638   G4Text g4text(text, G4Point3D(x,y,z));         2154   G4Text g4text(text, G4Point3D(x,y,z));
2639   G4VisAttributes visAtts(fCurrentTextColour)    2155   G4VisAttributes visAtts(fCurrentTextColour);
2640   g4text.SetVisAttributes(visAtts);              2156   g4text.SetVisAttributes(visAtts);
2641   g4text.SetLayout(fCurrentTextLayout);          2157   g4text.SetLayout(fCurrentTextLayout);
2642   g4text.SetScreenSize(font_size);               2158   g4text.SetScreenSize(font_size);
2643   g4text.SetOffset(x_offset,y_offset);           2159   g4text.SetOffset(x_offset,y_offset);
2644   G4VModel* model = new G4TextModel(g4text);     2160   G4VModel* model = new G4TextModel(g4text);
2645   const G4String& currentSceneName = pScene -    2161   const G4String& currentSceneName = pScene -> GetName ();
2646   G4bool successful = pScene -> AddRunDuratio    2162   G4bool successful = pScene -> AddRunDurationModel (model, warn);
2647   if (successful) {                              2163   if (successful) {
2648     if (verbosity >= G4VisManager::confirmati    2164     if (verbosity >= G4VisManager::confirmations) {
2649       G4cout << "Text '" << text              << 2165       G4cout << "Text \"" << text
2650        << "' has been added to scene \"" << c << 2166        << "\" has been added to scene \"" << currentSceneName << "\"."
2651        << G4endl;                                2167        << G4endl;
2652     }                                            2168     }
2653   }                                              2169   }
2654   else G4VisCommandsSceneAddUnsuccessful(verb    2170   else G4VisCommandsSceneAddUnsuccessful(verbosity);
2655                                               << 2171   UpdateVisManagerScene (currentSceneName);
2656   CheckSceneAndNotifyHandlers (pScene);       << 
2657 }                                                2172 }
2658                                                  2173 
2659                                                  2174 
2660 ////////////// /vis/scene/add/text2D ////////    2175 ////////////// /vis/scene/add/text2D //////////////////////////////////
2661                                                  2176 
2662 G4VisCommandSceneAddText2D::G4VisCommandScene    2177 G4VisCommandSceneAddText2D::G4VisCommandSceneAddText2D () {
2663   G4bool omitable;                               2178   G4bool omitable;
2664   fpCommand = new G4UIcommand ("/vis/scene/ad    2179   fpCommand = new G4UIcommand ("/vis/scene/add/text2D", this);
2665   fpCommand -> SetGuidance ("Adds 2D text to     2180   fpCommand -> SetGuidance ("Adds 2D text to current scene.");
2666   fpCommand -> SetGuidance ("x,y in range [-1 << 
2667   fpCommand -> SetGuidance                       2181   fpCommand -> SetGuidance
2668     ("Use \"/vis/set/textColour\" to set colo    2182     ("Use \"/vis/set/textColour\" to set colour.");
2669   fpCommand -> SetGuidance                       2183   fpCommand -> SetGuidance
2670     ("Use \"/vis/set/textLayout\" to set layo    2184     ("Use \"/vis/set/textLayout\" to set layout:");
2671   G4UIparameter* parameter;                      2185   G4UIparameter* parameter;
2672   parameter = new G4UIparameter ("x", 'd', om    2186   parameter = new G4UIparameter ("x", 'd', omitable = true);
2673   parameter->SetDefaultValue (0);                2187   parameter->SetDefaultValue (0);
                                                   >> 2188   parameter->SetGuidance ("x");
2674   fpCommand->SetParameter (parameter);           2189   fpCommand->SetParameter (parameter);
2675   parameter =  new G4UIparameter ("y", 'd', o    2190   parameter =  new G4UIparameter ("y", 'd', omitable = true);
2676   parameter->SetDefaultValue (0);                2191   parameter->SetDefaultValue (0);
                                                   >> 2192   parameter->SetGuidance ("y");
2677   fpCommand->SetParameter (parameter);           2193   fpCommand->SetParameter (parameter);
2678   parameter =  new G4UIparameter ("font_size"    2194   parameter =  new G4UIparameter ("font_size", 'd', omitable = true);
2679   parameter->SetDefaultValue (12);               2195   parameter->SetDefaultValue (12);
2680   parameter->SetGuidance ("pixels");             2196   parameter->SetGuidance ("pixels");
2681   fpCommand->SetParameter (parameter);           2197   fpCommand->SetParameter (parameter);
2682   parameter =  new G4UIparameter ("x_offset",    2198   parameter =  new G4UIparameter ("x_offset", 'd', omitable = true);
2683   parameter->SetDefaultValue (0);                2199   parameter->SetDefaultValue (0);
2684   parameter->SetGuidance ("pixels");             2200   parameter->SetGuidance ("pixels");
2685   fpCommand->SetParameter (parameter);           2201   fpCommand->SetParameter (parameter);
2686   parameter =  new G4UIparameter ("y_offset",    2202   parameter =  new G4UIparameter ("y_offset", 'd', omitable = true);
2687   parameter->SetDefaultValue (0);                2203   parameter->SetDefaultValue (0);
2688   parameter->SetGuidance ("pixels");             2204   parameter->SetGuidance ("pixels");
2689   fpCommand->SetParameter (parameter);           2205   fpCommand->SetParameter (parameter);
2690   parameter =  new G4UIparameter ("text", 's'    2206   parameter =  new G4UIparameter ("text", 's', omitable = true);
2691   parameter->SetGuidance ("The rest of the li    2207   parameter->SetGuidance ("The rest of the line is text.");
2692   parameter->SetDefaultValue ("Hello G4");       2208   parameter->SetDefaultValue ("Hello G4");
2693   fpCommand->SetParameter (parameter);           2209   fpCommand->SetParameter (parameter);
2694 }                                                2210 }
2695                                                  2211 
2696 G4VisCommandSceneAddText2D::~G4VisCommandScen    2212 G4VisCommandSceneAddText2D::~G4VisCommandSceneAddText2D () {
2697   delete fpCommand;                              2213   delete fpCommand;
2698 }                                                2214 }
2699                                                  2215 
2700 G4String G4VisCommandSceneAddText2D::GetCurre    2216 G4String G4VisCommandSceneAddText2D::GetCurrentValue (G4UIcommand*) {
2701   return "";                                     2217   return "";
2702 }                                                2218 }
2703                                                  2219 
2704 void G4VisCommandSceneAddText2D::SetNewValue     2220 void G4VisCommandSceneAddText2D::SetNewValue (G4UIcommand*, G4String newValue) {
2705                                                  2221 
2706   G4VisManager::Verbosity verbosity = fpVisMa    2222   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2707   G4bool warn = verbosity >= G4VisManager::wa    2223   G4bool warn = verbosity >= G4VisManager::warnings;
2708                                                  2224 
2709   G4Scene* pScene = fpVisManager->GetCurrentS    2225   G4Scene* pScene = fpVisManager->GetCurrentScene();
2710   if (!pScene) {                                 2226   if (!pScene) {
2711     if (verbosity >= G4VisManager::errors) {     2227     if (verbosity >= G4VisManager::errors) {
2712       G4warn << "ERROR: No current scene.  Pl << 2228       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2713     }                                            2229     }
2714     return;                                      2230     return;
2715   }                                              2231   }
2716                                                  2232 
2717   G4Tokenizer next(newValue);                    2233   G4Tokenizer next(newValue);
2718   G4double x = StoD(next());                     2234   G4double x = StoD(next());
2719   G4double y = StoD(next());                     2235   G4double y = StoD(next());
2720   G4double font_size = StoD(next());             2236   G4double font_size = StoD(next());
2721   G4double x_offset = StoD(next());              2237   G4double x_offset = StoD(next());
2722   G4double y_offset = StoD(next());              2238   G4double y_offset = StoD(next());
2723   G4String text = next("\n");                    2239   G4String text = next("\n");
2724                                                  2240 
2725   G4Text g4text(text, G4Point3D(x,y,0.));        2241   G4Text g4text(text, G4Point3D(x,y,0.));
2726   G4VisAttributes visAtts(fCurrentTextColour)    2242   G4VisAttributes visAtts(fCurrentTextColour);
2727   g4text.SetVisAttributes(visAtts);              2243   g4text.SetVisAttributes(visAtts);
2728   g4text.SetLayout(fCurrentTextLayout);          2244   g4text.SetLayout(fCurrentTextLayout);
2729   g4text.SetScreenSize(font_size);               2245   g4text.SetScreenSize(font_size);
2730   g4text.SetOffset(x_offset,y_offset);           2246   g4text.SetOffset(x_offset,y_offset);
2731   G4Text2D* g4text2D = new G4Text2D(g4text);     2247   G4Text2D* g4text2D = new G4Text2D(g4text);
2732   G4VModel* model =                              2248   G4VModel* model =
2733     new G4CallbackModel<G4VisCommandSceneAddT    2249     new G4CallbackModel<G4VisCommandSceneAddText2D::G4Text2D>(g4text2D);
2734   model->SetType("Text2D");                      2250   model->SetType("Text2D");
2735   model->SetGlobalTag("Text2D");                 2251   model->SetGlobalTag("Text2D");
2736   std::ostringstream oss;                     << 2252   model->SetGlobalDescription("Text2D: " + newValue);
2737   oss << "Text2D: '" << g4text.GetText()      << 
2738   << "' at " << g4text.GetPosition().x() << ' << 
2739   << " with size " << g4text.GetScreenSize()  << 
2740   << " with offsets " << g4text.GetXOffset()  << 
2741   model->SetGlobalDescription(oss.str());     << 
2742   const G4String& currentSceneName = pScene -    2253   const G4String& currentSceneName = pScene -> GetName ();
2743   G4bool successful = pScene -> AddRunDuratio    2254   G4bool successful = pScene -> AddRunDurationModel (model, warn);
2744   if (successful) {                              2255   if (successful) {
2745     if (verbosity >= G4VisManager::confirmati    2256     if (verbosity >= G4VisManager::confirmations) {
2746       G4cout << "2D text '" << text           << 2257       G4cout << "2D text \"" << text
2747        << "' has been added to scene \"" << c << 2258        << "\" has been added to scene \"" << currentSceneName << "\"."
2748        << G4endl;                                2259        << G4endl;
2749     }                                            2260     }
2750   }                                              2261   }
2751   else G4VisCommandsSceneAddUnsuccessful(verb    2262   else G4VisCommandsSceneAddUnsuccessful(verbosity);
2752                                               << 2263   UpdateVisManagerScene (currentSceneName);
2753   CheckSceneAndNotifyHandlers (pScene);       << 
2754 }                                                2264 }
2755                                                  2265 
2756 G4VisCommandSceneAddText2D::G4Text2D::G4Text2    2266 G4VisCommandSceneAddText2D::G4Text2D::G4Text2D(const G4Text& text):
2757   fText(text)                                    2267   fText(text)
2758 {}                                               2268 {}
2759                                                  2269 
2760 void G4VisCommandSceneAddText2D::G4Text2D::op    2270 void G4VisCommandSceneAddText2D::G4Text2D::operator()
2761   (G4VGraphicsScene& sceneHandler, const G4Mo << 2271   (G4VGraphicsScene& sceneHandler, const G4Transform3D& transform) {
2762   sceneHandler.BeginPrimitives2D();           << 2272   sceneHandler.BeginPrimitives2D(transform);
2763   sceneHandler.AddPrimitive(fText);              2273   sceneHandler.AddPrimitive(fText);
2764   sceneHandler.EndPrimitives2D();                2274   sceneHandler.EndPrimitives2D();
2765 }                                                2275 }
2766                                                  2276 
2767                                                  2277 
2768 ////////////// /vis/scene/add/trajectories //    2278 ////////////// /vis/scene/add/trajectories ///////////////////////////////////
2769                                                  2279 
2770 G4VisCommandSceneAddTrajectories::G4VisComman    2280 G4VisCommandSceneAddTrajectories::G4VisCommandSceneAddTrajectories () {
2771   G4bool omitable;                               2281   G4bool omitable;
2772   fpCommand = new G4UIcmdWithAString             2282   fpCommand = new G4UIcmdWithAString
2773     ("/vis/scene/add/trajectories", this);       2283     ("/vis/scene/add/trajectories", this);
2774   fpCommand -> SetGuidance                       2284   fpCommand -> SetGuidance
2775     ("Adds trajectories to current scene.");     2285     ("Adds trajectories to current scene.");
2776   fpCommand -> SetGuidance                       2286   fpCommand -> SetGuidance
2777     ("Causes trajectories, if any, to be draw    2287     ("Causes trajectories, if any, to be drawn at the end of processing an"
2778      "\nevent.  Switches on trajectory storin    2288      "\nevent.  Switches on trajectory storing and sets the"
2779      "\ndefault trajectory type.");              2289      "\ndefault trajectory type.");
2780   fpCommand -> SetGuidance                       2290   fpCommand -> SetGuidance
2781     ("The command line parameter list determi    2291     ("The command line parameter list determines the default trajectory type."
2782      "\nIf it contains the string \"smooth\",    2292      "\nIf it contains the string \"smooth\", auxiliary inter-step points will"
2783      "\nbe inserted to improve the smoothness    2293      "\nbe inserted to improve the smoothness of the drawing of a curved"
2784      "\ntrajectory."                             2294      "\ntrajectory."
2785      "\nIf it contains the string \"rich\", s    2295      "\nIf it contains the string \"rich\", significant extra information will"
2786      "\nbe stored in the trajectory (G4RichTr    2296      "\nbe stored in the trajectory (G4RichTrajectory) amenable to modeling"
2787      "\nand filtering with \"/vis/modeling/tr    2297      "\nand filtering with \"/vis/modeling/trajectories/create/drawByAttribute\""
2788      "\nand \"/vis/filtering/trajectories/cre    2298      "\nand \"/vis/filtering/trajectories/create/attributeFilter\" commands."
2789      "\nIt may contain both strings in any or    2299      "\nIt may contain both strings in any order.");
2790   fpCommand -> SetGuidance                       2300   fpCommand -> SetGuidance
2791     ("\nTo switch off trajectory storing: \"/    2301     ("\nTo switch off trajectory storing: \"/tracking/storeTrajectory 0\"."
2792      "\nSee also \"/vis/scene/endOfEventActio    2302      "\nSee also \"/vis/scene/endOfEventAction\".");
2793   fpCommand -> SetGuidance                       2303   fpCommand -> SetGuidance
2794     ("Note:  This only sets the default.  Ind    2304     ("Note:  This only sets the default.  Independently of the result of this"
2795      "\ncommand, a user may instantiate a tra    2305      "\ncommand, a user may instantiate a trajectory that overrides this default"
2796      "\nin PreUserTrackingAction.");             2306      "\nin PreUserTrackingAction.");
2797   fpCommand -> SetParameterName ("default-tra    2307   fpCommand -> SetParameterName ("default-trajectory-type", omitable = true);
2798   fpCommand -> SetDefaultValue ("");             2308   fpCommand -> SetDefaultValue ("");
2799 }                                                2309 }
2800                                                  2310 
2801 G4VisCommandSceneAddTrajectories::~G4VisComma    2311 G4VisCommandSceneAddTrajectories::~G4VisCommandSceneAddTrajectories () {
2802   delete fpCommand;                              2312   delete fpCommand;
2803 }                                                2313 }
2804                                                  2314 
2805 G4String G4VisCommandSceneAddTrajectories::Ge    2315 G4String G4VisCommandSceneAddTrajectories::GetCurrentValue (G4UIcommand*) {
2806   return "";                                     2316   return "";
2807 }                                                2317 }
2808                                                  2318 
2809 void G4VisCommandSceneAddTrajectories::SetNew    2319 void G4VisCommandSceneAddTrajectories::SetNewValue (G4UIcommand*,
2810                 G4String newValue) {             2320                 G4String newValue) {
2811                                                  2321 
2812   G4VisManager::Verbosity verbosity = fpVisMa    2322   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2813   G4bool warn = verbosity >= G4VisManager::wa    2323   G4bool warn = verbosity >= G4VisManager::warnings;
2814                                                  2324 
2815   G4Scene* pScene = fpVisManager->GetCurrentS    2325   G4Scene* pScene = fpVisManager->GetCurrentScene();
2816   if (!pScene) {                                 2326   if (!pScene) {
2817     if (verbosity >= G4VisManager::errors) {     2327     if (verbosity >= G4VisManager::errors) {
2818       G4warn << "ERROR: No current scene.  Pl << 2328       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2819     }                                            2329     }
2820     return;                                      2330     return;
2821   }                                              2331   }
2822   const G4String& currentSceneName = pScene - << 
2823                                                  2332 
2824   G4bool smooth = false;                      << 2333   G4bool smooth = false, rich = false;
2825   G4bool rich = false;                        << 
2826   if (newValue.find("smooth") != std::string:    2334   if (newValue.find("smooth") != std::string::npos) smooth = true;
2827   if (newValue.find("rich") != std::string::n    2335   if (newValue.find("rich") != std::string::npos) rich = true;
2828   if (newValue.size() && !(rich || smooth)) { << 
2829     if (verbosity >= G4VisManager::errors) {  << 
2830       G4warn << "ERROR: Unrecognised paramete << 
2831       "\n  No action taken."                  << 
2832       << G4endl;                              << 
2833     }                                         << 
2834     return;                                   << 
2835   }                                           << 
2836                                                  2336 
2837   G4UImanager* UImanager = G4UImanager::GetUI    2337   G4UImanager* UImanager = G4UImanager::GetUIpointer();
                                                   >> 2338   G4int keepVerbose = UImanager->GetVerboseLevel();
                                                   >> 2339   G4int newVerbose = 2;
                                                   >> 2340   UImanager->SetVerboseLevel(newVerbose);
                                                   >> 2341   G4PropagatorInField* propagatorInField =
                                                   >> 2342     G4TransportationManager::GetTransportationManager()->
                                                   >> 2343     GetPropagatorInField();
                                                   >> 2344   propagatorInField->SetTrajectoryFilter(0); // Switch off smooth trajectories.
                                                   >> 2345   static G4IdentityTrajectoryFilter auxiliaryPointsFilter;
2838   G4String defaultTrajectoryType;                2346   G4String defaultTrajectoryType;
                                                   >> 2347   G4bool i_mode_found = false;
                                                   >> 2348   G4int i_mode = 0;
2839   if (smooth && rich) {                          2349   if (smooth && rich) {
2840     UImanager->ApplyCommand("/tracking/storeT << 2350     UImanager->ApplyCommand("/tracking/storeTrajectory 3");
                                                   >> 2351     propagatorInField->SetTrajectoryFilter(&auxiliaryPointsFilter);
2841     defaultTrajectoryType = "G4RichTrajectory    2352     defaultTrajectoryType = "G4RichTrajectory configured for smooth steps";
2842   } else if (smooth) {                           2353   } else if (smooth) {
2843     UImanager->ApplyCommand("/tracking/storeT    2354     UImanager->ApplyCommand("/tracking/storeTrajectory 2");
                                                   >> 2355     propagatorInField->SetTrajectoryFilter(&auxiliaryPointsFilter);
2844     defaultTrajectoryType = "G4SmoothTrajecto    2356     defaultTrajectoryType = "G4SmoothTrajectory";
2845   } else if (rich) {                             2357   } else if (rich) {
2846     UImanager->ApplyCommand("/tracking/storeT    2358     UImanager->ApplyCommand("/tracking/storeTrajectory 3");
2847     defaultTrajectoryType = "G4RichTrajectory    2359     defaultTrajectoryType = "G4RichTrajectory";
2848   } else {                                       2360   } else {
                                                   >> 2361     if (!newValue.empty()) {
                                                   >> 2362       std::istringstream iss(newValue);
                                                   >> 2363       iss >> i_mode;
                                                   >> 2364       if (iss) {
                                                   >> 2365   i_mode_found = true;
                                                   >> 2366   if (verbosity >= G4VisManager::warnings) {
                                                   >> 2367     G4cout <<
                                                   >> 2368   "WARNING: Integer parameter " << i_mode << " found."
                                                   >> 2369   "\n  DEPRECATED - its use in this command will be removed at a future major"
                                                   >> 2370   "\n  release.  Use \"/vis/modeling/trajectories\" commands."
                                                   >> 2371      << G4endl;
                                                   >> 2372   }
                                                   >> 2373       } else {
                                                   >> 2374   if (verbosity >= G4VisManager::errors) {
                                                   >> 2375     G4cout << "ERROR: Unrecognised parameter \"" << newValue << "\""
                                                   >> 2376       "\n  No action taken."
                                                   >> 2377      << G4endl;
                                                   >> 2378   }
                                                   >> 2379   return;
                                                   >> 2380       }
                                                   >> 2381     }
2849     UImanager->ApplyCommand("/tracking/storeT    2382     UImanager->ApplyCommand("/tracking/storeTrajectory 1");
2850     defaultTrajectoryType = "G4Trajectory";      2383     defaultTrajectoryType = "G4Trajectory";
2851   }                                              2384   }
                                                   >> 2385   UImanager->SetVerboseLevel(keepVerbose);
2852                                                  2386 
2853   if (verbosity >= G4VisManager::errors) {       2387   if (verbosity >= G4VisManager::errors) {
2854     G4warn <<                                 << 2388     G4cout <<
2855       "Attributes available for modeling and     2389       "Attributes available for modeling and filtering with"
2856       "\n  \"/vis/modeling/trajectories/creat    2390       "\n  \"/vis/modeling/trajectories/create/drawByAttribute\" and"
2857       "\n  \"/vis/filtering/trajectories/crea    2391       "\n  \"/vis/filtering/trajectories/create/attributeFilter\" commands:"
2858      << G4endl;                                  2392      << G4endl;
2859     G4warn << *G4TrajectoriesModel().GetAttDe << 2393     G4cout << G4TrajectoriesModel().GetAttDefs();
2860     if (rich) {                                  2394     if (rich) {
2861       G4warn << *G4RichTrajectory().GetAttDef << 2395       G4cout << G4RichTrajectory().GetAttDefs()
2862        << *G4RichTrajectoryPoint().GetAttDefs << 2396        << G4RichTrajectoryPoint().GetAttDefs();
2863     } else if (smooth) {                         2397     } else if (smooth) {
2864       G4warn << *G4SmoothTrajectory().GetAttD << 2398       G4cout << G4SmoothTrajectory().GetAttDefs()
2865        << *G4SmoothTrajectoryPoint().GetAttDe << 2399        << G4SmoothTrajectoryPoint().GetAttDefs();
2866     } else {                                     2400     } else {
2867       G4warn << *G4Trajectory().GetAttDefs()  << 2401       G4cout << G4Trajectory().GetAttDefs()
2868        << *G4TrajectoryPoint().GetAttDefs();  << 2402        << G4TrajectoryPoint().GetAttDefs();
2869     }                                            2403     }
2870   }                                              2404   }
2871                                                  2405 
2872   const auto& eoeList = pScene->GetEndOfEvent << 2406   G4TrajectoriesModel* model = 0;
2873   auto eoeModel = eoeList.begin();            << 2407   if (i_mode_found) {
2874   for (; eoeModel != eoeList.end(); ++eoeMode << 2408     model = new G4TrajectoriesModel(i_mode);
2875     const auto* actualModel = eoeModel->fpMod << 2409   } else {
2876     if (dynamic_cast<const G4TrajectoriesMode << 2410     model = new G4TrajectoriesModel();
2877   }                                           << 2411   }
2878   if (eoeModel == eoeList.end()) {            << 2412   const G4String& currentSceneName = pScene -> GetName ();
2879     // No trajectories model exists in the sc << 2413   pScene -> AddEndOfEventModel (model, warn);
2880     G4VModel* model = new G4TrajectoriesModel << 
2881     pScene -> AddEndOfEventModel (model, warn << 
2882   }  // ...else it already exists and there i << 
2883   // because G4TrajectoriesModel simply descr << 
2884   // trajectories store whatever the type.    << 
2885                                                  2414 
2886   if (verbosity >= G4VisManager::confirmation    2415   if (verbosity >= G4VisManager::confirmations) {
2887     G4cout << "Default trajectory type " << d    2416     G4cout << "Default trajectory type " << defaultTrajectoryType
2888      << "\n  will be used to store trajectori    2417      << "\n  will be used to store trajectories for scene \""
2889      << currentSceneName << "\"."                2418      << currentSceneName << "\"."
2890      << G4endl;                                  2419      << G4endl;
2891   }                                              2420   }
2892                                                  2421 
2893   if (verbosity >= G4VisManager::warnings) {     2422   if (verbosity >= G4VisManager::warnings) {
2894     G4warn <<                                 << 2423     G4cout <<
2895       "WARNING: Trajectory storing has been r    2424       "WARNING: Trajectory storing has been requested.  This action may be"
2896       "\n  reversed with \"/tracking/storeTra    2425       "\n  reversed with \"/tracking/storeTrajectory 0\"."
2897      << G4endl;                                  2426      << G4endl;
2898   }                                              2427   }
2899                                               << 2428   UpdateVisManagerScene (currentSceneName);
2900   CheckSceneAndNotifyHandlers (pScene);       << 
2901 }                                                2429 }
2902                                                  2430 
2903 ////////////// /vis/scene/add/userAction ////    2431 ////////////// /vis/scene/add/userAction ///////////////////////////////////
2904                                                  2432 
2905 G4VisCommandSceneAddUserAction::G4VisCommandS    2433 G4VisCommandSceneAddUserAction::G4VisCommandSceneAddUserAction () {
2906   G4bool omitable;                               2434   G4bool omitable;
2907   fpCommand = new G4UIcmdWithAString("/vis/sc    2435   fpCommand = new G4UIcmdWithAString("/vis/scene/add/userAction",this);
2908   fpCommand -> SetGuidance                       2436   fpCommand -> SetGuidance
2909     ("Add named Vis User Action to current sc    2437     ("Add named Vis User Action to current scene.");
2910   fpCommand -> SetGuidance                       2438   fpCommand -> SetGuidance
2911     ("Attempts to match search string to name    2439     ("Attempts to match search string to name of action - use unique sub-string.");
2912   fpCommand -> SetGuidance                       2440   fpCommand -> SetGuidance
2913     ("(Use /vis/list to see names of register    2441     ("(Use /vis/list to see names of registered actions.)");
2914   fpCommand -> SetGuidance                       2442   fpCommand -> SetGuidance
2915     ("If name == \"all\" (default), all actio    2443     ("If name == \"all\" (default), all actions are added.");
2916   fpCommand -> SetParameterName("action-name"    2444   fpCommand -> SetParameterName("action-name", omitable = true);
2917   fpCommand -> SetDefaultValue("all");           2445   fpCommand -> SetDefaultValue("all");
2918 }                                                2446 }
2919                                                  2447 
2920 G4VisCommandSceneAddUserAction::~G4VisCommand    2448 G4VisCommandSceneAddUserAction::~G4VisCommandSceneAddUserAction () {
2921   delete fpCommand;                              2449   delete fpCommand;
2922 }                                                2450 }
2923                                                  2451 
2924 G4String G4VisCommandSceneAddUserAction::GetC    2452 G4String G4VisCommandSceneAddUserAction::GetCurrentValue (G4UIcommand*) {
2925   return "";                                     2453   return "";
2926 }                                                2454 }
2927                                                  2455 
2928 void G4VisCommandSceneAddUserAction::SetNewVa    2456 void G4VisCommandSceneAddUserAction::SetNewValue
2929 (G4UIcommand*, G4String newValue) {              2457 (G4UIcommand*, G4String newValue) {
2930                                                  2458 
2931   G4VisManager::Verbosity verbosity = fpVisMa    2459   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
2932                                                  2460 
2933   G4Scene* pScene = fpVisManager->GetCurrentS    2461   G4Scene* pScene = fpVisManager->GetCurrentScene();
2934   if (!pScene) {                                 2462   if (!pScene) {
2935     if (verbosity >= G4VisManager::errors) {     2463     if (verbosity >= G4VisManager::errors) {
2936       G4warn << "ERROR: No current scene.  Pl << 2464       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
2937     }                                            2465     }
2938     return;                                      2466     return;
2939   }                                              2467   }
2940                                                  2468 
2941   G4bool any = false;                            2469   G4bool any = false;
2942                                                  2470 
2943   const std::vector<G4VisManager::UserVisActi    2471   const std::vector<G4VisManager::UserVisAction>& runDurationUserVisActions =
2944     fpVisManager->GetRunDurationUserVisAction    2472     fpVisManager->GetRunDurationUserVisActions();
2945   for (size_t i = 0; i < runDurationUserVisAc    2473   for (size_t i = 0; i < runDurationUserVisActions.size(); i++) {
2946     const G4String& name = runDurationUserVis    2474     const G4String& name = runDurationUserVisActions[i].fName;
2947     G4VUserVisAction* visAction = runDuration    2475     G4VUserVisAction* visAction = runDurationUserVisActions[i].fpUserVisAction;
2948     if (newValue == "all" || name.find(newVal    2476     if (newValue == "all" || name.find(newValue) != std::string::npos) {
2949       any = true;                                2477       any = true;
2950       AddVisAction(name,visAction,pScene,runD    2478       AddVisAction(name,visAction,pScene,runDuration,verbosity);
2951     }                                            2479     }
2952   }                                              2480   }
2953                                                  2481 
2954   const std::vector<G4VisManager::UserVisActi    2482   const std::vector<G4VisManager::UserVisAction>& endOfEventUserVisActions =
2955     fpVisManager->GetEndOfEventUserVisActions    2483     fpVisManager->GetEndOfEventUserVisActions();
2956   for (size_t i = 0; i < endOfEventUserVisAct    2484   for (size_t i = 0; i < endOfEventUserVisActions.size(); i++) {
2957     const G4String& name = endOfEventUserVisA    2485     const G4String& name = endOfEventUserVisActions[i].fName;
2958     G4VUserVisAction* visAction = endOfEventU    2486     G4VUserVisAction* visAction = endOfEventUserVisActions[i].fpUserVisAction;
2959     if (newValue == "all" || name.find(newVal    2487     if (newValue == "all" || name.find(newValue) != std::string::npos) {
2960       any = true;                                2488       any = true;
2961       AddVisAction(name,visAction,pScene,endO    2489       AddVisAction(name,visAction,pScene,endOfEvent,verbosity);
2962     }                                            2490     }
2963   }                                              2491   }
2964                                                  2492 
2965   const std::vector<G4VisManager::UserVisActi    2493   const std::vector<G4VisManager::UserVisAction>& endOfRunUserVisActions =
2966     fpVisManager->GetEndOfRunUserVisActions()    2494     fpVisManager->GetEndOfRunUserVisActions();
2967   for (size_t i = 0; i < endOfRunUserVisActio    2495   for (size_t i = 0; i < endOfRunUserVisActions.size(); i++) {
2968     const G4String& name = endOfRunUserVisAct    2496     const G4String& name = endOfRunUserVisActions[i].fName;
2969     G4VUserVisAction* visAction = endOfRunUse    2497     G4VUserVisAction* visAction = endOfRunUserVisActions[i].fpUserVisAction;
2970     if (newValue == "all" || name.find(newVal    2498     if (newValue == "all" || name.find(newValue) != std::string::npos) {
2971       any = true;                                2499       any = true;
2972       AddVisAction(name,visAction,pScene,endO    2500       AddVisAction(name,visAction,pScene,endOfRun,verbosity);
2973     }                                            2501     }
2974   }                                              2502   }
2975                                                  2503 
2976   if (!any) {                                    2504   if (!any) {
2977     if (verbosity >= G4VisManager::warnings)     2505     if (verbosity >= G4VisManager::warnings) {
2978       G4warn << "WARNING: No User Vis Action  << 2506       G4cout << "WARNING: No User Vis Action registered." << G4endl;
2979     }                                            2507     }
2980     return;                                      2508     return;
2981   }                                              2509   }
2982                                                  2510 
2983   CheckSceneAndNotifyHandlers (pScene);       << 2511   const G4String& currentSceneName = pScene -> GetName ();
                                                   >> 2512   UpdateVisManagerScene (currentSceneName);
2984 }                                                2513 }
2985                                                  2514 
2986 void G4VisCommandSceneAddUserAction::AddVisAc    2515 void G4VisCommandSceneAddUserAction::AddVisAction
2987 (const G4String& name,                           2516 (const G4String& name,
2988  G4VUserVisAction* visAction,                    2517  G4VUserVisAction* visAction,
2989  G4Scene* pScene,                                2518  G4Scene* pScene,
2990  G4VisCommandSceneAddUserAction::ActionType t    2519  G4VisCommandSceneAddUserAction::ActionType type,
2991  G4VisManager::Verbosity verbosity)              2520  G4VisManager::Verbosity verbosity)
2992 {                                                2521 {
2993   G4bool warn = verbosity >= G4VisManager::wa    2522   G4bool warn = verbosity >= G4VisManager::warnings;
2994                                                  2523 
2995   const std::map<G4VUserVisAction*,G4VisExten    2524   const std::map<G4VUserVisAction*,G4VisExtent>& visExtentMap =
2996     fpVisManager->GetUserVisActionExtents();     2525     fpVisManager->GetUserVisActionExtents();
2997   G4VisExtent extent;                            2526   G4VisExtent extent;
2998   std::map<G4VUserVisAction*,G4VisExtent>::co    2527   std::map<G4VUserVisAction*,G4VisExtent>::const_iterator i =
2999     visExtentMap.find(visAction);                2528     visExtentMap.find(visAction);
3000   if (i != visExtentMap.end()) extent = i->se    2529   if (i != visExtentMap.end()) extent = i->second;
3001   if (warn) {                                    2530   if (warn) {
3002     if (extent.GetExtentRadius() <= 0.) {        2531     if (extent.GetExtentRadius() <= 0.) {
3003       G4warn                                  << 2532       G4cout << "WARNING: User Vis Action extent is null." << G4endl;
3004       << "WARNING: User Vis Action \"" << nam << 
3005       << G4endl;                              << 
3006     }                                            2533     }
3007   }                                              2534   }
3008                                                  2535 
3009   G4VModel* model = new G4CallbackModel<G4VUs    2536   G4VModel* model = new G4CallbackModel<G4VUserVisAction>(visAction);
3010   model->SetType("User Vis Action");             2537   model->SetType("User Vis Action");
3011   model->SetGlobalTag(name);                     2538   model->SetGlobalTag(name);
3012   model->SetGlobalDescription(name);             2539   model->SetGlobalDescription(name);
3013   model->SetExtent(extent);                      2540   model->SetExtent(extent);
3014   G4bool successful = false;;                    2541   G4bool successful = false;;
3015   switch (type) {                                2542   switch (type) {
3016   case runDuration:                              2543   case runDuration:
3017     successful = pScene -> AddRunDurationMode    2544     successful = pScene -> AddRunDurationModel (model, warn);
3018     break;                                       2545     break;
3019   case endOfEvent:                               2546   case endOfEvent:
3020     successful = pScene -> AddEndOfEventModel    2547     successful = pScene -> AddEndOfEventModel (model, warn);
3021     break;                                       2548     break;
3022   case endOfRun:                                 2549   case endOfRun:
3023     successful = pScene -> AddEndOfRunModel (    2550     successful = pScene -> AddEndOfRunModel (model, warn);
3024     break;                                       2551     break;
3025   }                                              2552   }
3026   if (successful) {                           << 2553   if (successful && verbosity >= G4VisManager::confirmations) {
3027     if (verbosity >= G4VisManager::confirmati << 2554     const G4String& currentSceneName = pScene -> GetName ();
3028       const G4String& currentSceneName = pSce << 2555     G4cout << "User Vis Action added to scene \""
3029       G4cout << "User Vis Action added to sce << 2556      << currentSceneName << "\"";
3030       << currentSceneName << "\"";            << 2557     if (verbosity >= G4VisManager::parameters) {
3031       if (verbosity >= G4VisManager::paramete << 2558       G4cout << "\n  with extent " << extent;
3032         G4cout << "\n  with extent " << exten << 
3033       }                                       << 
3034       G4cout << G4endl;                       << 
3035     }                                            2559     }
                                                   >> 2560     G4cout << G4endl;
3036   }                                              2561   }
3037   else G4VisCommandsSceneAddUnsuccessful(verb << 
3038 }                                                2562 }
3039                                                  2563 
3040 ////////////// /vis/scene/add/volume ////////    2564 ////////////// /vis/scene/add/volume ///////////////////////////////////////
3041                                                  2565 
3042 G4VisCommandSceneAddVolume::G4VisCommandScene    2566 G4VisCommandSceneAddVolume::G4VisCommandSceneAddVolume () {
3043   G4bool omitable;                               2567   G4bool omitable;
3044   fpCommand = new G4UIcommand ("/vis/scene/ad    2568   fpCommand = new G4UIcommand ("/vis/scene/add/volume", this);
3045   fpCommand -> SetGuidance                       2569   fpCommand -> SetGuidance 
3046    ("Adds a physical volume to current scene,    2570    ("Adds a physical volume to current scene, with optional clipping volume.");
3047   fpCommand -> SetGuidance                       2571   fpCommand -> SetGuidance 
3048     ("If physical-volume-name is \"world\" (t    2572     ("If physical-volume-name is \"world\" (the default), the top of the"
3049      "\nmain geometry tree (material world) i << 2573      "\nmain geometry tree (material world) is added.  If \"worlds\", the"
3050      "\ntops of all worlds - material world a << 2574      "\ntop of all worlds - material world and parallel worlds, if any - are"
3051      "\nadded. Otherwise a search of all worl << 2575      "\nadded.  Otherwise a search of all worlds is made, taking the first"
3052   fpCommand -> SetGuidance                    << 2576      "\nmatching occurence only.  To see a representation of the geometry"
3053     ("In the last case the names of all volum << 2577      "\nhierarchy of the worlds, try \"/vis/drawTree [worlds]\" or one of the"
3054      "\nagainst physical-volume-name. If this << 2578      "\ndriver/browser combinations that have the required functionality, e.g., HepRep.");
3055      "\nwhere regexp is a regular expression  << 
3056      "\nthe usual rules of regular expression << 
3057      "\nmatch is required."                   << 
3058      "\nFor example, \"/Shap/\" adds \"Shape1 << 
3059   fpCommand -> SetGuidance                    << 
3060     ("It may help to see a textual representa << 
3061      "\nthe worlds. Try \"/vis/drawTree [worl << 
3062      "\ncombinations that have the required f << 
3063   fpCommand -> SetGuidance                       2579   fpCommand -> SetGuidance
3064     ("If clip-volume-type is specified, the s    2580     ("If clip-volume-type is specified, the subsequent parameters are used to"
3065      "\nto define a clipping volume. For exam << 2581      "\nto define a clipping volume.  For example,"
3066      "\n\"/vis/scene/add/volume ! ! ! -box km << 2582      "\n\"vis/scene/add/volume ! ! ! -box km 0 1 0 1 0 1\" will draw the world"
3067      "\nwith the positive octant cut away. (I << 2583      "\nwith the positive octant cut away."); 
3068      "\nwarnings try replacing 0 by 0.0000000 << 
3069   fpCommand -> SetGuidance                       2584   fpCommand -> SetGuidance
3070     ("If clip-volume-type is prepended with '    2585     ("If clip-volume-type is prepended with '-', the clip-volume is subtracted"
3071      "\n(cutaway). (This is the default if th    2586      "\n(cutaway). (This is the default if there is no prepended character.)"
3072      "\nIf '*' is prepended, the intersection    2587      "\nIf '*' is prepended, the intersection of the physical-volume and the"
3073      "\nclip-volume is made. (You can make a  << 2588      "\nclip-volume is made. (You can make a section/DCUT with a thin box, for"
3074      "\na thin box, for example).");          << 2589      "\nexample).");
3075   fpCommand -> SetGuidance                       2590   fpCommand -> SetGuidance
3076     ("For \"box\", the parameters are xmin,xm    2591     ("For \"box\", the parameters are xmin,xmax,ymin,ymax,zmin,zmax."
3077      "\nOnly \"box\" is programmed at present    2592      "\nOnly \"box\" is programmed at present.");
3078   G4UIparameter* parameter;                      2593   G4UIparameter* parameter;
3079   parameter = new G4UIparameter ("physical-vo    2594   parameter = new G4UIparameter ("physical-volume-name", 's', omitable = true);
3080   parameter -> SetDefaultValue ("world");        2595   parameter -> SetDefaultValue ("world");
3081   fpCommand -> SetParameter (parameter);         2596   fpCommand -> SetParameter (parameter);
3082   parameter = new G4UIparameter ("copy-no", '    2597   parameter = new G4UIparameter ("copy-no", 'i', omitable = true);
3083   parameter -> SetGuidance ("If negative, mat << 2598   parameter -> SetGuidance
                                                   >> 2599     ("If negative, matches any copy no.  First name match is taken.");
3084   parameter -> SetDefaultValue (-1);             2600   parameter -> SetDefaultValue (-1);
3085   fpCommand -> SetParameter (parameter);         2601   fpCommand -> SetParameter (parameter);
3086   parameter = new G4UIparameter ("depth-of-de    2602   parameter = new G4UIparameter ("depth-of-descent", 'i', omitable = true);
3087   parameter -> SetGuidance                       2603   parameter -> SetGuidance
3088     ("Depth of descent of geometry hierarchy.    2604     ("Depth of descent of geometry hierarchy. Default = unlimited depth.");
3089   parameter -> SetDefaultValue (G4PhysicalVol << 2605   parameter -> SetDefaultValue (G4Scene::UNLIMITED);
3090   fpCommand -> SetParameter (parameter);         2606   fpCommand -> SetParameter (parameter);
3091   parameter = new G4UIparameter ("clip-volume    2607   parameter = new G4UIparameter ("clip-volume-type", 's', omitable = true);
3092   parameter -> SetParameterCandidates("none b    2608   parameter -> SetParameterCandidates("none box -box *box");
3093   parameter -> SetDefaultValue ("none");         2609   parameter -> SetDefaultValue ("none");
3094   parameter -> SetGuidance("[-|*]type.  See g    2610   parameter -> SetGuidance("[-|*]type.  See general guidance.");
3095   fpCommand -> SetParameter (parameter);         2611   fpCommand -> SetParameter (parameter);
3096   parameter = new G4UIparameter ("parameter-u    2612   parameter = new G4UIparameter ("parameter-unit", 's', omitable = true);
3097   parameter -> SetDefaultValue ("m");            2613   parameter -> SetDefaultValue ("m");
3098   fpCommand -> SetParameter (parameter);         2614   fpCommand -> SetParameter (parameter);
3099   parameter = new G4UIparameter ("parameter-1    2615   parameter = new G4UIparameter ("parameter-1", 'd', omitable = true);
3100   parameter -> SetDefaultValue (0.);             2616   parameter -> SetDefaultValue (0.);
3101   fpCommand -> SetParameter (parameter);         2617   fpCommand -> SetParameter (parameter);
3102   parameter = new G4UIparameter ("parameter-2    2618   parameter = new G4UIparameter ("parameter-2", 'd', omitable = true);
3103   parameter -> SetDefaultValue (0.);             2619   parameter -> SetDefaultValue (0.);
3104   fpCommand -> SetParameter (parameter);         2620   fpCommand -> SetParameter (parameter);
3105   parameter = new G4UIparameter ("parameter-3    2621   parameter = new G4UIparameter ("parameter-3", 'd', omitable = true);
3106   parameter -> SetDefaultValue (0.);             2622   parameter -> SetDefaultValue (0.);
3107   fpCommand -> SetParameter (parameter);         2623   fpCommand -> SetParameter (parameter);
3108   parameter = new G4UIparameter ("parameter-4    2624   parameter = new G4UIparameter ("parameter-4", 'd', omitable = true);
3109   parameter -> SetDefaultValue (0.);             2625   parameter -> SetDefaultValue (0.);
3110   fpCommand -> SetParameter (parameter);         2626   fpCommand -> SetParameter (parameter);
3111   parameter = new G4UIparameter ("parameter-5    2627   parameter = new G4UIparameter ("parameter-5", 'd', omitable = true);
3112   parameter -> SetDefaultValue (0.);             2628   parameter -> SetDefaultValue (0.);
3113   fpCommand -> SetParameter (parameter);         2629   fpCommand -> SetParameter (parameter);
3114   parameter = new G4UIparameter ("parameter-6    2630   parameter = new G4UIparameter ("parameter-6", 'd', omitable = true);
3115   parameter -> SetDefaultValue (0.);             2631   parameter -> SetDefaultValue (0.);
3116   fpCommand -> SetParameter (parameter);         2632   fpCommand -> SetParameter (parameter);
3117 }                                                2633 }
3118                                                  2634 
3119 G4VisCommandSceneAddVolume::~G4VisCommandScen    2635 G4VisCommandSceneAddVolume::~G4VisCommandSceneAddVolume () {
3120   delete fpCommand;                              2636   delete fpCommand;
3121 }                                                2637 }
3122                                                  2638 
3123 G4String G4VisCommandSceneAddVolume::GetCurre    2639 G4String G4VisCommandSceneAddVolume::GetCurrentValue (G4UIcommand*) {
3124   return "world 0 -1";                           2640   return "world 0 -1";
3125 }                                                2641 }
3126                                                  2642 
3127 void G4VisCommandSceneAddVolume::SetNewValue     2643 void G4VisCommandSceneAddVolume::SetNewValue (G4UIcommand*,
3128                 G4String newValue) {             2644                 G4String newValue) {
3129                                                  2645 
3130   G4VisManager::Verbosity verbosity = fpVisMa    2646   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
3131   G4bool warn = verbosity >= G4VisManager::wa    2647   G4bool warn = verbosity >= G4VisManager::warnings;
3132                                                  2648 
3133   G4Scene* pScene = fpVisManager->GetCurrentS    2649   G4Scene* pScene = fpVisManager->GetCurrentScene();
3134   if (!pScene) {                                 2650   if (!pScene) {
3135     if (verbosity >= G4VisManager::errors) {     2651     if (verbosity >= G4VisManager::errors) {
3136       G4warn << "ERROR: No current scene.  Pl << 2652       G4cout << "ERROR: No current scene.  Please create one." << G4endl;
3137     }                                            2653     }
3138     return;                                      2654     return;
3139   }                                              2655   }
3140                                                  2656 
3141   G4String name, clipVolumeType, parameterUni    2657   G4String name, clipVolumeType, parameterUnit;
3142   G4int copyNo, requestedDepthOfDescent;         2658   G4int copyNo, requestedDepthOfDescent;
3143   G4double param1, param2, param3, param4, pa    2659   G4double param1, param2, param3, param4, param5, param6;
3144   std::istringstream is (newValue);              2660   std::istringstream is (newValue);
3145   is >> name >> copyNo >> requestedDepthOfDes    2661   is >> name >> copyNo >> requestedDepthOfDescent
3146      >> clipVolumeType >> parameterUnit          2662      >> clipVolumeType >> parameterUnit
3147      >> param1 >> param2 >> param3 >> param4     2663      >> param1 >> param2 >> param3 >> param4 >> param5 >> param6;
3148   G4PhysicalVolumeModel::ClippingMode clippin    2664   G4PhysicalVolumeModel::ClippingMode clippingMode =
3149     G4PhysicalVolumeModel::subtraction;  // D    2665     G4PhysicalVolumeModel::subtraction;  // Default subtraction mode.
3150   if (clipVolumeType[size_t(0)] == '-') {        2666   if (clipVolumeType[size_t(0)] == '-') {
3151     clipVolumeType = clipVolumeType.substr(1)    2667     clipVolumeType = clipVolumeType.substr(1);  // Remove first character.
3152   } else if (clipVolumeType[size_t(0)] == '*'    2668   } else if (clipVolumeType[size_t(0)] == '*') {
3153     clippingMode = G4PhysicalVolumeModel::int    2669     clippingMode = G4PhysicalVolumeModel::intersection;
3154     clipVolumeType = clipVolumeType.substr(1)    2670     clipVolumeType = clipVolumeType.substr(1);
3155   }                                              2671   }
3156   G4double unit = G4UIcommand::ValueOf(parame    2672   G4double unit = G4UIcommand::ValueOf(parameterUnit);
3157   param1 *= unit; param2 *= unit; param3 *= u    2673   param1 *= unit; param2 *= unit; param3 *= unit;
3158   param4 *= unit; param5 *= unit; param6 *= u    2674   param4 *= unit; param5 *= unit; param6 *= unit;
3159                                                  2675 
3160   G4VSolid* clippingSolid = nullptr;          << 
3161   if (clipVolumeType == "box") {              << 
3162     const G4double dX = (param2 - param1) / 2 << 
3163     const G4double dY = (param4 - param3) / 2 << 
3164     const G4double dZ = (param6 - param5) / 2 << 
3165     const G4double x0 = (param2 + param1) / 2 << 
3166     const G4double y0 = (param4 + param3) / 2 << 
3167     const G4double z0 = (param6 + param5) / 2 << 
3168     clippingSolid = new G4DisplacedSolid      << 
3169     ("_displaced_clipping_box",               << 
3170      new G4Box("_clipping_box",dX,dY,dZ),     << 
3171      G4Translate3D(x0,y0,z0));                << 
3172   }                                           << 
3173                                               << 
3174   G4TransportationManager* transportationMana    2676   G4TransportationManager* transportationManager =
3175     G4TransportationManager::GetTransportatio    2677     G4TransportationManager::GetTransportationManager ();
3176                                                  2678 
3177   size_t nWorlds = transportationManager->Get    2679   size_t nWorlds = transportationManager->GetNoWorlds();
3178   if (nWorlds > 1) {  // Parallel worlds in o    2680   if (nWorlds > 1) {  // Parallel worlds in operation...
3179     if (verbosity >= G4VisManager::warnings)     2681     if (verbosity >= G4VisManager::warnings) {
3180       static G4bool warned = false;              2682       static G4bool warned = false;
3181       if (!warned && name != "worlds") {         2683       if (!warned && name != "worlds") {
3182   G4warn <<                                   << 2684   G4cout <<
3183     "WARNING: Parallel worlds in operation.      2685     "WARNING: Parallel worlds in operation.  To visualise, specify"
3184     "\n  \"worlds\" or the parallel world vol    2686     "\n  \"worlds\" or the parallel world volume or sub-volume name"
3185     "\n   and control visibility with /vis/ge    2687     "\n   and control visibility with /vis/geometry."
3186          << G4endl;                              2688          << G4endl;
3187   std::vector<G4VPhysicalVolume*>::iterator i    2689   std::vector<G4VPhysicalVolume*>::iterator iterWorld =
3188     transportationManager->GetWorldsIterator(    2690     transportationManager->GetWorldsIterator();
3189   for (size_t i = 0; i < nWorlds; ++i, ++iter    2691   for (size_t i = 0; i < nWorlds; ++i, ++iterWorld) {
3190     G4warn << "  World " << i << ": " << (*it << 2692     G4cout << "  World " << i << ": " << (*iterWorld)->GetName()
3191      << G4endl;                                  2693      << G4endl;
3192     warned = true;                               2694     warned = true;
3193   }                                              2695   }
3194       }                                          2696       }
3195     }                                            2697     }
3196   }                                              2698   }
3197                                                  2699 
3198   // Get the world (the initial value of the  << 
3199   G4VPhysicalVolume* world = *(transportation    2700   G4VPhysicalVolume* world = *(transportationManager->GetWorldsIterator());
3200                                                  2701 
3201   if (!world) {                                  2702   if (!world) {
3202     if (verbosity >= G4VisManager::errors) {     2703     if (verbosity >= G4VisManager::errors) {
3203       G4warn <<                               << 2704       G4cout <<
3204   "ERROR: G4VisCommandSceneAddVolume::SetNewV    2705   "ERROR: G4VisCommandSceneAddVolume::SetNewValue:"
3205   "\n  No world.  Maybe the geometry has not     2706   "\n  No world.  Maybe the geometry has not yet been defined."
3206   "\n  Try \"/run/initialize\""                  2707   "\n  Try \"/run/initialize\""
3207        << G4endl;                                2708        << G4endl;
3208     }                                            2709     }
3209     return;                                      2710     return;
3210   }                                              2711   }
3211                                                  2712 
3212   std::vector<G4PhysicalVolumesSearchScene::F << 2713   const std::vector<G4Scene::Model>& rdModelList = pScene -> GetRunDurationModelList();
                                                   >> 2714   std::vector<G4Scene::Model>::const_iterator it;
                                                   >> 2715   for (it = rdModelList.begin(); it != rdModelList.end(); ++it) {
                                                   >> 2716     if (it->fpModel->GetGlobalDescription().find("G4PhysicalVolumeModel")
                                                   >> 2717   != std::string::npos) {
                                                   >> 2718       if (((G4PhysicalVolumeModel*)(it->fpModel))->GetTopPhysicalVolume () == world) break;
                                                   >> 2719     }
                                                   >> 2720   }
                                                   >> 2721   if (it != rdModelList.end()) {
                                                   >> 2722     if (verbosity >= G4VisManager::warnings) {
                                                   >> 2723       G4cout << "WARNING: There is already a volume, \""
                                                   >> 2724              << it -> fpModel -> GetGlobalDescription()
                                                   >> 2725              << "\",\n in the run-duration model list of scene \""
                                                   >> 2726              << pScene -> GetName()
                                                   >> 2727              << "\".\n To get a clean scene:"
                                                   >> 2728        << "\n  /vis/drawVolume " << name
                                                   >> 2729        << "\n or"
                                                   >> 2730        << "\n  /vis/scene/create"
                                                   >> 2731        << "\n  /vis/scene/add/volume " << name
                                                   >> 2732        << "\n  /vis/sceneHandler/attach"
                                                   >> 2733        << "\n (and also, if necessary, /vis/viewer/flush)"
                                                   >> 2734              << G4endl;
                                                   >> 2735     }
                                                   >> 2736     return;
                                                   >> 2737   }
3213                                                  2738 
3214   // When it comes to determining the extent  << 2739   std::vector<G4PhysicalVolumeModel*> models;
3215   // assume the user wishes to ignore "invisi << 2740   std::vector<G4VPhysicalVolume*> foundVolumes;
3216   // users make the world volume invisible. S << 2741   G4VPhysicalVolume* foundWorld = 0;
3217   // model to traverse the geometry hierarchy << 2742   typedef G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID;
3218   // volume, until it finds non-invisible one << 2743   typedef std::vector<PVNodeID> PVPath;
3219   // to determine the overall extent. (Once a << 2744   PVPath foundFullPVPath;
3220   // the search is curtailed - daughters are  << 2745   std::vector<G4int> foundDepths;
3221   // so they have no subsequent influence on  << 2746   std::vector<G4Transform3D> transformations;
3222   // search continues at the same level until << 
3223   // volumes are found an their extents accum << 
3224   G4bool useFullExtent = false;               << 
3225   // However, the above procedure can be time << 
3226   // as a nested parameterisation whose ultim << 
3227   // visible ones, which are typical of a med << 
3228   // below that if a user specifies a name ot << 
3229   // wished the extent to be determined by th << 
3230   // or not. So we set useFullExtent true at  << 
3231                                                  2747 
3232   if (name == "world") {                         2748   if (name == "world") {
3233                                                  2749 
3234     findingsVector.push_back                  << 2750     models.push_back
3235     (G4PhysicalVolumesSearchScene::Findings(w << 2751       (new G4PhysicalVolumeModel (world, requestedDepthOfDescent));
                                                   >> 2752     foundVolumes.push_back(world);
                                                   >> 2753     foundDepths.push_back(0);
                                                   >> 2754     transformations.push_back(G4Transform3D());
3236                                                  2755 
3237   } else if (name == "worlds") {                 2756   } else if (name == "worlds") {
3238                                                  2757 
3239     if (nWorlds <= 1) {                       << 2758     if (nWorlds == 0) {
3240       if (verbosity >= G4VisManager::warnings    2759       if (verbosity >= G4VisManager::warnings) {
3241   G4warn <<                                   << 2760   G4cout <<
3242     "WARNING: G4VisCommandSceneAddVolume::Set    2761     "WARNING: G4VisCommandSceneAddVolume::SetNewValue:"
3243     "\n  Parallel worlds requested but none e    2762     "\n  Parallel worlds requested but none exist."
3244     "\n  Just adding material world."            2763     "\n  Just adding material world."
3245          << G4endl;                              2764          << G4endl;
3246       }                                          2765       }
3247     }                                            2766     }
3248     std::vector<G4VPhysicalVolume*>::iterator    2767     std::vector<G4VPhysicalVolume*>::iterator iterWorld =
3249       transportationManager->GetWorldsIterato    2768       transportationManager->GetWorldsIterator();
3250     for (size_t i = 0; i < nWorlds; ++i, ++it    2769     for (size_t i = 0; i < nWorlds; ++i, ++iterWorld) {
3251       findingsVector.push_back                << 2770       models.push_back
3252       (G4PhysicalVolumesSearchScene::Findings << 2771   (new G4PhysicalVolumeModel (*iterWorld, requestedDepthOfDescent));
3253        (*iterWorld,*iterWorld));              << 2772       foundVolumes.push_back(*iterWorld);
                                                   >> 2773       foundDepths.push_back(0);
                                                   >> 2774       transformations.push_back(G4Transform3D());
3254     }                                            2775     }
3255                                                  2776 
3256   } else {  // Search all worlds...              2777   } else {  // Search all worlds...
3257                                               << 2778     
3258     // Use the model's full extent. This assu << 
3259     // volumes in the findings vector (there  << 
3260     // determine the scene's extent. Otherwis << 
3261     // re-calculate each volume's extent base << 
3262     // could be time consuming.               << 
3263     useFullExtent = true;                     << 
3264                                               << 
3265     std::vector<G4VPhysicalVolume*>::iterator    2779     std::vector<G4VPhysicalVolume*>::iterator iterWorld =
3266       transportationManager->GetWorldsIterato    2780       transportationManager->GetWorldsIterator();
3267     for (size_t i = 0; i < nWorlds; ++i, ++it    2781     for (size_t i = 0; i < nWorlds; ++i, ++iterWorld) {
                                                   >> 2782       G4PhysicalVolumeModel searchModel (*iterWorld);  // Unlimited depth.
3268       G4ModelingParameters mp;  // Default -     2783       G4ModelingParameters mp;  // Default - no culling.
3269       G4PhysicalVolumeModel searchModel       << 2784       searchModel.SetModelingParameters (&mp);
3270       (*iterWorld,                            << 2785       G4PhysicalVolumeSearchScene searchScene (&searchModel, name, copyNo);
3271        requestedDepthOfDescent,               << 
3272        G4Transform3D(),                       << 
3273        &mp,                                   << 
3274        useFullExtent);                        << 
3275       G4PhysicalVolumesSearchScene searchScen << 
3276       searchModel.DescribeYourselfTo (searchS    2786       searchModel.DescribeYourselfTo (searchScene);  // Initiate search.
3277       for (const auto& findings: searchScene. << 2787       G4VPhysicalVolume* foundVolume = searchScene.GetFoundVolume ();
3278         findingsVector.push_back(findings);   << 2788       if (foundVolume) {
                                                   >> 2789   foundWorld = *iterWorld;
                                                   >> 2790   foundVolumes.push_back(foundVolume);
                                                   >> 2791         foundFullPVPath = searchScene.GetFoundFullPVPath();
                                                   >> 2792         foundDepths.push_back(searchScene.GetFoundDepth());
                                                   >> 2793   transformations.push_back(searchScene.GetFoundTransformation());
                                                   >> 2794   break;
3279       }                                          2795       }
3280     }                                            2796     }
3281   }                                           << 
3282                                                  2797 
3283   for (const auto& findings: findingsVector)  << 2798     if (foundVolumes.size()) {
3284     // Set copy number from search findings f << 2799       for (size_t i = 0; i < foundVolumes.size(); ++i) {
3285     findings.fpFoundPV->SetCopyNo(findings.fF << 2800         G4PhysicalVolumeModel* foundPVModel = new G4PhysicalVolumeModel
3286     G4PhysicalVolumeModel* foundPVModel = new << 2801         (foundVolumes[i], requestedDepthOfDescent, transformations[i]);
3287     (findings.fpFoundPV,                      << 2802         foundFullPVPath.pop_back();  // "Base" is "Found - 1".
3288      requestedDepthOfDescent,                 << 2803         foundPVModel->SetBaseFullPVPath(foundFullPVPath);
3289      findings.fFoundObjectTransformation,     << 2804   models.push_back(foundPVModel);
3290      0, // No modelling parameters (these are << 
3291      useFullExtent,                           << 
3292      findings.fFoundBasePVPath);              << 
3293     if (clippingSolid) {                      << 
3294       foundPVModel->SetClippingSolid(clipping << 
3295       foundPVModel->SetClippingMode(clippingM << 
3296     }                                         << 
3297     if (!foundPVModel->Validate(warn)) return << 
3298     // ...so add it to the scene.             << 
3299     G4bool successful = pScene->AddRunDuratio << 
3300     if (successful) {                         << 
3301       if (verbosity >= G4VisManager::confirma << 
3302         G4cout << "\"" << findings.fpFoundPV- << 
3303         << "\", copy no. " << findings.fFound << 
3304         << ",\n  found in searched volume \"" << 
3305         << findings.fpSearchPV->GetName()     << 
3306         << "\" at depth " << findings.fFoundD << 
3307         << ",\n  base path: \"" << findings.f << 
3308         << "\",\n  with a requested depth of  << 
3309         if (requestedDepthOfDescent < 0) {    << 
3310           G4cout << "<0 (unlimited)";         << 
3311         }                                     << 
3312         else {                                << 
3313           G4cout << requestedDepthOfDescent;  << 
3314         }                                     << 
3315         G4cout << ",\n  has been added to sce << 
3316         << G4endl;                            << 
3317       }                                          2805       }
3318     } else {                                     2806     } else {
3319       G4VisCommandsSceneAddUnsuccessful(verbo << 2807       if (verbosity >= G4VisManager::errors) {
3320     }                                         << 2808   G4cout << "ERROR: Volume \"" << name << "\"";
3321   }                                           << 2809   if (copyNo >= 0) {
3322                                               << 2810     G4cout << ", copy no. " << copyNo << ",";
3323   if (findingsVector.empty()) {               << 2811   }
3324     if (verbosity >= G4VisManager::errors) {  << 2812   G4cout << " not found." << G4endl;
3325       G4warn << "ERROR: Volume \"" << name << << 
3326       if (copyNo >= 0) {                      << 
3327         G4warn << ", copy no. " << copyNo <<  << 
3328       }                                          2813       }
3329       G4warn << " not found." << G4endl;      << 2814       return;
3330     }                                            2815     }
3331     G4VisCommandsSceneAddUnsuccessful(verbosi << 
3332     return;                                   << 
3333   }                                              2816   }
3334                                                  2817 
3335   CheckSceneAndNotifyHandlers(pScene);        << 2818   if (clipVolumeType == "box") {
3336 }                                             << 2819     const G4double dX = (param2 - param1) / 2.;
3337                                               << 2820     const G4double dY = (param4 - param3) / 2.;
3338 ///////////////////////////////////////////// << 2821     const G4double dZ = (param6 - param5) / 2.;
3339 ////////////// /vis/scene/add/plotter /////// << 2822     const G4double x0 = (param2 + param1) / 2.;
3340 ///////////////////////////////////////////// << 2823     const G4double y0 = (param4 + param3) / 2.;
3341 G4VisCommandSceneAddPlotter::G4VisCommandScen << 2824     const G4double z0 = (param6 + param5) / 2.;
3342   fpCommand = new G4UIcommand("/vis/scene/add << 2825     G4VSolid* clippingSolid =
3343   fpCommand -> SetGuidance ("Add a plotter to << 2826       new G4DisplacedSolid
3344                                               << 2827       ("_displaced_clipping_box",
3345   G4UIparameter* parameter;                   << 2828        new G4Box("_clipping_box",dX,dY,dZ),
3346   parameter =  new G4UIparameter ("plotter",  << 2829        G4Translate3D(x0,y0,z0));
3347   fpCommand->SetParameter(parameter);         << 2830     for (size_t i = 0; i < foundVolumes.size(); ++i) {
3348 }                                             << 2831       models[i]->SetClippingSolid(clippingSolid);
3349                                               << 2832       models[i]->SetClippingMode(clippingMode);
3350 G4VisCommandSceneAddPlotter::~G4VisCommandSce << 2833     }
3351                                               << 2834   }  // If any other shape consider NumberOfRotationSides!!!!!!!!!!!
3352 G4String G4VisCommandSceneAddPlotter::GetCurr << 
3353                                               << 
3354 void G4VisCommandSceneAddPlotter::SetNewValue << 
3355 {                                             << 
3356   G4VisManager::Verbosity verbosity = fpVisMa << 
3357   G4bool warn(verbosity >= G4VisManager::warn << 
3358                                                  2835 
3359   G4Scene* pScene = fpVisManager->GetCurrentS << 2836   const G4String& currentSceneName = pScene -> GetName ();
3360   if (!pScene) {                              << 2837   G4bool failure = true;
3361     if (verbosity >= G4VisManager::errors) {  << 2838   for (size_t i = 0; i < foundVolumes.size(); ++i) {
3362       G4warn << "ERROR: No current scene.  Pl << 2839     G4bool successful = pScene -> AddRunDurationModel (models[i], warn);
                                                   >> 2840     if (successful) {
                                                   >> 2841       failure = false;
                                                   >> 2842       if (verbosity >= G4VisManager::confirmations) {
                                                   >> 2843   G4cout << "First occurrence of \""
                                                   >> 2844          << foundVolumes[i] -> GetName ()
                                                   >> 2845          << "\"";
                                                   >> 2846   if (copyNo >= 0) {
                                                   >> 2847     G4cout << ", copy no. " << copyNo << ",";
                                                   >> 2848   }
                                                   >> 2849   G4cout << "\n  found ";
                                                   >> 2850   if (foundWorld)
                                                   >> 2851     G4cout << "in world \"" << foundWorld->GetName() << "\" ";
                                                   >> 2852   G4cout << "at depth " << foundDepths[i]
                                                   >> 2853          << ",\n  with a requested depth of further descent of ";
                                                   >> 2854   if (requestedDepthOfDescent < 0) {
                                                   >> 2855     G4cout << "<0 (unlimited)";
                                                   >> 2856   }
                                                   >> 2857   else {
                                                   >> 2858     G4cout << requestedDepthOfDescent;
                                                   >> 2859   }
                                                   >> 2860   G4cout << ",\n  has been added to scene \"" << currentSceneName << "\"."
                                                   >> 2861          << G4endl;
                                                   >> 2862       }
3363     }                                            2863     }
3364     return;                                   << 
3365   }                                              2864   }
3366                                                  2865 
3367   G4Plotter& _plotter = G4PlotterManager::Get << 2866   if (failure) {
3368   G4VModel* model = new G4PlotterModel(_plott << 2867     G4VisCommandsSceneAddUnsuccessful(verbosity);
3369                                               << 2868     return;
3370   const G4String& currentSceneName = pScene - << 
3371   G4bool successful = pScene -> AddEndOfRunMo << 
3372   if (successful) {                           << 
3373     if (verbosity >= G4VisManager::confirmati << 
3374       G4cout                                  << 
3375       << "Plotter \"" << model->GetCurrentDes << 
3376       << "\" has been added to scene \"" << c << 
3377       << G4endl;                              << 
3378     }                                         << 
3379   }                                              2869   }
3380   else G4VisCommandsSceneAddUnsuccessful(verb << 
3381                                                  2870 
3382   CheckSceneAndNotifyHandlers (pScene);       << 2871   UpdateVisManagerScene (currentSceneName);
3383 }                                                2872 }
3384                                               << 
3385                                                  2873