Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4OpenInventorXtExaminerViewer.hh
Go to the documentation of this file.
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 // Open Inventor Xt Extended Viewer - 30 Oct 2012
27 // Rastislav Ondrasek, Pierre-Luc Gagnon, Frederick Jones TRIUMF
28 
29 #ifndef HookEventProcState_H
30 #define HookEventProcState_H 1
31 #include "G4VStateDependent.hh"
32 
35 {
36 private:
38 public:
41 
42  virtual G4bool Notify(G4ApplicationState requiredState);
43 };
44 #endif /* HookEventProcState_H */
45 
46 
47 #ifndef G4OPENINVENTORXTEXAMINERVIEWER_HH
48 #define G4OPENINVENTORXTEXAMINERVIEWER_HH
49 
50 #include <map>
51 #include <vector>
52 #include <fstream>
53 #include <Inventor/SbLinear.h>
54 #include <Inventor/nodes/SoLineSet.h>
55 #include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
56 #include <Inventor/events/SoKeyboardEvent.h>
57 
58 class SoCoordinate3;
59 class SoFont;
60 class SoText2;
61 class SoPointSet;
62 
63 class G4OpenInventorXtExaminerViewer : public SoXtExaminerViewer {
64 private:
65  Widget prevViewPtButton, nextViewPtButton;
66  Widget menuBar, fileMenu, openFileDialog, newFileDialog,
67  loadRefCoordsDialog, saveRefCoordsDialog,
68  loadSceneGraphDialog, saveSceneGraphDialog,
69  viewPtSelection, listsDialog, myShellDialog, myViewPtList, myElementList;
70 
71  static G4OpenInventorXtExaminerViewer *viewer;
72  void (*escapeCallback)(void *);
73  void * examinerObject;
74  SbBool lshiftdown, rshiftdown, lctrldown, rctrldown;
75 
76 public:
77 
78  // Same constructor as the ExaminerViewer
79  G4OpenInventorXtExaminerViewer(Widget parent = NULL,
80  const char *name = NULL,
81  SbBool embed = TRUE,
82  SoXtFullViewer::BuildFlag flag = BUILD_ALL,
83  SoXtViewer::Type type = BROWSER);
84 
86  template <class T> void parseString(T &t, const std::string &s, bool &error);
87  Widget addMenu(std::string name);
88  void addButton(Widget menu, std::string name, XtCallbackProc);
89  Widget getMenuBar() { return menuBar; }
90  Widget getMenu() { return fileMenu; }
91  void warningMsgDialog(std::string, String, XtCallbackProc);
93 
96  std::string saveRefCoordsFileName;
98 
99  Widget createScale(Widget, char *, int, float);
100  void addEscapeCallback(void (*cb)(void *), void *);
104 
105 protected:
106  // Same constructor as the ExaminerViewer
107  G4OpenInventorXtExaminerViewer(Widget parent,
108  const char *name,
109  SbBool embed,
110  SoXtFullViewer::BuildFlag flag,
111  SoXtViewer::Type type,
112  SbBool build);
113 
114  // Overloaded for adding the MenuBar
115  Widget buildWidget(Widget parent);
116  // Overloaded so additional buttons can be added
117  virtual void createViewerButtons (Widget parent, SbPList * buttonlist);
118  // Overloaded for catching various keyboard events
119  virtual SbBool processSoEvent(const SoEvent * const event);
120  void moveCamera(float dist = 0, bool lookdown = false);
121  std::string curEltName;
122  SbVec3f camUpVec;
123  SbVec3f camDir;
124  void rotateCamera();
125  void updateViewParams(SoKeyboardEvent::Key);
126  bool loadViewPts();
127  virtual void afterRealizeHook();
128 
129 private:
130  // Each constructor calls this generic constructor
131  void constructor(const SbBool build);
132 
133  static G4OpenInventorXtExaminerViewer *getObject();
134 
135  HookEventProcState *hookBeamOn;
136  friend class HookEventProcState;
137  bool newEvents;
138  static void sceneChangeCB(void *, SoSensor *);
139 
140  void setViewPt();
141  void writeViewPtIdx();
142  void cleanUpAfterPrevFile();
143 
144  void popUpFileSelDialog(Widget&, std::string, std::string, XtCallbackProc);
145  static void cancelFileSelDialogCB(Widget, XtPointer, XtPointer);
146  static void openViewPtFileCB(Widget, XtPointer, XtPointer);
147  static void viewPtFileSelectedCB(Widget, XtPointer, XtPointer);
148  static void newViewPtFileCB(Widget, XtPointer, XtPointer);
149  static void createNewVPFileCB(Widget, XtPointer, XtPointer);
150  static void overwriteFileCB(Widget, XtPointer, XtPointer);
151  static void loadRefCoordsDialogCB(Widget, XtPointer, XtPointer); //pop file dialog
152  static void loadRefCoordsCB(Widget, XtPointer, XtPointer); //execute loading
153  static void saveRefCoordsDialogCB(Widget, XtPointer, XtPointer); //pop file dialog
154  static void saveRefCoordsCB(Widget, XtPointer, XtPointer); //execute saving
155  static void saveRefCoordsOverWriteCB(Widget, XtPointer, XtPointer);
156  static void loadSceneGraphDialogCB(Widget, XtPointer, XtPointer);
157  static void loadSceneGraphCB(Widget, XtPointer, XtPointer);
158  static void saveSceneGraphDialogCB(Widget, XtPointer, XtPointer);
159  static void saveSceneGraphCB(Widget, XtPointer, XtPointer);
160  static void saveSceneGraphOverWriteCB(Widget, XtPointer, XtPointer);
161  static void mouseoverCB(void *aThis, SoEventCallback *eventCB);
162  static void pickingCB(void *aThis, SoEventCallback *eventCB);
163 
164 
165  // Viewpoint operations
166  void addViewPoints();
167  static void closeListsDialogCB(Widget, XtPointer, XtPointer);
168  static void loadBookmarkCB(Widget, XtPointer, XtPointer);
169  static void renameBookmarkCB(Widget, XtPointer, XtPointer);
170  void renameViewPt(char *vpName);
171  static void sortBookmarksCB(Widget, XtPointer, XtPointer);
172  void sortViewPts(std::vector<std::string>);
173  static void deleteBookmarkCB(Widget, XtPointer, XtPointer);
174  static void deleteViewPtCB(Widget, XtPointer, XtPointer);
175  void deleteViewPt(char *vpName = NULL);
176 
177  // Animation
178  static void animateRefParticleCB(Widget, XtPointer, XtPointer);
179  static void animateSensorCB(void *, SoSensor *);
180  static void animateSensorRotationCB(void *, SoSensor *);
181  void animateRefParticle();
182  void saveCurCamera();
183  void restoreCamera();
184  double animateBtwPtsPeriod, speedStep;
185  void incSpeed();
186  void decSpeed();
187 
188  SoTimerSensor *animateSensor;
189  SoTimerSensor *animateSensorRotation;
190  SoNodeSensor *sceneChangeSensor;
191  SbVec3f camStartPos, camEndPos;
192  SbRotation camStartOrient, camEndOrient;
193 
194  static void prevViewPtCB(Widget, XtPointer, XtPointer);
195  static void nextViewPtCB(Widget, XtPointer, XtPointer);
196  static void saveViewPtCB(Widget, XtPointer, XtPointer);
197  static void abbrOutputCB(Widget, XtPointer, XtPointer);
198  static void pickRefPathCB(Widget, XtPointer, XtPointer);
199  static void constructListsDialog(Widget, XtPointer, XtPointer);
200  void saveViewPt(char *name);
201 
202 
203  static void lookAtSceneElementCB(Widget, XtPointer, XtPointer);
204  static void cancelSceneElementSelectionCB(Widget, XtPointer, XtPointer);
205 
206  void setReferencePath(SoLineSet*, SoCoordinate3*, bool append = false);
207  void setReferencePathZPos();
208  void findAndSetRefPath();
209  SoCoordinate3 *getCoordsNode(SoFullPath *path);
210  void getSceneElements(); // reads elements from the scene graph
211  float sqrlen(const SbVec3f&);
212  void distanceToTrajectory(const SbVec3f&, float&, SbVec3f&, int&);
213  void sortElements();
214  void createElementsList(Widget);
215  static void closeMainWindowCB(Widget, XtPointer, XtPointer);
216  void evenOutRefParticlePts();
217 
218  static void gotoRefPathStartCB(Widget, XtPointer, XtPointer);
219  void gotoRefPathStart();
220  static void invertRefPathCB(Widget, XtPointer, XtPointer);
221  void invertRefPath();
222 
223  enum CameraType {
224  PERSPECTIVE,
225  ORTHOGRAPHIC
226  };
227 
228 
229  enum State {
230  GENERAL,
231  BEAMLINE,
232  VIEWPOINT,
233  ANIMATION,
234  REVERSED_ANIMATION,
235  PAUSED_ANIMATION,
236  ROTATING
237  };
238 
239  // For storing the view point
240  struct viewPtData {
241  char* viewPtName;
242  int viewportMapping;
243  SbVec3f position;
244  SbRotation orientation;
245  float aspectRatio;
246  float nearDistance;
247  float farDistance;
248  float focalDistance;
249  CameraType camType;
250  float height;
251  };
252 
253  struct sceneElement {
254  std::string name;
255  SoFullPath * path;
256  SbVec3f center;
257  float closestPointZCoord;
258 
259  sceneElement operator=(sceneElement const &rhs) const {
260  sceneElement el;
261  el.name = rhs.name;
262  el.path = rhs.path;
263  el.center = rhs.center;
264  el.closestPointZCoord = rhs.closestPointZCoord;
265 
266  return el;
267  }
268  };
269 
270  struct elementForSorting {
271  float closestPointZCoord;
272  SbVec3f closestPoint;
273  float smallestDistance;
274  float distanceToBeamlineStart;
275  std::string name;
276 
277  bool operator<(elementForSorting const &other) const
278  {
279  if (closestPointZCoord < other.closestPointZCoord)
280  return true;
281  if (closestPointZCoord > other.closestPointZCoord)
282  return false;
283 
284  // otherwise closestPointZCoord == other.closestPointZCoord.
285  // Compare the distances from the center of the element to
286  // the start of the beamline.
287  if (distanceToBeamlineStart < other.distanceToBeamlineStart)
288  return true;
289  if (distanceToBeamlineStart > other.distanceToBeamlineStart)
290  return false;
291 
292  // In case both closestPointZCoord and smallestDistance are
293  // equal, we have two exactly overlapping elements, if so
294  // the order doesn't matter
295  return true;
296  }
297  };
298 
299  bool zcoordSetFlag;
300 
301  std::vector<sceneElement> sceneElements;
302  std::vector<viewPtData> viewPtList;
303  std::string fileName;
304  std::ifstream fileIn;
305  std::ofstream fileOut;
306  int viewPtIdx;
307  int MAX_VP_IDX;
308  int MAX_VP_NAME;
309 
310  // For storing coordinate points of the reference particle
311  std::vector<SbVec3f> refParticleTrajectory;
312  // For displaying distance during anim and beamline modes
313  std::vector<float> refZPositions;
314  int refParticleIdx;
315  int prevRefIdx;
316  float distance;
317  State currentState, prevState, beforePausing;
318  char *curViewPtName;
319 
320  int step;
321  SbVec3f prevPt;
322  SbVec3f prevParticleDir;
323  void * prevColorField;
324 
325  viewPtData camB4Animation;
326  bool returnToSaveVP;
327  bool returnToAnim;
328  SoCamera *myCam;
329  void setStartingPtForAnimation();
330  float left_right, up_down;
331  SbVec3f rotAxis; // For 90 degree rotations
332  int rotCnt; // # of steps rotation is split into
333 
334  static void getViewPtNameCB(Widget, XtPointer, XtPointer);
335  std::string viewPtAutoName();
336 
338  SoSearchAction * searcher;
339 
340  SoNode * superimposition;
341  SoCoordinate3 * sgeometry;
342  SoScale * sscale;
343 
344  SoTranslation * stranslation;
345  SoTranslation * curInfoTrans;
346  SoTranslation * mouseOverTransSolid;
347  SoTranslation * mouseOverTransMaterial;
348  SoTranslation * mouseOverTransLogName;
349  SoTranslation * mouseOverTransZPos;
350 
351  // Used for 2 similar purposes: 1. Displays z position during animation
352  // 2. Displays name of the current viewpoint
353  SoText2 * curInfoText;
354  /* Need to use many different fields for mouseover
355  * because newlines are ignored when the scene is rendered */
356  SoText2 * mouseOverTextSolid;
357  SoText2 * mouseOverTextMaterial;
358  SoText2 * mouseOverTextLogName;
359  SoText2 * mouseOverTextZPos;
360 
361  SoFont * curInfoFont;
362  SoFont * mouseOverFontSolid;
363  SoFont * mouseOverFontMaterial;
364  SoFont * mouseOverFontLogName;
365  SoFont * mouseOverFontZPos;
366  SoSwitch * axisSwitch;
367  SoSwitch * animSpeedOutlineSwitch;
368  SoSwitch * animSpeedSwitch;
369  SoSwitch * curInfoSwitch;
370 
371  SoNode * getSuperimpositionNode(SoNode *, const char * name);
372 
373  void superimpositionEvent(SoAction * action);
374  static void superimpositionCB(void * closure, SoAction * action);
375 
376  virtual void actualRedraw(void);
377  void updateSpeedIndicator(void);
378 
379  float maxSpeed;
381 
382  // FWJ added for Ortho camera
383  float defaultHeight;
384  float defaultHeightAngle;
385 
386  // Used by G4 app during element rotations, stores previous view
387  SbVec3f upVector, offsetFromCenter, center;
388  bool rotUpVec;
389 
390  SoSeparator * newSceneGraph;
391 
392 
393 };
394 #endif /* G4OPENINVENTORXTEXAMINERVIEWER_HH */