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