Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4OpenInventorWinViewer.cc
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//
27//
28/*
29 * jck : 05 Feb 1997 : Initial Implementation
30 * jck : 21 Apr 1997 : Mods for SoXtHepViewer
31 * gb : on Win32 use an SoXtExaminerViewer.
32 * gb : 05 April 2004 : creation.
33 * gb : 09 November 2004 : Pulldown menu with the escape menu item.
34 * gb 14 November 2004 : inherit G4OpenInventorViewer.
35 */
36
37// this :
39
40#include <Inventor/nodes/SoSelection.h>
41
42#include <Inventor/Win/SoWin.h>
43#include <Inventor/Win/viewers/SoWinExaminerViewer.h>
44
46
47#include "G4OpenInventor.hh"
50#include "G4VisManager.hh"
51
52#include <windowsx.h>
53
54// To have sizeChanged public :
55class Geant4_SoWinExaminerViewer : public SoWinExaminerViewer {
56public:
57 Geant4_SoWinExaminerViewer(HWND parent,const char* name,SbBool embed)
58 :SoWinExaminerViewer(parent,name,embed){}
59 virtual void sizeChanged(const SbVec2s & size){
60 SoWinExaminerViewer::sizeChanged(size);
61 }
62};
63
64// File :
65#define ID_FILE_POSTSCRIPT 1
66#define ID_FILE_PIXMAP_POSTSCRIPT 2
67#define ID_FILE_INVENTOR 3
68#define ID_FILE_ESCAPE 4
69// Etc :
70#define ID_ETC_ERASE_DETECTOR 101
71#define ID_ETC_ERASE_EVENT 102
72#define ID_ETC_SET_SOLID 103
73#define ID_ETC_SET_WIRE_FRAME 104
74#define ID_ETC_SET_REDUCED_WIRE_FRAME 105
75#define ID_ETC_SET_FULL_WIRE_FRAME 106
76#define ID_ETC_SET_PREVIEW 107
77#define ID_ETC_SET_PREVIEW_AND_FULL 108
78#define ID_ETC_UPDATE_SCENE 109
79#define ID_ETC_STATS 110
80// Help :
81#define ID_HELP_CONTROLS 201
82
83//static void SecondaryLoopPostAction ();
84
85static const char className[] = "G4OpenInventorShellWindow";
86
88 G4OpenInventorSceneHandler& sceneHandler
89,const G4String& name)
90:G4OpenInventorViewer (sceneHandler, name)
91,fShell(0)
92,fViewer(0)
93{
95 G4cout << "Window name: " << fName << G4endl;
96}
97
98
100
101 G4String wName = fName;
102
103 int width = fVP.GetWindowSizeHintX();
104 int height = fVP.GetWindowSizeHintY();;
105
106 HWND parent = (HWND)fInteractorManager->GetParentInteractor ();
107 if(!parent) {
108 //Create a shell window :
109 G4String shellName = wName;
110 shellName += "_shell";
111 static SbBool done = FALSE;
112 if(done==FALSE) {
113 HBRUSH brush = (HBRUSH) GetSysColorBrush(COLOR_BTNFACE);
114 WNDCLASS wc;
115 wc.style = CS_HREDRAW | CS_VREDRAW;
116 wc.lpfnWndProc = (WNDPROC)WindowProc;
117 wc.cbClsExtra = 0;
118 wc.cbWndExtra = 0;
119 wc.hInstance = ::GetModuleHandle(0);
120 wc.hIcon = ::LoadIcon(0, IDI_APPLICATION);
121 wc.hCursor = ::LoadCursor(0, IDC_ARROW);
122 wc.hbrBackground = brush;
123 wc.lpszMenuName = className;
124 wc.lpszClassName = className;
125 ::RegisterClass(&wc);
126 done = TRUE;
127 }
128
129 width = fVP.GetWindowSizeHintX();
130 height = fVP.GetWindowSizeHintX();
131
132 HMENU menuBar = CreateMenu();
133
134 {HMENU casc = CreatePopupMenu();
135 ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"File");
136 ::AppendMenu(casc,MF_STRING,ID_FILE_POSTSCRIPT,"PS (gl2ps)");
137 ::AppendMenu(casc,MF_STRING,ID_FILE_PIXMAP_POSTSCRIPT,"PS (pixmap)");
138 ::AppendMenu(casc,MF_STRING,ID_FILE_INVENTOR,"IV");
139 ::AppendMenu(casc,MF_STRING,ID_FILE_ESCAPE,"Escape");}
140
141 {HMENU casc = CreatePopupMenu();
142 ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"Etc");
143 ::AppendMenu(casc,MF_STRING,ID_ETC_ERASE_DETECTOR,"Erase detector");
144 ::AppendMenu(casc,MF_STRING,ID_ETC_ERASE_EVENT,"Erase event");
145 ::AppendMenu(casc,MF_STRING,ID_ETC_SET_SOLID,"Set solid");
146 //::AppendMenu(casc,MF_STRING,ID_ETC_SET_WIRE_FRAME,"Set (G4) wire frame");
147 ::AppendMenu(casc,MF_STRING,ID_ETC_SET_REDUCED_WIRE_FRAME,
148 "Set (G4) reduced wire frame");
149 ::AppendMenu(casc,MF_STRING,ID_ETC_SET_FULL_WIRE_FRAME,
150 "Set (G4) full wire frame");
151 ::AppendMenu(casc,MF_STRING,ID_ETC_SET_PREVIEW,
152 "Visible mothers + invisible daughters");
153 ::AppendMenu(casc,MF_STRING,ID_ETC_SET_PREVIEW_AND_FULL,
154 "Visible mothers + visible daughters");
155 ::AppendMenu(casc,MF_STRING,ID_ETC_UPDATE_SCENE,"Update scene");
156 ::AppendMenu(casc,MF_STRING,ID_ETC_STATS,"Scene graph stats");}
157
158 {HMENU casc = CreatePopupMenu();
159 ::AppendMenu(menuBar,MF_POPUP,(UINT)casc,"Help");
160 ::AppendMenu(casc,MF_STRING,ID_HELP_CONTROLS,"Controls");}
161
162 fShell = ::CreateWindow(className, shellName.c_str(),
163 WS_OVERLAPPEDWINDOW |
164 WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
165 CW_USEDEFAULT, CW_USEDEFAULT,
166 width,height,
167 0,menuBar,::GetModuleHandle(0),0);
168 // Retreive window and client sizez :
169 RECT wrect,crect;
170 GetWindowRect((HWND)fShell,&wrect);
171 GetClientRect((HWND)fShell,&crect);
172 int ww = wrect.right-wrect.left;
173 int wh = wrect.bottom-wrect.top;
174 int cw = crect.right-crect.left;
175 int ch = crect.bottom-crect.top;
176 // Compell client rect to be width height :
177 MoveWindow((HWND)fShell,wrect.left,wrect.top,width+ww-cw,height+wh-ch,TRUE);
178 ::SetWindowLongPtr((HWND)fShell,GWLP_USERDATA,LONG(this));
179 ::SetWindowText((HWND)fShell,shellName.c_str());
180 parent = fShell;
182 } else {
184 if(str!=0) wName = str;
185 }
186 fViewer = new Geant4_SoWinExaminerViewer(parent,wName.c_str(),TRUE);
187
188 // Have a GL2PS render action :
189 const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
190 fGL2PSAction = new SoGL2PSAction(vpRegion);
191 fViewer->setGLRenderAction(fGL2PSAction);
192
193 fViewer->setSize(SbVec2s(width,height));
194 fViewer->setSceneGraph(fSoSelection);
195 fViewer->viewAll();
196 fViewer->saveHomePosition();
197 fViewer->setTitle(fName);
198 fViewer->show();
199 if(fShell) {
200 SoWin::show(fShell);
202 }
203 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
204 fViewer->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_ADD);
205}
206
208 if(fShell) fInteractorManager->RemoveShell(fShell);
209 if(fViewer) {
210 fViewer->setSceneGraph(0);
211 delete fViewer;
212 }
213 if(fShell) {
214 ::SetWindowLongPtr((HWND)fShell,GWLP_USERDATA,LONG(0));
215 ::DestroyWindow((HWND)fShell);
216 }
217}
218
220 if(!fViewer) return;
221 fViewer->viewAll();
222 fViewer->saveHomePosition();
223}
224
227 if(!fViewer) return;
228 // Background.
230 fViewer->setBackgroundColor
231 (SbColor((float)b.GetRed(),(float)b.GetGreen(),(float)b.GetBlue()));
232}
234 if(!fViewer) return;
235 fViewer->render();
236}
237
239 if(!fViewer) return 0;
240 return fViewer->getCamera();
241}
242
243
244//////////////////////////////////////////////////////////////////////////////
245LRESULT CALLBACK G4OpenInventorWinViewer::WindowProc (
246 HWND aWindow
247,UINT aMessage
248,WPARAM aWParam
249,LPARAM aLParam
250)
251//////////////////////////////////////////////////////////////////////////////
252// Below treatment of WM_SIZE, WM_SETFOCUS not necessary
253// with TGS, but needed with SoFree. WM_DESTROY needed for
254// 'main top level window' so that 'Close window' induces
255// the end of the task.
256//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
257{
258 switch (aMessage) {
259 case WM_SIZE:{ // Assume one child window !
260 int width = LOWORD(aLParam);
261 int height = HIWORD(aLParam);
262 //printf("debug : G4SoWindow : WMS_SIZE : %d %d\n",width,height);
264 (G4OpenInventorWinViewer*)::GetWindowLongPtr(aWindow,GWLP_USERDATA);
265 if(This && This->fViewer) {
266 This->fViewer->sizeChanged(SbVec2s(width,height));
267 }
268 }return 0;
269 case WM_SETFOCUS:{ // Assume one child window !
270 HWND hwnd = ::GetFirstChild(aWindow);
271 if(hwnd!=0) ::SetFocus(hwnd);
272 }return 0;
273 case WM_DESTROY:{
274 //G4OpenInventorWinViewer* This =
275 // (G4OpenInventorWinViewer*)::GetWindowLongPtr(aWindow,GWLP_USERDATA);
276 //::PostQuitMessage(0);
277 }return 0;
278 case WM_COMMAND:{
280 (G4OpenInventorWinViewer*)::GetWindowLongPtr(aWindow,GWLP_USERDATA);
281 if(This) {
282 if(aLParam==0) { //From menu.
283 // File :
284 if(aWParam==ID_FILE_POSTSCRIPT) {
285 This->WritePostScript();
286 } else if(aWParam==ID_FILE_PIXMAP_POSTSCRIPT) {
287 This->WritePixmapPostScript();
288 } else if(aWParam==ID_FILE_INVENTOR) {
289 This->WriteInventor();
290 } else if(aWParam==ID_FILE_ESCAPE) {
291 This->Escape();
292 // Etc :
293 } else if(aWParam==ID_ETC_ERASE_DETECTOR) {
294 This->EraseDetector();
295 } else if(aWParam==ID_ETC_ERASE_EVENT) {
296 This->EraseEvent();
297 } else if(aWParam==ID_ETC_SET_SOLID) {
298 This->SetSolid();
299 } else if(aWParam==ID_ETC_SET_WIRE_FRAME) {
300 This->SetWireFrame();
301 } else if(aWParam==ID_ETC_SET_REDUCED_WIRE_FRAME) {
302 This->SetReducedWireFrame(true);
303 } else if(aWParam==ID_ETC_SET_FULL_WIRE_FRAME) {
304 This->SetReducedWireFrame(false);
305 } else if(aWParam==ID_ETC_SET_PREVIEW) {
306 This->SetPreview();
307 } else if(aWParam==ID_ETC_SET_PREVIEW_AND_FULL) {
308 This->SetPreviewAndFull();
309 } else if(aWParam==ID_ETC_UPDATE_SCENE) {
310 This->UpdateScene();
311 } else if(aWParam==ID_ETC_STATS) {
312 This->SceneGraphStatistics();
313 // Help :
314 } else if(aWParam==ID_HELP_CONTROLS) {
315 G4cout << This->Help() << G4endl;
316 }
317 }
318 }
319 }return 0;
320 default:
321 return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam));
322 }
323}
#define ID_ETC_SET_WIRE_FRAME
#define ID_ETC_SET_FULL_WIRE_FRAME
#define ID_ETC_UPDATE_SCENE
#define ID_ETC_SET_PREVIEW_AND_FULL
#define ID_ETC_STATS
#define ID_FILE_PIXMAP_POSTSCRIPT
#define ID_ETC_SET_PREVIEW
#define ID_ETC_ERASE_DETECTOR
#define ID_ETC_SET_REDUCED_WIRE_FRAME
#define ID_HELP_CONTROLS
#define ID_FILE_POSTSCRIPT
#define ID_ETC_ERASE_EVENT
#define ID_ETC_SET_SOLID
#define ID_FILE_ESCAPE
#define ID_FILE_INVENTOR
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define SoGL2PSAction
Definition: SoGL2PSAction.h:40
G4double GetBlue() const
Definition: G4Colour.hh:154
G4double GetRed() const
Definition: G4Colour.hh:152
G4double GetGreen() const
Definition: G4Colour.hh:153
G4String Help(const G4String &topic="controls")
void WriteInventor(const G4String &file="g4out.iv")
void WritePostScript(const G4String &file="g4out.ps")
void Escape()
Menu items callbacks /////////////////////////////////////////////////////.
G4VInteractorManager * fInteractorManager
void WritePixmapPostScript(const G4String &file="g4out.ps")
Geant4_SoGL2PSAction * fGL2PSAction
G4OpenInventorWinViewer(G4OpenInventorSceneHandler &scene, const G4String &name="")
void SetCreatedInteractor(G4Interactor)
virtual void FlushAndWaitExecution()=0
G4Interactor GetParentInteractor()
void RemoveShell(G4Interactor)
void AddShell(G4Interactor)
G4String fName
Definition: G4VViewer.hh:218
G4ViewParameters fVP
Definition: G4VViewer.hh:220
unsigned int GetWindowSizeHintX() const
const G4Colour & GetBackgroundColour() const
unsigned int GetWindowSizeHintY() const
static Verbosity GetVerbosity()
virtual void sizeChanged(const SbVec2s &size)
Geant4_SoWinExaminerViewer(HWND parent, const char *name, SbBool embed)
#define TRUE
Definition: globals.hh:41
#define FALSE
Definition: globals.hh:38