source: trunk/geant4/visualization/management/src/G4VisCommands.cc @ 569

Last change on this file since 569 was 531, checked in by garnier, 17 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: 9.8 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: G4VisCommands.cc,v 1.20 2006/11/26 15:49:10 allison Exp $
28// GEANT4 tag $Name: geant4-08-02-patch-01 $
29
30// /vis/ top level commands - John Allison  5th February 2001
31
32#include "G4VisCommands.hh"
33
34#include "G4VisManager.hh"
35#include "G4UImanager.hh"
36#include "G4UIcmdWithABool.hh"
37#include "G4UIcmdWithAString.hh"
38#include "G4UIcmdWithoutParameter.hh"
39#include "G4RunManager.hh"
40#include "G4Run.hh"
41#include "G4UIsession.hh"
42
43////////////// /vis/enable ///////////////////////////////////////
44
45G4VisCommandEnable::G4VisCommandEnable () {
46  G4bool omitable;
47
48  fpCommand = new G4UIcmdWithABool("/vis/enable", this);
49  fpCommand -> SetGuidance("Enables/disables visualization system.");
50  fpCommand -> SetParameterName("enabled", omitable=true);
51  fpCommand -> SetDefaultValue(true);
52
53  fpCommand1 = new G4UIcmdWithoutParameter("/vis/disable", this);
54  fpCommand1 -> SetGuidance("Disables visualization system.");
55}
56
57G4VisCommandEnable::~G4VisCommandEnable () {
58  delete fpCommand;
59  delete fpCommand1;
60}
61
62G4String G4VisCommandEnable::GetCurrentValue (G4UIcommand*) {
63  return G4String();
64}
65
66void G4VisCommandEnable::SetNewValue (G4UIcommand* command,
67                                      G4String newValue) {
68  if (command == fpCommand) {
69    G4bool enable = G4UIcommand::ConvertToBool(newValue);
70    if (enable) fpVisManager->Enable();  // Printing is in vis manager.
71    else fpVisManager->Disable();        // Printing is in vis manager.
72  } else fpVisManager->Disable();        // Printing is in vis manager.
73  // Note: Printing is in vis manager.
74}
75
76////////////// /vis/list ///////////////////////////////////////
77
78G4VisCommandList::G4VisCommandList ()
79{
80  G4bool omitable;
81
82  fpCommand = new G4UIcmdWithAString("/vis/list", this);
83  fpCommand -> SetGuidance("Lists visualization parameters.");
84  fpCommand -> SetParameterName("verbosity", omitable=true);
85  fpCommand -> SetDefaultValue("warnings");
86}
87
88G4VisCommandList::~G4VisCommandList ()
89{
90  delete fpCommand;
91}
92
93G4String G4VisCommandList::GetCurrentValue (G4UIcommand*)
94{
95  return "";
96}
97
98void G4VisCommandList::SetNewValue (G4UIcommand*, G4String newValue)
99{
100  G4String& verbosityString = newValue;
101  G4VisManager::Verbosity verbosity =
102    fpVisManager->GetVerbosityValue(verbosityString);
103
104  fpVisManager->PrintAvailableGraphicsSystems();
105  G4cout << G4endl;
106  fpVisManager->PrintAvailableModels(verbosity);
107  G4cout << G4endl;
108  G4UImanager* UImanager = G4UImanager::GetUIpointer();
109  UImanager->ApplyCommand(G4String("/vis/viewer/list ! ") + verbosityString);
110  if (verbosity < G4VisManager::parameters)
111    G4cout <<
112  "\nTo get more information, \"/vis/list all all\" or use individual commands"
113  "\n  such as (use \"ls\" or \"help\"):"
114  "\n    /vis/viewer/list"
115  "\n    /vis/modeling/trajectories/list"
116  "\n    /vis/filtering/trajectories/list"
117           << G4endl;
118}
119
120////////////// /vis/reviewKeptEvents ///////////////////////////////////////
121
122G4VisCommandReviewKeptEvents::G4VisCommandReviewKeptEvents ()
123{
124  G4bool omitable;
125
126  fpCommand = new G4UIcmdWithAString("/vis/reviewKeptEvents", this);
127  fpCommand -> SetGuidance("Review kept events.");
128  fpCommand -> SetGuidance
129    ("If a macro file is specified, it is executed for each event.");
130  fpCommand -> SetGuidance
131    ("If a macro file is not specified, each event is drawn to the current"
132     "\nviewer.  After each event, the session is paused.  The user may issue"
133     "\nany allowed command.  Then enter \"continue\" to continue to the next"
134     "\nevent.");
135  fpCommand -> SetParameterName("macro-file-name", omitable=true);
136  fpCommand -> SetDefaultValue("");
137}
138
139G4VisCommandReviewKeptEvents::~G4VisCommandReviewKeptEvents ()
140{
141  delete fpCommand;
142}
143
144G4String G4VisCommandReviewKeptEvents::GetCurrentValue (G4UIcommand*)
145{
146  return "";
147}
148
149void G4VisCommandReviewKeptEvents::SetNewValue (G4UIcommand*, G4String newValue)
150{
151  G4String& macroFileName = newValue;
152  G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
153
154  G4RunManager* runManager = G4RunManager::GetRunManager();
155  const G4Run* run = runManager? runManager->GetCurrentRun(): 0;
156  const std::vector<const G4Event*>* events = run? run->GetEventVector(): 0;
157  size_t nKeptEvents = events? events->size(): 0;
158
159  if (!nKeptEvents) {
160    if (verbosity >= G4VisManager::errors) {
161      G4cout <<
162        "ERROR: G4VisCommandReviewKeptEvents::SetNewValue: No kept events,"
163        "\n  or kept events not accessible."
164             << G4endl;
165    }
166    return;
167  }
168
169  G4VViewer* viewer = fpVisManager->GetCurrentViewer();
170  if (!viewer) {
171    if (verbosity >= G4VisManager::errors) {
172      G4cout <<
173  "ERROR: No current viewer - \"/vis/viewer/list\" to see possibilities."
174             << G4endl;
175    }
176    return;
177  }
178
179  G4Scene* pScene = fpVisManager->GetCurrentScene();
180  if (!pScene) {
181    if (verbosity >= G4VisManager::errors) {
182      G4cout << "ERROR: No current scene.  Please create one." << G4endl;
183    }
184    return;
185  }
186
187  G4VSceneHandler* sceneHandler = fpVisManager->GetCurrentSceneHandler();
188
189  G4UImanager* UImanager = G4UImanager::GetUIpointer();
190  G4int keepVerbose = UImanager->GetVerboseLevel();
191  G4int newVerbose(0);
192  if (keepVerbose >= 2 || verbosity >= G4VisManager::confirmations)
193    newVerbose = 2;
194  UImanager->SetVerboseLevel(newVerbose);
195
196  // Event by event refreshing...
197  G4bool currentRefreshAtEndOfEvent = pScene->GetRefreshAtEndOfEvent();
198  pScene->SetRefreshAtEndOfEvent(true);
199  if (macroFileName.empty()) {
200
201    // Draw to viewer and pause session...
202    for (size_t i = 0; i < nKeptEvents; ++i) {
203      const G4Event* event = (*events)[i];
204      if (verbosity >= G4VisManager::warnings) {
205        G4cout << "Drawing event : " << event->GetEventID() <<
206          ".  At EndOfEvent, enter any command, then \"continue\"..."
207               << G4endl;
208      }
209      sceneHandler->SetEvent(event);
210      UImanager->ApplyCommand("/vis/viewer/rebuild");
211      /* The above command forces a rebuild of the scene, including
212         the detector.  This is fine for "immediate" viewers - a
213         refresh requires a rebuild anyway.  But for "stored mode"
214         viewers, you could, in principle, avoid a rebuild of the
215         detector with something like the following:
216      sceneHandler->ClearTransientStore();
217      viewer->DrawView();
218      sceneHandler->DrawEvent(event);
219         but this causes mayhem for "immediate" viewers because
220         ClearTransientStore issues a DrawView and some curious sort
221         of recursion takes place.  For "stored" viewers, the event
222         gets drawn but not the eventID, so something odd is happening
223         there too.  This needs further investigation - enhanced
224         features or a complete re-think.
225      */
226      if (!viewer->GetViewParameters().IsAutoRefresh())
227        UImanager->ApplyCommand("/vis/viewer/flush");
228      G4UIsession* session = UImanager->GetSession();
229      session->PauseSessionStart("EndOfEvent");
230      sceneHandler->SetEvent(0);
231    }
232
233  } else {
234
235    // Execute macro file...
236    for (size_t i = 0; i < nKeptEvents; ++i) {
237      const G4Event* event = (*events)[i];
238      if (verbosity >= G4VisManager::warnings) {
239        G4cout << "Drawing event : " << event->GetEventID()
240               << " with macro file \"" << macroFileName << G4endl;
241      }
242      sceneHandler->SetEvent(event);
243      UImanager->ApplyCommand("/control/execute " + macroFileName);
244      sceneHandler->SetEvent(0);
245    }
246  }
247  pScene->SetRefreshAtEndOfEvent(currentRefreshAtEndOfEvent);
248
249  UImanager->SetVerboseLevel(keepVerbose);
250}
251
252////////////// /vis/verbose ///////////////////////////////////////
253
254G4VisCommandVerbose::G4VisCommandVerbose () {
255  G4bool omitable;
256
257  fpCommand = new G4UIcmdWithAString("/vis/verbose", this);
258  for (size_t i = 0; i < G4VisManager::VerbosityGuidanceStrings.size(); ++i) {
259    fpCommand -> SetGuidance(G4VisManager::VerbosityGuidanceStrings[i]);
260  }
261  fpCommand -> SetParameterName("verbosity", omitable=true);
262  fpCommand -> SetDefaultValue("warnings");
263}
264
265G4VisCommandVerbose::~G4VisCommandVerbose () {
266  delete fpCommand;
267}
268
269G4String G4VisCommandVerbose::GetCurrentValue (G4UIcommand*) {
270  return G4String();
271}
272
273void G4VisCommandVerbose::SetNewValue (G4UIcommand*,
274                                       G4String newValue) {
275  G4VisManager::Verbosity verbosity =
276    fpVisManager->GetVerbosityValue(newValue);
277  fpVisManager->SetVerboseLevel(verbosity);
278  // Always prints whatever the verbosity...
279  G4cout << "Visualization verbosity changed to "
280         << G4VisManager::VerbosityString(verbosity) << G4endl;
281}
Note: See TracBrowser for help on using the repository browser.