source: trunk/source/geometry/solids/test/fred/src/FredVoxelTestMessenger.cc @ 1316

Last change on this file since 1316 was 1316, checked in by garnier, 14 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 6.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// FredVoxelTestMessenger.cc
28//
29
30#include "FredVoxelTestMessenger.hh"
31#include "FredVoxelTest.hh"
32
33#include "G4UIdirectory.hh"
34#include "G4UIcommand.hh"
35#include "G4UIcmdWithoutParameter.hh"
36#include "G4UIcmdWith3VectorAndUnit.hh"
37#include "G4UIcmdWithAString.hh"
38#include "G4UIcmdWithADouble.hh"
39
40#include "G4VVisManager.hh"
41#include "G4UImanager.hh"
42
43//
44// Constructor
45//
46FredVoxelTestMessenger::FredVoxelTestMessenger()
47{
48        voxelTest = new FredVoxelTest();
49       
50        //
51        // Declare directory
52        //
53        voxelTestDirectory = new G4UIdirectory( "/fred/voxel/" );
54        voxelTestDirectory->SetGuidance( "Controls for voxel test" );
55       
56        //
57        // X min/max command
58        //
59        xMinMaxCmd = new G4UIcmdWith3VectorAndUnit( "/fred/voxel/xextent", this );
60        xMinMaxCmd->SetGuidance( "Max/min value along voxel x axis" );
61        xMinMaxCmd->SetParameterName( "Min", "Max", "NotUsed", true, true );
62       
63        //
64        // Y min/max command
65        //
66        yMinMaxCmd = new G4UIcmdWith3VectorAndUnit( "/fred/voxel/yextent", this );
67        yMinMaxCmd->SetGuidance( "Max/min value along voxel y axis" );
68        yMinMaxCmd->SetParameterName( "Min", "Max", "NotUsed", true, true );
69       
70        //
71        // Z min/max command
72        //
73        zMinMaxCmd = new G4UIcmdWith3VectorAndUnit( "/fred/voxel/zextent", this );
74        zMinMaxCmd->SetGuidance( "Max/min value along voxel z axis" );
75        zMinMaxCmd->SetParameterName( "Min", "Max", "NotUsed", true, true );
76
77        //
78        // Position command
79        //
80        posCmd = new G4UIcmdWith3VectorAndUnit( "/fred/voxel/position", this );
81        posCmd->SetGuidance( "Position of voxel" );
82        posCmd->SetParameterName( "X", "Y", "Z", true, true );
83       
84        //
85        // Rotate commands
86        //
87        xRotateCmd = new G4UIcmdWithADouble( "/fred/voxel/xrotate", this );
88        xRotateCmd->SetGuidance( "Rotate around x axis" );
89       
90        yRotateCmd = new G4UIcmdWithADouble( "/fred/voxel/yrotate", this );
91        yRotateCmd->SetGuidance( "Rotate around y axis" );
92       
93        zRotateCmd = new G4UIcmdWithADouble( "/fred/voxel/zrotate", this );
94        zRotateCmd->SetGuidance( "Rotate around z axis" );
95       
96        levelCmd = new G4UIcmdWithoutParameter( "/fred/voxel/level", this );
97        levelCmd->SetGuidance( "Reset rotation" );
98       
99        //
100        // Draw command
101        //
102        drawCmd = new G4UIcmdWithAString( "/fred/voxel/draw", this );
103        drawCmd->SetGuidance( "Test and draw the voxel" );
104        drawCmd->SetCandidates( "x y z" );
105       
106        //
107        // Test command
108        //
109        testCmd = new G4UIcmdWithAString( "/fred/voxel/test", this );
110        testCmd->SetGuidance( "Apply the voxel to the test volume" );
111        testCmd->SetCandidates( "x y z" );
112       
113        //
114        // Reset command
115        //
116        resetCmd = new G4UIcmdWithoutParameter( "/fred/voxel/reset", this );
117        resetCmd->SetGuidance( "Start with a fresh voxel" );
118}
119
120
121//
122// Destructor
123//
124FredVoxelTestMessenger::~FredVoxelTestMessenger()
125{
126        delete xMinMaxCmd;
127        delete yMinMaxCmd;
128        delete zMinMaxCmd;
129        delete posCmd;
130        delete drawCmd;
131        delete testCmd;
132        delete voxelTestDirectory;
133       
134        delete voxelTest;
135}
136
137
138//
139// InvokeTest
140//
141void FredVoxelTestMessenger::InvokeTest( G4String request )
142{
143        if (testVolume== 0) {
144                G4cerr << "Please initialize geometry before running test 3" << G4endl;
145                G4cerr << "Test 3 ABORTED" << G4endl;
146                return;
147        }
148       
149        EAxis axis;
150       
151        if ( request == "x" ) 
152                axis = kXAxis;
153        else if ( request == "y" )
154                axis = kYAxis;
155        else if ( request == "z" )
156                axis = kZAxis;
157        else {
158                G4cerr << "Please specify x, y, or z" << G4endl;
159                return;
160        }
161       
162        voxelTest->Test( axis, testVolume );
163}
164
165
166//
167// Draw
168//
169void FredVoxelTestMessenger::Draw()
170{
171        if (G4VVisManager::GetConcreteInstance()) {
172                G4UImanager *UI = G4UImanager::GetUIpointer();
173
174                // Prepare
175                UI->ApplyCommand( "/vis~/clear/view" );
176 
177                // Draw detector
178                UI->ApplyCommand( "/vis~/draw/current" );
179       
180                // Draw voxel
181                voxelTest->Draw();
182               
183                // Finish
184                UI->ApplyCommand( "/vis~/show/view" );
185        }
186}
187
188
189//
190// SetNewVaolume
191//
192// Call by the UI when user requests a change
193//
194void FredVoxelTestMessenger::SetNewValue( G4UIcommand *command, G4String newValues )
195{
196        if (command == xMinMaxCmd) {
197                G4ThreeVector param = xMinMaxCmd->GetNew3VectorValue( newValues );
198                voxelTest->SetExtent( kXAxis, param.x(), param.y() );
199        } 
200        else if (command == yMinMaxCmd) {
201                G4ThreeVector param = yMinMaxCmd->GetNew3VectorValue( newValues );
202                voxelTest->SetExtent( kYAxis, param.x(), param.y() );
203        } 
204        else if (command == zMinMaxCmd) {
205                G4ThreeVector param = zMinMaxCmd->GetNew3VectorValue( newValues );
206                voxelTest->SetExtent( kZAxis, param.x(), param.y() );
207        } 
208        else if (command == posCmd) {
209                voxelTest->SetOrigin( posCmd->GetNew3VectorValue( newValues ) );
210        }
211        else if (command == xRotateCmd) {
212                voxelTest->Rotate( kXAxis, deg*xRotateCmd->GetNewDoubleValue( newValues ) );
213        }
214        else if (command == yRotateCmd) {
215                voxelTest->Rotate( kYAxis, deg*yRotateCmd->GetNewDoubleValue( newValues ) );
216        }
217        else if (command == zRotateCmd) {
218                voxelTest->Rotate( kZAxis, deg*zRotateCmd->GetNewDoubleValue( newValues ) );
219        }
220        else if (command == levelCmd) {
221                voxelTest->ResetRotation();
222        }
223        else if (command == drawCmd) {
224                InvokeTest( newValues );
225                Draw();
226        }
227        else if (command == testCmd) {
228                InvokeTest( newValues );
229        }
230        else if (command == resetCmd) {
231                delete voxelTest;
232                voxelTest = new FredVoxelTest();
233        }
234        else {
235                G4Exception( "Unrecognized command" );
236        }
237}
238
239
240
241
242
243//
244// GetCurrentValue
245//
246G4String FredVoxelTestMessenger::GetCurrentValue( G4UIcommand * )
247{
248        return "fred";
249}
250       
Note: See TracBrowser for help on using the repository browser.