source: trunk/examples/advanced/radiation_monitor/materials/src/RadmonMaterialsMessenger.cc@ 1036

Last change on this file since 1036 was 807, checked in by garnier, 17 years ago

update

File size: 13.7 KB
Line 
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// File name: RadmonMaterialsMessenger.cc
28// Creation date: Sep 2005
29// Main author: Riccardo Capra <capra@ge.infn.it>
30//
31// Id: $Id: RadmonMaterialsMessenger.cc,v 1.4 2006/06/29 16:16:53 gunter Exp $
32// Tag: $Name: $
33//
34
35// Messenger commands path
36#define COMMANDS_PATH "/radmon/materials/"
37
38// Include files
39#include "RadmonMaterialsMessenger.hh"
40#include "RadmonMaterialsManager.hh"
41#include "G4UnitsTable.hh"
42
43
44
45 RadmonMaterialsMessenger :: RadmonMaterialsMessenger(RadmonMaterialsManager * manager)
46:
47 RadmonMessenger(COMMANDS_PATH, "Interactive materials definition commands."),
48 materialsManager(manager),
49 RADMON_INITIALIZE_COMMAND(CreateElement),
50 RADMON_INITIALIZE_COMMAND(CreateMaterial),
51 RADMON_INITIALIZE_COMMAND(AddComponentByAtoms),
52 RADMON_INITIALIZE_COMMAND(AddComponentByFraction),
53 RADMON_INITIALIZE_COMMAND(SetMaterialColor),
54 RADMON_INITIALIZE_COMMAND(SetMaterialTrasparency),
55 RADMON_INITIALIZE_COMMAND(SetMaterialVisibility),
56 RADMON_INITIALIZE_COMMAND(SetMaterialStyle),
57 RADMON_INITIALIZE_COMMAND(Dump),
58 RADMON_INITIALIZE_COMMAND(Insert),
59 RADMON_INITIALIZE_COMMAND(Save)
60{
61 RADMON_CREATE_COMMAND_5ARGS(CreateElement, "Creates a new element", "material", "symbol", "Z", "A", "unit");
62 RADMON_CREATE_COMMAND_4ARGS(CreateMaterial, "Creates a new material", "material", "density", "unit", "totComponents");
63 RADMON_CREATE_COMMAND_3ARGS(AddComponentByAtoms, "Adds a element into a material specifying the number of atoms", "material", "element", "atoms");
64 RADMON_CREATE_COMMAND_3ARGS(AddComponentByFraction, "Adds a element or material into another material specifying the percentage", "material", "component", "fraction");
65 RADMON_CREATE_COMMAND_4ARGS(SetMaterialColor, "Set default color for all elements made of this material", "material", "red", "green", "blue");
66 RADMON_CREATE_COMMAND_2ARGS(SetMaterialTrasparency, "Set default trasparency for all elements made of this material", "material", "alpha");
67 RADMON_CREATE_COMMAND_2ARGS(SetMaterialVisibility, "Set default visibility for all elements made of this material", "material", "visibility");
68 RADMON_CREATE_COMMAND_2ARGS(SetMaterialStyle, "Set default style for all elements made of this material", "material", "style");
69 RADMON_CREATE_COMMAND_0ARGS(Dump, "Print currently declared elements and materials");
70 RADMON_CREATE_COMMAND_1ARG (Insert, "Inserts elements and materials from file", "fileName");
71 RADMON_CREATE_COMMAND_1ARG (Save, "Saves a elements and materials declarations into a file", "fileName");
72}
73
74
75
76 RadmonMaterialsMessenger :: ~RadmonMaterialsMessenger()
77{
78 RADMON_DESTROY_COMMAND(Save);
79 RADMON_DESTROY_COMMAND(Insert);
80 RADMON_DESTROY_COMMAND(Dump);
81 RADMON_DESTROY_COMMAND(SetMaterialStyle);
82 RADMON_DESTROY_COMMAND(SetMaterialVisibility);
83 RADMON_DESTROY_COMMAND(SetMaterialTrasparency);
84 RADMON_DESTROY_COMMAND(SetMaterialColor);
85 RADMON_DESTROY_COMMAND(AddComponentByFraction);
86 RADMON_DESTROY_COMMAND(AddComponentByAtoms);
87 RADMON_DESTROY_COMMAND(CreateMaterial);
88 RADMON_DESTROY_COMMAND(CreateElement);
89}
90
91
92
93
94
95G4String RadmonMaterialsMessenger :: GetCurrentValue(G4UIcommand * /* command */)
96{
97 G4cout << "RadmonMaterialsMessenger::GetCurrentValue(): Not supported" << G4endl;
98
99 return G4String();
100}
101
102
103
104void RadmonMaterialsMessenger :: SetNewValue(G4UIcommand * command, G4String newValue)
105{
106 RADMON_BEGIN_LIST_SET_COMMANDS
107 RADMON_SET_COMMAND(CreateElement)
108 RADMON_SET_COMMAND(CreateMaterial)
109 RADMON_SET_COMMAND(AddComponentByAtoms)
110 RADMON_SET_COMMAND(AddComponentByFraction)
111 RADMON_SET_COMMAND(SetMaterialColor)
112 RADMON_SET_COMMAND(SetMaterialTrasparency)
113 RADMON_SET_COMMAND(SetMaterialVisibility)
114 RADMON_SET_COMMAND(SetMaterialStyle)
115 RADMON_SET_COMMAND(Dump)
116 RADMON_SET_COMMAND(Insert)
117 RADMON_SET_COMMAND(Save)
118 RADMON_END_LIST_SET_COMMANDS
119}
120
121
122
123
124
125// Events
126void RadmonMaterialsMessenger :: OnCreateElement(const G4String & value)
127{
128 G4String args[5];
129
130 if (!ProcessArguments(value, 5, args))
131 return;
132
133 G4double z(G4UIcommand::ConvertToDouble(args[2]));
134
135 if (z<=0.)
136 {
137 G4cout << "RadmonMaterialsMessenger::OnCreateElement(): z must be positive." << G4endl;
138 return;
139 }
140
141 G4double a(GetUnit(args[4], "Molar Mass"));
142
143 if (a<0.)
144 return;
145
146 a*=G4UIcommand::ConvertToDouble(args[3]);
147
148 if (a<=0.)
149 {
150 G4cout << "RadmonMaterialsMessenger::OnCreateElement(): a must be positive." << G4endl;
151 return;
152 }
153
154 materialsManager->CreateElement(args[0], args[1], z, a);
155}
156
157
158
159void RadmonMaterialsMessenger :: OnCreateMaterial(const G4String & value)
160{
161 G4String args[4];
162
163 if (!ProcessArguments(value, 4, args))
164 return;
165
166 G4double density(GetUnit(args[2], "Volumic Mass"));
167
168 if (density<0.)
169 return;
170
171 density*=G4UIcommand::ConvertToDouble(args[1]);
172
173 if (density<=0.)
174 {
175 G4cout << "RadmonMaterialsMessenger::OnCreateMaterial(): Material density must be positive." << G4endl;
176 return;
177 }
178
179 G4int components(G4UIcommand::ConvertToInt(args[3]));
180
181 if (components<0)
182 {
183 G4cout << "RadmonMaterialsMessenger::OnCreateMaterial(): Number of components must be positive (>=0)." << G4endl;
184 return;
185 }
186
187 materialsManager->CreateMaterial(args[0], density, components);
188}
189
190
191
192void RadmonMaterialsMessenger :: OnAddComponentByAtoms(const G4String & value)
193{
194 G4String args[3];
195
196 if (!ProcessArguments(value, 3, args))
197 return;
198
199 if (!materialsManager->IsIncompleteMaterial(args[0]))
200 {
201 if (!materialsManager->ExistsMaterial(args[0]))
202 G4cout << "RadmonMaterialsMessenger::OnAddComponentByAtoms(): Material \"" << args[0] << "\" not found." << G4endl;
203 else
204 G4cout << "RadmonMaterialsMessenger::OnAddComponentByAtoms(): No more components to be added to \"" << args[0] << "\"." << G4endl;
205 return;
206 }
207
208 if (!materialsManager->ExistsElement(args[1]))
209 {
210 G4cout << "RadmonMaterialsMessenger::OnAddComponentByAtoms(): Element \"" << args[1] << "\" not found." << G4endl;
211 return;
212 }
213
214 G4int atoms(G4UIcommand::ConvertToInt(args[2]));
215
216 if (atoms<=0)
217 {
218 G4cout << "RadmonMaterialsMessenger::OnAddComponentByAtoms(): Number of atoms must be positive (>0)." << G4endl;
219 return;
220 }
221
222 materialsManager->AddComponentByAtoms(args[0], args[1], atoms);
223}
224
225
226
227void RadmonMaterialsMessenger :: OnAddComponentByFraction(const G4String & value)
228{
229 G4String args[3];
230
231 if (!ProcessArguments(value, 3, args))
232 return;
233
234 if (!materialsManager->IsIncompleteMaterial(args[0]))
235 {
236 if (!materialsManager->ExistsMaterial(args[0]))
237 G4cout << "RadmonMaterialsMessenger::OnAddComponentByFraction(): Material \"" << args[0] << "\" not found." << G4endl;
238 else
239 G4cout << "RadmonMaterialsMessenger::OnAddComponentByFraction(): No more components to be added to \"" << args[0] << "\"." << G4endl;
240 return;
241 }
242
243 if ((!materialsManager->ExistsElement(args[1])) && (!materialsManager->ExistsMaterial(args[1])))
244 {
245 G4cout << "RadmonMaterialsMessenger::OnAddComponentByFraction(): Element/Material \"" << args[1] << "\" not found." << G4endl;
246 return;
247 }
248
249 G4double fraction(G4UIcommand::ConvertToDouble(args[2]));
250
251 if (fraction<=0)
252 {
253 G4cout << "RadmonMaterialsMessenger::OnAddComponentByFraction(): Material fraction must be positive (>0)." << G4endl;
254 return;
255 }
256
257 materialsManager->AddComponentByFraction(args[0], args[1], fraction);
258}
259
260
261
262void RadmonMaterialsMessenger :: OnSetMaterialColor(const G4String & value)
263{
264 G4String args[4];
265
266 if (!ProcessArguments(value, 4, args))
267 return;
268
269 if (!materialsManager->ExistsMaterial(args[0]) && !materialsManager->IsIncompleteMaterial(args[0]))
270 {
271 G4cout << "RadmonMaterialsMessenger::OnSetMaterialColor(): Material \"" << args[0] << "\" not found." << G4endl;
272 return;
273 }
274
275 G4double red(G4UIcommand::ConvertToDouble(args[1]));
276 G4double green(G4UIcommand::ConvertToDouble(args[2]));
277 G4double blue(G4UIcommand::ConvertToDouble(args[3]));
278
279 if (red<0. || red>1. || green<0. || green>1. || blue<0. || blue>1.)
280 {
281 G4cout << "RadmonMaterialsMessenger::OnSetMaterialColor(): Red, green and blue components must be set between 0 and 1." << G4endl;
282 return;
283 }
284
285 materialsManager->SetMaterialColor(args[0], G4Color(red, green, blue, materialsManager->GetMaterialColor(args[0]).GetAlpha()));
286}
287
288
289
290void RadmonMaterialsMessenger :: OnSetMaterialTrasparency(const G4String & value)
291{
292 G4String args[2];
293
294 if (!ProcessArguments(value, 2, args))
295 return;
296
297 if (!materialsManager->ExistsMaterial(args[0]) && !materialsManager->IsIncompleteMaterial(args[0]))
298 {
299 G4cout << "RadmonMaterialsMessenger::OnSetMaterialTrasparency(): Material \"" << args[0] << "\" not found." << G4endl;
300 return;
301 }
302
303 G4double alpha(G4UIcommand::ConvertToDouble(args[1]));
304
305 if (alpha<0. || alpha>1.)
306 {
307 G4cout << "RadmonMaterialsMessenger::OnSetMaterialTrasparency(): Alpha component must be set between 0 and 1." << G4endl;
308 return;
309 }
310
311 const G4Color &c(materialsManager->GetMaterialColor(args[0]));
312 materialsManager->SetMaterialColor(args[0], G4Color(c.GetRed(), c.GetGreen(), c.GetBlue(), alpha));
313}
314
315
316
317void RadmonMaterialsMessenger :: OnSetMaterialVisibility(const G4String & value)
318{
319 G4String args[2];
320
321 if (!ProcessArguments(value, 2, args))
322 return;
323
324 if (!materialsManager->ExistsMaterial(args[0]) && !materialsManager->IsIncompleteMaterial(args[0]))
325 {
326 G4cout << "RadmonMaterialsMessenger::OnSetMaterialVisibility(): Material \"" << args[0] << "\" not found." << G4endl;
327 return;
328 }
329
330 if (args[1]=="hidden")
331 materialsManager->SetMaterialVisibility(args[0], false);
332 else if (args[1]=="visible")
333 materialsManager->SetMaterialVisibility(args[0], true);
334 else
335 G4cout << "RadmonMaterialsMessenger::OnSetMaterialVisibility(): Visibility must be set to visible or hidden." << G4endl;
336}
337
338
339
340void RadmonMaterialsMessenger :: OnSetMaterialStyle(const G4String & value)
341{
342 G4String args[2];
343
344 if (!ProcessArguments(value, 2, args))
345 return;
346
347 if (!materialsManager->ExistsMaterial(args[0]) && !materialsManager->IsIncompleteMaterial(args[0]))
348 {
349 G4cout << "RadmonMaterialsMessenger::OnSetMaterialStyle(): Material \"" << args[0] << "\" not found." << G4endl;
350 return;
351 }
352
353 if (args[1]=="wireframe")
354 materialsManager->SetMaterialForceWireframe(args[0], true);
355 else if (args[1]=="solid")
356 materialsManager->SetMaterialForceSolid(args[0], true);
357 else if (args[1]=="default")
358 {
359 materialsManager->SetMaterialForceWireframe(args[0], false);
360 materialsManager->SetMaterialForceSolid(args[0], false);
361 }
362 else
363 G4cout << "RadmonMaterialsMessenger::OnSetMaterialStyle(): Style must be set to wireframe, solid or default." << G4endl;
364}
365
366
367
368void RadmonMaterialsMessenger :: OnDump(const G4String & /* value */)
369{
370 materialsManager->Dump(G4cout, "- ");
371 G4cout << G4endl;
372}
373
374
375
376void RadmonMaterialsMessenger :: OnInsert(const G4String & value)
377{
378 G4String args[1];
379
380 if (!ProcessArguments(value, 1, args))
381 return;
382
383 std::istream * in(OpenForInput(args[0]));
384
385 if (!in)
386 return;
387
388 if (!materialsManager->Insert(*in))
389 G4cout << "RadmonMaterialsMessenger::OnInsert(): Error reading from file \"" << args[0] << "\"." << G4endl;
390
391 delete in;
392}
393
394
395
396void RadmonMaterialsMessenger :: OnSave(const G4String & value)
397{
398 G4String args[1];
399
400 if (!ProcessArguments(value, 1, args))
401 return;
402
403 std::ostream * out(OpenForOutput(args[0]));
404
405 if (!out)
406 return;
407
408 if (!materialsManager->Save(*out))
409 G4cout << "RadmonMaterialsMessenger::OnSave(): Cannot write layout into file \"" << args[0] << "\"." << G4endl;
410
411 delete out;
412}
413
Note: See TracBrowser for help on using the repository browser.