source: trunk/geant4/visualization/management/src/G4VisCommandsViewerSet.cc@ 585

Last change on this file since 585 was 531, checked in by garnier, 18 years ago

r660@mac-90108: laurentgarnier | 2007-06-25 16:10:12 +0200
ajout de fichiers NON modifies

  • Property svn:mime-type set to text/cpp
File size: 35.6 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// $Id: G4VisCommandsViewerSet.cc,v 1.47 2006/11/14 14:59:55 allison Exp $
28// GEANT4 tag $Name: geant4-08-02-patch-01 $
29
30// /vis/viewer/set commands - John Allison 16th May 2000
31
32#include "G4VisCommandsViewerSet.hh"
33
34#include "G4UIcommand.hh"
35#include "G4UIcmdWithAString.hh"
36#include "G4UIcmdWithABool.hh"
37#include "G4UIcmdWithAnInteger.hh"
38#include "G4UIcmdWithADouble.hh"
39#include "G4UnitsTable.hh"
40#include "G4VisManager.hh"
41#include "G4Polyhedron.hh"
42
43#include <sstream>
44#include <cctype>
45
46G4VisCommandsViewerSet::G4VisCommandsViewerSet ():
47 fLightsVector (G4ThreeVector(1.,1.,1.)),
48 fUpVector (G4ThreeVector(0.,1.,0.)),
49 fViewpointVector (G4ThreeVector(0.,0.,1.))
50{
51 G4bool omitable;
52 G4UIparameter* parameter;
53
54 fpCommandAll = new G4UIcmdWithAString ("/vis/viewer/set/all",this);
55 fpCommandAll->SetGuidance
56 ("Copies view parameters.");
57 fpCommandAll->SetGuidance
58 ("Copies view parameters (except the autoRefresh status) from"
59 "\nfrom-viewer to current viewer.");
60 fpCommandAll->SetParameterName ("from-viewer-name",omitable = false);
61
62 fpCommandAutoRefresh = new G4UIcmdWithABool
63 ("/vis/viewer/set/autoRefresh",this);
64 fpCommandAutoRefresh->SetGuidance("Sets auto-refresh.");
65 fpCommandAutoRefresh->SetGuidance
66 ("If true, view is automatically refreshed after a change of"
67 "\nview parameters.");
68 fpCommandAutoRefresh->SetParameterName("auto-refresh",omitable = true);
69 fpCommandAutoRefresh->SetDefaultValue(false);
70
71 fpCommandAuxEdge = new G4UIcmdWithABool
72 ("/vis/viewer/set/auxiliaryEdge",this);
73 fpCommandAuxEdge->SetGuidance("Sets visibility of auxiliary edges");
74 fpCommandAuxEdge->SetGuidance
75 ("Auxiliary edges, i.e., those that are part of a curved surface,"
76 "\nsometimes called soft edges, become visible/invisible.");
77 fpCommandAuxEdge->SetParameterName("edge",omitable = true);
78 fpCommandAuxEdge->SetDefaultValue(false);
79
80 fpCommandBackground = new G4UIcommand
81 ("/vis/viewer/set/background",this);
82 fpCommandBackground->SetGuidance
83 ("Set background colour and transparency (default black and opaque).");
84 fpCommandBackground->SetGuidance
85 ("Accepts (a) RGB triplet. e.g., \".3 .4 .5\", or"
86 "\n(b) string such as \"white\", \"black\", \"grey\", \"red\"..."
87 "\n(c) an additional number for opacity, e.g., \".3 .4 .5 .6\""
88 "\n or \"grey ! ! .6\" (note \"!\"'s for unused green and blue parameters),"
89 "\n e.g. \"! ! ! 0.\" for a transparent background.");
90 parameter = new G4UIparameter("red_or_string", 's', omitable = true);
91 parameter -> SetDefaultValue ("0.");
92 fpCommandBackground -> SetParameter (parameter);
93 parameter = new G4UIparameter("green", 'd', omitable = true);
94 parameter -> SetDefaultValue (0.);
95 fpCommandBackground -> SetParameter (parameter);
96 parameter = new G4UIparameter ("blue", 'd', omitable = true);
97 parameter -> SetDefaultValue (0.);
98 fpCommandBackground -> SetParameter (parameter);
99 parameter = new G4UIparameter ("opacity", 'd', omitable = true);
100 parameter -> SetDefaultValue (1.);
101 fpCommandBackground -> SetParameter (parameter);
102
103 fpCommandCulling = new G4UIcommand("/vis/viewer/set/culling",this);
104 fpCommandCulling->SetGuidance ("Set culling options.");
105 fpCommandCulling->SetGuidance
106 ("\"global\": enables/disables all other culling options.");
107 fpCommandCulling->SetGuidance
108 ("\"coveredDaughters\": culls, i.e., eliminates, volumes that would not"
109 "\nbe seen because covered by ancester volumes in surface drawing mode,"
110 "\nand then only if the ancesters are visible and opaque, and then only"
111 "\nif no sections or cutaways are in operation. Intended solely to"
112 "\nimprove the speed of rendering visible volumes.");
113 fpCommandCulling->SetGuidance
114 ("\"invisible\": culls objects with the invisible attribute set.");
115 fpCommandCulling->SetGuidance
116 ("\"density\": culls volumes with density lower than threshold. Useful"
117 "\nfor eliminating \"container volumes\" with no physical correspondence,"
118 "\nwhose material is usually air. If this is selected, provide threshold"
119 "\ndensity and unit (g/cm3 mg/cm3 or kg/m3)."
120 );
121 parameter = new G4UIparameter("culling-option",'s',omitable = false);
122 parameter->SetParameterCandidates
123 ("global coveredDaughters invisible density");
124 fpCommandCulling->SetParameter(parameter);
125 parameter = new G4UIparameter("action",'b',omitable = true);
126 parameter->SetDefaultValue(1);
127 fpCommandCulling->SetParameter(parameter);
128 parameter = new G4UIparameter("density-threshold",'d',omitable = true);
129 parameter->SetDefaultValue("0.01");
130 fpCommandCulling->SetParameter(parameter);
131 parameter = new G4UIparameter("unit",'s',omitable = true);
132 parameter->SetParameterCandidates ("g/cm3, mg/cm3 kg/m3");
133 parameter->SetDefaultValue("g/cm3");
134 fpCommandCulling->SetParameter(parameter);
135
136 fpCommandCutawayMode =
137 new G4UIcmdWithAString ("/vis/viewer/set/cutawayMode", this);
138 fpCommandCutawayMode->SetGuidance
139 ("Sets cutaway mode - add (union) or multiply (intersection).");
140 fpCommandCutawayMode->SetParameterName ("cutaway-mode",omitable = false);
141 fpCommandCutawayMode->SetCandidates ("add union multiply intersection");
142 fpCommandCutawayMode->SetDefaultValue("union");
143
144 fpCommandEdge = new G4UIcmdWithABool("/vis/viewer/set/edge",this);
145 fpCommandEdge->SetGuidance
146 ("Edges become visible/invisible in surface mode.");
147 fpCommandEdge->SetParameterName("edge",omitable = true);
148 fpCommandEdge->SetDefaultValue(true);
149
150 fpCommandExplodeFactor = new G4UIcommand
151 ("/vis/viewer/set/explodeFactor", this);
152 fpCommandExplodeFactor->SetGuidance
153 ("Moves top-level drawn volumes by this factor from this centre.");
154 parameter = new G4UIparameter("explodeFactor", 'd', omitable=true);
155 parameter->SetParameterRange("explodeFactor>=1.");
156 parameter->SetDefaultValue(1.);
157 fpCommandExplodeFactor->SetParameter(parameter);
158 parameter = new G4UIparameter("x",'d',omitable = true);
159 parameter->SetDefaultValue (0);
160 parameter->SetGuidance ("Coordinate of explode centre.");
161 fpCommandExplodeFactor->SetParameter(parameter);
162 parameter = new G4UIparameter("y",'d',omitable = true);
163 parameter->SetDefaultValue (0);
164 parameter->SetGuidance ("Coordinate of explode centre.");
165 fpCommandExplodeFactor->SetParameter(parameter);
166 parameter = new G4UIparameter("z",'d',omitable = true);
167 parameter->SetDefaultValue (0);
168 parameter->SetGuidance ("Coordinate of explode centre.");
169 fpCommandExplodeFactor->SetParameter(parameter);
170 parameter = new G4UIparameter("unit",'s',omitable = true);
171 parameter->SetDefaultValue ("m");
172 parameter->SetGuidance ("Unit of explode centre.");
173 fpCommandExplodeFactor->SetParameter(parameter);
174
175 fpCommandGlobalLineWidthScale = new G4UIcmdWithADouble
176 ("/vis/viewer/set/globalLineWidthScale", this);
177 fpCommandGlobalLineWidthScale->SetGuidance
178 ("Multiplies line widths by this factor.");
179 fpCommandGlobalLineWidthScale->
180 SetParameterName("scale-factor", omitable=true);
181 fpCommandGlobalLineWidthScale->SetDefaultValue(1.);
182
183 fpCommandGlobalMarkerScale = new G4UIcmdWithADouble
184 ("/vis/viewer/set/globalMarkerScale", this);
185 fpCommandGlobalMarkerScale->SetGuidance
186 ("Multiplies marker sizes by this factor.");
187 fpCommandGlobalMarkerScale->
188 SetParameterName("scale-factor", omitable=true);
189 fpCommandGlobalMarkerScale->SetDefaultValue(1.);
190
191 fpCommandHiddenEdge =
192 new G4UIcmdWithABool("/vis/viewer/set/hiddenEdge",this);
193 fpCommandHiddenEdge->SetGuidance
194 ("Edges become hidden/seen in wireframe or surface mode.");
195 fpCommandHiddenEdge->SetParameterName("hidden-edge",omitable = true);
196 fpCommandHiddenEdge->SetDefaultValue(true);
197
198 fpCommandHiddenMarker =
199 new G4UIcmdWithABool("/vis/viewer/set/hiddenMarker",this);
200 fpCommandHiddenMarker->SetGuidance
201 ("If true, closer objects hide markers. Otherwise, markers always show.");
202 fpCommandHiddenMarker->SetParameterName("hidden-marker",omitable = true);
203 fpCommandHiddenMarker->SetDefaultValue(true);
204
205 fpCommandLightsMove = new G4UIcmdWithAString
206 ("/vis/viewer/set/lightsMove",this);
207 fpCommandLightsMove->SetGuidance
208 ("Lights move with camera or with object");
209 fpCommandLightsMove->SetParameterName("lightsMove",omitable = false);
210 fpCommandLightsMove->SetCandidates
211 ("cam camera with-camera obj object with-object");
212
213 fpCommandLightsThetaPhi = new G4UIcommand
214 ("/vis/viewer/set/lightsThetaPhi", this);
215 fpCommandLightsThetaPhi->SetGuidance
216 ("Set direction from target to lights.");
217 parameter = new G4UIparameter("theta", 'd', omitable = true);
218 parameter -> SetDefaultValue(60.);
219 fpCommandLightsThetaPhi -> SetParameter (parameter);
220 parameter = new G4UIparameter("phi", 'd', omitable = true);
221 parameter -> SetDefaultValue(45.);
222 fpCommandLightsThetaPhi -> SetParameter (parameter);
223 parameter = new G4UIparameter ("unit", 's', omitable = true);
224 parameter -> SetDefaultValue ("deg");
225 fpCommandLightsThetaPhi -> SetParameter (parameter);
226
227 fpCommandLightsVector = new G4UIcommand
228 ("/vis/viewer/set/lightsVector", this);
229 fpCommandLightsVector->SetGuidance
230 ("Set direction from target to lights.");
231 parameter = new G4UIparameter("x", 'd', omitable = true);
232 parameter -> SetDefaultValue (1);
233 fpCommandLightsVector -> SetParameter (parameter);
234 parameter = new G4UIparameter("y", 'd', omitable = true);
235 parameter -> SetDefaultValue (1);
236 fpCommandLightsVector -> SetParameter (parameter);
237 parameter = new G4UIparameter ("z", 'd', omitable = true);
238 parameter -> SetDefaultValue (1);
239 fpCommandLightsVector -> SetParameter (parameter);
240
241 fpCommandLineSegments = new G4UIcmdWithAnInteger
242 ("/vis/viewer/set/lineSegmentsPerCircle",this);
243 fpCommandLineSegments->SetGuidance
244 ("Set number of sides per circle for polygon/polyhedron drawing.");
245 fpCommandLineSegments->SetGuidance
246 ("Refers to graphical representation of objects with curved lines/surfaces.");
247 fpCommandLineSegments->SetParameterName("line-segments",omitable = true);
248 fpCommandLineSegments->SetDefaultValue(24);
249
250 fpCommandProjection = new G4UIcommand("/vis/viewer/set/projection",this);
251 fpCommandProjection->SetGuidance
252 ("Orthogonal or perspective projection.");
253 parameter = new G4UIparameter("projection",'s',omitable = true);
254 parameter->SetParameterCandidates("o orthogonal p perspective");
255 parameter->SetDefaultValue("orthogonal");
256 fpCommandProjection->SetParameter(parameter);
257 parameter = new G4UIparameter("field-half-angle",'d',omitable = true);
258 parameter->SetDefaultValue(30.);
259 fpCommandProjection->SetParameter(parameter);
260 parameter = new G4UIparameter("unit",'s',omitable = true);
261 parameter->SetDefaultValue("deg");
262 fpCommandProjection->SetParameter(parameter);
263
264 fpCommandSectionPlane = new G4UIcommand("/vis/viewer/set/sectionPlane",this);
265 fpCommandSectionPlane -> SetGuidance
266 ("Set plane for drawing section (DCUT).");
267 fpCommandSectionPlane -> SetGuidance
268 ("E.g., for a y-z plane at x = 1 cm:"
269 "\n\"/vis/viewer/set/sectionPlane on 1 0 0 cm 1 0 0\"."
270 "\nTo turn off: /vis/viewer/set/sectionPlane off");
271 parameter = new G4UIparameter("Selector",'c',true);
272 parameter -> SetDefaultValue ("on");
273 fpCommandSectionPlane->SetParameter(parameter);
274 parameter = new G4UIparameter("x",'d',omitable = true);
275 parameter -> SetDefaultValue (0);
276 parameter -> SetGuidance ("Coordinate of point on the plane.");
277 fpCommandSectionPlane->SetParameter(parameter);
278 parameter = new G4UIparameter("y",'d',omitable = true);
279 parameter -> SetDefaultValue (0);
280 parameter -> SetGuidance ("Coordinate of point on the plane.");
281 fpCommandSectionPlane->SetParameter(parameter);
282 parameter = new G4UIparameter("z",'d',omitable = true);
283 parameter -> SetDefaultValue (0);
284 parameter -> SetGuidance ("Coordinate of point on the plane.");
285 fpCommandSectionPlane->SetParameter(parameter);
286 parameter = new G4UIparameter("unit",'s',omitable = true);
287 parameter -> SetDefaultValue ("m");
288 parameter -> SetGuidance ("Unit of point on the plane.");
289 fpCommandSectionPlane->SetParameter(parameter);
290 parameter = new G4UIparameter("nx",'d',omitable = true);
291 parameter -> SetDefaultValue (1);
292 parameter -> SetGuidance ("Component of plane normal.");
293 fpCommandSectionPlane->SetParameter(parameter);
294 parameter = new G4UIparameter("ny",'d',omitable = true);
295 parameter -> SetDefaultValue (0);
296 parameter -> SetGuidance ("Component of plane normal.");
297 fpCommandSectionPlane->SetParameter(parameter);
298 parameter = new G4UIparameter("nz",'d',omitable = true);
299 parameter -> SetDefaultValue (0);
300 parameter -> SetGuidance ("Component of plane normal.");
301 fpCommandSectionPlane->SetParameter(parameter);
302
303 fpCommandStyle = new G4UIcmdWithAString ("/vis/viewer/set/style",this);
304 fpCommandStyle->SetGuidance
305 ("Set style of drawing - w[ireframe] or s[urface].");
306 fpCommandStyle->SetGuidance
307 ("(Hidden line drawing is controlled by \"/vis/viewer/set/hiddenEdge\".)");
308 fpCommandStyle->SetParameterName ("style",omitable = false);
309
310 fpCommandUpThetaPhi = new G4UIcommand
311 ("/vis/viewer/set/upThetaPhi", this);
312 fpCommandUpThetaPhi -> SetGuidance ("Set up vector.");
313 fpCommandUpThetaPhi -> SetGuidance
314 ("Viewer will attempt always to show this direction upwards.");
315 parameter = new G4UIparameter("theta", 'd', omitable = true);
316 parameter -> SetDefaultValue (90.);
317 fpCommandUpThetaPhi -> SetParameter (parameter);
318 parameter = new G4UIparameter("phi", 'd', omitable = true);
319 parameter -> SetDefaultValue (90.);
320 fpCommandUpThetaPhi -> SetParameter (parameter);
321 parameter = new G4UIparameter ("unit", 's', omitable = true);
322 parameter -> SetDefaultValue ("deg");
323 fpCommandUpThetaPhi -> SetParameter (parameter);
324
325 fpCommandUpVector = new G4UIcommand
326 ("/vis/viewer/set/upVector", this);
327 fpCommandUpVector -> SetGuidance ("Set up vector.");
328 fpCommandUpVector -> SetGuidance
329 ("Viewer will attempt always to show this direction upwards.");
330 parameter = new G4UIparameter("x", 'd', omitable = true);
331 parameter -> SetDefaultValue (0.);
332 fpCommandUpVector -> SetParameter (parameter);
333 parameter = new G4UIparameter("y", 'd', omitable = true);
334 parameter -> SetDefaultValue (1.);
335 fpCommandUpVector -> SetParameter (parameter);
336 parameter = new G4UIparameter ("z", 'd', omitable = true);
337 parameter -> SetDefaultValue (0.);
338 fpCommandUpVector -> SetParameter (parameter);
339
340 fpCommandViewpointThetaPhi = new G4UIcommand
341 ("/vis/viewer/set/viewpointThetaPhi", this);
342 fpCommandViewpointThetaPhi -> SetGuidance
343 ("Set direction from target to camera.");
344 fpCommandViewpointThetaPhi -> SetGuidance
345 ("Also changes lightpoint direction if lights are set to move with camera.");
346 parameter = new G4UIparameter("theta", 'd', omitable = true);
347 parameter -> SetDefaultValue (60.);
348 fpCommandViewpointThetaPhi -> SetParameter (parameter);
349 parameter = new G4UIparameter("phi", 'd', omitable = true);
350 parameter -> SetDefaultValue (45.);
351 fpCommandViewpointThetaPhi -> SetParameter (parameter);
352 parameter = new G4UIparameter ("unit", 's', omitable = true);
353 parameter -> SetDefaultValue ("deg");
354 fpCommandViewpointThetaPhi -> SetParameter (parameter);
355
356 fpCommandViewpointVector = new G4UIcommand
357 ("/vis/viewer/set/viewpointVector", this);
358 fpCommandViewpointVector -> SetGuidance
359 ("Set direction from target to camera.");
360 fpCommandViewpointVector -> SetGuidance
361 ("Also changes lightpoint direction if lights are set to move with camera.");
362 parameter = new G4UIparameter("x", 'd', omitable = true);
363 parameter -> SetDefaultValue (1.);
364 fpCommandViewpointVector -> SetParameter (parameter);
365 parameter = new G4UIparameter("y", 'd', omitable = true);
366 parameter -> SetDefaultValue (1.);
367 fpCommandViewpointVector -> SetParameter (parameter);
368 parameter = new G4UIparameter ("z", 'd', omitable = true);
369 parameter -> SetDefaultValue (1.);
370 fpCommandViewpointVector -> SetParameter (parameter);
371}
372
373G4VisCommandsViewerSet::~G4VisCommandsViewerSet() {
374 delete fpCommandAll;
375 delete fpCommandAuxEdge;
376 delete fpCommandAutoRefresh;
377 delete fpCommandBackground;
378 delete fpCommandCulling;
379 delete fpCommandCutawayMode;
380 delete fpCommandEdge;
381 delete fpCommandExplodeFactor;
382 delete fpCommandGlobalLineWidthScale;
383 delete fpCommandGlobalMarkerScale;
384 delete fpCommandHiddenEdge;
385 delete fpCommandHiddenMarker;
386 delete fpCommandLineSegments;
387 delete fpCommandLightsMove;
388 delete fpCommandLightsThetaPhi;
389 delete fpCommandLightsVector;
390 delete fpCommandProjection;
391 delete fpCommandSectionPlane;
392 delete fpCommandStyle;
393 delete fpCommandUpThetaPhi;
394 delete fpCommandUpVector;
395 delete fpCommandViewpointThetaPhi;
396 delete fpCommandViewpointVector;
397}
398
399G4String G4VisCommandsViewerSet::GetCurrentValue(G4UIcommand*) {
400 return "";
401}
402
403void G4VisCommandsViewerSet::SetNewValue
404(G4UIcommand* command,G4String newValue) {
405
406 G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
407
408 G4VViewer* currentViewer = fpVisManager->GetCurrentViewer();
409 if (!currentViewer) {
410 if (verbosity >= G4VisManager::errors) {
411 G4cout <<
412 "ERROR: G4VisCommandsViewerSet::SetNewValue: no current viewer."
413 << G4endl;
414 }
415 return;
416 }
417
418 G4ViewParameters vp = currentViewer->GetViewParameters();
419
420 if (command == fpCommandAll) {
421 G4VViewer* fromViewer = fpVisManager->GetViewer(newValue);
422 if (!fromViewer) {
423 if (verbosity >= G4VisManager::errors) {
424 G4cout <<
425 "ERROR: G4VisCommandsViewerSet::SetNewValue: all:"
426 "\n unrecognised from-viewer."
427 << G4endl;
428 }
429 return;
430 }
431 if (fromViewer == currentViewer) {
432 if (verbosity >= G4VisManager::warnings) {
433 G4cout <<
434 "WARNING: G4VisCommandsViewerSet::SetNewValue: all:"
435 "\n from-viewer and current viewer are identical."
436 << G4endl;
437 }
438 return;
439 }
440 // Copy view parameters except for autoRefresh...
441 G4bool currentAutoRefresh =
442 currentViewer->GetViewParameters().IsAutoRefresh();
443 vp = fromViewer->GetViewParameters();
444 vp.SetAutoRefresh(currentAutoRefresh);
445 if (verbosity >= G4VisManager::confirmations) {
446 G4cout << "View parameters of viewer \"" << currentViewer->GetName()
447 << "\"\n set to those of viewer \"" << fromViewer->GetName()
448 << "\"."
449 << G4endl;
450 }
451 }
452
453 else if (command == fpCommandAutoRefresh) {
454 G4bool autoRefresh = G4UIcommand::ConvertToBool(newValue);
455 vp.SetAutoRefresh(autoRefresh);
456 if (verbosity >= G4VisManager::confirmations) {
457 G4cout << "Views will ";
458 if (!vp.IsAutoRefresh()) G4cout << "not ";
459 G4cout << "be automatically refreshed after a change of view parameters."
460 << G4endl;
461 }
462 currentViewer->SetViewParameters(vp);
463 return; // I.e., avoid a refresh for this command.
464 }
465
466 else if (command == fpCommandAuxEdge) {
467 vp.SetAuxEdgeVisible(G4UIcommand::ConvertToBool(newValue));
468 if (verbosity >= G4VisManager::confirmations) {
469 G4cout << "Auxiliary edges will ";
470 if (!vp.IsAuxEdgeVisible()) G4cout << "not ";
471 G4cout << "be visible." << G4endl;
472 }
473 }
474
475 else if (command == fpCommandBackground) {
476 G4String redOrString;
477 G4double green, blue, opacity;
478 std::istringstream iss(newValue);
479 iss >> redOrString >> green >> blue >> opacity;
480 G4Colour colour(0.,0.,0.); // Default black and opaque.
481 const size_t iPos0 = 0;
482 if (std::isalpha(redOrString[iPos0])) {
483 G4Colour::GetColour(redOrString, colour); // Remains default (black) if
484 // not found.
485 } else {
486 colour = G4Colour(G4UIcommand::ConvertTo3Vector(newValue));
487 }
488 colour = G4Colour(colour.GetRed(), colour.GetGreen(), colour.GetBlue(), opacity);
489 vp.SetBackgroundColour(colour);
490 if (verbosity >= G4VisManager::confirmations) {
491 G4cout << "Background colour "
492 << vp.GetBackgroundColour()
493 << " requested."
494 << G4endl;
495 }
496 }
497
498 else if (command == fpCommandCulling) {
499 G4String cullingOption, stringFlag, unit;
500 G4double density;
501 std::istringstream is (newValue);
502 is >> cullingOption >> stringFlag >> density >> unit;
503 G4bool boolFlag = G4UIcommand::ConvertToBool(stringFlag);
504 if (cullingOption == "global") {
505 vp.SetCulling(boolFlag);
506 if (verbosity >= G4VisManager::confirmations) {
507 G4cout <<
508 "G4VisCommandsViewerSet::SetNewValue: culling: global culling flag"
509 " set to " << G4UIcommand::ConvertToString(boolFlag) <<
510 ".\n Does not change specific culling flags."
511 << G4endl;
512 }
513 }
514 else if (cullingOption == "coveredDaughters") {
515 vp.SetCullingCovered(boolFlag);
516 if (verbosity >= G4VisManager::confirmations) {
517 G4cout <<
518 "G4VisCommandsViewerSet::SetNewValue: culling: culling covered"
519 "\n daughters flag set to "
520 << G4UIcommand::ConvertToString(boolFlag) <<
521 ". Daughters covered by opaque mothers"
522 "\n will be culled, i.e., not drawn, if this flag is true."
523 "\n Note: this is only effective in surface drawing style,"
524 "\n and then only if the volumes are visible and opaque, and then"
525 "\n only if no sections or cutaways are in operation."
526 << G4endl;
527 }
528 }
529 else if (cullingOption == "invisible") {
530 vp.SetCullingInvisible(boolFlag);
531 if (verbosity >= G4VisManager::confirmations) {
532 G4cout <<
533 "G4VisCommandsViewerSet::SetNewValue: culling: culling invisible"
534 "\n flag set to "
535 << boolFlag << G4UIcommand::ConvertToString(boolFlag) <<
536 ". Volumes marked invisible will be culled,"
537 "\n i.e., not drawn, if this flag is true."
538 << G4endl;
539 }
540 }
541 else if (cullingOption == "density") {
542 vp.SetDensityCulling(boolFlag);
543 if (boolFlag) {
544 density *= G4UnitDefinition::GetValueOf(unit);
545 vp.SetVisibleDensity(density);
546 }
547 else {
548 density = vp.GetVisibleDensity();
549 }
550 if (verbosity >= G4VisManager::confirmations) {
551 G4cout <<
552 "G4VisCommandsViewerSet::SetNewValue: culling: culling by density"
553 "\n flag set to " << G4UIcommand::ConvertToString(boolFlag) <<
554 ". Volumes with density less than " <<
555 G4BestUnit(density,"Volumic Mass") <<
556 "\n will be culled, i.e., not drawn, if this flag is true."
557 << G4endl;
558 }
559 }
560 else {
561 if (verbosity >= G4VisManager::errors) {
562 G4cout <<
563 "ERROR: G4VisCommandsViewerSet::SetNewValue: culling:"
564 "\n option not recognised."
565 << G4endl;
566 }
567 }
568 }
569
570 else if (command == fpCommandCutawayMode) {
571 if (newValue == "add" || newValue == "union")
572 vp.SetCutawayMode(G4ViewParameters::cutawayUnion);
573 if (newValue == "multiply" || newValue == "intersection")
574 vp.SetCutawayMode(G4ViewParameters::cutawayIntersection);
575
576 if (verbosity >= G4VisManager::confirmations) {
577 G4cout << "Cutaway mode set to ";
578 if (vp.GetCutawayMode() == G4ViewParameters::cutawayUnion)
579 G4cout << "cutawayUnion";
580 if (vp.GetCutawayMode() == G4ViewParameters::cutawayIntersection)
581 G4cout << "cutawayIntersection";
582 G4cout << G4endl;
583 }
584 }
585
586 else if (command == fpCommandEdge) {
587 G4ViewParameters::DrawingStyle existingStyle = vp.GetDrawingStyle();
588 if (G4UIcommand::ConvertToBool(newValue)) {
589 switch (existingStyle) {
590 case G4ViewParameters::wireframe:
591 break;
592 case G4ViewParameters::hlr:
593 break;
594 case G4ViewParameters::hsr:
595 vp.SetDrawingStyle(G4ViewParameters::hlhsr);
596 break;
597 case G4ViewParameters::hlhsr:
598 break;
599 }
600 }
601 else {
602 switch (existingStyle) {
603 case G4ViewParameters::wireframe:
604 break;
605 case G4ViewParameters::hlr:
606 break;
607 case G4ViewParameters::hsr:
608 break;
609 case G4ViewParameters::hlhsr:
610 vp.SetDrawingStyle(G4ViewParameters::hsr);
611 break;
612 }
613 }
614 if (verbosity >= G4VisManager::confirmations) {
615 G4cout << "Drawing style of viewer \"" << currentViewer->GetName()
616 << "\" set to " << vp.GetDrawingStyle()
617 << G4endl;
618 }
619 }
620
621 else if (command == fpCommandExplodeFactor) {
622 G4double explodeFactor, x, y, z;
623 G4String unitString;
624 std::istringstream is (newValue);
625 is >> explodeFactor >> x >> y >> z >> unitString;
626 G4double unit = G4UIcommand::ValueOf(unitString);
627 vp.SetExplodeFactor(explodeFactor);
628 vp.SetExplodeCentre(G4Point3D(x * unit, y * unit, z * unit));
629 if (verbosity >= G4VisManager::confirmations) {
630 G4cout << "Explode factor changed to " << vp.GetExplodeFactor()
631 << " from centre " << vp.GetExplodeCentre()
632 << G4endl;
633 }
634 }
635
636 else if (command == fpCommandGlobalLineWidthScale) {
637 G4double globalLineWidthScale
638 = fpCommandGlobalLineWidthScale->GetNewDoubleValue(newValue);
639 vp.SetGlobalLineWidthScale(globalLineWidthScale);
640 if (verbosity >= G4VisManager::confirmations) {
641 G4cout << "Global Line Width Scale changed to "
642 << vp.GetGlobalLineWidthScale() << G4endl;
643 }
644 }
645
646 else if (command == fpCommandGlobalMarkerScale) {
647 G4double globalMarkerScale
648 = fpCommandGlobalMarkerScale->GetNewDoubleValue(newValue);
649 vp.SetGlobalMarkerScale(globalMarkerScale);
650 if (verbosity >= G4VisManager::confirmations) {
651 G4cout << "Global Marker Scale changed to "
652 << vp.GetGlobalMarkerScale() << G4endl;
653 }
654 }
655
656 else if (command == fpCommandHiddenEdge) {
657 G4ViewParameters::DrawingStyle existingStyle = vp.GetDrawingStyle();
658 if (G4UIcommand::ConvertToBool(newValue)) {
659 switch (existingStyle) {
660 case G4ViewParameters::wireframe:
661 vp.SetDrawingStyle(G4ViewParameters::hlr);
662 break;
663 case G4ViewParameters::hlr:
664 break;
665 case G4ViewParameters::hsr:
666 vp.SetDrawingStyle(G4ViewParameters::hlhsr);
667 break;
668 case G4ViewParameters::hlhsr:
669 break;
670 }
671 }
672 else {
673 switch (existingStyle) {
674 case G4ViewParameters::wireframe:
675 break;
676 case G4ViewParameters::hlr:
677 vp.SetDrawingStyle(G4ViewParameters::wireframe);
678 break;
679 case G4ViewParameters::hsr:
680 break;
681 case G4ViewParameters::hlhsr:
682 vp.SetDrawingStyle(G4ViewParameters::hsr);
683 break;
684 }
685 }
686 if (verbosity >= G4VisManager::confirmations) {
687 G4cout << "Drawing style of viewer \"" << currentViewer->GetName()
688 << "\" set to " << vp.GetDrawingStyle()
689 << G4endl;
690 }
691 }
692
693 else if (command == fpCommandHiddenMarker) {
694 G4bool hidden = G4UIcommand::ConvertToBool(newValue);
695 if (hidden) vp.SetMarkerHidden();
696 else vp.SetMarkerNotHidden();
697 if (verbosity >= G4VisManager::confirmations) {
698 G4cout << "Markers will ";
699 if (vp.IsMarkerNotHidden()) G4cout << "not ";
700 G4cout << "be hidden under solid objects." << G4endl;
701 }
702 }
703
704 else if (command == fpCommandLightsMove) {
705 G4String s (newValue);
706 if (s.find("cam") != G4String::npos) vp.SetLightsMoveWithCamera(true);
707 else if(s.find("obj") != G4String::npos) vp.SetLightsMoveWithCamera(false);
708 else {
709 if (verbosity >= G4VisManager::errors) {
710 G4cout << "ERROR: \"" << newValue << "\" not recognised."
711 " Looking for \"cam\" or \"obj\" in string." << G4endl;
712 }
713 }
714 if (verbosity >= G4VisManager::confirmations) {
715 G4cout << "Lights move with ";
716 if (vp.GetLightsMoveWithCamera())
717 G4cout << "camera (object appears to rotate).";
718 else G4cout << "object (the viewer appears to be moving).";
719 G4cout << G4endl;
720 }
721 }
722
723 else if (command == fpCommandLightsThetaPhi) {
724 G4double theta, phi;
725 ConvertToDoublePair(newValue, theta, phi);
726 G4double x = std::sin (theta) * std::cos (phi);
727 G4double y = std::sin (theta) * std::sin (phi);
728 G4double z = std::cos (theta);
729 fLightsVector = G4ThreeVector (x, y, z);
730 vp.SetLightpointDirection(fLightsVector);
731 if (verbosity >= G4VisManager::confirmations) {
732 G4cout << "Lights direction set to "
733 << vp.GetLightpointDirection() << G4endl;
734 }
735 }
736
737 else if (command == fpCommandLightsVector) {
738 fLightsVector = G4UIcommand::ConvertTo3Vector(newValue);
739 vp.SetLightpointDirection(fLightsVector);
740 if (verbosity >= G4VisManager::confirmations) {
741 G4cout << "Lights direction set to "
742 << vp.GetLightpointDirection() << G4endl;
743 }
744 }
745
746 else if (command == fpCommandLineSegments) {
747 G4int nSides = G4UIcommand::ConvertToInt(newValue);
748 nSides = vp.SetNoOfSides(nSides);
749 if (verbosity >= G4VisManager::confirmations) {
750 G4cout <<
751 "Number of line segements per circle in polygon approximation is "
752 << nSides << G4endl;
753 }
754 }
755
756 else if (command == fpCommandProjection) {
757 G4double fieldHalfAngle;
758 const size_t iPos0 = 0;
759 if (newValue[iPos0] == 'o') { // "orthogonal"
760 fieldHalfAngle = 0.;
761 }
762 else if (newValue[iPos0] == 'p') { // "perspective"
763 G4String dummy;
764 G4String unit;
765 std::istringstream is (newValue);
766 is >> dummy >> fieldHalfAngle >> unit;
767 fieldHalfAngle *= G4UIcommand::ValueOf(unit);
768 if (fieldHalfAngle > 89.5 * deg || fieldHalfAngle <= 0.0) {
769 if (verbosity >= G4VisManager::errors) {
770 G4cout <<
771 "ERROR: Field half angle should be 0 < angle <= 89.5 degrees.";
772 G4cout << G4endl;
773 }
774 return;
775 }
776 }
777 else {
778 if (verbosity >= G4VisManager::errors) {
779 G4cout << "ERROR: \"" << newValue << "\" not recognised."
780 " Looking for 'o' or 'p' first character." << G4endl;
781 }
782 return;
783 }
784 vp.SetFieldHalfAngle(fieldHalfAngle);
785 if (verbosity >= G4VisManager::confirmations) {
786 G4cout << "Projection style of viewer \"" << currentViewer->GetName()
787 << "\" set to ";
788 if (fieldHalfAngle == 0.) {
789 G4cout << "orthogonal.";
790 }
791 else {
792 G4cout << "perspective\n with half angle " << fieldHalfAngle / deg
793 << " degrees.";
794 }
795 G4cout << G4endl;
796 }
797 }
798
799 else if (command == fpCommandSectionPlane) {
800 G4String choice, unit;
801 G4double x, y, z, nx, ny, nz;
802 std::istringstream is (newValue);
803 is >> choice >> x >> y >> z >> unit >> nx >> ny >> nz;
804
805 G4int iSelector = -1;
806 if (choice.compareTo("off",G4String::ignoreCase) == 0 ||
807 !G4UIcommand::ConvertToBool(choice)) iSelector = 0;
808 if (choice.compareTo("on",G4String::ignoreCase) == 0 ||
809 G4UIcommand::ConvertToBool(choice)) iSelector = 1;
810 if (iSelector < 0) {
811 if (verbosity >= G4VisManager::errors) {
812 G4cout << "Choice not recognised (on/true or off/false)." << G4endl;
813 G4cout << "Section drawing is currently: ";
814 if (vp.IsSection ()) G4cout << "on";
815 else G4cout << "off";
816 G4cout << ".\nSection plane is currently: "
817 << vp.GetSectionPlane ();
818 G4cout << G4endl;
819 }
820 return;
821 }
822
823 G4double F = 1.;
824 switch (iSelector) {
825 default:
826 case 0:
827 vp.UnsetSectionPlane();
828 break;
829 case 1:
830 F = G4UIcommand::ValueOf(unit);
831 x *= F; y *= F; z *= F;
832 vp.SetSectionPlane(G4Plane3D(G4Normal3D(nx,ny,nz), G4Point3D(x,y,z)));
833 vp.SetViewpointDirection(G4Normal3D(nx,ny,nz));
834 break;
835 }
836
837 if (verbosity >= G4VisManager::confirmations) {
838 G4cout << "Section drawing is now: ";
839 if (vp.IsSection ()) G4cout << "on";
840 else G4cout << "off";
841 G4cout << ".\nSection plane is now: "
842 << vp.GetSectionPlane ();
843 G4cout << G4endl;
844 }
845 }
846
847 else if (command == fpCommandStyle) {
848 G4ViewParameters::DrawingStyle existingStyle = vp.GetDrawingStyle();
849 const size_t iPos0 = 0;
850 if (newValue[iPos0] == 'w') { // "wireframe"
851 switch (existingStyle) {
852 case G4ViewParameters::wireframe:
853 break;
854 case G4ViewParameters::hlr:
855 break;
856 case G4ViewParameters::hsr:
857 vp.SetDrawingStyle(G4ViewParameters::wireframe);
858 break;
859 case G4ViewParameters::hlhsr:
860 vp.SetDrawingStyle(G4ViewParameters::hlr);
861 break;
862 }
863 }
864 else if (newValue[iPos0] == 's') { // "surface"
865 switch (existingStyle) {
866 case G4ViewParameters::wireframe:
867 vp.SetDrawingStyle(G4ViewParameters::hsr);
868 break;
869 case G4ViewParameters::hlr:
870 vp.SetDrawingStyle(G4ViewParameters::hlhsr);
871 break;
872 case G4ViewParameters::hsr:
873 break;
874 case G4ViewParameters::hlhsr:
875 break;
876 }
877 }
878 else {
879 if (verbosity >= G4VisManager::errors) {
880 G4cout << "ERROR: \"" << newValue << "\" not recognised."
881 " Looking for 'w' or 's' first character." << G4endl;
882 }
883 return;
884 }
885 if (verbosity >= G4VisManager::confirmations) {
886 G4cout << "Drawing style of viewer \"" << currentViewer->GetName()
887 << "\" set to " << vp.GetDrawingStyle()
888 << G4endl;
889 }
890 }
891
892 else if (command == fpCommandUpThetaPhi) {
893 G4double theta, phi;
894 ConvertToDoublePair(newValue, theta, phi);
895 G4double x = std::sin (theta) * std::cos (phi);
896 G4double y = std::sin (theta) * std::sin (phi);
897 G4double z = std::cos (theta);
898 fUpVector = G4ThreeVector (x, y, z);
899 vp.SetUpVector(fUpVector);
900 if (verbosity >= G4VisManager::confirmations) {
901 G4cout << "Up direction set to " << vp.GetUpVector() << G4endl;
902 }
903 }
904
905 else if (command == fpCommandUpVector) {
906 fUpVector = G4UIcommand::ConvertTo3Vector(newValue).unit();
907 vp.SetUpVector(fUpVector);
908 if (verbosity >= G4VisManager::confirmations) {
909 G4cout << "Up direction set to " << vp.GetUpVector() << G4endl;
910 }
911 }
912
913 else if (command == fpCommandViewpointThetaPhi) {
914 G4double theta, phi;
915 ConvertToDoublePair(newValue, theta, phi);
916 G4double x = std::sin (theta) * std::cos (phi);
917 G4double y = std::sin (theta) * std::sin (phi);
918 G4double z = std::cos (theta);
919 fViewpointVector = G4ThreeVector (x, y, z);
920 vp.SetViewAndLights(fViewpointVector);
921 if (verbosity >= G4VisManager::confirmations) {
922 G4cout << "Viewpoint direction set to "
923 << vp.GetViewpointDirection() << G4endl;
924 if (vp.GetLightsMoveWithCamera ()) {
925 G4cout << "Lightpoint direction set to "
926 << vp.GetActualLightpointDirection () << G4endl;
927 }
928 }
929 }
930
931 else if (command == fpCommandViewpointVector) {
932 fViewpointVector = G4UIcommand::ConvertTo3Vector(newValue).unit();
933 vp.SetViewAndLights(fViewpointVector);
934 if (verbosity >= G4VisManager::confirmations) {
935 G4cout << "Viewpoint direction set to "
936 << vp.GetViewpointDirection() << G4endl;
937 if (vp.GetLightsMoveWithCamera ()) {
938 G4cout << "Lightpoint direction set to "
939 << vp.GetActualLightpointDirection () << G4endl;
940 }
941 }
942 }
943
944 else {
945 if (verbosity >= G4VisManager::errors) {
946 G4cout <<
947 "ERROR: G4VisCommandsViewerSet::SetNewValue: unrecognised command."
948 << G4endl;
949 }
950 return;
951 }
952
953 SetViewParameters(currentViewer,vp);
954}
Note: See TracBrowser for help on using the repository browser.