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