18#include "BDSDetectorConstruction.hh"
19#include "BDSFieldQueryInfo.hh"
20#include "BDSUtilities.hh"
21#include "BDSVisCommandSceneAddQueryMagneticField.hh"
22#include "BDSVisFieldModel.hh"
27#include "G4UIcommand.hh"
28#include "G4UIparameter.hh"
29#include "G4Version.hh"
30#include "G4VisManager.hh"
32#if G4VERSION_NUMBER < 1060
33#include "G4UImanager.hh"
34#include "G4VSceneHandler.hh"
39BDSVisCommandSceneAddQueryMagneticField::BDSVisCommandSceneAddQueryMagneticField(
const BDSDetectorConstruction* realWorldIn):
40 realWorld(realWorldIn),
43 command =
new G4UIcommand(
"/bds/field/drawQuery",
this);
44 command->SetGuidance(
"Adds field representation from a query to the current scene. The key \"all\" can be used to draw all defined queries.");
46 G4UIparameter* parameter;
47 parameter =
new G4UIparameter(
"queryName",
's',
false);
48 parameter->SetDefaultValue(
"");
49 command->SetParameter(parameter);
52BDSVisCommandSceneAddQueryMagneticField::~BDSVisCommandSceneAddQueryMagneticField()
57G4String BDSVisCommandSceneAddQueryMagneticField::GetCurrentValue(G4UIcommand*)
62void BDSVisCommandSceneAddQueryMagneticField::SetNewValue(G4UIcommand*, G4String newValue)
64 G4VisManager::Verbosity verbosity = G4VisManager::GetVerbosity();
65 G4bool warn = verbosity >= G4VisManager::warnings;
66 G4Scene* scene = fpVisManager->GetCurrentScene();
69 if (verbosity >= G4VisManager::errors)
70 {G4cerr <<
"ERROR: No current scene. Please create one." << G4endl;}
74 {G4cerr <<
"No query name specified." << G4endl;
return;}
77 std::vector<BDSFieldQueryInfo*> queries;
80 const std::vector<BDSFieldQueryInfo*>& allQueries = realWorld->
FieldQueries();
81 std::map<G4String, BDSFieldQueryInfo*> nameToObject;
82 for (
const auto& query : allQueries)
83 {nameToObject[query->name] = query;}
86 for (
const auto& name : queryNames)
94 auto search = nameToObject.find(name);
95 if (search != nameToObject.end())
96 {queries.push_back(search->second);}
98 {G4cerr <<
"No such query name \"" << name <<
"\"" << G4endl;}
102 {G4cerr <<
"No queries found to draw" << G4endl;
return;}
105 G4bool successful = scene->AddRunDurationModel(model, warn);
107 if (successful && verbosity >= G4VisManager::confirmations)
108 {G4cout <<
"Magnetic field, if any, will be drawn in scene \"" << scene->GetName() <<
"\"" << G4endl;}
111 if (!successful && verbosity >= G4VisManager::warnings)
112 {G4cerr <<
"WARNING: not possible to add to the scene" << G4endl;}
118#if G4VERSION_NUMBER < 1060
124 G4VSceneHandler* sceneHandler = fpVisManager->GetCurrentSceneHandler();
128 if (scene == sceneHandler->GetScene())
129 {G4UImanager::GetUIpointer()->ApplyCommand(
"/vis/scene/notifyHandlers");}
Class that constructs a Geant4 model of an accelerator.
const std::vector< BDSFieldQueryInfo * > & FieldQueries() const
Access vector of query objects.
void CheckSceneAndNotifyHandlers(G4Scene *scene)
Simplified copy of G4VVisCommands::CheckSceneAndNotifyHandlers from G4 V6 and upwards.
std::vector< G4String > SplitOnWhiteSpace(const G4String &input)
Split a string on whitespace and return a vector of these 'words'.