ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4VisCommandModelCreate.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4VisCommandModelCreate.hh
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 // Jane Tinslay, John Allison, Joseph Perl October 2005
28 //
29 // Class Description:
30 // Templated create command for model factories. Factory generates new models
31 // and associated messengers.
32 // Class Description - End:
33 
34 #ifndef G4VISCOMMANDSMODELCREATE_HH
35 #define G4VISCOMMANDSMODELCREATE_HH
36 
37 #include "G4VVisCommand.hh"
38 #include "G4String.hh"
39 #include "G4UIcmdWithAString.hh"
40 #include "G4UIcommand.hh"
41 #include "G4UIdirectory.hh"
42 #include <vector>
43 
44 template <typename Factory>
46 
47 public: // With description
48 
49  G4VisCommandModelCreate(Factory*, const G4String& placement);
50  // Input factory and command placement
51 
52  virtual ~G4VisCommandModelCreate();
53 
55  void SetNewValue (G4UIcommand* command, G4String newValue);
56 
57  G4String Placement() const;
58 
59 private:
60 
62 
63  // Data members
64  Factory* fpFactory;
68  std::vector<G4UIcommand*> fDirectoryList;
69 
70 };
71 
72 template <typename Factory>
74  :fpFactory(factory)
75  ,fPlacement(placement)
76  ,fId(0)
77 {
78  G4String factoryName = factory->Name();
79 
80  G4String command = Placement()+"/create/"+factoryName;
81  G4String guidance = "Create a "+factoryName+" model and associated messengers.";
82 
83  fpCommand = new G4UIcmdWithAString(command, this);
84  fpCommand->SetGuidance(guidance);
85  fpCommand->SetGuidance("Generated model becomes current.");
86  fpCommand->SetParameterName("model-name", true);
87 }
88 
89 template <typename Factory>
91 {
92  delete fpCommand;
93 
94  unsigned i(0);
95  for (i=0; i<fDirectoryList.size(); ++i) {
96  delete fDirectoryList[i];
97  }
98 }
99 
100 template <typename Factory>
101 G4String
103 {
104  return fPlacement;
105 }
106 
107 template <typename Factory>
108 G4String
110 {
111  std::ostringstream oss;
112  oss <<fpFactory->Name()<<"-" << fId++;
113  return oss.str();
114 }
115 
116 template <typename Factory>
117 G4String
119 {
120  return "";
121 }
122 
123 template <typename Factory>
125 {
126  if (newName.isNull()) newName = NextName();
127 
128  assert (0 != fpFactory);
129 
130  // Create directory for new model commands
131  G4String title = Placement()+"/"+newName+"/";
132  G4String guidance = "Commands for "+newName+" model.";
133 
134  G4UIcommand* directory = new G4UIdirectory(title);
135  directory->SetGuidance(guidance);
136  fDirectoryList.push_back(directory);
137 
138  // Create the model.
139  typename Factory::ModelAndMessengers creation = fpFactory->Create(Placement(), newName);
140 
141  // Register model with vis manager
142  fpVisManager->RegisterModel(creation.first);
143 
144  // Register associated messengers with vis manager
145  typename Factory::Messengers::iterator iter = creation.second.begin();
146 
147  while (iter != creation.second.end()) {
148  fpVisManager->RegisterMessenger(*iter);
149  iter++;
150  }
151 }
152 
153 #endif