Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 /* 29 * jck 05 Feb 1997 - Initial Implementation 30 * jck 21 Apr 1997 31 * Mods for SoXtHepViewer 32 * gb : on Win32 use an SoXtExaminerViewer. 33 * gb 05 April 2004 : revisit to separate Wind 34 * gb 09 November 2004 : restore the escape bu 35 * gb 09 November 2004 : have a menu bar in th 36 * gb 09 November 2004 : have gl2ps file produ 37 * gb 14 November 2004 : inherit G4OpenInvento 38 */ 39 40 // this : 41 #include "G4OpenInventorXtViewer.hh" 42 43 #include <Inventor/nodes/SoSelection.h> 44 45 #include <Inventor/Xt/SoXt.h> 46 #include <Inventor/Xt/viewers/SoXtExaminerView 47 48 #include <X11/StringDefs.h> 49 #include <X11/Shell.h> 50 51 #include <Xm/Xm.h> 52 #include <Xm/PushB.h> 53 #include <Xm/Form.h> 54 #include <Xm/CascadeB.h> 55 #include <Xm/RowColumn.h> 56 #include <Xm/Text.h> 57 58 #include "HEPVis/actions/SoGL2PSAction.h" 59 60 #include "G4OpenInventor.hh" 61 #include "G4OpenInventorSceneHandler.hh" 62 #include "G4VInteractorManager.hh" 63 #include "G4VisManager.hh" 64 65 G4OpenInventorXtViewer::G4OpenInventorXtViewer 66 G4OpenInventorSceneHandler& sceneHandler 67 ,const G4String& name) 68 :G4OpenInventorViewer (sceneHandler, name) 69 ,fShell(0) 70 ,fViewer(0) 71 ,fHelpForm(0) 72 ,fHelpText(0) 73 { 74 if (G4VisManager::GetVerbosity() >= G4VisMan 75 G4cout << "Window name: " << fName << G4en 76 } 77 78 79 void G4OpenInventorXtViewer::Initialise() { 80 81 G4String wName = fName; 82 83 Widget parent = (Widget)fInteractorManager-> 84 int width = 600; 85 int height = 600; 86 87 if(!parent) { 88 // Check if user has specified an X-Window 89 char str[32]; 90 91 G4String sgeometry = fVP.GetXGeometryStrin 92 if(sgeometry.empty()) { 93 G4cout << "ERROR: Geometry string \"" 94 << sgeometry 95 << "\" is empty. Using \"600x600 96 << G4endl; 97 width = 600; 98 height = 600; 99 snprintf(str,sizeof str,"%dx%d",width,he 100 sgeometry = str; 101 } else { 102 width = fVP.GetWindowSizeHintX(); 103 height = fVP.GetWindowSizeHintX(); 104 } 105 106 //Create a shell window : 107 G4String shellName = wName; 108 shellName += "_shell"; 109 Arg args[10]; 110 XtSetArg(args[0],XtNgeometry,XtNewString(s 111 XtSetArg(args[1],XtNborderWidth,0); 112 XtSetArg(args[2],XtNtitle,XtNewString(wNam 113 fShell = XtAppCreateShell(shellName.c_str( 114 topLevelShellWidgetClass, 115 SoXt::getDisplay(), 116 args,3); 117 118 XtSetArg(args[0],XmNtopAttachment ,XmATT 119 XtSetArg(args[1],XmNleftAttachment ,XmATT 120 XtSetArg(args[2],XmNrightAttachment ,XmATT 121 XtSetArg(args[3],XmNbottomAttachment,XmATT 122 Widget form = XmCreateForm (fShell,(char*) 123 XtManageChild (form); 124 125 XtSetArg(args[0],XmNtopAttachment ,XmATT 126 XtSetArg(args[1],XmNleftAttachment ,XmATT 127 XtSetArg(args[2],XmNrightAttachment ,XmATT 128 Widget menuBar = XmCreateMenuBar (form,(ch 129 XtManageChild(menuBar); 130 131 {Widget menu = AddMenu(menuBar,"File","File 132 AddButton(menu,"PS (gl2ps)",PostScriptCbk) 133 AddButton(menu,"PS (pixmap)",PixmapPostScr 134 AddButton(menu,"IV",WriteInventorCbk); 135 AddButton(menu,"Escape",EscapeCbk);} 136 137 {Widget menu = AddMenu(menuBar,"Etc","Etc") 138 AddButton(menu,"Erase detector",EraseDetec 139 AddButton(menu,"Erase event",EraseEventCbk 140 AddButton(menu,"Set solid",SetSolidCbk); 141 /* AddButton(menu,"Set (G4) wire frame",Set 142 AddButton(menu,"Set (G4) reduced wire fram 143 AddButton(menu,"Set (G4) full wire frame", 144 AddButton(menu,"Visible mothers + invisibl 145 AddButton(menu,"Visible mothers + visible 146 AddButton(menu,"Update scene",UpdateSceneC 147 AddButton(menu,"Scene graph stats",SceneGr 148 } 149 150 {Widget menu = AddMenu(menuBar,"Help","Help 151 AddButton(menu,"Controls",HelpCbk);} 152 153 fViewer = new SoXtExaminerViewer(form,wNam 154 155 XtSetArg(args[0],XmNtopAttachment ,XmATT 156 XtSetArg(args[1],XmNtopWidget ,menuB 157 XtSetArg(args[2],XmNleftAttachment ,XmATT 158 XtSetArg(args[3],XmNrightAttachment ,XmATT 159 XtSetArg(args[4],XmNbottomAttachment,XmATT 160 XtSetValues(fViewer->getWidget(),args,5); 161 162 fHelpForm = XmCreateFormDialog(fShell,(cha 163 XtSetArg(args[0],XmNleftAttachment ,XmATT 164 XtSetArg(args[1],XmNrightAttachment ,XmATT 165 XtSetArg(args[2],XmNbottomAttachment,XmATT 166 Widget cancel = XmCreatePushButton(fHelpFo 167 XtAddCallback(cancel,XmNactivateCallback,H 168 XtManageChild(cancel); 169 XtSetArg(args[0],XmNtopAttachment ,XmATT 170 XtSetArg(args[1],XmNleftAttachment ,XmATT 171 XtSetArg(args[2],XmNrightAttachment ,XmATT 172 XtSetArg(args[3],XmNbottomAttachment,XmATT 173 XtSetArg(args[4],XmNbottomWidget ,cance 174 fHelpText = XmCreateScrolledText(fHelpForm 175 XtManageChild(fHelpText); 176 177 fInteractorManager->AddShell(fShell); 178 179 } else { 180 char* str = fInteractorManager->GetCreatio 181 if(str!=0) wName = str; 182 fViewer = new SoXtExaminerViewer(parent,wN 183 } 184 185 fViewer->setSize(SbVec2s(width,height)); 186 187 // Have a GL2PS render action : 188 const SbViewportRegion& vpRegion = fViewer-> 189 fGL2PSAction = new SoGL2PSAction(vpRegion); 190 fViewer->setGLRenderAction(fGL2PSAction); 191 192 // Else : 193 fViewer->setSceneGraph(fSoSelection); 194 fViewer->viewAll(); 195 fViewer->saveHomePosition(); 196 fViewer->setTitle(fName); 197 fViewer->show(); 198 if(fShell) { 199 SoXt::show(fShell); 200 fInteractorManager->FlushAndWaitExecution 201 } 202 fInteractorManager->SetCreatedInteractor (fV 203 fViewer->setTransparencyType(SoGLRenderActio 204 } 205 206 G4OpenInventorXtViewer::~G4OpenInventorXtViewe 207 if(fShell) fInteractorManager->RemoveShell(f 208 if(fViewer) { 209 fViewer->setSceneGraph(0); 210 //FIXME : SGI : the below "delete" block t 211 //FIXME : CoinXt : the below "delete" cras 212 //FIXME : delete fViewer; 213 } 214 if(fShell) XtDestroyWidget(fShell); 215 } 216 217 void G4OpenInventorXtViewer::FinishView () { 218 if(!fViewer) return; 219 fViewer->viewAll(); 220 fViewer->saveHomePosition(); 221 } 222 223 void G4OpenInventorXtViewer::SetView () { 224 G4OpenInventorViewer::SetView (); 225 if(!fViewer) return; 226 // Background. 227 G4Colour b = fVP.GetBackgroundColour (); 228 fViewer->setBackgroundColor 229 (SbColor((float)b.GetRed(),(float)b.GetGre 230 } 231 232 233 void G4OpenInventorXtViewer::ViewerRender () { 234 if(!fViewer) return; 235 fViewer->render(); 236 } 237 238 SoCamera* G4OpenInventorXtViewer::GetCamera () 239 if(!fViewer) return 0; 240 return fViewer->getCamera(); 241 } 242 243 Widget G4OpenInventorXtViewer::AddMenu( 244 Widget aMenuBar 245 ,const G4String& aName 246 ,const G4String& aLabel 247 ) 248 { 249 // Pulldown menu : 250 Widget menu = XmCreatePulldownMenu(aMenuBar, 251 // Cascade button : 252 Arg args[2]; 253 XmString cps = 254 XmStringLtoRCreate((char*)aLabel.c_str(),( 255 XtSetArg (args[0],XmNlabelString,cps); 256 XtSetArg (args[1],XmNsubMenuId,menu); 257 Widget widget = XmCreateCascadeButton(aMenuB 258 XmStringFree (cps); 259 XtManageChild(widget); 260 return menu; 261 } 262 void G4OpenInventorXtViewer::AddButton ( 263 Widget aMenu 264 ,const G4String& aLabel 265 ,XtCallbackProc aCallback 266 ) 267 { 268 Widget widget = XmCreatePushButton(aMenu,(ch 269 XtManageChild(widget); 270 XtAddCallback(widget,XmNactivateCallback,aCa 271 } 272 273 void G4OpenInventorXtViewer::HelpCancelCbk( 274 Widget,XtPointer aData,XtPointer) { 275 G4OpenInventorXtViewer* This = (G4OpenInvent 276 XtUnmanageChild(This->fHelpForm); 277 } 278 279 280 ////////////////////////////////////////////// 281 ////////////////////////////////////////////// 282 ////////////////////////////////////////////// 283 284 void G4OpenInventorXtViewer::EscapeCbk( 285 Widget,XtPointer aData,XtPointer) { 286 G4OpenInventorXtViewer* This = (G4OpenInvent 287 This->Escape(); 288 } 289 290 void G4OpenInventorXtViewer::PostScriptCbk( 291 Widget,XtPointer aData,XtPointer) { 292 G4OpenInventorXtViewer* This = (G4OpenInvent 293 This->WritePostScript(); 294 } 295 296 void G4OpenInventorXtViewer::PixmapPostScriptC 297 Widget,XtPointer aData,XtPointer) { 298 G4OpenInventorXtViewer* This = (G4OpenInvent 299 This->WritePixmapPostScript(); 300 } 301 302 void G4OpenInventorXtViewer::SceneGraphStatist 303 Widget,XtPointer aData,XtPointer) { 304 G4OpenInventorXtViewer* This = (G4OpenInvent 305 This->SceneGraphStatistics(); 306 } 307 308 void G4OpenInventorXtViewer::WriteInventorCbk( 309 Widget,XtPointer aData,XtPointer) { 310 G4OpenInventorXtViewer* This = (G4OpenInvent 311 This->WriteInventor(); 312 } 313 314 void G4OpenInventorXtViewer::EraseDetectorCbk( 315 Widget,XtPointer aData,XtPointer) { 316 G4OpenInventorXtViewer* This = (G4OpenInvent 317 This->EraseDetector(); 318 } 319 320 void G4OpenInventorXtViewer::EraseEventCbk( 321 Widget,XtPointer aData,XtPointer) { 322 G4OpenInventorXtViewer* This = (G4OpenInvent 323 This->EraseEvent(); 324 } 325 326 void G4OpenInventorXtViewer::SetSolidCbk( 327 Widget,XtPointer aData,XtPointer) { 328 G4OpenInventorXtViewer* This = (G4OpenInvent 329 This->SetSolid(); 330 } 331 332 void G4OpenInventorXtViewer::SetWireFrameCbk( 333 Widget,XtPointer aData,XtPointer) { 334 G4OpenInventorXtViewer* This = (G4OpenInvent 335 This->SetWireFrame(); 336 } 337 338 void G4OpenInventorXtViewer::SetReducedWireFra 339 Widget,XtPointer aData,XtPointer) { 340 G4OpenInventorXtViewer* This = (G4OpenInvent 341 This->SetReducedWireFrame(true); 342 } 343 344 void G4OpenInventorXtViewer::SetFullWireFrameC 345 Widget,XtPointer aData,XtPointer) { 346 G4OpenInventorXtViewer* This = (G4OpenInvent 347 This->SetReducedWireFrame(false); 348 } 349 350 void G4OpenInventorXtViewer::UpdateSceneCbk( 351 Widget,XtPointer aData,XtPointer) { 352 G4OpenInventorXtViewer* This = (G4OpenInvent 353 This->UpdateScene(); 354 } 355 356 void G4OpenInventorXtViewer::SetPreviewCbk( 357 Widget,XtPointer aData,XtPointer) { 358 G4OpenInventorXtViewer* This = (G4OpenInvent 359 This->SetPreview(); 360 } 361 362 void G4OpenInventorXtViewer::SetPreviewAndFull 363 Widget,XtPointer aData,XtPointer) { 364 G4OpenInventorXtViewer* This = (G4OpenInvent 365 This->SetPreviewAndFull(); 366 } 367 368 void G4OpenInventorXtViewer::HelpCbk( 369 Widget,XtPointer aData,XtPointer) { 370 G4OpenInventorXtViewer* This = (G4OpenInvent 371 XtManageChild(This->fHelpForm); 372 XmTextSetString(This->fHelpText,(char*)This- 373 } 374