Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLXmViewerMessenger.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 28 #include "G4OpenGLXmViewerMessenger.hh"
 29 
 30 #include "G4SystemOfUnits.hh"
 31 #include "G4OpenGLXmViewer.hh"
 32 #include "G4OpenGLXmSliderBar.hh"
 33 
 34 #include "G4UImanager.hh"
 35 #include "G4UIcommand.hh"
 36 #include "G4UIdirectory.hh"
 37 #include "G4UIcmdWithADoubleAndUnit.hh"
 38 #include "G4UIcmdWithADouble.hh"
 39 
 40 #include "G4VisManager.hh"
 41 
 42 G4OpenGLXmViewerMessenger* G4OpenGLXmViewerMessenger::fpInstance = 0;
 43 
 44 G4OpenGLXmViewerMessenger* G4OpenGLXmViewerMessenger::GetInstance()
 45 {
 46   if (!fpInstance) fpInstance = new G4OpenGLXmViewerMessenger;
 47   return fpInstance;
 48 }
 49 
 50 G4OpenGLXmViewerMessenger::G4OpenGLXmViewerMessenger()
 51 {
 52   G4bool omitable;
 53 
 54   fpDirectory = new G4UIdirectory("/vis/oglxm/");
 55   fpDirectory->SetGuidance("G4OpenGLXmViewer commands.");
 56 
 57   fpDirectorySet = new G4UIdirectory ("/vis/oglxm/set/");
 58   fpDirectorySet->SetGuidance("G4OpenGLXmViewer set commands.");
 59 
 60   fpCommandSetDollyHigh =
 61     new G4UIcmdWithADoubleAndUnit("/vis/oglxm/set/dolly-high", this);
 62   fpCommandSetDollyHigh->SetGuidance("Higher limit of dolly slider.");
 63   fpCommandSetDollyHigh->SetParameterName("dolly-high", omitable = false);
 64 
 65   fpCommandSetDollyLow =
 66     new G4UIcmdWithADoubleAndUnit("/vis/oglxm/set/dolly-low", this);
 67   fpCommandSetDollyLow->SetGuidance("Lower limit of dolly slider.");
 68   fpCommandSetDollyLow->SetParameterName("dolly-low", omitable = false);
 69 
 70   fpCommandSetPanHigh =
 71     new G4UIcmdWithADoubleAndUnit("/vis/oglxm/set/pan-high", this);
 72   fpCommandSetPanHigh->SetGuidance("Higher limit of pan slider.");
 73   fpCommandSetPanHigh->SetParameterName("pan-high", omitable = false);
 74 
 75   fpCommandSetRotationHigh =
 76     new G4UIcmdWithADoubleAndUnit("/vis/oglxm/set/rotation-high", this);
 77   fpCommandSetRotationHigh->SetGuidance("Higher limit of rotation slider.");
 78   fpCommandSetRotationHigh->SetParameterName("rotation-high", omitable = false);
 79 
 80   fpCommandSetZoomHigh =
 81     new G4UIcmdWithADouble("/vis/oglxm/set/zoom-high", this);
 82   fpCommandSetZoomHigh->SetGuidance("Higher limit of zoom slider.");
 83   fpCommandSetZoomHigh->SetParameterName("zoom-high", omitable = false);
 84 
 85   fpCommandSetZoomLow =
 86     new G4UIcmdWithADouble("/vis/oglxm/set/zoom-low", this);
 87   fpCommandSetZoomLow->SetGuidance("Lower limit of zoom slider.");
 88   fpCommandSetZoomLow->SetParameterName("zoom-low", omitable = false);
 89 }
 90 
 91 G4OpenGLXmViewerMessenger::~G4OpenGLXmViewerMessenger ()
 92 {
 93   delete fpCommandSetZoomLow;
 94   delete fpCommandSetZoomHigh;
 95   delete fpCommandSetRotationHigh;
 96   delete fpCommandSetPanHigh;
 97   delete fpCommandSetDollyLow;
 98   delete fpCommandSetDollyHigh;
 99   delete fpDirectorySet;
100   delete fpDirectory;
101 }
102 
103 void G4OpenGLXmViewerMessenger::SetNewValue
104 (G4UIcommand* command, G4String newValue)
105 {
106   G4VisManager* pVisManager = G4VisManager::GetInstance();
107 
108   G4VViewer* pVViewer = pVisManager->GetCurrentViewer();
109 
110   if (!pVViewer) {
111     G4cout <<
112       "G4OpenGLXmViewerMessenger::SetNewValue: No current viewer."
113       "\n  \"/vis/open\", or similar, to get one."
114            << G4endl;
115     return;
116   }
117 
118   G4OpenGLXmViewer* pViewer = dynamic_cast<G4OpenGLXmViewer*>(pVViewer);
119 
120   if (!pViewer) {
121     G4cout <<
122       "G4OpenGLXmViewerMessenger::SetNewValue: Current viewer is not of type"
123       "\n  OGLIXm or OGLSXm.  Use \"/vis/viewer/select\" or \"/vis/open\"."
124            << G4endl;
125     return;
126   }
127 
128   G4bool panningControlPanel = true;
129   G4bool rotationControlPanel = true;
130 
131   if (command == fpCommandSetDollyHigh)
132     {
133       if (pViewer->fpdolly_slider)
134   {
135     pViewer->dolly_high =
136       fpCommandSetDollyHigh->GetNewDoubleValue(newValue);
137     pViewer->fpdolly_slider->SetMaxValue (pViewer->dolly_high);
138     if (pViewer->fVP.GetDolly() > pViewer->dolly_high)
139       {
140         pViewer->fpdolly_slider->SetInitialValue (pViewer->dolly_high);
141         pViewer->fVP.SetDolly(pViewer->dolly_high);
142       }
143     else
144       {
145         pViewer->fpdolly_slider->SetInitialValue (pViewer->fVP.GetDolly());
146       }
147   }
148       else
149   {
150     panningControlPanel = false;
151   }
152     }
153 
154   else if (command == fpCommandSetDollyLow)
155     {
156       if (pViewer->fpdolly_slider)
157   {
158     pViewer->dolly_low =
159       fpCommandSetDollyLow->GetNewDoubleValue(newValue);
160     pViewer->fpdolly_slider->SetMinValue (pViewer->dolly_low);
161     if (pViewer->fVP.GetDolly() < pViewer->dolly_low)
162       {
163         pViewer->fpdolly_slider->SetInitialValue (pViewer->dolly_low);
164         pViewer->fVP.SetDolly(pViewer->dolly_low);
165       }
166     else
167       {
168         pViewer->fpdolly_slider->SetInitialValue (pViewer->fVP.GetDolly());
169       }
170   }
171       else
172   {
173     panningControlPanel = false;
174   }
175     }
176 
177   else if (command == fpCommandSetPanHigh)
178     {
179       if (pViewer->fppanning_slider)
180   {
181     pViewer->pan_sens_limit =
182       fpCommandSetPanHigh->GetNewDoubleValue(newValue);
183     pViewer->fppanning_slider->SetMaxValue (pViewer->pan_sens_limit);
184     pViewer->fppanning_slider->SetInitialValue (pViewer->pan_sens_limit / 2.);
185   }
186       else
187   {
188     panningControlPanel = false;
189   }
190     }
191 
192   else if (command == fpCommandSetRotationHigh)
193     {
194       if (pViewer->fprotation_slider)
195   {
196     // Internally in OpenGLXm, it's in degrees...
197     pViewer->rot_sens_limit =
198       fpCommandSetRotationHigh->GetNewDoubleValue(newValue) / deg;
199     pViewer->fprotation_slider->SetMaxValue (pViewer->rot_sens_limit);
200     pViewer->fprotation_slider->SetInitialValue (pViewer->rot_sens_limit / 2.);
201   }
202       else
203   {
204     rotationControlPanel = false;
205   }
206     }
207 
208   else if (command == fpCommandSetZoomHigh)
209     {
210       if (pViewer->fpzoom_slider)
211   {
212     pViewer->zoom_high =
213       fpCommandSetZoomHigh->GetNewDoubleValue(newValue);
214     pViewer->fpzoom_slider->SetMaxValue (pViewer->zoom_high);
215     pViewer->fpzoom_slider->SetInitialValue (pViewer->fVP.GetZoomFactor());
216     if (pViewer->fVP.GetZoomFactor() > pViewer->zoom_high)
217       {
218         pViewer->fpzoom_slider->SetInitialValue (pViewer->zoom_high);
219         pViewer->fVP.SetZoomFactor(pViewer->zoom_high);
220       }
221     else
222       {
223         pViewer->fpzoom_slider->SetInitialValue (pViewer->fVP.GetZoomFactor());
224       }
225   }
226       else
227   {
228     panningControlPanel = false;
229   }
230     }
231 
232   else if (command == fpCommandSetZoomLow)
233     {
234       if (pViewer->fpzoom_slider)
235   {
236     pViewer->zoom_low =
237       fpCommandSetZoomLow->GetNewDoubleValue(newValue);
238     pViewer->fpzoom_slider->SetMinValue (pViewer->zoom_low);
239     pViewer->fpzoom_slider->SetInitialValue (pViewer->fVP.GetZoomFactor());
240     if (pViewer->fVP.GetZoomFactor() < pViewer->zoom_low)
241       {
242         pViewer->fpzoom_slider->SetInitialValue (pViewer->zoom_low);
243         pViewer->fVP.SetZoomFactor(pViewer->zoom_low);
244       }
245     else
246       {
247         pViewer->fpzoom_slider->SetInitialValue (pViewer->fVP.GetZoomFactor());
248       }
249   }
250       else
251   {
252     panningControlPanel = false;
253   }
254     }
255 
256   if (!panningControlPanel)
257     {
258     G4cout << 
259       "G4OpenGLXmViewerMessenger::SetNewValue: pull down panning"
260       "\n  control panel and re-issue command."
261      << G4endl;
262     return;
263     }
264 
265   if (!rotationControlPanel)
266     {
267     G4cout << 
268       "G4OpenGLXmViewerMessenger::SetNewValue: pull down rotation"
269       "\n  control panel and re-issue command."
270      << G4endl;
271     return;
272     }
273 
274   G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/rebuild");
275 }
276