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.5.p2)


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