19#include "BDSDetectorConstruction.hh"
20#include "BDSFieldQueryInfo.hh"
21#include "BDSUtilities.hh"
22#include "BDSVisCommandSceneAddQueryMagneticField.hh"
23#include "BDSVisFieldModel.hh"
28#include "G4UIcommand.hh"
29#include "G4UIparameter.hh"
30#include "G4Version.hh"
31#include "G4VisManager.hh"
33#if G4VERSION_NUMBER < 1060
34#include "G4UImanager.hh"
35#include "G4VSceneHandler.hh"
40BDSVisCommandSceneAddQueryMagneticField::BDSVisCommandSceneAddQueryMagneticField(
const BDSDetectorConstruction* realWorldIn):
41 realWorld(realWorldIn),
44 command =
new G4UIcommand(
"/bds/field/drawQuery",
this);
45 command->SetGuidance(
"Adds field representation from a query to the current scene. The key \"all\" can be used to draw all defined queries.");
47 G4UIparameter* parameter;
48 parameter =
new G4UIparameter(
"queryName",
's',
false);
49 parameter->SetDefaultValue(
"");
50 command->SetParameter(parameter);
53BDSVisCommandSceneAddQueryMagneticField::~BDSVisCommandSceneAddQueryMagneticField()
58G4String BDSVisCommandSceneAddQueryMagneticField::GetCurrentValue(G4UIcommand*)
63void BDSVisCommandSceneAddQueryMagneticField::SetNewValue(G4UIcommand*, G4String newValue)
65 G4VisManager::Verbosity verbosity = G4VisManager::GetVerbosity();
66 G4bool warn = verbosity >= G4VisManager::warnings;
67 G4Scene* scene = fpVisManager->GetCurrentScene();
70 if (verbosity >= G4VisManager::errors)
71 {G4cerr <<
"ERROR: No current scene. Please create one." << G4endl;}
75 {G4cerr <<
"No query name specified." << G4endl;
return;}
78 std::vector<BDSFieldQueryInfo*> queries;
81 const std::vector<BDSFieldQueryInfo*>& allQueries = realWorld->
FieldQueries();
82 std::map<G4String, BDSFieldQueryInfo*> nameToObject;
83 for (
const auto& query : allQueries)
84 {nameToObject[query->name] = query;}
87 for (
const auto& name : queryNames)
95 auto search = nameToObject.find(name);
96 if (search != nameToObject.end())
97 {queries.push_back(search->second);}
99 {G4cerr <<
"No such query name \"" << name <<
"\"" << G4endl;}
103 {G4cerr <<
"No queries found to draw" << G4endl;
return;}
106 G4bool successful = scene->AddRunDurationModel(model, warn);
108 if (successful && verbosity >= G4VisManager::confirmations)
109 {G4cout <<
"Magnetic field, if any, will be drawn in scene \"" << scene->GetName() <<
"\"" << G4endl;}
112 if (!successful && verbosity >= G4VisManager::warnings)
113 {G4cerr <<
"WARNING: not possible to add to the scene" << G4endl;}
119#if G4VERSION_NUMBER < 1060
125 G4VSceneHandler* sceneHandler = fpVisManager->GetCurrentSceneHandler();
129 if (scene == sceneHandler->GetScene())
130 {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'.