Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 26 27 // Frederick Jones TRIUMF 07 January 2018 27 // Frederick Jones TRIUMF 07 January 2018 28 28 29 #include "G4OpenInventorQtExaminerViewer.hh" << 29 #ifdef G4VIS_BUILD_OIQT_DRIVER 30 << 31 #include "ui_OIQtListsDialog.h" << 32 30 33 #include "saveViewPt.h" << 31 #include "G4OpenInventorQtExaminerViewer.hh" 34 #include "pickext.h" << 35 #include "pickref.h" << 36 #include "wireframe.h" << 37 << 38 #include <algorithm> // For using sort on a ve << 39 32 40 #include "G4ios.hh" 33 #include "G4ios.hh" 41 #include "G4UImanager.hh" << 42 #include "G4UIQt.hh" << 43 34 44 #include <Inventor/Qt/SoQt.h> 35 #include <Inventor/Qt/SoQt.h> 45 #include <Inventor/Qt/SoQtCursor.h> << 46 #include <Inventor/events/SoKeyboardEvent.h> 36 #include <Inventor/events/SoKeyboardEvent.h> 47 #include <Inventor/events/SoMouseButtonEvent.h << 48 #include <Inventor/events/SoLocation2Event.h> << 49 #include <Inventor/nodes/SoSeparator.h> << 50 #include <Inventor/nodes/SoOrthographicCamera. << 51 #include <Inventor/nodes/SoPerspectiveCamera.h << 52 << 53 // FWJ moved to header file << 54 //#include <Inventor/nodes/SoEventCallback.h> << 55 #include <Inventor/nodes/SoLineSet.h> << 56 #include <Inventor/nodes/SoMaterial.h> << 57 #include <Inventor/errors/SoDebugError.h> << 58 #include <Inventor/SoPickedPoint.h> << 59 #include <Inventor/actions/SoWriteAction.h> << 60 #include <Inventor/projectors/SbPlaneProjector << 61 << 62 #include <Inventor/sensors/SoTimerSensor.h> << 63 #include <Inventor/sensors/SoNodeSensor.h> << 64 << 65 #include "Geant4_SoPolyhedron.h" << 66 #include "G4TrajectoryPoint.hh" << 67 #include "G4AttHolder.hh" << 68 #include "G4AttCheck.hh" << 69 #if 0x060000 <= QT_VERSION << 70 #include "G4StateManager.hh" << 71 #endif << 72 37 73 #include <Inventor/nodes/SoCallback.h> << 74 #include <Inventor/nodes/SoSwitch.h> << 75 #include <Inventor/nodes/SoScale.h> << 76 #include <Inventor/nodes/SoTranslation.h> << 77 #include <Inventor/actions/SoSearchAction.h> << 78 #include <Inventor/actions/SoGetBoundingBoxAct << 79 38 80 #include <Inventor/nodes/SoCoordinate3.h> << 81 // For rendering distance during animation: << 82 #include <Inventor/nodes/SoText2.h> << 83 #include <Inventor/nodes/SoFont.h> << 84 #include <Inventor/nodes/SoPointSet.h> << 85 #include <Inventor/nodes/SoDrawStyle.h> << 86 #include <Inventor/nodes/SoBaseColor.h> << 87 << 88 // For searching for nodes within kits: << 89 #include <Inventor/nodekits/SoBaseKit.h> << 90 << 91 #include <QMenuBar> << 92 #include <QPushButton> << 93 #include <QRadioButton> << 94 #include <QToolButton> << 95 #include <QListWidget> << 96 #include <QListWidgetItem> << 97 #include <QInputDialog> << 98 #include <QMessageBox> << 99 #include <QFileDialog> << 100 #include <QStyle> << 101 #include <QCommonStyle> << 102 //#include <QMainWindow> << 103 << 104 #ifndef G4GMAKE << 105 #include "moc_G4OpenInventorQtExaminerViewer.c << 106 #endif << 107 << 108 #define G4warn G4cout << 109 << 110 #if QT_VERSION < 0x060000 << 111 G4OpenInventorQtExaminerViewer* G4OpenInventor 39 G4OpenInventorQtExaminerViewer* G4OpenInventorQtExaminerViewer::viewer = 0; 112 #endif << 113 << 114 #define MIN_SPEED 2.1 // Lower number << 115 #define START_STEP 0.3 << 116 #define SPEED_INDICATOR_STEP 0.045 << 117 #define MAX_SPEED_INDICATOR 0.81 << 118 // Number of steps 90 degree rotation around a << 119 #define ROT_CNT 6 << 120 40 121 41 122 // Constructor 42 // Constructor 123 G4OpenInventorQtExaminerViewer:: 43 G4OpenInventorQtExaminerViewer:: 124 G4OpenInventorQtExaminerViewer(QWidget* parent 44 G4OpenInventorQtExaminerViewer(QWidget* parent, const char* name, SbBool embed, 125 SoQtFullViewer: << 45 SoQtFullViewer::BuildFlag flag, 126 SoQtViewer::Typ 46 SoQtViewer::Type type) 127 : SoQtExaminerViewer(parent, name, embed, f << 47 : SoQtExaminerViewer(parent, name, embed, flag, type) 128 #if 0x060000 <= QT_VERSION << 129 fName(name), << 130 #endif << 131 externalQtApp(0), processSoEventCount(0) << 132 { 48 { 133 // FWJ DEBUG << 49 G4cout << "G4OpenInventorQtExaminerViewer CONSTRUCTOR CALLED" << G4endl; 134 // G4cout << "G4OpenInventorQtExaminerView << 135 // G4cout << "G4OpenInventorQtExaminerView << 136 << 137 // FWJ THIS DOESN'T WORK APPARENTLY NO MAIN << 138 // QMenuBar* menubar = ((QMainWindow*)par << 139 << 140 #if QT_VERSION < 0x060000 << 141 fName = new QString(name); << 142 viewer = this; 50 viewer = this; 143 #endif << 144 construct(TRUE); << 145 } 51 } 146 52 147 // Destructor 53 // Destructor 148 G4OpenInventorQtExaminerViewer::~G4OpenInvento 54 G4OpenInventorQtExaminerViewer::~G4OpenInventorQtExaminerViewer() 149 { 55 { 150 // if (superimposition != NULL) { 56 // if (superimposition != NULL) { 151 // removeSuperimposition(superimpositi 57 // removeSuperimposition(superimposition); 152 // superimposition->unref(); 58 // superimposition->unref(); 153 // superimposition = NULL; 59 // superimposition = NULL; 154 // } 60 // } 155 // if (animateSensor->isScheduled()) 61 // if (animateSensor->isScheduled()) 156 // animateSensor->unschedule(); 62 // animateSensor->unschedule(); 157 // delete animateSensor; 63 // delete animateSensor; 158 // delete sceneChangeSensor; 64 // delete sceneChangeSensor; >> 65 // 159 // delete[] curViewPtName; 66 // delete[] curViewPtName; 160 // delete searcher; 67 // delete searcher; 161 68 162 #if QT_VERSION < 0x060000 << 163 viewer = 0; 69 viewer = 0; 164 #else << 165 delete hookBeamOn; << 166 #endif << 167 } << 168 << 169 << 170 void G4OpenInventorQtExaminerViewer::construct << 171 { << 172 setFeedbackSize(40); << 173 << 174 hookBeamOn = new HookEventProcState(this); << 175 newEvents = false; << 176 << 177 buildWidget(getParentWidget()); << 178 << 179 fileName = "bookmarkFile"; // Default viewp << 180 viewPtIdx = -1; // index of the most recent << 181 << 182 animateSensor = new SoTimerSensor(animateSe << 183 animateSensorRotation = new SoTimerSensor(a << 184 animateBtwPtsPeriod = MIN_SPEED; << 185 << 186 currentState = GENERAL; << 187 myCam = new SoPerspectiveCamera; << 188 MAX_VP_IDX = 3; << 189 MAX_VP_NAME = 35; // Max length of a viewpo << 190 #if QT_VERSION < 0x060000 << 191 curViewPtName = new char[MAX_VP_NAME + 1]; << 192 #else << 193 curViewPtName.clear(); << 194 #endif << 195 left_right = up_down = 0; // For movements << 196 speedStep = START_STEP; // For smoother ani << 197 rotUpVec = false; // Used during scene elem << 198 step = 1; //By default << 199 // Used for moving along the beam with the << 200 // mouse instead of rotating the view << 201 lshiftdown = rshiftdown = false; << 202 // Used for rotating the view with the came << 203 // staying in place << 204 lctrldown = rctrldown = false; << 205 // Used to send abbreviated output to the c << 206 abbrOutputFlag = false; << 207 pickRefPathFlag = false; << 208 prevColorField = NULL; << 209 // warningFlag = false; // We come from t << 210 // myElementList = NULL; << 211 // FWJ default path look-ahead << 212 pathLookahead = 5; << 213 << 214 newSceneGraph = NULL; << 215 zcoordSetFlag = false; << 216 << 217 //////////////////////////SUPERIMPOSED SCEN << 218 searcher = NULL; << 219 // Used in animation; progressively scaled << 220 maxSpeed = 0.0f; << 221 << 222 static const char * superimposed[] = { << 223 "#Inventor V2.1 ascii", "", << 224 "Separator ", << 225 "{", << 226 " MaterialBinding ", << 227 " {", << 228 " value OVERALL", << 229 " }", << 230 " OrthographicCamera ", << 231 " {", << 232 " height 1", << 233 " nearDistance 0", << 234 " farDistance 1", << 235 " }", << 236 " DEF soxt->callback Callback { << 237 " Separator ", << 238 " {", << 239 " DEF soxt->translation Translat << 240 " {", << 241 " translation 0 0 0", << 242 " }", << 243 " DEF soxt->scale Scale ", << 244 " {", << 245 " scaleFactor 1 1 1", << 246 " }", << 247 " DEF soxt->geometry Coordinate3 << 248 " {", << 249 " point ", << 250 " [", << 251 " -0.81 -0.04 << 252 " -0.81 0.04 0, << 253 " 0 0 0, 0 << 254 " 0.81 -0.04 0, 0. << 255 " 0.81 0.04 0,", << 256 " 0 0.02 0,", / << 257 " 0.81 0.02 0, 0. << 258 " 0 -0.02 0,", << 259 " 0 0.01 0,", / << 260 " 0.4 0.01 0, 0. << 261 " 0 -0.01 0", << 262 " ]", << 263 " }", << 264 // current speed indicator (outline) << 265 " DEF soxt->animSpeedOutlineSwit << 266 " {", << 267 " whichChild -3", << 268 " Material ", << 269 " {", << 270 " emissiveColor 0 0 0 << 271 " }", << 272 " IndexedFaceSet ", << 273 " {", << 274 " coordIndex ", << 275 " [", << 276 " 12, 11 << 277 " ]", << 278 " }", << 279 " }", << 280 // the coordinate system << 281 " DEF soxt->axisSwitch Switch ", << 282 " {", << 283 " whichChild -3", << 284 " BaseColor ", << 285 " {", << 286 " rgb 1 1 1", << 287 " }", << 288 " IndexedLineSet ", << 289 " {", << 290 " coordIndex ", << 291 " [", << 292 " 0, 2, << 293 " 3, 5, << 294 " 6, 8, << 295 " 1, 7, << 296 " ]", << 297 " }", << 298 " }", << 299 // current speed indicator << 300 " DEF soxt->animSpeedSwitch Swit << 301 " {", << 302 " whichChild -3", << 303 " Material ", << 304 " {", << 305 " emissiveColor 0 1 0", << 306 " }", << 307 " IndexedFaceSet ", << 308 " {", << 309 " coordIndex ", << 310 " [", << 311 " 16, 15 << 312 " ]", << 313 " }", << 314 " }", << 315 " }", << 316 // For displaying either z position (dur << 317 " DEF soxt->curInfoSwitch Switch ", << 318 " {", << 319 " whichChild -3", << 320 " DEF soxt->curInfoTrans Transla << 321 " {", << 322 " translation 0 0 0 " << 323 // " translation 10 << 324 " }", << 325 " DEF soxt->curInfoFont Font ", << 326 " {", << 327 " name defaultFont:Bold" << 328 " size 16", << 329 " }", << 330 " DEF soxt->curInfoText Text2 ", << 331 " {", << 332 " string Hello", << 333 " }", << 334 " }", << 335 // Need to use different fields for mous << 336 // because newlines are ignored when the << 337 " Separator ", << 338 " {", << 339 " DEF soxt->mouseOverTransLogNam << 340 " {", << 341 " translation 0 0 0 " << 342 " }", << 343 " DEF soxt->mouseOverFontLogName << 344 " {", << 345 " name defaultFont:Bold" << 346 " size 16", << 347 " }", << 348 " DEF soxt->mouseOverTextLogName << 349 " }", << 350 " Separator ", << 351 " {", << 352 " DEF soxt->mouseOverTransSolid << 353 " {", << 354 " translation 0 0 0 " << 355 " }", << 356 " DEF soxt->mouseOverFontSolid F << 357 " {", << 358 " name defaultFont:Bold" << 359 " size 16", << 360 " }", << 361 " DEF soxt->mouseOverTextSolid T << 362 " }", << 363 " Separator ", << 364 " {", << 365 " DEF soxt->mouseOverTransMateri << 366 " {", << 367 " translation 0 0 0 " << 368 " }", << 369 " DEF soxt->mouseOverFontMateria << 370 " {", << 371 " name defaultFont:Bold" << 372 " size 16", << 373 " }", << 374 " DEF soxt->mouseOverTextMateria << 375 " }", << 376 " Separator ", << 377 " {", << 378 " DEF soxt->mouseOverTransZPos T << 379 " {", << 380 " translation 0 0 0 " << 381 " }", << 382 " DEF soxt->mouseOverFontZPos Fo << 383 " {", << 384 " name defaultFont:Bold" << 385 " size 16", << 386 " }", << 387 " DEF soxt->mouseOverTextZPos Te << 388 " }", << 389 "}", NULL << 390 }; << 391 << 392 int i, bufsize; << 393 for (i = bufsize = 0; superimposed[i]; i++) << 394 bufsize += strlen(superimposed[i]) + 1; << 395 char * buf = new char[bufsize + 1]; << 396 for (i = bufsize = 0; superimposed[i]; i++) << 397 strcpy(buf + bufsize, superimposed[i]); << 398 bufsize += strlen(superimposed[i]); << 399 buf[bufsize] = '\n'; << 400 bufsize++; << 401 } << 402 SoInput * input = new SoInput; << 403 input->setBuffer(buf, bufsize); << 404 SbBool ok = SoDB::read(input, superimpositi << 405 (void)ok; // FWJ added to avoid compiler << 406 assert(ok); << 407 delete input; << 408 delete[] buf; << 409 superimposition->ref(); << 410 << 411 sscale = (SoScale *) getSuperimpositionNode << 412 stranslation = (SoTranslation *) getSuperim << 413 sgeometry = (SoCoordinate3 *) getSuperimpos << 414 axisSwitch = (SoSwitch *) getSuperimpositio << 415 animSpeedOutlineSwitch = (SoSwitch *) getSu << 416 animSpeedSwitch = (SoSwitch *) getSuperimpo << 417 curInfoSwitch = (SoSwitch *) getSuperimposi << 418 curInfoTrans = (SoTranslation *) getSuperim << 419 curInfoFont = (SoFont *) getSuperimposition << 420 curInfoText = (SoText2 *) getSuperimpositio << 421 mouseOverTransLogName = (SoTranslation*)get << 422 mouseOverFontLogName = (SoFont *) getSuperi << 423 mouseOverTextLogName = (SoText2 *) getSuper << 424 mouseOverTransSolid = (SoTranslation *) get << 425 mouseOverFontSolid = (SoFont *) getSuperimp << 426 mouseOverTextSolid = (SoText2 *) getSuperim << 427 mouseOverTransMaterial = (SoTranslation*)ge << 428 mouseOverFontMaterial = (SoFont *) getSuper << 429 mouseOverTextMaterial = (SoText2 *) getSupe << 430 mouseOverTransZPos = (SoTranslation *) getS << 431 mouseOverFontZPos = (SoFont *) getSuperimpo << 432 mouseOverTextZPos = (SoText2 *) getSuperimp << 433 << 434 SoCallback * cb = (SoCallback *) getSuperim << 435 cb->setCallback(superimpositionCB, this); << 436 << 437 addSuperimposition(superimposition); << 438 setSuperimpositionEnabled(superimposition, << 439 axisSwitch->whichChild.setValue(SO_SWITCH_N << 440 animSpeedOutlineSwitch->whichChild.setValue << 441 animSpeedSwitch->whichChild.setValue(SO_SWI << 442 << 443 /////////////////////\SUPERIMPOSED SCENE/// << 444 << 445 } << 446 << 447 << 448 // Adds a menu bar and menu items to the viewe << 449 void G4OpenInventorQtExaminerViewer::buildWidg << 450 { << 451 if (!parent) << 452 SoDebugError::post("G4OpenInventorQtExam << 453 "Error: Parent is nul << 454 << 455 // Common font for (almost) all widgets << 456 font = new QFont; << 457 font->setPointSize(12); << 458 // This font setting does not propagate to << 459 parent->setFont(*font); << 460 // This propagates everywhere but would aff << 461 // QApplication::setFont(*font); << 462 << 463 // MENU BAR << 464 << 465 #if QT_VERSION < 0x060000 << 466 menubar = new QMenuBar(getRenderAreaWidget( << 467 #else << 468 menubar = new QMenuBar(); << 469 menubar->setNativeMenuBar(false); << 470 addAppPushButton(menubar); << 471 #endif << 472 // FWJ DEBUG << 473 // G4cout << "G4OpenInventorQtExaminerVie << 474 // menubar << G4endl; << 475 << 476 filemenu = new QMenu("File"); << 477 menubar->addMenu(filemenu); << 478 << 479 FileOpenBookmark = new QAction("Open Bookma << 480 FileOpenBookmark->setFont(*font); << 481 connect(FileOpenBookmark, SIGNAL(triggered( << 482 SLOT(FileOpenBookmarkCB())); << 483 filemenu->addAction(FileOpenBookmark); << 484 << 485 FileNewBookmark = new QAction("New Bookmark << 486 FileNewBookmark->setFont(*font); << 487 connect(FileNewBookmark, SIGNAL(triggered() << 488 SLOT(FileNewBookmarkCB())); << 489 filemenu->addAction(FileNewBookmark); << 490 << 491 FileLoadRefPath = new QAction("Load Referen << 492 FileLoadRefPath->setFont(*font); << 493 connect(FileLoadRefPath, SIGNAL(triggered() << 494 SLOT(FileLoadRefPathCB())); << 495 filemenu->addAction(FileLoadRefPath); << 496 << 497 FileSaveRefPath = new QAction("Save Referen << 498 FileSaveRefPath->setFont(*font); << 499 connect(FileSaveRefPath, SIGNAL(triggered() << 500 SLOT(FileSaveRefPathCB())); << 501 filemenu->addAction(FileSaveRefPath); << 502 << 503 FileLoadSceneGraph = new QAction("Load scen << 504 FileLoadSceneGraph->setFont(*font); << 505 connect(FileLoadSceneGraph, SIGNAL(triggere << 506 SLOT(FileLoadSceneGraphCB())); << 507 filemenu->addAction(FileLoadSceneGraph); << 508 << 509 FileSaveSceneGraph = new QAction("Save scen << 510 FileSaveSceneGraph->setFont(*font); << 511 connect(FileSaveSceneGraph, SIGNAL(triggere << 512 SLOT(FileSaveSceneGraphCB())); << 513 filemenu->addAction(FileSaveSceneGraph); << 514 << 515 // Rest of File menu is done in G4OpenInven << 516 << 517 toolsmenu = new QMenu("Tools"); << 518 menubar->addMenu(toolsmenu); << 519 << 520 ToolsAnimateRefParticle = new QAction("Fly << 521 ToolsAnimateRefParticle->setFont(*font); << 522 connect(ToolsAnimateRefParticle, SIGNAL(tri << 523 SLOT(ToolsAnimateRefParticleCB())); << 524 toolsmenu->addAction(ToolsAnimateRefParticl << 525 << 526 ToolsRefPathStart = new QAction("Go to star << 527 ToolsRefPathStart->setFont(*font); << 528 connect(ToolsRefPathStart, SIGNAL(triggered << 529 SLOT(ToolsRefPathStartCB())); << 530 toolsmenu->addAction(ToolsRefPathStart); << 531 << 532 ToolsRefPathInvert = new QAction("Invert Re << 533 ToolsRefPathInvert->setFont(*font); << 534 connect(ToolsRefPathInvert, SIGNAL(triggere << 535 SLOT(ToolsRefPathInvertCB())); << 536 toolsmenu->addAction(ToolsRefPathInvert); << 537 << 538 etcmenu = new QMenu("Etc"); << 539 menubar->addMenu(etcmenu); << 540 << 541 // All Etc menu items are done in G4OpenInv << 542 << 543 helpmenu = new QMenu("Help"); << 544 menubar->addMenu(helpmenu); << 545 << 546 HelpControls = new QAction("Controls", this << 547 HelpControls->setFont(*font); << 548 connect(HelpControls, SIGNAL(triggered()), << 549 helpmenu->addAction(HelpControls); << 550 << 551 #if QT_VERSION < 0x060000 << 552 menubar->show(); << 553 #endif << 554 << 555 // SoQtExaminerViewer::buildWidget(parent << 556 << 557 // APP VIEWER BUTTONS have their own box on << 558 // The built in viewer button list is PRIVA << 559 << 560 saveViewPtButton = new QPushButton; << 561 saveViewPtButton->setIcon(QPixmap((const ch << 562 saveViewPtButton->setIconSize(QSize(24,24)) << 563 saveViewPtButton->setToolTip("Bookmark this << 564 connect(saveViewPtButton, SIGNAL(clicked()) << 565 SLOT(SaveViewPtCB())); << 566 addAppPushButton(saveViewPtButton); << 567 << 568 nextViewPtButton = new QPushButton; << 569 nextViewPtButton->setIconSize(QSize(24,24)) << 570 QCommonStyle style; << 571 nextViewPtButton->setIcon(style.standardIco << 572 nextViewPtButton->setToolTip("Next bookmark << 573 connect(nextViewPtButton, SIGNAL(clicked()) << 574 SLOT(NextViewPtCB())); << 575 addAppPushButton(nextViewPtButton); << 576 << 577 prevViewPtButton = new QPushButton; << 578 prevViewPtButton->setIconSize(QSize(24,24)) << 579 prevViewPtButton->setIcon(style.standardIco << 580 prevViewPtButton->setToolTip("Previous book << 581 connect(prevViewPtButton, SIGNAL(clicked()) << 582 SLOT(PrevViewPtCB())); << 583 addAppPushButton(prevViewPtButton); << 584 << 585 abbrOutputButton = new QPushButton; << 586 abbrOutputButton->setCheckable(true); << 587 abbrOutputButton->setIconSize(QSize(24,24)) << 588 abbrOutputButton->setIcon(QPixmap((const ch << 589 abbrOutputButton->setToolTip("Extended pick << 590 connect(abbrOutputButton, SIGNAL(toggled(bo << 591 SLOT(AbbrOutputCB(bool))); << 592 addAppPushButton(abbrOutputButton); << 593 << 594 pickRefPathButton = new QPushButton; << 595 pickRefPathButton->setIconSize(QSize(24,24) << 596 pickRefPathButton->setIcon(QPixmap((const c << 597 pickRefPathButton->setToolTip("Pick ref tra << 598 connect(pickRefPathButton, SIGNAL(clicked() << 599 SLOT(PickRefPathCB())); << 600 addAppPushButton(pickRefPathButton); << 601 << 602 switchWireFrameButton = new QPushButton; << 603 switchWireFrameButton->setCheckable(true); << 604 switchWireFrameButton->setIconSize(QSize(24 << 605 switchWireFrameButton->setIcon(QPixmap((con << 606 switchWireFrameButton->setToolTip("Switch w << 607 connect(switchWireFrameButton, SIGNAL(toggl << 608 SLOT(SwitchWireFrameCB(bool))); << 609 addAppPushButton(switchWireFrameButton); << 610 << 611 switchAxesButton = new QPushButton; << 612 switchAxesButton->setCheckable(true); << 613 switchAxesButton->setText(QString("A")); << 614 switchAxesButton->setToolTip("Axes on/off") << 615 connect(switchAxesButton, SIGNAL(toggled(bo << 616 SLOT(SwitchAxesCB(bool))); << 617 addAppPushButton(switchAxesButton); << 618 << 619 detachButton = new QPushButton; << 620 detachButton->setIconSize(QSize(24,24)); << 621 detachButton->setIcon(style.standardIcon(QS << 622 detachButton->setToolTip("Detach viewer win << 623 connect(detachButton, SIGNAL(clicked()), th << 624 SLOT(DetachCB())); << 625 // Used for UIQt only so check and add late << 626 // addAppPushButton(detachButton); << 627 << 628 // HELP WINDOW << 629 << 630 helpmsgbox = new QMessageBox(getParentWidge << 631 helpmsgbox->setWindowTitle("OIQt Controls") << 632 helpmsgbox->setFont(*font); << 633 QString messagetxt = << 634 "\nVIEWING mode (Hand cursor):\n\n\ << 635 Left-button + pointer move: rotate\n\ << 636 Shift+Left-button + pointer move: pan\n\ << 637 Middle-button + pointer move: pan\n\ << 638 Ctrl+Shift+Left-button + pointer move: zoo << 639 Mouse wheel: zoom\n\ << 640 Right-button: popup menu\n\n\ << 641 PICKING mode (Arrow cursor):\n\n\ << 642 Click on a volume: geometry readout\n\ << 643 Click on a trajectory: particle & trajecto << 644 Ctrl + click on a volume: see daughters.\n << 645 Shift + click on a volume: see mother.\n\n << 646 EXTENDED PICKING mode (Arrow+ viewer button):\ << 647 Hover the mouse over a volume or trajectory << 648 overlayed readout.\n\n\ << 649 ELEMENT NAVIGATION (requires Reference Path):\ << 650 Click on element in list: centers view on << 651 Arrow keys: rotate in 90 degree steps arou << 652 Shift + Right Arrow: move to next element\ << 653 Shift + Left Arrow: move to previous eleme << 654 FLY mode (requires Reference Path):\n\n\ << 655 Page Up: Increase speed\n\ << 656 Page Down: Decrease speed (& reverse if wa << 657 Up Arrow: raise camera above path\n\ << 658 Down Arror: lower camera below path\n\ << 659 Escape: Exit fly mode"; << 660 helpmsgbox->setText(messagetxt); << 661 helpmsgbox->setModal(false); << 662 // helpmsgbox->setWindowModality(Qt::NonM << 663 << 664 // AUXILIARY LISTS WINDOW << 665 << 666 // Bypass the namespace in order to make a << 667 AuxWindowDialog = new Ui_Dialog; << 668 AuxWindow = new QDialog(parent); << 669 AuxWindowDialog->setupUi(AuxWindow); << 670 << 671 // SIGNALS << 672 connect(AuxWindowDialog->listWidget, SIGNAL << 673 this, SLOT(LoadBookmarkCB(QListWidg << 674 connect(AuxWindowDialog->listWidget1, SIGNA << 675 this, SLOT(LookAtSceneElementCB(QLi << 676 connect(AuxWindowDialog->pushButton_2, SIGN << 677 this, SLOT(DeleteBookmarkCB())); << 678 connect(AuxWindowDialog->pushButton_3, SIGN << 679 this, SLOT(RenameBookmarkCB())); << 680 connect(AuxWindowDialog->pushButton, SIGNAL << 681 this, SLOT(SortBookmarksCB())); << 682 << 683 // FWJ Better to do this after viewer windo << 684 // AuxWindow->show(); << 685 // AuxWindow->raise(); << 686 // AuxWindow->activateWindow(); << 687 } << 688 << 689 << 690 #if QT_VERSION < 0x060000 << 691 // Called right after buttons and widgets get << 692 // It sets the viewpoint last accessed. << 693 void G4OpenInventorQtExaminerViewer::afterReal << 694 { << 695 SoQtExaminerViewer::afterRealizeHook(); << 696 #else << 697 void G4OpenInventorQtExaminerViewer::setupScen << 698 { << 699 #endif << 700 // Default height is used when selecting an << 701 // FWJ Added defaultHeight for Ortho camera << 702 SoCamera *cam = getCamera(); << 703 if (cam) { << 704 if (cam->isOfType(SoPerspectiveCamera::g << 705 defaultHeightAngle = << 706 ((SoPerspectiveCamera *) cam)->hei << 707 toggleCameraType(); << 708 defaultHeight = << 709 ((SoOrthographicCamera *) cam)->he << 710 toggleCameraType(); << 711 } else { << 712 defaultHeight = << 713 ((SoOrthographicCamera *) cam)->he << 714 toggleCameraType(); << 715 cam = getCamera(); << 716 if (cam->isOfType(SoPerspectiveCamera << 717 defaultHeightAngle = << 718 ((SoPerspectiveCamera *) cam)-> << 719 toggleCameraType(); << 720 } << 721 } << 722 << 723 // Open the default bookmark file << 724 fileIn.open(fileName.c_str()); << 725 if (!fileIn.fail()) { << 726 if (!loadViewPts()) { << 727 QMessageBox msgbox; << 728 msgbox.setFont(*font); << 729 QString messagetxt = "Error reading b << 730 messagetxt.append(QString(fileName.c_ << 731 msgbox.setText(messagetxt); << 732 msgbox.exec(); << 733 } else { << 734 // Opens a file without erasing it << 735 fileOut.open(fileName.c_str(), std::i << 736 fileOut.seekp(0, std::ios::end); // F << 737 // FWJ DEBUG << 738 // G4cout << "afterRealizeHook: opene << 739 // << G4endl; << 740 if (viewPtList.size()) { << 741 // FWJ disabled auto-selection of << 742 // Initial view should be user-con << 743 // setViewPt(); << 744 addViewPoints(); << 745 } << 746 } << 747 fileIn.close(); << 748 } else { << 749 // Creates a new default bookmark file << 750 fileOut.open(fileName.c_str()); << 751 // FWJ DEBUG << 752 // G4cout << "afterRealizeHook: Opened a << 753 } << 754 << 755 fileIn.clear(); << 756 << 757 SoSeparator* root = (SoSeparator*) (getScen << 758 if (root == NULL) << 759 SoDebugError::post("G4OpenInventorQtExam << 760 else { << 761 root->addChild(myCam); // For position/o << 762 } << 763 << 764 #if 0x060000 <= QT_VERSION << 765 if(root!=nullptr) { << 766 #endif << 767 sceneChangeSensor = new SoNodeSensor; << 768 sceneChangeSensor->setFunction(sceneChangeC << 769 sceneChangeSensor->attach(root); << 770 sceneChangeSensor->setData(this); << 771 << 772 ///////////////////////////// MOUSEOVER & P << 773 << 774 // Monitor mouseover events for displaying << 775 // An SoEventCallback is needed instead of << 776 // because that last one does not provide u << 777 // that was picked << 778 SoEventCallback *moCB = new SoEventCallback << 779 moCB->addEventCallback( << 780 SoLocation2Event::ge << 781 mouseoverCB, static_ << 782 root->addChild(moCB); << 783 << 784 // Override the default picking mechanism p << 785 // because we want abbreviated output when << 786 SoEventCallback *pickCB = new SoEventCallba << 787 pickCB->addEventCallback( << 788 SoMouseButtonEvent << 789 pickingCB, static_ << 790 root->addChild(pickCB); << 791 #if 0x060000 <= QT_VERSION << 792 } << 793 #endif << 794 << 795 ///////////////////////////// MOUSEOVER & P << 796 << 797 #if QT_VERSION < 0x060000 << 798 AuxWindow->show(); << 799 AuxWindow->raise(); << 800 AuxWindow->activateWindow(); << 801 << 802 auto UI = G4UImanager::GetUIpointer(); << 803 uiQt = dynamic_cast<G4UIQt*>(UI->GetG4UIWin << 804 // This explicitly sets the TabWidget as pa << 805 if (uiQt) { << 806 viewerParent = getParentWidget(); << 807 viewerParent2 = viewerParent->parentWidg << 808 uiQt->AddTabWidget(getParentWidget(), *f << 809 uiQtTabIndex = uiQt->GetViewerTabWidget( << 810 // attached = TRUE; << 811 addAppPushButton(detachButton); << 812 } << 813 #else << 814 //G.Barrand: map the AuxWindow "at need", i << 815 // Having one appearing for each << 816 // Also, if "closing" the AuxWind << 817 // way to map it again. Moreover, << 818 // it inactivates the Apple menu << 819 // AuxWindow per viewer, why not << 820 // tab widget? It will go toward << 821 #endif << 822 } << 823 << 824 #if 0x060000 <= QT_VERSION << 825 void G4OpenInventorQtExaminerViewer::addInTab( << 826 auto UI = G4UImanager::GetUIpointer(); << 827 uiQt = dynamic_cast<G4UIQt*>(UI->GetG4UIWind << 828 if(uiQt) { << 829 uiQt->AddTabWidget(getParentWidget(),fName << 830 addAppPushButton(detachButton); << 831 } << 832 } << 833 #endif << 834 << 835 // This method locates a named node in the sup << 836 // FWJ RENAME THIS << 837 SoNode* << 838 G4OpenInventorQtExaminerViewer::getSuperimposi << 839 << 840 { << 841 if (!searcher) << 842 searcher = new SoSearchAction; << 843 searcher->reset(); << 844 searcher->setName(SbName(name)); << 845 searcher->setInterest(SoSearchAction::FIRST << 846 searcher->setSearchingAll(TRUE); << 847 searcher->apply(root); << 848 assert(searcher->getPath()); << 849 return searcher->getPath()->getTail(); << 850 } << 851 << 852 << 853 // FWJ don't know why userdata is called "clos << 854 // It contains the this pointer! << 855 void G4OpenInventorQtExaminerViewer::superimpo << 856 << 857 { << 858 if (closure) << 859 ((G4OpenInventorQtExaminerViewer*)closur << 860 } << 861 << 862 << 863 // Renders and positions speed indicator and l << 864 // distance/viewpoint name on the drawing canv << 865 void G4OpenInventorQtExaminerViewer::superimpo << 866 { << 867 << 868 if (!action->isOfType(SoGLRenderAction::get << 869 return; << 870 SbViewportRegion vpRegion = << 871 ((SoGLRenderAction*)action)->getViewport << 872 SbVec2s viewportSize = vpRegion.getViewport << 873 << 874 // Aspect is WIDTH/HEIGHT << 875 float aspect = float(viewportSize[0]) / flo << 876 << 877 // FWJ DEBUG << 878 // G4cout << "SPEVENT X0 Y0 DX DY aspect: << 879 // " " << vpRegion.getViewportOrigin() << 880 // " " << viewportSize[0] << << 881 // " " << viewportSize()[1] << << 882 // " " << aspect << G4endl; << 883 << 884 // Translation and scale factor for animati << 885 << 886 float factorx = 1.0f / float(viewportSize[1 << 887 float factory = factorx; << 888 << 889 if (aspect > 1.0f) { << 890 stranslation->translation.setValue(SbVec << 891 } else { << 892 stranslation->translation.setValue(SbVec << 893 factorx /= aspect; << 894 factory /= aspect; << 895 } << 896 if (viewportSize[0] > 500) << 897 factorx *= 500.0f / 400.0f; << 898 else << 899 factorx *= float(viewportSize[0]) / 400. << 900 << 901 sscale->scaleFactor.setValue(SbVec3f(factor << 902 << 903 // TEXT OVERLAY... << 904 << 905 // FWJ Simplified and rewrote the following << 906 // with the overlayed text after a viewer w << 907 // Result is now readable but needs further << 908 << 909 float xInfo, yInfo, xLogName, yLogName, xSo << 910 xMaterial, yMaterial, xZPos, yZPos; << 911 << 912 // Base point for navigation distance or vi << 913 // Origin is at center of render area. << 914 xInfo = -.475; << 915 yInfo = .475; << 916 // Menu bar height in same coordinates: << 917 float mbgap = 0.03; << 918 if (aspect > 1.) xInfo = xInfo*aspect; << 919 if (aspect < 1.) yInfo = yInfo/aspect; << 920 yInfo = yInfo - mbgap*aspect; << 921 << 922 // Following are relative to above base poi << 923 xLogName = 0.0; << 924 yLogName = -.88 + mbgap*aspect; << 925 xSolid = 0.0; << 926 ySolid = -.91 + mbgap*aspect; << 927 xMaterial = 0.0; << 928 yMaterial = -.94 + mbgap*aspect; << 929 xZPos = 0.0; << 930 yZPos = -.97 + mbgap*aspect; << 931 << 932 // Top line << 933 curInfoTrans->translation.setValue(SbVec3f( << 934 << 935 // Bottom lines << 936 mouseOverTransLogName->translation.setValue << 937 mouseOverTransSolid->translation.setValue(S << 938 mouseOverTransMaterial->translation.setValu << 939 mouseOverTransZPos->translation.setValue(Sb << 940 << 941 if (currentState == VIEWPOINT) { // Display << 942 curInfoFont->size.setValue(15); << 943 curInfoFont->name.setValue("defaultFont: << 944 #if QT_VERSION < 0x060000 << 945 curInfoText->string.setValue(SbString(cu << 946 #else << 947 curInfoText->string.setValue(SbString(cu << 948 #endif << 949 } << 950 else if(currentState == GENERAL) { // Displ << 951 curInfoFont->size.setValue(16); << 952 curInfoFont->name.setValue("defaultFont: << 953 curInfoText->string.setValue(SbString("" << 954 } << 955 else { << 956 if (refParticleIdx < (int) refParticleTr << 957 curInfoFont->size.setValue(16); << 958 curInfoFont->name.setValue("defaultFo << 959 char zPos[20]; << 960 // FWJ need a better format here << 961 snprintf(zPos, sizeof zPos, "%-7.2f [ << 962 curInfoText->string.setValue(SbString << 963 } << 964 } << 965 } << 966 << 967 << 968 // Loads view point data from a file into a v << 969 << 970 bool G4OpenInventorQtExaminerViewer::loadViewP << 971 { << 972 bool error = false; << 973 viewPtData tmp; << 974 std::string token; << 975 SbVec3f axis; << 976 SbRotation orient; << 977 float x{0.0}, y{0.0}, z{0.0}, angle{0.0}; << 978 << 979 // Gets the last view point accessed, store << 980 fileIn >> token; << 981 parseString<int>(viewPtIdx, token, error); << 982 getline(fileIn, token); // Remove "\n" << 983 // Converts data from string type into nece << 984 while (getline(fileIn, token)) { << 985 << 986 std::size_t end = token.find_last_not_of << 987 token = token.substr(0, end + 1); << 988 << 989 #if QT_VERSION < 0x060000 << 990 char *vpName = new char[token.size() + 1 << 991 strcpy(vpName, token.c_str()); << 992 tmp.viewPtName = vpName; << 993 #else << 994 tmp.viewPtName = token; << 995 #endif << 996 fileIn >> token; << 997 << 998 parseString<float>(x, token, error); << 999 fileIn >> token; << 1000 parseString<float>(y, token, error); << 1001 fileIn >> token; << 1002 parseString<float>(z, token, error); << 1003 fileIn >> token; << 1004 tmp.position = axis.setValue(x, y, z); << 1005 << 1006 parseString<float>(x, token, error); << 1007 fileIn >> token; << 1008 parseString<float>(y, token, error); << 1009 fileIn >> token; << 1010 parseString<float>(z, token, error); << 1011 fileIn >> token; << 1012 parseString<float>(angle, token, error) << 1013 fileIn >> token; << 1014 orient.setValue(axis.setValue(x, y, z), << 1015 tmp.orientation = orient.getValue(); << 1016 << 1017 int camType{0}; << 1018 parseString<int>(camType, token, error) << 1019 fileIn >> token; << 1020 tmp.camType = (CameraType) camType; << 1021 << 1022 parseString<float>(tmp.height, token, e << 1023 fileIn >> token; << 1024 parseString<float>(tmp.focalDistance, t << 1025 fileIn >> token; << 1026 parseString<float>(tmp.nearDistance, to << 1027 fileIn >> token; << 1028 parseString<float>(tmp.farDistance, tok << 1029 fileIn >> token; << 1030 parseString<int>(tmp.viewportMapping, t << 1031 fileIn >> token; << 1032 parseString<float>(tmp.aspectRatio, tok << 1033 << 1034 getline(fileIn, token); // To remove "\ << 1035 getline(fileIn, token); << 1036 << 1037 if (error) { << 1038 #if QT_VERSION < 0x060000 << 1039 viewPtIdx = 0; << 1040 #else << 1041 viewPtIdx = -1; << 1042 #endif << 1043 viewPtList.clear(); << 1044 return false; << 1045 } << 1046 viewPtList.push_back(tmp); << 1047 } << 1048 << 1049 return true; << 1050 } << 1051 << 1052 << 1053 // Rotates camera 90 degrees around a scene e << 1054 // Rotation is animated for smoothness. << 1055 void G4OpenInventorQtExaminerViewer::rotateCa << 1056 { << 1057 SoCamera *cam = getCamera(); << 1058 << 1059 SbRotation rot(rotAxis, M_PI / (2 * ROT_CN << 1060 rot.multVec(camDir, camDir); << 1061 rot.multVec(camUpVec, camUpVec); << 1062 << 1063 SbVec3f camPosNew = prevPt - (camDir*dista << 1064 cam->position = camPosNew; << 1065 cam->pointAt(prevPt, camUpVec); << 1066 cam->focalDistance = (prevPt - camPosNew). << 1067 << 1068 rotCnt--; << 1069 << 1070 if (animateSensorRotation->isScheduled()) << 1071 animateSensorRotation->unschedule(); << 1072 } << 1073 << 1074 animateSensorRotation->setBaseTime(SbTime: << 1075 animateSensorRotation->setInterval(SbTime( << 1076 animateSensorRotation->schedule(); << 1077 << 1078 } << 1079 << 1080 << 1081 // Slides camera along the beamline. << 1082 void G4OpenInventorQtExaminerViewer::moveCame << 1083 { << 1084 << 1085 SoCamera *cam = getCamera(); << 1086 SbVec3f p1, p2; // The particle moves fr << 1087 SbVec3f particleDir; // Direction vector << 1088 SbVec3f camPosNew{0.0f, 0.0f, 0.0f}; // N << 1089 << 1090 if(refParticleTrajectory.size() == 0) { << 1091 //refParticleTrajectory hasn't been set << 1092 if(dist) << 1093 distance = dist; << 1094 else << 1095 distance = (cam->position.getValue() << 1096 << 1097 cam->position.setValue(center + offsetF << 1098 cam->focalDistance = (cam->position.get << 1099 cam->pointAt(center, upVector); << 1100 } << 1101 else { << 1102 << 1103 // If we move forward past the last tra << 1104 // go back to the beginning << 1105 if (refParticleIdx >= (int) refParticle << 1106 prevPt = refParticleTrajectory[refPa << 1107 dist = (prevPt - cam->position.getVa << 1108 refParticleIdx = 0; << 1109 } << 1110 // If we move backward past the beginni << 1111 // go to the last trajectory point << 1112 if (refParticleIdx < 0) { << 1113 prevPt = refParticleTrajectory[refPa << 1114 dist = (prevPt - cam->position.getVa << 1115 refParticleIdx = (int) refParticleTr << 1116 } << 1117 << 1118 // Set start and end points << 1119 p1 = refParticleTrajectory[refParticleI << 1120 p2 = refParticleTrajectory[refParticleI << 1121 << 1122 // Get the direction from p1 to p2 << 1123 particleDir = p2 - p1; << 1124 particleDir.normalize(); << 1125 << 1126 if(prevParticleDir == SbVec3f(0,0,0)) { << 1127 // First time entering BEAMLINE mode << 1128 // the element from the front, with << 1129 if(lookdown) << 1130 camDir = SbVec3f(0,0,1); << 1131 else << 1132 camDir = SbVec3f(1,0,0); << 1133 camUpVec = SbVec3f(0,1,0); << 1134 << 1135 // In case the start of the goes in << 1136 // direction other than +z, rotate t << 1137 SbRotation rot(SbVec3f(0,0,1), parti << 1138 rot.multVec(camDir, camDir); << 1139 rot.multVec(camUpVec, camUpVec); << 1140 << 1141 } << 1142 else if(particleDir != prevParticleDir) << 1143 // The beamline has changed directio << 1144 << 1145 SbRotation rot(prevParticleDir, part << 1146 rot.multVec(camDir, camDir); << 1147 rot.multVec(camUpVec, camUpVec); << 1148 << 1149 } << 1150 << 1151 if (cam->isOfType(SoPerspectiveCamera:: << 1152 if (!dist) << 1153 distance = (prevPt - cam->positio << 1154 else << 1155 distance = dist; << 1156 } << 1157 << 1158 // FWJ distance not relevant -- use foc << 1159 // if (cam->isOfType(SoOrthographicCame << 1160 // if (!dist) << 1161 // distance = (prevPt - cam->posi << 1162 // else << 1163 // distance = dist; << 1164 // } << 1165 << 1166 << 1167 float x,y,z; << 1168 prevPt.getValue(x,y,z); << 1169 << 1170 << 1171 if (cam->isOfType(SoPerspectiveCamera:: << 1172 camPosNew = p2 - (camDir*distance); << 1173 } << 1174 if (cam->isOfType(SoOrthographicCamera: << 1175 // FWJ maintain focal distance << 1176 camPosNew = p2 - (camDir*cam->focalD << 1177 // camPosNew = p2 - (camDir) << 1178 } << 1179 << 1180 cam->position = camPosNew; << 1181 cam->pointAt(p2, camUpVec); << 1182 cam->focalDistance = (p2 - camPosNew).l << 1183 << 1184 p2.getValue(x,y,z); << 1185 camPosNew.getValue(x,y,z); << 1186 << 1187 prevParticleDir = particleDir; << 1188 prevPt = p1; // For accurate distance c << 1189 << 1190 } << 1191 << 1192 } << 1193 << 1194 << 1195 void G4OpenInventorQtExaminerViewer::pickingC << 1196 << 1197 { << 1198 SoHandleEventAction* action = eventCB->get << 1199 const SoPickedPoint *pp = action->getPicke << 1200 G4OpenInventorQtExaminerViewer* This = (G4 << 1201 << 1202 if(pp != NULL) { << 1203 << 1204 SoPath* path = pp->getPath(); << 1205 SoNode* node = ((SoFullPath*)path)->get << 1206 << 1207 if(node->getTypeId() == SoLineSet::getC << 1208 << 1209 if(This->pickRefPathFlag) { << 1210 This->pickRefPathFlag = false; << 1211 if(This->viewingBeforePickRef != << 1212 This->setViewing(This->viewing << 1213 else << 1214 This->setComponentCursor(SoQtC << 1215 << 1216 // The trajectory is a set of lin << 1217 SoLineSet * trajectory = (SoLineS << 1218 // FWJ DEBUG << 1219 // G4cout << "FOUND trajectory Li << 1220 << 1221 // The set of all trajectories is stor << 1222 // one level above the LineSet that wa << 1223 // seperator are as follows (in this o << 1224 // ResetTransform, MatrixTransform, Co << 1225 SoSeparator * grpNode = << 1226 (SoSeparator*)(((SoFullPath*)p << 1227 << 1228 // The node that contains the coordinates << 1229 // Coordinate3 node which occurs before th << 1230 // back through the nodes in the group unt << 1231 int nodeIndex = grpNode->findChil << 1232 SoNode * tmpNode; << 1233 // FWJ needs initialization << 1234 SoCoordinate3 * coords = 0; << 1235 // SoCoordinate3 * coo << 1236 // We allow only 100 iterations, << 1237 // (should take only a few iterat << 1238 for(int i = 0; i < 100; ++i) { << 1239 --nodeIndex; << 1240 << 1241 tmpNode = grpNode->getChild(no << 1242 if(tmpNode->getTypeId() == SoC << 1243 //node found << 1244 coords = (SoCoordinate3 *)t << 1245 break; << 1246 } << 1247 } << 1248 << 1249 if(coords == NULL) { << 1250 G4warn << "Could not find the << 1251 " for the picked trajectory << 1252 G4warn << " Reference trajecto << 1253 return; << 1254 } << 1255 // FWJ DEBUG << 1256 // G4cout << "FOUND SoCoordinate3 << 1257 << 1258 << 1259 if ((This->lshiftdown) || (This- << 1260 This->setReferencePath(traject << 1261 else << 1262 This->setReferencePath(traject << 1263 << 1264 return; << 1265 << 1266 } << 1267 else if(This->abbrOutputFlag) { << 1268 << 1269 G4AttHolder* attHolder = dynamic_ << 1270 if(attHolder && attHolder->GetAtt << 1271 << 1272 std::string strTrajPoint = "G4 << 1273 std::ostringstream oss; << 1274 for (std::size_t i = 0; i < at << 1275 G4cout << G4AttCheck(attHol << 1276 attHol << 1277 oss << G4AttCheck(attHolder << 1278 attHolder << 1279 if(oss.str().find(strTrajPo << 1280 << 1281 // Last attribute displayed was a << 1282 // want abbreviated output, displa << 1283 // (unless we're already at the la << 1284 if(i != attHolder->GetAt << 1285 G4cout << G4AttCheck( << 1286 attHolder->GetAttValues()[attHo << 1287 attHolder->GetAttDefs()[attHold << 1288 } << 1289 break; << 1290 } << 1291 } << 1292 } else { << 1293 G4String name((char*)node->get << 1294 G4String cls((char*)node->getT << 1295 G4warn << "SoNode : " << node << 1296 << " SoType : " << cls << 1297 << " name : " << name << 1298 << G4endl; << 1299 G4warn << "No attributes attac << 1300 } << 1301 << 1302 return; << 1303 } << 1304 else{ << 1305 //Go to default behavior << 1306 } << 1307 } << 1308 else { << 1309 //Go to default behavior << 1310 } << 1311 << 1312 // Default behavior in G4OpenInventorVi << 1313 G4AttHolder* attHolder = dynamic_cast<G << 1314 if(attHolder && attHolder->GetAttDefs() << 1315 for (std::size_t i = 0; i < attHolde << 1316 G4cout << G4AttCheck(attHolder->G << 1317 attHolder->G << 1318 } << 1319 } else { << 1320 G4String name((char*)node->getName() << 1321 G4String cls((char*)node->getTypeId( << 1322 G4warn << "SoNode : " << node << 1323 << " SoType : " << cls << 1324 << " name : " << name << 1325 << G4endl; << 1326 G4warn << "No attributes attached." << 1327 } << 1328 << 1329 //Suppress other event handlers << 1330 eventCB->setHandled(); << 1331 } << 1332 } << 1333 << 1334 << 1335 void G4OpenInventorQtExaminerViewer::mouseove << 1336 { << 1337 SoHandleEventAction* action = eventCB->get << 1338 const SoPickedPoint* pp = action->getPicke << 1339 G4OpenInventorQtExaminerViewer* This = (G4 << 1340 << 1341 if(!This->abbrOutputFlag) << 1342 return; << 1343 << 1344 if(pp != NULL) { << 1345 << 1346 const SbViewportRegion & viewportRegion << 1347 << 1348 std::string sLogName; << 1349 float x,y,z; << 1350 std::stringstream ssZPos; << 1351 std::stringstream ssSolids; << 1352 std::stringstream ssMaterials; << 1353 SoPath * path = pp->getPath(); << 1354 SoNode* node = ((SoFullPath*)path)->get << 1355 << 1356 if(node->getTypeId() == Geant4_SoPolyhe << 1357 << 1358 sLogName = "Logical Volume: "; << 1359 sLogName += ((Geant4_SoPolyhedron *) << 1360 << 1361 SoGetBoundingBoxAction bAction(viewp << 1362 bAction.apply((SoFullPath*)path); << 1363 SbBox3f bBox = bAction.getBoundingBo << 1364 SbVec3f centr = bBox.getCenter(); << 1365 centr.getValue(x,y,z); << 1366 ssZPos << "Pos: " << x << " " << y << 1367 << 1368 G4AttHolder* attHolder = dynamic_cas << 1369 if(attHolder && attHolder->GetAttDef << 1370 << 1371 std::vector<const std::map<G4Stri << 1372 attHolder->GetAttDefs(); << 1373 std::vector<const std::vector<G4A << 1374 attHolder->GetAttValues(); << 1375 for (std::size_t i = 0; i < vecDe << 1376 const std::vector<G4AttValue> << 1377 << 1378 std::vector<G4AttValue>::const << 1379 << 1380 for (iValue = vals->begin(); i << 1381 const G4String& valueName = << 1382 const G4String& value = iVa << 1383 << 1384 if(valueName == "Solid") { << 1385 if(ssSolids.str() == "") << 1386 ssSolids << "Solid Na << 1387 else << 1388 ssSolids << ", " << v << 1389 } << 1390 << 1391 if(valueName == "Material") << 1392 if(ssMaterials.str() == << 1393 ssMaterials << "Mater << 1394 else << 1395 ssMaterials << ", " < << 1396 } << 1397 } << 1398 } << 1399 } << 1400 } << 1401 // FWJ Mouseover for trajectories << 1402 else if(node->getTypeId() == SoLineSet: << 1403 // G4cout << "Trajectory!!!!!!!!!!!! << 1404 G4AttHolder* attHolder = dynamic_cas << 1405 if(attHolder && attHolder->GetAttDef << 1406 std::string strTrajPoint = "G4Tra << 1407 std::ostringstream oss; << 1408 G4String t1, t1Ch, t2, t3, t4; << 1409 for (std::size_t i = 0; i < attHo << 1410 // G4cout << "Getting index " << 1411 // No, returns a vector! << 1412 // G4AttValue* attValue = at << 1413 const std::vector<G4AttValue>* << 1414 std::vector<G4AttValue>::const << 1415 for (iValue = vals->begin(); i << 1416 const G4String& valueName = << 1417 const G4String& value = iVa << 1418 // G4cout << " valueName = << 1419 // G4cout << " value = " < << 1420 // LINE 1 << 1421 if (valueName == "PN") t1 = << 1422 if (valueName == "Ch") { << 1423 if (atof(value.c_str()) << 1424 t1Ch = " +"; << 1425 else << 1426 t1Ch = " "; << 1427 t1Ch += value; << 1428 } << 1429 if (valueName == "PDG") { << 1430 t1 += " "; << 1431 t1 += value; << 1432 t1 += t1Ch; << 1433 This->mouseOverTextLogNa << 1434 } << 1435 // G4cout << 1436 // LINE 2 << 1437 if (valueName == "EventID") << 1438 if (valueName == "ID") t2 + << 1439 if (valueName == "PID") { << 1440 t2 += " Prt " + value << 1441 This->mouseOverTextSolid << 1442 } << 1443 // LINE 3 << 1444 if (valueName == "IKE") t3 << 1445 if (valueName == "IMom") { << 1446 // Remove units << 1447 std::size_t ipos = value << 1448 G4String value1 = value; << 1449 value1.erase(ipos); << 1450 t3 += " P (" + value1 << 1451 } << 1452 if (valueName == "IMag") { << 1453 t3 += " " + value + "/c" << 1454 // t << 1455 This->mouseOverTextMater << 1456 } << 1457 // LINE 4 << 1458 if (valueName == "NTP") { << 1459 std::ostringstream t4oss << 1460 t4oss << "TrjPts " << v << 1461 t4oss << " Pos " << p << 1462 " " << pp->getPoint() << 1463 This->mouseOverTextZPos- << 1464 } << 1465 } << 1466 // G4cout << " NOW CALLING G4Att << 1467 // G4cout << G4AttCheck(attHolder << 1468 // attHol << 1469 // oss << G4AttCheck(attHolder->G << 1470 // attHolder << 1471 // if(oss.str().find(strTrajPoint << 1472 // // Last attribute displayed << 1473 // // want abbreviated output, << 1474 // // (unless we're already at << 1475 // if(i != attHolder->GetAttDe << 1476 // G4cout << G4AttCheck( << 1477 // attHolder->GetAttValu << 1478 // attHolder->GetAttDefs << 1479 // } << 1480 // break; << 1481 // } << 1482 } << 1483 } << 1484 This->setSuperimpositionEnabled(This << 1485 This->scheduleRedraw(); << 1486 eventCB->setHandled(); << 1487 return; << 1488 } << 1489 << 1490 bool redraw = false; << 1491 if(std::string(This->mouseOverTextLogNa << 1492 This->mouseOverTextLogName->string.s << 1493 redraw = true; << 1494 } << 1495 if(std::string(This->mouseOverTextSolid << 1496 This->mouseOverTextSolid->string.set << 1497 redraw = true; << 1498 } << 1499 if(std::string(This->mouseOverTextMater << 1500 This->mouseOverTextMaterial->string. << 1501 redraw = true; << 1502 } << 1503 if(std::string(This->mouseOverTextZPos- << 1504 This->mouseOverTextZPos->string.setV << 1505 redraw = true; << 1506 } << 1507 << 1508 if(redraw) { << 1509 This->setSuperimpositionEnabled(This << 1510 This->scheduleRedraw(); << 1511 } << 1512 << 1513 eventCB->setHandled(); << 1514 } << 1515 else { << 1516 if(std::string(This->mouseOverTextLogNa << 1517 This->mouseOverTextLogName->string.s << 1518 This->scheduleRedraw(); << 1519 } << 1520 if(std::string(This->mouseOverTextSolid << 1521 This->mouseOverTextSolid->string.set << 1522 This->scheduleRedraw(); << 1523 } << 1524 if(std::string(This->mouseOverTextMater << 1525 This->mouseOverTextMaterial->string. << 1526 This->scheduleRedraw(); << 1527 } << 1528 if(std::string(This->mouseOverTextZPos- << 1529 This->mouseOverTextZPos->string.setV << 1530 This->scheduleRedraw(); << 1531 } << 1532 } << 1533 } << 1534 << 1535 << 1536 // Called by hitting PageUp during animation. << 1537 void G4OpenInventorQtExaminerViewer::incSpeed << 1538 if (std::ceil(animateBtwPtsPeriod * 100) > << 1539 if (speedStep > 0.08) << 1540 speedStep -= 0.02; << 1541 else << 1542 speedStep = 0.02; << 1543 animateBtwPtsPeriod -= speedStep; << 1544 } else << 1545 animateBtwPtsPeriod = 0.0; << 1546 << 1547 if (currentState != PAUSED_ANIMATION) { << 1548 int lastIdx = (int) refParticleTrajecto << 1549 if (refParticleIdx < lastIdx && !animat << 1550 animateRefParticle(); << 1551 } << 1552 } << 1553 << 1554 // Called by hitting PageDown during animatio << 1555 void G4OpenInventorQtExaminerViewer::decSpeed << 1556 animateBtwPtsPeriod += speedStep; << 1557 if (animateBtwPtsPeriod < MIN_SPEED) { << 1558 if (std::floor(animateBtwPtsPeriod * 10 << 1559 speedStep = 0.08; << 1560 } else if (animateBtwPtsPeriod > 0.12) << 1561 speedStep += 0.02; << 1562 } else { << 1563 animateBtwPtsPeriod = MIN_SPEED; << 1564 speedStep = START_STEP; << 1565 maxSpeed = 0.0f; << 1566 if (animateSensor->isScheduled()) << 1567 animateSensor->unschedule(); << 1568 } << 1569 } << 1570 << 1571 << 1572 // Based on the user's interaction the speed << 1573 << 1574 void G4OpenInventorQtExaminerViewer::updateSp << 1575 { << 1576 assert(this->sgeometry != NULL); << 1577 << 1578 SbVec3f * points = this->sgeometry->point. << 1579 << 1580 if (points[10][0] == 0.0f) << 1581 this->animSpeedOutlineSwitch->whichChil << 1582 if (points[14][0] == 0.0f) << 1583 this->animSpeedSwitch->whichChild.setVa << 1584 points[10][0] = this->maxSpeed; << 1585 points[11][0] = this->maxSpeed; << 1586 points[14][0] = this->maxSpeed; << 1587 points[15][0] = this->maxSpeed; << 1588 this->sgeometry->point.finishEditing(); << 1589 << 1590 if (this->maxSpeed == 0.0f) { << 1591 this->animSpeedOutlineSwitch->whichChil << 1592 this->animSpeedSwitch->whichChild.setVa << 1593 } << 1594 } << 1595 << 1596 << 1597 void G4OpenInventorQtExaminerViewer::actualRe << 1598 switch (currentState) { << 1599 case ANIMATION: << 1600 case REVERSED_ANIMATION: << 1601 case PAUSED_ANIMATION: << 1602 updateSpeedIndicator(); << 1603 SoQtExaminerViewer::actualRedraw(); << 1604 break; << 1605 default: << 1606 SoQtExaminerViewer::actualRedraw(); << 1607 break; << 1608 } << 1609 } << 1610 << 1611 << 1612 void G4OpenInventorQtExaminerViewer::setRefer << 1613 SoCoordinate3 *coords, bool append) << 1614 { << 1615 // TODO: Color the reference path << 1616 // Disable the color stuff for now: change << 1617 // FWJ See G4OpenInventorXtExaminerViewer. << 1618 << 1619 // The trajectory is composed of all the p << 1620 // multiple value field (SoMFInt32) numVer << 1621 // For each of the numVertices.getNum()* p << 1622 // retrieve the points from the SoCoordina << 1623 << 1624 SbVec3f refParticlePt; << 1625 << 1626 if(!append) << 1627 refParticleTrajectory.clear(); << 1628 << 1629 for(int i = 0; i < lineset->numVertices.ge << 1630 for(int j = 0; j < lineset->numVertices << 1631 refParticlePt = coords->point[j]; << 1632 refParticleTrajectory.push_back(refP << 1633 } << 1634 } << 1635 // Remove points that are too close to eac << 1636 evenOutRefParticlePts(); << 1637 setReferencePathZPos(); << 1638 getSceneElements(); << 1639 sortElements(); << 1640 } << 1641 << 1642 << 1643 void G4OpenInventorQtExaminerViewer::setRefer << 1644 { << 1645 refZPositions.clear(); << 1646 refZPositions.push_back(0); << 1647 float dist; << 1648 for(unsigned int i=0; i < refParticleTraje << 1649 dist = (refParticleTrajectory[i] - << 1650 refParticleTrajectory[i + 1]).l << 1651 refZPositions.push_back(refZPositions[i << 1652 } << 1653 } << 1654 << 1655 << 1656 void G4OpenInventorQtExaminerViewer::findAndS << 1657 { << 1658 SoSearchAction action; << 1659 action.setType(SoLineSet::getClassTypeId() << 1660 action.setInterest(SoSearchAction::ALL); << 1661 action.apply(getSceneGraph()); << 1662 << 1663 SoPathList &pathList = action.getPaths(); << 1664 << 1665 if(pathList.getLength() != 0) { << 1666 << 1667 SoCoordinate3 * coords = NULL; << 1668 std::vector<SoCoordinate3 *> coordvec; << 1669 std::vector<SoLineSet *> linevec; << 1670 << 1671 bool refPathFound = false; << 1672 for(int i = 0; i < pathList.getLength() << 1673 SoFullPath *path = (SoFullPath *)pat << 1674 << 1675 G4AttHolder* attHolder = dynamic_cas << 1676 if(attHolder != nullptr) << 1677 { << 1678 for (std::size_t j = 0; j < attHolde << 1679 std::ostringstream oss; << 1680 oss << G4AttCheck(attHolder->GetA << 1681 attHolder->GetA << 1682 << 1683 std::string findStr = "Type of tr << 1684 std::string compareValue = "REFER << 1685 std::size_t idx = oss.str().find( << 1686 << 1687 if(idx != std::string::npos) { << 1688 if(oss.str().substr(idx + find << 1689 compareVal << 1690 coords = getCoordsNode(path << 1691 if(coords != NULL) { << 1692 refPathFound = true; << 1693 coordvec.push_back(coord << 1694 linevec.push_back((SoLin << 1695 } << 1696 break; << 1697 } << 1698 } << 1699 << 1700 findStr = "Track ID (ID): "; << 1701 idx = oss.str().find(findStr); << 1702 if(idx != std::string::npos) { << 1703 //index all primary tracks << 1704 std::string tmpstr = oss.str() << 1705 std::istringstream buffer(tmps << 1706 int num; << 1707 buffer >> num; << 1708 if(num == 1) { << 1709 << 1710 // Check if next character << 1711 // in which case we don't h << 1712 // FWJ attempt to fix Cover << 1713 char nextChar = oss.str().a << 1714 // const char * nextChar = << 1715 // oss.str().substr(idx + f << 1716 if(std::isdigit(nextChar)) << 1717 break; //Not a primary t << 1718 << 1719 coords = getCoordsNode(path << 1720 if(coords != NULL) { << 1721 coordvec.push_back(coord << 1722 linevec.push_back((SoLin << 1723 break; //Found coords no << 1724 } << 1725 } << 1726 else << 1727 break; //Not a primary tra << 1728 } << 1729 else{ << 1730 //Not a Track ID attribute, fa << 1731 } << 1732 } << 1733 } << 1734 << 1735 if(refPathFound) << 1736 break; << 1737 } << 1738 << 1739 if(coordvec.empty()) << 1740 return; //No track with a Coordin << 1741 << 1742 if(refPathFound) { << 1743 //set ref path to last traj, coord i << 1744 setReferencePath(linevec.back(), coo << 1745 return; << 1746 } << 1747 //else << 1748 << 1749 int longestIdx = 0; << 1750 float longestLength = 0.0; << 1751 // For all paths << 1752 for(unsigned int i=0;i < linevec.size() << 1753 << 1754 //First generate a vector with all t << 1755 std::vector<SbVec3f> trajectory; << 1756 // For all lines in the i path << 1757 for(int j=0; j < linevec[i]->numVert << 1758 // For all points in line j << 1759 for(int k=0; k < linevec[i]->numV << 1760 trajectory.push_back(coordvec[ << 1761 } << 1762 } << 1763 << 1764 // Then calculate the total length << 1765 float tmpLength=0.0; << 1766 for(unsigned int j=0; j < trajectory << 1767 tmpLength += (trajectory[j] - tra << 1768 } << 1769 << 1770 if(tmpLength > longestLength) { << 1771 longestIdx = i; << 1772 longestLength = tmpLength; << 1773 } << 1774 } << 1775 << 1776 // Set the longest path as the referenc << 1777 setReferencePath(linevec[longestIdx], c << 1778 } << 1779 } << 1780 << 1781 << 1782 SoCoordinate3 * G4OpenInventorQtExaminerViewe << 1783 { << 1784 SoLineSet *trajectory = (SoLineSet *)path- << 1785 SoSeparator * grpNode = (SoSeparator*)(((S << 1786 int nodeIndex = grpNode->findChild(traject << 1787 SoNode * tmpNode; << 1788 << 1789 // We allow only 100 iterations, in case t << 1790 // (should take only a few iterations) << 1791 for (int i = 0; i < 100; ++i) { << 1792 --nodeIndex; << 1793 << 1794 tmpNode = grpNode->getChild(nodeIndex); << 1795 if(tmpNode->getTypeId() == SoCoordinate << 1796 //node found << 1797 return (SoCoordinate3 *)tmpNode; << 1798 } << 1799 } << 1800 return NULL; //coords node not found << 1801 } << 1802 << 1803 << 1804 // Displays scene elements on the right side << 1805 // else: scene graph is searched for Geant4_S << 1806 void G4OpenInventorQtExaminerViewer::getScene << 1807 { << 1808 std::string field, eltName; << 1809 << 1810 std::map<std::string, int> duplicates; << 1811 std::map<std::string, int> sceneElts; << 1812 SoSearchAction search; << 1813 Geant4_SoPolyhedron *node; << 1814 SoGroup *root = (SoGroup *)getSceneManager << 1815 << 1816 SoBaseKit::setSearchingChildren(TRUE); << 1817 << 1818 search.reset(); << 1819 search.setSearchingAll(TRUE); << 1820 search.setInterest(SoSearchAction::ALL); << 1821 search.setType(Geant4_SoPolyhedron::getCla << 1822 << 1823 // FWJ DEBUG << 1824 // G4cout << "Searching for elements.... << 1825 search.apply(root); << 1826 << 1827 SoPathList &pl = search.getPaths(); << 1828 << 1829 << 1830 // First find which names occur more than << 1831 for (int i = 0; i < pl.getLength(); i++) { << 1832 SoFullPath *path = (SoFullPath *)pl[i]; << 1833 node = (Geant4_SoPolyhedron *)path->get << 1834 eltName = node->getName(); << 1835 // G4cout << " FOUND " << i << " << 1836 if(duplicates.count(eltName)) << 1837 duplicates[eltName]++; << 1838 else << 1839 duplicates[eltName] = 1; << 1840 } << 1841 << 1842 for(int i = 0; i < pl.getLength(); i++) { << 1843 float x,y,z; << 1844 std::stringstream ssCount; << 1845 SoFullPath *path = (SoFullPath *)pl[i]; << 1846 node = (Geant4_SoPolyhedron *)path->get << 1847 eltName = node->getName(); << 1848 field = eltName; << 1849 if(duplicates[eltName] == 1) << 1850 ssCount << "";//duplicates[field] << 1851 else { << 1852 if(sceneElts.count(eltName)) << 1853 sceneElts[eltName]++; << 1854 else << 1855 sceneElts[eltName] = 1; << 1856 << 1857 ssCount << sceneElts[eltName]; << 1858 field += "_"; << 1859 } << 1860 << 1861 field += ssCount.str(); << 1862 << 1863 SoGetBoundingBoxAction bAction(getViewp << 1864 bAction.apply(path); << 1865 SbBox3f bBox = bAction.getBoundingBox() << 1866 << 1867 SbVec3f centr = bBox.getCenter(); << 1868 centr.getValue(x,y,z); << 1869 << 1870 path->ref(); << 1871 sceneElement el = { field, path, centr, << 1872 sceneElements.push_back(el); << 1873 } << 1874 } << 1875 << 1876 << 1877 float G4OpenInventorQtExaminerViewer::sqrlen( << 1878 { << 1879 float x,y,z; << 1880 a.getValue(x,y,z); << 1881 return x*x + y*y + z*z; << 1882 } << 1883 << 1884 << 1885 void G4OpenInventorQtExaminerViewer::distance << 1886 << 1887 << 1888 << 1889 { << 1890 // a : Previous point on trajectory << 1891 // b : Next point on trajectory << 1892 // q : the point in space << 1893 // dab, daq, dbq: distance between a & b, << 1894 // << 1895 // Theory: A point p on a line ab is defi << 1896 // << 1897 // p(t) = a+t?(b?a) << 1898 // << 1899 // note: All are vectors except the << 1900 // << 1901 // When t is between 0 and 1 the point p i << 1902 // The point p is defined in terms of the << 1903 // the distance from the query point q to << 1904 // of that distance we differentiate it an << 1905 // << 1906 // diff(Norm(p(t)- q)) = 0 << 1907 // << 1908 // note: diff means taking the derivat << 1909 // << 1910 // The resulting t is given in the code be << 1911 // between p and q is given by: << 1912 // << 1913 // d^2 = (Norm(p(t)-q))^2 << 1914 // << 1915 // The expression found is given in the co << 1916 // << 1917 // Ref: http://programmizm.sourceforge.net << 1918 // distance-from-a-point-to-a-po << 1919 // << 1920 // --PLG << 1921 << 1922 const std::size_t count = refParticleTraje << 1923 assert(count>0); << 1924 << 1925 SbVec3f b = refParticleTrajectory[0]; << 1926 SbVec3f dbq = b - q; << 1927 float sqrDist = sqrlen(dbq); << 1928 closestPoint = b; << 1929 index = 0; << 1930 for (std::size_t i = 1; i < count; ++i) { << 1931 const SbVec3f a = b; << 1932 const SbVec3f daq = dbq; << 1933 b = refParticleTrajectory[i]; << 1934 dbq = b - q; << 1935 const SbVec3f dab = a - b; << 1936 << 1937 float dab_x, dab_y, dab_z; << 1938 dab.getValue(dab_x,dab_y,dab_z); << 1939 float daq_x, daq_y, daq_z; << 1940 daq.getValue(daq_x, daq_y, daq_z); << 1941 float dbq_x, dbq_y, dbq_z; << 1942 dbq.getValue(dbq_x, dbq_y, dbq_z); << 1943 << 1944 const float inv_sqrlen = 1./sqrlen(dab) << 1945 const float t = (dab_x*daq_x + dab_y*da << 1946 << 1947 if (t<0.) { << 1948 // The trajectory point occurs befor << 1949 // Go to the next point << 1950 continue; << 1951 } << 1952 float current_dist; << 1953 if (t<=1.) { << 1954 // The trajectory point occurs betwe << 1955 // Compute the distance to that poin << 1956 current_dist = daq_x*daq_x + daq_y*d << 1957 - t*(daq_x*dab_x + daq_y*dab_y + << 1958 + t*t*(dab_x*dab_x + dab_y*dab_y << 1959 } << 1960 else { //t>1. << 1961 // The trajectory point occurs after << 1962 // Get the distance to point b << 1963 current_dist = sqrlen(dbq); << 1964 } << 1965 << 1966 if (current_dist < sqrDist) { << 1967 sqrDist = current_dist; << 1968 closestPoint = a + t*(b-a); << 1969 index = (int) i; << 1970 } << 1971 } << 1972 << 1973 dist = std::sqrt(sqrDist); << 1974 } << 1975 << 1976 << 1977 void G4OpenInventorQtExaminerViewer::sortElem << 1978 { << 1979 if(refParticleTrajectory.empty()) << 1980 return; << 1981 << 1982 float * trajLength = new float[refParticle << 1983 typedef std::map<elementForSorting, sceneE << 1984 sortedMap sorted; << 1985 << 1986 // For every point on the reference trajec << 1987 // the total length from the start << 1988 SbVec3f prevPoint; << 1989 std::vector<SbVec3f>::iterator itRef = ref << 1990 int trajIndex = 0; << 1991 prevPoint = *itRef; << 1992 trajLength[trajIndex] = 0.0; << 1993 ++itRef; << 1994 ++trajIndex; << 1995 for(; itRef != refParticleTrajectory.end() << 1996 trajLength[trajIndex] = trajLength[traj << 1997 prevPoint = *itRef; << 1998 } << 1999 << 2000 // Compute the smallest distance between t << 2001 // and the reference trajectory (find the << 2002 // then map the element to the trajectory << 2003 // point (calculated above) << 2004 SoGetBoundingBoxAction bAction(getViewport << 2005 SbVec3f elementCoord; << 2006 std::vector<sceneElement>::iterator itEl; << 2007 int elementIndex; << 2008 elementForSorting el; << 2009 for(itEl = sceneElements.begin(), elementI << 2010 itEl != sceneElements.end(); ++itEl, + << 2011 bAction.apply(itEl->path); << 2012 << 2013 // FWJ sceneElement already has a cente << 2014 elementCoord = itEl->center; << 2015 // ... and this sometimes returns an em << 2016 // elementCoord = bAction.getBound << 2017 // if (bAction.getBoundingBox().is << 2018 // G4cout << "sortElements: Box << 2019 // G4cout << " element name=" << 2020 // } << 2021 << 2022 int index; << 2023 distanceToTrajectory(elementCoord, el.s << 2024 itEl->closestPointZCoord = el.closestPo << 2025 el.distanceToBeamlineStart = (itEl->cen << 2026 << 2027 // This map of the scene elements (or t << 2028 // is automatically sorted by trajector << 2029 // by the distance between the element << 2030 // is the same as another element. Thi << 2031 // an element structure which implement << 2032 sorted.insert(std::make_pair(el,*itEl)) << 2033 } << 2034 << 2035 // store the sorted elements into the vect << 2036 sceneElements.clear(); << 2037 << 2038 sortedMap::iterator itSorted = sorted.begi << 2039 for(; itSorted != sorted.end(); itSorted++ << 2040 sceneElements.push_back(itSorted->secon << 2041 << 2042 zcoordSetFlag = true; << 2043 << 2044 createElementsList(); << 2045 << 2046 delete[] trajLength; << 2047 } << 2048 << 2049 << 2050 void G4OpenInventorQtExaminerViewer::createEl << 2051 { << 2052 // FWJ DEBUG << 2053 // G4cout << "Populating ELEMENT LIST... << 2054 << 2055 AuxWindowDialog->listWidget1->clear(); << 2056 // int size = sceneElements.size(); << 2057 << 2058 std::vector<sceneElement>::const_iterator << 2059 std::stringstream ss; << 2060 << 2061 for(it=sceneElements.begin(); it!=sceneEle << 2062 ss << it->name; << 2063 if(zcoordSetFlag) << 2064 ss << " [" << it->closestPointZCoord << 2065 << 2066 new QListWidgetItem(ss.str().c_str(), A << 2067 ss.str(""); << 2068 } << 2069 } << 2070 << 2071 << 2072 // Called when user clicks a scene element in << 2073 // Zooms onto that element. << 2074 void << 2075 G4OpenInventorQtExaminerViewer::LookAtSceneEl << 2076 { << 2077 // FWJ DEBUG << 2078 // G4cout << "AuxWindow: listWidget1 sel << 2079 << 2080 SoCamera * cam = getCamera(); << 2081 << 2082 if (SoQtExaminerViewer::isAnimating()) << 2083 stopAnimating(); << 2084 << 2085 if (currentState == ANIMATION || currentSt << 2086 || currentState == PAUSED_ANIMATION ) << 2087 if (animateSensor->isScheduled()) << 2088 animateSensor->unschedule(); << 2089 setSuperimpositionEnabled(superimpositi << 2090 maxSpeed = 0.0f; << 2091 scheduleRedraw(); << 2092 restoreCamera(); << 2093 currentState = prevState; << 2094 } else if (currentState == VIEWPOINT) << 2095 setSuperimpositionEnabled(superimpositi << 2096 << 2097 std::string elementField = qPrintable(item << 2098 << 2099 std::size_t idx = elementField.find_last_o << 2100 if(idx == std::string::npos) << 2101 idx = elementField.size(); //if "[" not << 2102 else << 2103 idx--; // To get rid of the space that << 2104 << 2105 bool error = false; << 2106 SoFullPath *path; << 2107 SoSearchAction search; << 2108 SoNode *root = getSceneManager()->getScene << 2109 int counter = 0; << 2110 std::size_t idxUnderscore = elementField.f << 2111 << 2112 parseString<int>(counter, << 2113 elementField.substr << 2114 << 2115 SoBaseKit::setSearchingChildren(TRUE); << 2116 search.reset(); << 2117 search.setSearchingAll(TRUE); << 2118 << 2119 // G4cout << " Starting search for elemen << 2120 // << G4endl; << 2121 << 2122 if(error) { // No counter is present => el << 2123 curEltName = elementField.substr(0, idx << 2124 search.setName(curEltName.c_str()); << 2125 search.apply(root); << 2126 << 2127 path = (SoFullPath *)search.getPath(); << 2128 } << 2129 else { << 2130 curEltName = elementField.substr(0, idx << 2131 search.setInterest(SoSearchAction::ALL) << 2132 search.setName(curEltName.c_str()); << 2133 search.apply(root); << 2134 << 2135 SoPathList &pl = search.getPaths(); << 2136 path = (SoFullPath *)pl[counter - 1]; / << 2137 } << 2138 << 2139 G4ThreeVector global; << 2140 << 2141 // FWJ FLIP THIS << 2142 if ((idx > 0) && (path)) { << 2143 << 2144 if(!refParticleTrajectory.empty()) { << 2145 << 2146 SoGetBoundingBoxAction bAction(getVi << 2147 bAction.apply(path); << 2148 SbBox3f bBox = bAction.getBoundingBo << 2149 SbVec3f elementCoord = bBox.getCente << 2150 << 2151 refParticleIdx = 0; << 2152 SbVec3f p; << 2153 << 2154 float absLengthNow, absLengthMin; << 2155 int maxIdx = (int) refParticleTrajec << 2156 int targetIdx = 0; << 2157 SbVec3f dir; << 2158 << 2159 p = refParticleTrajectory[refParticl << 2160 absLengthMin = (p - elementCoord).le << 2161 refParticleIdx++; << 2162 << 2163 // Find a ref. particle's point clos << 2164 while (refParticleIdx < maxIdx) { << 2165 p = refParticleTrajectory[refPart << 2166 absLengthNow = (p - elementCoord) << 2167 << 2168 if (absLengthNow < absLengthMin) << 2169 absLengthMin = absLengthNow; << 2170 targetIdx = refParticleIdx; << 2171 } << 2172 refParticleIdx++; << 2173 } << 2174 << 2175 if (currentState != BEAMLINE) { // S << 2176 SbVec3f p1, pN; << 2177 currentState = BEAMLINE; << 2178 prevParticleDir = SbVec3f(0,0,0); << 2179 << 2180 p1 = prevPt = refParticleTrajecto << 2181 pN = refParticleTrajectory[refPar << 2182 distance = (pN - p1).length() / 1 << 2183 << 2184 // FWJ Rather than switching to a << 2185 // to keep the same height(magnif << 2186 // if (cam->isOfType(SoOrthograph << 2187 // ((SoOrthographicCamera *) c << 2188 // // FWJ Restore the default hei << 2189 // // ((SoOrthographicCamera *) c << 2190 // } << 2191 // else if (cam->isOfType(SoPersp << 2192 << 2193 // FWJ required to avoid extreme << 2194 if (cam->isOfType(SoPerspectiveCa << 2195 ((SoPerspectiveCamera*)cam)->h << 2196 << 2197 } else { << 2198 if (cam->isOfType(SoPerspectiveCa << 2199 distance = (prevPt - cam->posi << 2200 } << 2201 refParticleIdx = targetIdx; << 2202 << 2203 //////////////////////////////////// << 2204 setSuperimpositionEnabled(superimpos << 2205 axisSwitch->whichChild.setValue(SO_S << 2206 animSpeedOutlineSwitch->whichChild.s << 2207 animSpeedSwitch->whichChild.setValue << 2208 scheduleRedraw(); << 2209 //////////////////////////////////// << 2210 << 2211 moveCamera(distance); << 2212 << 2213 } << 2214 << 2215 else { << 2216 offsetFromCenter.setValue(0, 0, 1); << 2217 distance = 50;// small number since << 2218 upVector.setValue(0, 1, 0); << 2219 moveCamera(distance); << 2220 cam->viewAll(path, getViewportRegion << 2221 } << 2222 } << 2223 << 2224 } << 2225 << 2226 << 2227 void G4OpenInventorQtExaminerViewer::FileLoad << 2228 { << 2229 // G4cout << "File: Load Ref Path CALLBA << 2230 << 2231 QFileDialog filedialog(getParentWidget(), << 2232 filedialog.setFileMode(QFileDialog::AnyFil << 2233 filedialog.setFont(*font); << 2234 if (!filedialog.exec()) return; << 2235 QStringList filenameinlist = filedialog.se << 2236 QString filenamein = filenameinlist[0]; << 2237 << 2238 std::ifstream ifs(qPrintable(filenamein)); << 2239 if(ifs.is_open()) { << 2240 refParticleTrajectory.clear(); << 2241 float x,y,z; << 2242 while(ifs >> x >> y >> z) { << 2243 refParticleTrajectory.push_back(SbVe << 2244 } << 2245 ifs.close(); << 2246 } else { << 2247 QMessageBox msgbox; << 2248 msgbox.setFont(*font); << 2249 QString messagetxt = "Reference Path fi << 2250 messagetxt.append(filenamein); << 2251 msgbox.setText(messagetxt); << 2252 msgbox.exec(); << 2253 return; << 2254 } << 2255 if (refParticleTrajectory.size() < 2) { << 2256 QMessageBox msgbox; << 2257 msgbox.setFont(*font); << 2258 QString messagetxt = "Invalid Reference << 2259 msgbox.setText(messagetxt); << 2260 msgbox.exec(); << 2261 return; << 2262 } << 2263 // Following setReferencePath() ... << 2264 evenOutRefParticlePts(); << 2265 setReferencePathZPos(); << 2266 getSceneElements(); << 2267 sortElements(); << 2268 } << 2269 << 2270 << 2271 void G4OpenInventorQtExaminerViewer::FileSave << 2272 { << 2273 // G4cout << "File: Save Ref Path CALLBA << 2274 << 2275 QFileDialog filedialog(getParentWidget(), << 2276 filedialog.setFileMode(QFileDialog::AnyFil << 2277 // To enable confirmation of overwriting << 2278 filedialog.setAcceptMode(QFileDialog::Acce << 2279 filedialog.setFont(*font); << 2280 if (!filedialog.exec()) return; << 2281 QStringList filenameinlist = filedialog.se << 2282 QString filenamein = filenameinlist[0]; << 2283 << 2284 std::ofstream ofs(qPrintable(filenamein)); << 2285 if (ofs.is_open()) { << 2286 float x,y,z; << 2287 for (unsigned int i=0; i < refParticleT << 2288 refParticleTrajectory[i].getValue(x, << 2289 ofs << x << " " << y << " " << z << << 2290 } << 2291 ofs.close(); << 2292 } else { << 2293 QMessageBox msgbox; << 2294 msgbox.setFont(*font); << 2295 QString messagetxt = "Error opening fil << 2296 messagetxt.append(filenamein); << 2297 msgbox.setText(messagetxt); << 2298 msgbox.exec(); << 2299 } << 2300 << 2301 } << 2302 << 2303 void G4OpenInventorQtExaminerViewer::evenOutR << 2304 { << 2305 if(refParticleTrajectory.empty()) << 2306 return; << 2307 << 2308 SbVec3f p1, p2, p3, dirNow, dirNxt, dir, p << 2309 float avgDistBtwPts = 0; << 2310 float totalDistBtwPts = 0; << 2311 std::vector<SbVec3f> newRefParticleTraject << 2312 SbVec3f refPoint; << 2313 std::size_t size = refParticleTrajectory.s << 2314 int numOfPts = 0; << 2315 for (std::size_t i = 0; i < size; ++i) { << 2316 p1 = refParticleTrajectory[i]; << 2317 p2 = refParticleTrajectory[i + 1]; << 2318 if (p1 == p2) << 2319 continue; << 2320 numOfPts++; << 2321 totalDistBtwPts += (p2 - p1).length(); << 2322 } << 2323 // Nothing useful to do (and fix Coverity) << 2324 if (numOfPts <= 2) return; << 2325 << 2326 avgDistBtwPts = totalDistBtwPts / numOfPts << 2327 float minDistAllowed = 0.75 * avgDistBtwPt << 2328 // float maxDistAllowed = 1.25 * avgDistBt << 2329 << 2330 float x, y, z; << 2331 std::size_t i = 0, j = 0; << 2332 while (i < size) { << 2333 p1 = refParticleTrajectory[i]; << 2334 p2 = refParticleTrajectory[i + 1]; << 2335 << 2336 refPoint = p1; << 2337 p1.getValue(x, y, z); << 2338 << 2339 newRefParticleTrajectory.push_back(refP << 2340 << 2341 j = i; << 2342 while ((p2 - p1).length() < minDistAllo << 2343 j++; << 2344 << 2345 p1 = refParticleTrajectory[j]; << 2346 p2 = refParticleTrajectory[j + 1]; << 2347 } << 2348 if (j != i) << 2349 i = j + 1; << 2350 else << 2351 i++; << 2352 } << 2353 << 2354 refParticleTrajectory.clear(); << 2355 refParticleTrajectory = newRefParticleTraj << 2356 } << 2357 << 2358 << 2359 void G4OpenInventorQtExaminerViewer::saveCurC << 2360 { << 2361 SoCamera *cam = getCamera(); << 2362 camB4Animation.viewportMapping = cam->view << 2363 camB4Animation.position = cam->position.ge << 2364 camB4Animation.orientation = cam->orientat << 2365 camB4Animation.aspectRatio = cam->aspectRa << 2366 camB4Animation.nearDistance = cam->nearDis << 2367 camB4Animation.farDistance = cam->farDista << 2368 camB4Animation.focalDistance = cam->focalD << 2369 << 2370 if (cam->isOfType(SoPerspectiveCamera::get << 2371 camB4Animation.height = << 2372 ((SoPerspectiveCamera *) cam)->heigh << 2373 camB4Animation.camType = PERSPECTIVE; << 2374 } else if (cam->isOfType(SoOrthographicCam << 2375 camB4Animation.height = << 2376 ((SoOrthographicCamera *) cam)->heig << 2377 camB4Animation.camType = ORTHOGRAPHIC; << 2378 } << 2379 } << 2380 << 2381 << 2382 void G4OpenInventorQtExaminerViewer::restoreC << 2383 { << 2384 SoCamera *cam = getCamera(); << 2385 << 2386 cam->viewportMapping = camB4Animation.view << 2387 cam->position = camB4Animation.position; << 2388 cam->orientation = camB4Animation.orientat << 2389 cam->aspectRatio = camB4Animation.aspectRa << 2390 cam->nearDistance = camB4Animation.nearDis << 2391 cam->farDistance = camB4Animation.farDista << 2392 cam->focalDistance = camB4Animation.focalD << 2393 << 2394 if (cam->isOfType(SoPerspectiveCamera::get << 2395 if (camB4Animation.camType == ORTHOGRAP << 2396 toggleCameraType(); << 2397 cam = getCamera(); << 2398 ((SoOrthographicCamera *) cam)->heig << 2399 << 2400 } else << 2401 ((SoPerspectiveCamera *) cam)->heigh << 2402 << 2403 } else if (cam->isOfType(SoOrthographicCam << 2404 if (camB4Animation.camType == PERSPECTI << 2405 toggleCameraType(); << 2406 cam = getCamera(); << 2407 ((SoPerspectiveCamera *) cam)->heigh << 2408 << 2409 } else << 2410 ((SoOrthographicCamera *) cam)->heig << 2411 << 2412 } << 2413 } << 2414 << 2415 << 2416 void G4OpenInventorQtExaminerViewer::animateS << 2417 << 2418 { << 2419 SbTime curTime = SbTime::getTimeOfDay(); << 2420 G4OpenInventorQtExaminerViewer* This = (G4 << 2421 << 2422 SoTimerSensor* s = (SoTimerSensor*) sensor << 2423 << 2424 float t = float((curTime - s->getBaseTime( << 2425 / This->animateBtwPtsPeriod; << 2426 << 2427 if ((t > 1.0f) || (t + s->getInterval().ge << 2428 t = 1.0f; << 2429 SbBool end = (t == 1.0f); << 2430 << 2431 if (end) { << 2432 This->animateSensorRotation->unschedule << 2433 if(This->rotCnt) { << 2434 // rotations left << 2435 This->rotateCamera(); << 2436 } << 2437 else { << 2438 // rotation over << 2439 This->currentState = This->prevState << 2440 return; << 2441 } << 2442 } << 2443 << 2444 } << 2445 << 2446 << 2447 // Called repeatedly during reference particl << 2448 << 2449 void G4OpenInventorQtExaminerViewer::animateS << 2450 << 2451 { << 2452 SbTime curTime = SbTime::getTimeOfDay(); << 2453 G4OpenInventorQtExaminerViewer* This = (G4 << 2454 SoCamera *cam = This->getCamera(); << 2455 SoTimerSensor* s = (SoTimerSensor*) sensor << 2456 << 2457 float t = float((curTime - s->getBaseTime( << 2458 / This->animateBtwPtsPeriod; << 2459 << 2460 if ((t > 1.0f) || (t + s->getInterval().ge << 2461 t = 1.0f; << 2462 SbBool end = (t == 1.0f); << 2463 << 2464 cam->orientation = SbRotation::slerp(This- << 2465 cam->position = This->camStartPos + (This- << 2466 << 2467 if (end) { << 2468 This->animateSensor->unschedule(); << 2469 << 2470 if (This->currentState == ANIMATION) { << 2471 if (This->refParticleIdx < (int) (Th << 2472 This->animateRefParticle(); << 2473 else { << 2474 This->animateBtwPtsPeriod = MIN_S << 2475 This->speedStep = START_STEP; << 2476 } << 2477 } << 2478 if (This->currentState == REVERSED_ANIM << 2479 if (This->refParticleIdx >= 1) << 2480 This->animateRefParticle(); << 2481 else { << 2482 This->animateBtwPtsPeriod = MIN_S << 2483 This->speedStep = START_STEP; << 2484 } << 2485 } << 2486 } << 2487 } << 2488 << 2489 << 2490 void G4OpenInventorQtExaminerViewer::setStart << 2491 { << 2492 if (SoQtExaminerViewer::isAnimating()) << 2493 stopAnimating(); << 2494 << 2495 SbRotation rot; << 2496 SbVec3f p1{0.0, 0.0, 0.0}, p2{0.0, 0.0, 0. << 2497 float x1, y1, z1, x2, y2, z2; << 2498 << 2499 if (currentState == ANIMATION) { << 2500 p1 = refParticleTrajectory[refParticleI << 2501 p2 = refParticleTrajectory[++(refPartic << 2502 } else if (currentState == REVERSED_ANIMAT << 2503 p2 = refParticleTrajectory[refParticleI << 2504 p1 = refParticleTrajectory[--(refPartic << 2505 } else if (currentState == PAUSED_ANIMATIO << 2506 if (refParticleIdx < (int) refParticleT << 2507 p1 = refParticleTrajectory[refPartic << 2508 p2 = refParticleTrajectory[refPartic << 2509 } else { << 2510 p1 = refParticleTrajectory[refPartic << 2511 p2 = refParticleTrajectory[refPartic << 2512 } << 2513 } << 2514 p1.getValue(x1, y1, z1); << 2515 p2.getValue(x2, y2, z2); << 2516 << 2517 camD = p2 - p1; << 2518 camD.normalize(); << 2519 << 2520 p2_tmp.setValue(x2, y1, z2); << 2521 camD_tmp = p2_tmp - p1; << 2522 camD_tmp.normalize(); << 2523 << 2524 camUpV.setValue(0, 1, 0); << 2525 rot.setValue(camD_tmp, camD); << 2526 rot.multVec(camUpV, camUpV); << 2527 << 2528 leftRightAxis = camD.cross(camUpV); << 2529 << 2530 myCam->position = p1; << 2531 myCam->pointAt(p2, camUpV); << 2532 << 2533 // Update camera position << 2534 p1 = p1 + (up_down * camUpV) + (left_right << 2535 myCam->position = p1; << 2536 // FWJ Try look-ahead here << 2537 int idx = refParticleIdx + pathLookahead; << 2538 idx = std::min(idx, (int)refParticleTrajec << 2539 myCam->pointAt(refParticleTrajectory[idx], << 2540 // myCam->pointAt(refParticleTrajectory[ << 2541 myCam->focalDistance = 0.1f; << 2542 } << 2543 << 2544 << 2545 void G4OpenInventorQtExaminerViewer::gotoRefP << 2546 { << 2547 G4OpenInventorQtExaminerViewer::ToolsRefPa << 2548 } << 2549 << 2550 << 2551 void G4OpenInventorQtExaminerViewer::ToolsRef << 2552 { << 2553 if (!refParticleTrajectory.size()) { << 2554 QMessageBox msgbox; << 2555 msgbox.setFont(*font); << 2556 QString messagetxt = "No current refere << 2557 msgbox.setText(messagetxt); << 2558 msgbox.exec(); << 2559 return; << 2560 } << 2561 << 2562 if (currentState == ROTATING) << 2563 return; << 2564 if (currentState == ANIMATION || currentSt << 2565 || currentState == PAUSED_ANIMATION) { << 2566 if (animateSensor->isScheduled()) << 2567 animateSensor->unschedule(); << 2568 setSuperimpositionEnabled(superimpositi << 2569 maxSpeed = 0.0f; << 2570 scheduleRedraw(); << 2571 } else { << 2572 saveCurCamera(); << 2573 prevState = currentState; << 2574 prevRefIdx = refParticleIdx; << 2575 } << 2576 << 2577 if (SoQtExaminerViewer::isAnimating()) << 2578 stopAnimating(); << 2579 << 2580 up_down = 0; << 2581 left_right = 0; << 2582 step = 1; << 2583 << 2584 refParticleIdx = 0; << 2585 currentState = BEAMLINE; << 2586 setSuperimpositionEnabled(superimposition, << 2587 axisSwitch->whichChild.setValue(SO_SWITCH_ << 2588 animSpeedOutlineSwitch->whichChild.setValu << 2589 animSpeedSwitch->whichChild.setValue(SO_SW << 2590 scheduleRedraw(); << 2591 << 2592 // FWJ Disabled: this is set in moveCamera << 2593 // Zoom in << 2594 // SoCamera *cam = getCamera(); << 2595 // cam->focalDistance = 0.1f; << 2596 << 2597 prevParticleDir = SbVec3f(0,0,0); << 2598 << 2599 //Default zoom << 2600 SbVec3f p1 = refParticleTrajectory[0]; << 2601 SbVec3f pN = refParticleTrajectory[refPart << 2602 distance = (pN - p1).length() / 10; << 2603 << 2604 moveCamera(distance, true); << 2605 } << 2606 << 2607 << 2608 void G4OpenInventorQtExaminerViewer::ToolsRef << 2609 { << 2610 invertRefPath(); << 2611 } << 2612 << 2613 << 2614 void G4OpenInventorQtExaminerViewer::invertRe << 2615 { << 2616 std::reverse(refParticleTrajectory.begin() << 2617 refParticleTrajectory.end()); << 2618 setReferencePathZPos(); << 2619 sortElements(); << 2620 } << 2621 << 2622 << 2623 void G4OpenInventorQtExaminerViewer::animateR << 2624 { << 2625 SoCamera *cam = getCamera(); << 2626 << 2627 camStartPos = cam->position.getValue(); << 2628 camStartOrient = cam->orientation.getValue << 2629 << 2630 if (currentState != BEAMLINE) << 2631 setStartingPtForAnimation(); << 2632 << 2633 camEndPos = myCam->position.getValue(); << 2634 camEndOrient = myCam->orientation.getValue << 2635 << 2636 if (animateSensor->isScheduled()) << 2637 animateSensor->unschedule(); << 2638 << 2639 animateSensor->setBaseTime(SbTime::getTime << 2640 animateSensor->setInterval(SbTime(0.02)); << 2641 << 2642 animateSensor->schedule(); << 2643 } << 2644 << 2645 << 2646 #if QT_VERSION < 0x060000 << 2647 void G4OpenInventorQtExaminerViewer::addEscap << 2648 { << 2649 escapeCallback = callback; << 2650 } << 2651 #endif << 2652 << 2653 void G4OpenInventorQtExaminerViewer::sceneCha << 2654 { << 2655 // FWJ DEBUG << 2656 // G4cout << "SCENE CHANGE callback" << << 2657 // NOTE: could/should be disabled during a << 2658 << 2659 G4OpenInventorQtExaminerViewer* This = << 2660 (G4OpenInventorQtExaminerViewer*)userDa << 2661 if(This->newEvents) { << 2662 This->findAndSetRefPath(); << 2663 This->newEvents = false; << 2664 } << 2665 } << 2666 << 2667 << 2668 //////////////////////////////////// BOOKMARK << 2669 << 2670 // Adds bookmarks to listsDialog. << 2671 << 2672 void G4OpenInventorQtExaminerViewer::addViewP << 2673 { << 2674 std::size_t size = viewPtList.size(); << 2675 if (!size) return; << 2676 << 2677 for (std::size_t i = 0; i < size; ++i) { << 2678 #if QT_VERSION < 0x060000 << 2679 new QListWidgetItem(viewPtList[i].viewP << 2680 AuxWindowDialog->li << 2681 #else << 2682 new QListWidgetItem(viewPtList[i].viewP << 2683 AuxWindowDialog->li << 2684 #endif << 2685 } << 2686 } << 2687 << 2688 << 2689 // Converts a string type word into a float t << 2690 << 2691 template<class T> << 2692 void G4OpenInventorQtExaminerViewer::parseStr << 2693 << 2694 { << 2695 std::istringstream str(s); << 2696 if ((str >> t).fail()) << 2697 error = true; << 2698 } << 2699 << 2700 << 2701 void << 2702 G4OpenInventorQtExaminerViewer::FileOpenBookm << 2703 { << 2704 // FWJ DEBUG << 2705 // G4cout << "File: Open Bookmark File C << 2706 QFileDialog filedialog(getParentWidget(), << 2707 filedialog.setFileMode(QFileDialog::Existi << 2708 filedialog.setFont(*font); << 2709 if (!filedialog.exec()) return; << 2710 QStringList filenameinlist = filedialog.se << 2711 QString filenamein = filenameinlist[0]; << 2712 << 2713 fileIn.close(); << 2714 fileIn.open(qPrintable(filenamein)); << 2715 if (fileIn.fail()) { << 2716 QMessageBox msgbox; << 2717 msgbox.setFont(*font); << 2718 QString messagetxt = "Error opening fil << 2719 messagetxt.append(filenamein); << 2720 msgbox.setText(messagetxt); << 2721 msgbox.exec(); << 2722 // G4cout << "ERROR opening file " << 2723 fileIn.clear(); << 2724 return; << 2725 } << 2726 // Opens a file without erasing it << 2727 cleanUpAfterPrevFile(); << 2728 << 2729 if (!loadViewPts()) { << 2730 QMessageBox msgbox; << 2731 msgbox.setFont(*font); << 2732 QString messagetxt = "Error reading boo << 2733 messagetxt.append(filenamein); << 2734 msgbox.setText(messagetxt); << 2735 msgbox.exec(); << 2736 // G4cout << "ERROR reading bookma << 2737 fileIn.clear(); << 2738 return; << 2739 } << 2740 << 2741 fileName = qPrintable(filenamein); << 2742 fileOut.open(fileName.c_str(), std::ios::i << 2743 fileOut.seekp(0, std::ios::end); << 2744 << 2745 addViewPoints(); << 2746 << 2747 // LATER: display filename in lists window << 2748 << 2749 fileIn.close(); << 2750 fileIn.clear(); << 2751 } << 2752 << 2753 // Called before loading a new viewpoint file << 2754 // Resets member fields to default values. << 2755 << 2756 void G4OpenInventorQtExaminerViewer::cleanUpA << 2757 { << 2758 viewPtIdx = -1; << 2759 viewPtList.clear(); << 2760 // setSuperimpositionEnabled(superimposi << 2761 // scheduleRedraw(); << 2762 currentState = GENERAL; << 2763 if (fileOut.is_open()) fileOut.close(); << 2764 << 2765 AuxWindowDialog->listWidget->clear(); << 2766 AuxWindowDialog->lineEdit->setText(QString << 2767 } << 2768 << 2769 << 2770 void << 2771 G4OpenInventorQtExaminerViewer::FileNewBookma << 2772 { << 2773 // G4cout << "File: Open New Bookmark Fi << 2774 QFileDialog filedialog(getParentWidget(), << 2775 filedialog.setFileMode(QFileDialog::AnyFil << 2776 // To enable confirmation of overwriting << 2777 filedialog.setAcceptMode(QFileDialog::Acce << 2778 // But change the "Save" button text << 2779 filedialog.setLabelText(QFileDialog::Accep << 2780 filedialog.setFont(*font); << 2781 if (!filedialog.exec()) return; << 2782 QStringList filenameinlist = filedialog.se << 2783 QString filenamein = filenameinlist[0]; << 2784 << 2785 cleanUpAfterPrevFile(); << 2786 fileName = qPrintable(filenamein); << 2787 fileOut.open(fileName.c_str()); << 2788 if (fileOut.fail()) { << 2789 QMessageBox msgbox; << 2790 msgbox.setFont(*font); << 2791 QString messagetxt = "Error opening new << 2792 messagetxt.append(filenamein); << 2793 msgbox.setText(messagetxt); << 2794 msgbox.exec(); << 2795 // G4cout << "ERROR opening new bookmar << 2796 } << 2797 } << 2798 << 2799 << 2800 void << 2801 G4OpenInventorQtExaminerViewer::ToolsAnimateR << 2802 { << 2803 // G4cout << "Tools: Animate Ref Particl << 2804 if (!refParticleTrajectory.size()) { << 2805 returnToAnim = true; << 2806 G4warn << "No Reference Trajectory" << << 2807 return; << 2808 } << 2809 << 2810 ////////////////////////////////////////// << 2811 setSuperimpositionEnabled(superimposition, << 2812 maxSpeed = SPEED_INDICATOR_STEP; << 2813 axisSwitch->whichChild.setValue(SO_SWITCH_ << 2814 animSpeedOutlineSwitch->whichChild.setValu << 2815 animSpeedSwitch->whichChild.setValue(SO_SW << 2816 scheduleRedraw(); << 2817 ////////////////////////////////////////// << 2818 << 2819 SoCamera *cam = getCamera(); << 2820 // SbVec3f camDirOld, camDirNew, camDirN << 2821 << 2822 if (currentState == ANIMATION || currentSt << 2823 || currentState == ROTATING) << 2824 return; << 2825 << 2826 if (currentState != PAUSED_ANIMATION) { << 2827 << 2828 saveCurCamera(); << 2829 prevState = currentState; << 2830 prevRefIdx = refParticleIdx; << 2831 << 2832 if (cam->isOfType(SoOrthographicCamera: << 2833 toggleCameraType(); << 2834 cam = getCamera(); << 2835 } << 2836 << 2837 refParticleIdx = 0; // Set the camera t << 2838 animateBtwPtsPeriod = MIN_SPEED; << 2839 speedStep = START_STEP; << 2840 left_right = up_down = 0; << 2841 << 2842 cam->focalDistance = 0.1f; << 2843 ((SoPerspectiveCamera *) cam)->heightAn << 2844 } << 2845 << 2846 currentState = ANIMATION; << 2847 setStartingPtForAnimation(); << 2848 << 2849 cam->position = (myCam)->position.getValue << 2850 cam->orientation = (myCam)->orientation.ge << 2851 animateRefParticle(); // Animate the camer << 2852 } << 2853 << 2854 << 2855 void << 2856 G4OpenInventorQtExaminerViewer::SaveViewPtCB( << 2857 { << 2858 // G4cout << "AppButton: Save Viewpoint << 2859 // First get viewpoint name ... << 2860 // EMULATING getViewPtNameCB ... << 2861 // bool ok; << 2862 // Note QString() returns an empty string << 2863 #if 0x060000 <= QT_VERSION << 2864 //G.Barrand: map the AuxWindow here. Then << 2865 // and not systematically when c << 2866 // Moreover, if "closing" the Au << 2867 // it permits to map it back. << 2868 AuxWindow->show(); << 2869 AuxWindow->raise(); << 2870 AuxWindow->activateWindow(); << 2871 #endif << 2872 << 2873 // NONE OF THE FOLLOWING CHANGES THE FONT: << 2874 QInputDialog* inputdialog = new QInputDial << 2875 inputdialog->setFont(*font); << 2876 inputdialog->setWindowTitle(tr("Enter a na << 2877 inputdialog->setLabelText("Bookmark name") << 2878 // inputdialog->setTextEchoMode(QLineEdi << 2879 inputdialog->adjustSize(); << 2880 QString namein; << 2881 if (inputdialog->exec() == QDialog::Accept << 2882 namein=inputdialog->textValue().trimmed << 2883 else << 2884 return; << 2885 if (namein.isEmpty()) return; << 2886 << 2887 // This easier approach failed: unable to << 2888 // QString namein = << 2889 // QInputDialog::getText(getParentWid << 2890 // tr("Enter a << 2891 // tr("Bookmark << 2892 // QString(), & << 2893 << 2894 namein.truncate(MAX_VP_NAME); << 2895 << 2896 char* name = strdup(qPrintable(namein)); << 2897 << 2898 // FWJ DEBUG << 2899 // G4cout << "QString is " << qPrintable << 2900 // G4cout << "char[] is " << name << G4 << 2901 << 2902 for (int i = 0; i < (int)viewPtList.size() << 2903 #if QT_VERSION < 0x060000 << 2904 if (!strcmp(name, viewPtList[i].viewPtN << 2905 #else << 2906 if (!strcmp(name, viewPtList[i].viewPtN << 2907 #endif << 2908 QMessageBox msgbox; << 2909 msgbox.setText("Bookmark name is alr << 2910 msgbox.exec(); << 2911 free(name); << 2912 return; << 2913 } << 2914 } << 2915 << 2916 if (viewPtIdx == -1) viewPtIdx = 0; << 2917 saveViewPt(name); << 2918 << 2919 saveViewPtItem = new QListWidgetItem(namei << 2920 AuxWi << 2921 AuxWindowDialog->listWidget->setCurrentIte << 2922 AuxWindowDialog->lineEdit->setText(namein) << 2923 free(name); << 2924 } << 2925 << 2926 << 2927 // Saves current camera parameters to a viewp << 2928 << 2929 void G4OpenInventorQtExaminerViewer::saveView << 2930 { << 2931 SbVec3f axis; << 2932 viewPtData tmp; << 2933 float x, y, z, angle; << 2934 SoCamera* camera = getCamera(); << 2935 << 2936 // NOTE: Xt VSN increments this at end of << 2937 // viewPtIdx++; << 2938 << 2939 // FWJ DEBUG << 2940 // G4cout << "saveViewPt: saving bookmar << 2941 // << G4endl; << 2942 << 2943 if (viewPtList.size() == 0) { << 2944 writeViewPtIdx(); << 2945 } << 2946 << 2947 #if QT_VERSION < 0x060000 << 2948 tmp.viewPtName = name; << 2949 #else << 2950 tmp.viewPtName = std::string(name); << 2951 #endif << 2952 tmp.viewportMapping = camera->viewportMapp << 2953 tmp.position = camera->position.getValue() << 2954 tmp.orientation = camera->orientation.getV << 2955 tmp.aspectRatio = camera->aspectRatio.getV << 2956 tmp.nearDistance = camera->nearDistance.ge << 2957 tmp.farDistance = camera->farDistance.getV << 2958 tmp.focalDistance = camera->focalDistance. << 2959 << 2960 // Save camera height (changed by zooming) << 2961 if (camera->isOfType(SoPerspectiveCamera:: << 2962 tmp.height = ((SoPerspectiveCamera *) c << 2963 tmp.camType = PERSPECTIVE; << 2964 } else if (camera->isOfType(SoOrthographic << 2965 tmp.height = ((SoOrthographicCamera *) << 2966 tmp.camType = ORTHOGRAPHIC; << 2967 } else { << 2968 SoDebugError::post("G4OpenInventorQtExa << 2969 "Only Perspective an << 2970 return; << 2971 } << 2972 << 2973 viewPtList.push_back(tmp); << 2974 << 2975 // Now save the view point to a .txt file << 2976 // FWJ DEBUG << 2977 // G4cout << "saveViewPt: writing to Bookm << 2978 << 2979 std::string vpName = name; << 2980 << 2981 while ((int) vpName.size() <= MAX_VP_NAME) << 2982 vpName += " "; << 2983 << 2984 fileOut << vpName << std::endl; << 2985 tmp.position.getValue(x, y, z); << 2986 fileOut << x << " " << y << " " << z << st << 2987 << 2988 // Reusing x, y and z for storing the axis << 2989 tmp.orientation.getValue(axis, angle); << 2990 axis.getValue(x, y, z); << 2991 fileOut << x << " " << y << " " << z << " << 2992 << 2993 fileOut << tmp.camType << " " << tmp.heigh << 2994 fileOut << tmp.focalDistance << " "; << 2995 fileOut << tmp.nearDistance << " "; << 2996 fileOut << tmp.farDistance << std::endl; << 2997 fileOut << tmp.viewportMapping << " "; << 2998 fileOut << tmp.aspectRatio << "\n" << std: << 2999 fileOut.flush(); << 3000 << 3001 viewPtIdx++; << 3002 << 3003 // FWJ DEBUG << 3004 // G4cout << "saveViewPt: finished writi << 3005 // " Next viewPtIdx is " << viewPtId << 3006 } 70 } 3007 71 3008 72 3009 // Updates the viewPtIdx in a viewpoint file. << 73 // FWJ try to handle events as in XtExaminerViewer 3010 << 74 SbBool 3011 void G4OpenInventorQtExaminerViewer::writeVie << 3012 { << 3013 std::string idxStr; << 3014 std::stringstream out; << 3015 << 3016 out << viewPtIdx; << 3017 idxStr = out.str(); << 3018 fileOut.seekp(0, std::ios::beg); << 3019 << 3020 while ((int) idxStr.length() < MAX_VP_IDX) << 3021 idxStr += " "; << 3022 } << 3023 << 3024 // FWJ DEBUG << 3025 // G4cout << "writeViewPtIdx: " << viewP << 3026 fileOut << idxStr << "\n"; << 3027 fileOut.flush(); << 3028 fileOut.seekp(0, std::ios::end); << 3029 } << 3030 << 3031 << 3032 // Receives the name of the bookmark clicked << 3033 << 3034 void G4OpenInventorQtExaminerViewer::LoadBook << 3035 { << 3036 // FWJ DEBUG << 3037 // G4cout << "AuxWindow: listWidget Load << 3038 << 3039 for (int i = 0; i < (int)viewPtList.size() << 3040 #if QT_VERSION < 0x060000 << 3041 if (!strcmp(viewPtList[i].viewPtName, q << 3042 #else << 3043 if (!strcmp(viewPtList[i].viewPtName.c_ << 3044 #endif << 3045 viewPtIdx = i; << 3046 break; << 3047 } << 3048 } << 3049 // G4cout << " FOUND viewPtIdx " << vie << 3050 << 3051 writeViewPtIdx(); << 3052 setViewPt(); << 3053 AuxWindowDialog->lineEdit->setText(item->t << 3054 } << 3055 << 3056 << 3057 // Sets the viewpoint based on camera data th << 3058 << 3059 void G4OpenInventorQtExaminerViewer::setViewP << 3060 { << 3061 if (currentState == ANIMATION || currentSt << 3062 || currentState == ROTATING) { << 3063 if (animateSensor->isScheduled()) anima << 3064 setSuperimpositionEnabled(superimpositi << 3065 maxSpeed = 0.0f; << 3066 scheduleRedraw(); << 3067 } << 3068 << 3069 SoCamera * camera = getCamera(); << 3070 if (camera == NULL) { << 3071 G4warn << "setViewPt: Camera is null. U << 3072 G4endl; << 3073 // String dialogName = (char *) "M << 3074 // std::string msg = "Camera is nu << 3075 // warningMsgDialog(msg, dialogNam << 3076 return; << 3077 } << 3078 << 3079 if (!viewPtList.size()) { << 3080 G4warn << "setViewPt: There are no view << 3081 // String dialogName = (char *) "M << 3082 // std::string msg = "There are no << 3083 // warningMsgDialog(msg, dialogNam << 3084 return; << 3085 } << 3086 << 3087 if (SoQtExaminerViewer::isAnimating()) sto << 3088 << 3089 if (currentState != VIEWPOINT) { << 3090 currentState = VIEWPOINT; << 3091 /////////////////////////////////////// << 3092 setSuperimpositionEnabled(superimpositi << 3093 axisSwitch->whichChild.setValue(SO_SWIT << 3094 animSpeedOutlineSwitch->whichChild.setV << 3095 animSpeedSwitch->whichChild.setValue(SO << 3096 scheduleRedraw(); << 3097 /////////////////////////////////////// << 3098 } << 3099 << 3100 #if QT_VERSION < 0x060000 << 3101 #else << 3102 if((viewPtIdx<0)||(viewPtIdx>=int(viewPtLi << 3103 G4warn << "setViewPt: inconsitent viewPt << 3104 return; << 3105 } << 3106 #endif << 3107 << 3108 curViewPtName = viewPtList[viewPtIdx].view << 3109 camera->viewportMapping = viewPtList[viewP << 3110 camera->position = viewPtList[viewPtIdx].p << 3111 camera->orientation = viewPtList[viewPtIdx << 3112 camera->aspectRatio = viewPtList[viewPtIdx << 3113 camera->nearDistance = viewPtList[viewPtId << 3114 camera->farDistance = viewPtList[viewPtIdx << 3115 camera->focalDistance = viewPtList[viewPtI << 3116 << 3117 // Restore camera height (changed by zoomi << 3118 if (camera->isOfType(SoPerspectiveCamera:: << 3119 if (viewPtList[viewPtIdx].camType == OR << 3120 toggleCameraType(); << 3121 camera = getCamera(); << 3122 ((SoOrthographicCamera *) camera)->h << 3123 << 3124 } else << 3125 ((SoPerspectiveCamera *) camera)->he << 3126 << 3127 } else if (camera->isOfType(SoOrthographic << 3128 if (viewPtList[viewPtIdx].camType == PE << 3129 toggleCameraType(); << 3130 camera = getCamera(); << 3131 ((SoPerspectiveCamera *) camera)->he << 3132 << 3133 } else << 3134 ((SoOrthographicCamera *) camera)->h << 3135 << 3136 } else { << 3137 SoDebugError::post("G4OpenInventorQtExa << 3138 "Only Perspective an << 3139 return; << 3140 } << 3141 << 3142 } << 3143 << 3144 << 3145 void G4OpenInventorQtExaminerViewer::NextView << 3146 { << 3147 // FWJ DEBUG << 3148 // G4cout << "App Button: nextViewPt CAL << 3149 << 3150 if (!viewPtList.size()) return; << 3151 if (viewPtIdx >= (int)viewPtList.size() - << 3152 viewPtIdx = 0; << 3153 #if 0x060000 <= QT_VERSION << 3154 else if (viewPtIdx<0) << 3155 viewPtIdx = 0; << 3156 #endif << 3157 else << 3158 viewPtIdx++; << 3159 << 3160 writeViewPtIdx(); << 3161 setViewPt(); << 3162 #if QT_VERSION < 0x060000 << 3163 char* viewptname = viewPtList[viewPtIdx].v << 3164 AuxWindowDialog->lineEdit->setText(QString << 3165 #else << 3166 AuxWindowDialog->lineEdit->setText(QString << 3167 #endif << 3168 } << 3169 << 3170 void G4OpenInventorQtExaminerViewer::PrevView << 3171 { << 3172 // FWJ DEBUG << 3173 // G4cout << "App Button: prevViewPt CAL << 3174 << 3175 if (!viewPtList.size()) return; << 3176 #if QT_VERSION < 0x060000 << 3177 if (viewPtIdx == 0) << 3178 #else << 3179 if (viewPtIdx <= 0) << 3180 #endif << 3181 viewPtIdx = (int) viewPtList.size() - 1 << 3182 else << 3183 viewPtIdx--; << 3184 << 3185 writeViewPtIdx(); << 3186 setViewPt(); << 3187 #if QT_VERSION < 0x060000 << 3188 char* viewptname = viewPtList[viewPtIdx].v << 3189 AuxWindowDialog->lineEdit->setText(QString << 3190 #else << 3191 AuxWindowDialog->lineEdit->setText(QString << 3192 #endif << 3193 } << 3194 << 3195 << 3196 void G4OpenInventorQtExaminerViewer::AbbrOutp << 3197 { << 3198 // FWJ DEBUG << 3199 // G4cout << "App Button: abbrOutput CAL << 3200 << 3201 abbrOutputFlag = checked; << 3202 } << 3203 << 3204 << 3205 void G4OpenInventorQtExaminerViewer::PickRefP << 3206 { << 3207 // FWJ DEBUG << 3208 // G4cout << "App Button: pickRefPath CA << 3209 << 3210 // Save viewing state and go to picking mo << 3211 viewingBeforePickRef = isViewing(); << 3212 if(isViewing()) << 3213 setViewing(false); << 3214 setComponentCursor(SoQtCursor(SoQtCursor:: << 3215 pickRefPathFlag = true; << 3216 } << 3217 << 3218 << 3219 void G4OpenInventorQtExaminerViewer::SwitchWi << 3220 { << 3221 // FWJ DEBUG << 3222 // G4cout << "App Button: switchWireFram << 3223 << 3224 // if (switchWireFrameButton->isDown()) << 3225 if (checked) { << 3226 setDrawStyle(SoQtViewer::STILL, SoQtVie << 3227 setDrawStyle(SoQtViewer::INTERACTIVE, S << 3228 } else { << 3229 setDrawStyle(SoQtViewer::STILL, SoQtVie << 3230 setDrawStyle(SoQtViewer::INTERACTIVE, << 3231 SoQtViewer::VIEW_SAM << 3232 } << 3233 } << 3234 << 3235 << 3236 void G4OpenInventorQtExaminerViewer::SwitchAx << 3237 { << 3238 // FWJ DEBUG << 3239 // G4cout << "App Button: switchAxes CAL << 3240 setFeedbackVisibility(checked); << 3241 // if (checked) { << 3242 // setFeedbackVisibility(TRUE); << 3243 // } else { << 3244 // setFeedbackVisibility(FALSE); << 3245 // } << 3246 } << 3247 << 3248 << 3249 void G4OpenInventorQtExaminerViewer::DetachCB << 3250 { << 3251 #if QT_VERSION < 0x060000 << 3252 // FWJ DEBUG << 3253 // G4cout << "App Button: detach CALLBAC << 3254 uiQt->GetViewerTabWidget()->removeTab(uiQt << 3255 viewerParent->setParent(viewerParent2); << 3256 removeAppPushButton(detachButton); << 3257 show(); << 3258 #else << 3259 //G.Barrand: have the viewer in a detached << 3260 // We have the title window refl << 3261 // it comes from, then "Detached << 3262 // Ask to destroy the detached v << 3263 // of closing the window with th << 3264 // we have a dandling hidden vie << 3265 // to map it again. << 3266 G4int index = -1; << 3267 {int tabn = uiQt->GetViewerTabWidget()->cou << 3268 for (G4int c = 0; c < tabn; ++c) { << 3269 if (uiQt->GetViewerTabWidget()->tabText( << 3270 index = c; << 3271 } << 3272 }} << 3273 if(index==(-1)) return; << 3274 removeAppPushButton(detachButton); << 3275 uiQt->GetViewerTabWidget()->removeTab(inde << 3276 {short w,h; << 3277 getSize().getValue(w,h); << 3278 QWidget* dialog = new QDialog(); << 3279 dialog->setWindowTitle(QString("Detached " << 3280 dialog->setAttribute(Qt::WA_DeleteOnClose) << 3281 {QHBoxLayout* layout = new QHBoxLayout(); << 3282 layout->setContentsMargins(0,0,0,0); << 3283 layout->setSpacing(0); << 3284 layout->addWidget(getParentWidget()); << 3285 dialog->setLayout(layout);} << 3286 dialog->resize(w,h); << 3287 getParentWidget()->show(); << 3288 dialog->show(); << 3289 } << 3290 #endif << 3291 } << 3292 << 3293 << 3294 void G4OpenInventorQtExaminerViewer::DeleteBo << 3295 { << 3296 // FWJ DEBUG << 3297 // G4cout << "Delete Button: DeleteBookm << 3298 << 3299 // Maybe nothing selected yet << 3300 QListWidgetItem* listitem = AuxWindowDialo << 3301 if (!listitem) return; << 3302 if (!(listitem->isSelected())) return; << 3303 << 3304 QString vpnamein = listitem->text(); << 3305 << 3306 char* vpName = strdup(qPrintable(vpnamein) << 3307 // G4cout << "DELETING bookmark " << vpN << 3308 << 3309 deleteViewPt(vpName); << 3310 delete listitem; << 3311 free(vpName); << 3312 } << 3313 << 3314 // Deletes current viewpoint the user is look << 3315 // Updates the input file and bookmarks as we << 3316 << 3317 void G4OpenInventorQtExaminerViewer::deleteVi << 3318 { << 3319 std::string line; << 3320 std::size_t end; << 3321 fileIn.open(fileName.c_str()); << 3322 std::ofstream out("temporaryFile.txt"); << 3323 << 3324 #if QT_VERSION < 0x060000 << 3325 if (!vpName) << 3326 vpName = viewPtList[viewPtIdx].viewPtNa << 3327 #endif << 3328 << 3329 getline(fileIn, line); // Printing the vie << 3330 out << line << "\n"; << 3331 << 3332 while (getline(fileIn, line)) { << 3333 end = line.find_last_not_of(' '); << 3334 line = line.substr(0, end + 1); << 3335 if (!strcmp(line.c_str(), vpName)) { // << 3336 while (line.size()) { << 3337 getline(fileIn, line); << 3338 } << 3339 << 3340 while (getline(fileIn, line)) << 3341 out << line << "\n"; << 3342 } else { << 3343 while (line.size()) { << 3344 out << line << "\n"; << 3345 getline(fileIn, line); << 3346 } << 3347 out << "\n"; << 3348 } << 3349 } << 3350 << 3351 std::size_t idx = 0; // Remove viewpoint f << 3352 std::size_t size = viewPtList.size(); << 3353 while (idx < size) { << 3354 #if QT_VERSION < 0x060000 << 3355 if (!strcmp(viewPtList[idx].viewPtName, << 3356 #else << 3357 if (!strcmp(viewPtList[idx].viewPtName. << 3358 #endif << 3359 viewPtList.erase(viewPtList.begin() << 3360 break; << 3361 } << 3362 idx++; << 3363 } << 3364 << 3365 out.close(); << 3366 fileOut.close(); << 3367 fileIn.clear(); << 3368 fileIn.close(); << 3369 << 3370 // FWJ check return status: error popups n << 3371 int istat = remove(fileName.c_str()); << 3372 if (istat == -1) { << 3373 QMessageBox msgbox; << 3374 msgbox.setFont(*font); << 3375 QString messagetxt = "Error removing bo << 3376 // messagetxt.append(filenamein); << 3377 msgbox.setText(messagetxt); << 3378 msgbox.exec(); << 3379 // G4cout << "Error removing bookm << 3380 } << 3381 istat = rename("temporaryFile.txt", fileNa << 3382 if (istat == -1) { << 3383 QMessageBox msgbox; << 3384 msgbox.setFont(*font); << 3385 QString messagetxt = "Error renaming bo << 3386 // messagetxt.append(filenamein); << 3387 msgbox.setText(messagetxt); << 3388 msgbox.exec(); << 3389 // G4cout << "Error renaming bookm << 3390 } << 3391 fileOut.open(fileName.c_str(), std::ios::i << 3392 fileOut.seekp(0, std::ios::end); << 3393 << 3394 if (!viewPtList.size()) { // viewPtList is << 3395 #if QT_VERSION < 0x060000 << 3396 curViewPtName = (char *) empty.c_str(); << 3397 #else << 3398 curViewPtName.clear(); << 3399 #endif << 3400 scheduleRedraw(); << 3401 } else { << 3402 if (viewPtIdx >= (int) viewPtList.size( << 3403 viewPtIdx--; << 3404 writeViewPtIdx(); << 3405 setViewPt(); << 3406 } << 3407 } << 3408 << 3409 << 3410 void G4OpenInventorQtExaminerViewer::RenameBo << 3411 { << 3412 // FWJ DEBUG << 3413 // G4cout << "Rename Button: RenameBookm << 3414 // Maybe nothing selected yet << 3415 QListWidgetItem* listitem = AuxWindowDialo << 3416 if (!listitem) return; << 3417 if (!(listitem->isSelected())) return; << 3418 << 3419 QString vpnamein = listitem->text(); << 3420 << 3421 QInputDialog* inputdialog = new QInputDial << 3422 inputdialog->setFont(*font); << 3423 inputdialog->setWindowTitle(tr("Enter")); << 3424 inputdialog->setLabelText("New bookmark na << 3425 inputdialog->adjustSize(); << 3426 QString newnamein; << 3427 if (inputdialog->exec() == QDialog::Accept << 3428 newnamein=inputdialog->textValue().trim << 3429 else << 3430 return; << 3431 if (newnamein.isEmpty()) return; << 3432 << 3433 char* newname = strdup(qPrintable(newnamei << 3434 << 3435 std::size_t size = viewPtList.size(); << 3436 for (std::size_t i = 0; i < size; ++i) { << 3437 #if QT_VERSION < 0x060000 << 3438 if (!strcmp(newname, viewPtList[i].view << 3439 #else << 3440 if (!strcmp(newname, viewPtList[i].view << 3441 #endif << 3442 QMessageBox msgbox; << 3443 msgbox.setFont(*font); << 3444 msgbox.setText("Bookmark name is alr << 3445 msgbox.exec(); << 3446 } << 3447 } << 3448 << 3449 // G4cout << "RENAMING to " << newname < << 3450 renameViewPt(newname); << 3451 listitem->setText(QString(newname)); << 3452 AuxWindowDialog->lineEdit->setText(newname << 3453 // if (currentState == VIEWPOINT) << 3454 // scheduleRedraw(); << 3455 << 3456 free(newname); << 3457 } << 3458 << 3459 // Renames currently selected viewpoint. << 3460 << 3461 void G4OpenInventorQtExaminerViewer::renameVi << 3462 { << 3463 std::size_t idx = 0, end, pos; << 3464 std::size_t size = viewPtList.size(); << 3465 std::string line, newName; << 3466 fileIn.open(fileName.c_str()); << 3467 << 3468 newName = vpName; << 3469 while ((int) newName.size() < MAX_VP_NAME) << 3470 newName += " "; << 3471 << 3472 getline(fileIn, line); << 3473 pos = fileIn.tellg(); << 3474 while (getline(fileIn, line)) { << 3475 end = line.find_last_not_of(' '); << 3476 line = line.substr(0, end + 1); << 3477 #if QT_VERSION < 0x060000 << 3478 if (!strcmp(line.c_str(), curViewPtName << 3479 #else << 3480 if (!strcmp(line.c_str(), curViewPtName << 3481 #endif << 3482 fileOut.seekp(pos); << 3483 fileOut << newName; << 3484 fileOut.seekp(0, std::ios::end); // << 3485 break; << 3486 } << 3487 while (line.size()) << 3488 getline(fileIn, line); << 3489 pos = fileIn.tellg(); << 3490 } << 3491 << 3492 fileIn.close(); << 3493 fileIn.clear(); << 3494 << 3495 while (idx < size) { << 3496 #if QT_VERSION < 0x060000 << 3497 if (!strcmp(viewPtList[idx].viewPtName, << 3498 strcpy(viewPtList[idx].viewPtName, v << 3499 #else << 3500 if (!strcmp(viewPtList[idx].viewPtName. << 3501 viewPtList[idx].viewPtName = std::st << 3502 #endif << 3503 break; << 3504 } << 3505 idx++; << 3506 } << 3507 } << 3508 << 3509 << 3510 void G4OpenInventorQtExaminerViewer::SortBook << 3511 { << 3512 // FWJ NOTE: Xt version of this does not w << 3513 << 3514 // G4cout << "Sort Button: SortBookmarks << 3515 << 3516 // FWJ List for sorting << 3517 // The dialog list and bookmark file will << 3518 // Simpler to populate this list from the << 3519 << 3520 std::vector<std::string> charList; << 3521 << 3522 if (viewPtList.size() < 2) return; << 3523 << 3524 // Get current entries from the list << 3525 << 3526 for (int i = 0; i < (int)viewPtList.size() << 3527 << 3528 charList.push_back(viewPtList[i].viewPt << 3529 // G4cout << " Pushed " << i << " << 3530 } << 3531 << 3532 std::sort(charList.begin(), charList.end() << 3533 << 3534 // FWJ POPULATE the new dialog list << 3535 // G4cout << " Populating Bookmark list << 3536 AuxWindowDialog->listWidget->clear(); << 3537 << 3538 for (int i = 0; i < (int)viewPtList.size() << 3539 // viewPtIdx has to be changed to accou << 3540 #if QT_VERSION < 0x060000 << 3541 if (!strcmp(charList[i].c_str(), curVie << 3542 #else << 3543 if (!strcmp(charList[i].c_str(), curVie << 3544 #endif << 3545 viewPtIdx = i; << 3546 new QListWidgetItem(charList[i].c_str() << 3547 << 3548 } << 3549 << 3550 sortViewPts(charList); << 3551 << 3552 } << 3553 << 3554 // Rewrites entire viewpoint file with sorted << 3555 << 3556 void G4OpenInventorQtExaminerViewer::sortView << 3557 { << 3558 SbVec3f axis; << 3559 float x, y, z, angle; << 3560 std::size_t sortIdx = 0, unsortIdx = 0; << 3561 << 3562 if (fileOut.is_open()) << 3563 fileOut.close(); << 3564 << 3565 fileOut.open(fileName.c_str()); // Erase c << 3566 << 3567 writeViewPtIdx(); << 3568 << 3569 std::size_t size = sortedViewPts.size(); << 3570 while (sortIdx < size) { << 3571 while (strcmp(sortedViewPts[sortIdx].c_ << 3572 #if QT_VERSION < 0x060000 << 3573 viewPtList[unsortIdx].vie << 3574 #else << 3575 viewPtList[unsortIdx].vie << 3576 #endif << 3577 unsortIdx++; << 3578 << 3579 std::string vpName = viewPtList[unsortI << 3580 << 3581 while ((int) vpName.size() < MAX_VP_NAM << 3582 vpName += " "; << 3583 fileOut << vpName << std::endl; << 3584 viewPtList[unsortIdx].position.getValue << 3585 fileOut << x << " " << y << " " << z << << 3586 << 3587 // Reusing x, y and z for storing the a << 3588 viewPtList[unsortIdx].orientation.getVa << 3589 axis.getValue(x, y, z); << 3590 fileOut << x << " " << y << " " << z << << 3591 << 3592 fileOut << viewPtList[unsortIdx].camTyp << 3593 << viewPtList[unsortIdx].height << 3594 fileOut << viewPtList[unsortIdx].focalD << 3595 << 3596 fileOut << viewPtList[unsortIdx].nearDi << 3597 << 3598 fileOut << viewPtList[unsortIdx].farDis << 3599 << 3600 fileOut << viewPtList[unsortIdx].viewpo << 3601 fileOut << viewPtList[unsortIdx].aspect << 3602 fileOut.flush(); << 3603 << 3604 unsortIdx = 0; << 3605 sortIdx++; << 3606 } << 3607 } << 3608 << 3609 // Needed to implement mouse wheel zoom direc << 3610 // Does not work with MacOS trackpad: use Coi << 3611 // Emulating private method SoGuiFullViewerP: << 3612 #ifndef __APPLE__ << 3613 void << 3614 G4OpenInventorQtExaminerViewer::zoom(const fl << 3615 { << 3616 float multiplicator = float(std::exp(diffv << 3617 SoCamera *cam = getCamera(); << 3618 << 3619 if (cam->isOfType(SoPerspectiveCamera::get << 3620 const float oldfocaldist = cam->focalDi << 3621 const float newfocaldist = oldfocaldist << 3622 << 3623 SbVec3f direction; << 3624 cam->orientation.getValue().multVec(SbV << 3625 << 3626 const SbVec3f oldpos = cam->position.ge << 3627 const SbVec3f newpos = oldpos + (newfoc << 3628 cam->position = newpos; << 3629 cam->focalDistance = newfocaldist; << 3630 } else if (cam->isOfType(SoOrthographicCam << 3631 SoOrthographicCamera * oc = (SoOrthogra << 3632 oc->height = oc->height.getValue() * mu << 3633 } << 3634 } << 3635 #endif << 3636 << 3637 // Handling mouse and keyboard events << 3638 << 3639 SbBool << 3640 G4OpenInventorQtExaminerViewer::processSoEven 75 G4OpenInventorQtExaminerViewer::processSoEvent(const SoEvent* const ev) 3641 { 76 { 3642 77 3643 // FWJ DEBUG << 78 // SoCamera *cam = getCamera(); 3644 // G4cout << "processSoEvent ########### << 3645 << 3646 SoCamera *cam = getCamera(); << 3647 const SoType type(ev->getTypeId()); 79 const SoType type(ev->getTypeId()); 3648 80 3649 // Needed to implement mouse wheel zoom direc << 3650 // Does not work with MacOS trackpad: use Coi << 3651 #ifndef __APPLE__ << 3652 if (type.isDerivedFrom(SoMouseButtonEvent: << 3653 SoMouseButtonEvent * me = (SoMouseButto << 3654 << 3655 // if (currentState == ANIMATION | << 3656 // || currentState == PAUSED_A << 3657 << 3658 switch (me->getButton()) { << 3659 << 3660 case SoMouseButtonEvent::BUTTON4: // << 3661 if (me->getState() == SoButtonEve << 3662 // G4cout << "SC << 3663 zoom(-0.1f); << 3664 return TRUE; << 3665 } << 3666 break; << 3667 << 3668 case SoMouseButtonEvent::BUTTON5: // << 3669 if (me->getState() == SoButtonEve << 3670 // G4cout << "SC << 3671 zoom(0.1f); << 3672 return TRUE; << 3673 } << 3674 break; << 3675 << 3676 default: << 3677 break; << 3678 } << 3679 // } << 3680 if (currentState == GENERAL) { << 3681 << 3682 } << 3683 } << 3684 #endif << 3685 << 3686 if (type.isDerivedFrom(SoKeyboardEvent::ge 81 if (type.isDerivedFrom(SoKeyboardEvent::getClassTypeId())) { 3687 SoKeyboardEvent* ke = (SoKeyboardEvent* 82 SoKeyboardEvent* ke = (SoKeyboardEvent*)ev; 3688 83 3689 if (SoKeyboardEvent::isKeyPressEvent(ev 84 if (SoKeyboardEvent::isKeyPressEvent(ev, ke->getKey())) { 3690 switch (ke->getKey()) { 85 switch (ke->getKey()) { 3691 case SoKeyboardEvent::E: 86 case SoKeyboardEvent::E: 3692 if (externalQtApp) { << 87 G4cout << "E KEY PRESSED, EXITING Qt MAIN LOOP" << G4endl; 3693 // G4cout << "E KEY PRESSED" < << 88 SoQt::exitMainLoop(); 3694 return TRUE; << 3695 } else { << 3696 G4cout << << 3697 "E KEY PRESSED, EXITING OIQ << 3698 G4endl; << 3699 SoQt::exitMainLoop(); << 3700 // escapeCallback(); << 3701 return TRUE; << 3702 } << 3703 case SoKeyboardEvent::LEFT_SHIFT: << 3704 this->lshiftdown = true; << 3705 return TRUE; << 3706 case SoKeyboardEvent::RIGHT_SHIFT: << 3707 this->rshiftdown = true; << 3708 return TRUE; << 3709 case SoKeyboardEvent::LEFT_CONTROL: << 3710 this->lctrldown = true; << 3711 return TRUE; << 3712 case SoKeyboardEvent::RIGHT_CONTROL: << 3713 this->rctrldown = true; << 3714 return TRUE; << 3715 case SoKeyboardEvent::SPACE: << 3716 if (currentState == ANIMATION << 3717 || currentState == REVERSED_A << 3718 beforePausing = currentState; << 3719 currentState = PAUSED_ANIMATIO << 3720 if (animateSensor->isScheduled << 3721 animateSensor->unschedule() << 3722 return TRUE; << 3723 } else if (currentState == PAUSED << 3724 if (maxSpeed) { << 3725 if ((beforePausing == ANIMA << 3726 && refParticleIdx << 3727 < (int) refParticleTra << 3728 || (beforePausing == RE << 3729 && refParticleIdx > << 3730 currentState = beforePau << 3731 animateRefParticle(); << 3732 } << 3733 } << 3734 return TRUE; << 3735 } << 3736 break; << 3737 case SoKeyboardEvent::ESCAPE: << 3738 if (currentState == ANIMATION << 3739 || currentState == REVERSED_A << 3740 || currentState == PAUSED_ANI << 3741 << 3742 if (animateSensor->isScheduled << 3743 animateSensor->unschedule() << 3744 currentState = prevState; << 3745 refParticleIdx = prevRefIdx; << 3746 setSuperimpositionEnabled(supe << 3747 maxSpeed = 0.0f; << 3748 step = 1; << 3749 << 3750 scheduleRedraw(); << 3751 if (currentState == VIEWPOINT) << 3752 setSuperimpositionEnabled(s << 3753 axisSwitch->whichChild.setV << 3754 animSpeedOutlineSwitch->whi << 3755 << 3756 animSpeedSwitch->whichChild << 3757 << 3758 scheduleRedraw(); << 3759 } << 3760 restoreCamera(); << 3761 return TRUE; << 3762 } << 3763 break; << 3764 case SoKeyboardEvent::DELETE: << 3765 if (viewPtList.size() << 3766 && (currentState != ANIMATION << 3767 && currentState != REVERS << 3768 && currentState != PAUSED << 3769 // FWJ IMPLEMENT LATER << 3770 // String dialogName = (char * << 3771 // std::string msg = "Are you << 3772 // warningMsgDialog(msg, dialo << 3773 return TRUE; << 3774 } << 3775 break; << 3776 case SoKeyboardEvent::LEFT_ARROW: << 3777 switch (currentState) { << 3778 case BEAMLINE: << 3779 if ((this->lshiftdown) || (t << 3780 refParticleIdx -= step; << 3781 moveCamera(); << 3782 } << 3783 else if ((this->lctrldown) << 3784 if (SoQtExaminerViewer::isA << 3785 stopAnimating(); << 3786 prevState = currentState; << 3787 currentState = ROTATING; << 3788 animateBtwPtsPeriod = 0.08f << 3789 << 3790 SbVec3f tmp = camDir; << 3791 tmp.negate(); << 3792 rotAxis = tmp; << 3793 << 3794 rotCnt = ROT_CNT; << 3795 moveCamera(); // To make su << 3796 rotateCamera(); << 3797 } << 3798 else { << 3799 if (SoQtExaminerViewer::isA << 3800 stopAnimating(); << 3801 prevState = currentState; << 3802 currentState = ROTATING; << 3803 animateBtwPtsPeriod = 0.08f << 3804 << 3805 SbVec3f tmp = camUpVec; << 3806 tmp.negate(); << 3807 rotAxis = tmp; << 3808 << 3809 rotCnt = ROT_CNT; << 3810 moveCamera(); // To make su << 3811 rotateCamera(); << 3812 << 3813 } << 3814 return TRUE; << 3815 << 3816 case ANIMATION: << 3817 case REVERSED_ANIMATION: << 3818 left_right -= 1.5f; << 3819 return TRUE; << 3820 case PAUSED_ANIMATION: << 3821 left_right -= 1.5f; << 3822 setStartingPtForAnimation(); << 3823 cam->position = myCam->positio << 3824 return TRUE; << 3825 case GENERAL: << 3826 case VIEWPOINT: << 3827 if ((!this->lshiftdown) && (!t << 3828 // Using this allows us to << 3829 // changing the camera para << 3830 this->bottomWheelMotion( << 3831 thi << 3832 << 3833 return TRUE; << 3834 } << 3835 break; << 3836 case ROTATING: << 3837 // For this state, let the key << 3838 // be handled by superclass << 3839 break; << 3840 default: << 3841 SoDebugError::post("G4OpenInve << 3842 "Unhandled << 3843 break; << 3844 } << 3845 break; 89 break; 3846 << 3847 case SoKeyboardEvent::RIGHT_ARROW: << 3848 switch(currentState) { << 3849 case BEAMLINE: << 3850 if ((this->lshiftdown) || (t << 3851 refParticleIdx += step; << 3852 moveCamera(); << 3853 } << 3854 else if ((this->lctrldown) << 3855 if (SoQtExaminerViewer::isA << 3856 stopAnimating(); << 3857 prevState = currentState; << 3858 currentState = ROTATING; << 3859 animateBtwPtsPeriod = 0.08f << 3860 << 3861 rotAxis = camDir; << 3862 << 3863 rotCnt = ROT_CNT; << 3864 moveCamera(); // To make su << 3865 rotateCamera(); << 3866 } << 3867 else{ << 3868 if (SoQtExaminerViewer::isA << 3869 stopAnimating(); << 3870 prevState = currentState; << 3871 currentState = ROTATING; << 3872 animateBtwPtsPeriod = 0.08f << 3873 << 3874 rotAxis = camUpVec; << 3875 << 3876 rotCnt = ROT_CNT; << 3877 moveCamera(); // To make su << 3878 rotateCamera(); << 3879 } << 3880 return TRUE; << 3881 << 3882 case ANIMATION: << 3883 case REVERSED_ANIMATION: << 3884 left_right += 1.5f; << 3885 return TRUE; << 3886 case PAUSED_ANIMATION: << 3887 left_right += 1.5f; << 3888 setStartingPtForAnimation(); << 3889 cam->position = myCam->positio << 3890 return TRUE; << 3891 case GENERAL: << 3892 case VIEWPOINT: << 3893 if ((!this->lshiftdown) && (!t << 3894 // Using this allows us to << 3895 // changing the camera para << 3896 this->bottomWheelMotion( << 3897 thi << 3898 return TRUE; << 3899 } << 3900 break; << 3901 case ROTATING: << 3902 // For this state, let the key << 3903 // be handled by superclass << 3904 break; << 3905 default: << 3906 SoDebugError::post("G4OpenInve << 3907 "Unhandled << 3908 break; << 3909 } << 3910 break; << 3911 << 3912 case SoKeyboardEvent::DOWN_ARROW: << 3913 switch(currentState) { << 3914 case BEAMLINE: << 3915 << 3916 if ((this->lshiftdown) || (t << 3917 refParticleIdx -= step; << 3918 moveCamera(); << 3919 } << 3920 else{ << 3921 if (SoQtExaminerViewer::isA << 3922 stopAnimating(); << 3923 prevState = currentState; << 3924 currentState = ROTATING; << 3925 animateBtwPtsPeriod = 0.08f << 3926 << 3927 rotAxis = camDir.cross(camU << 3928 << 3929 rotCnt = ROT_CNT; << 3930 moveCamera(); // To make su << 3931 rotateCamera(); << 3932 << 3933 } << 3934 return TRUE; << 3935 << 3936 case ANIMATION: << 3937 case REVERSED_ANIMATION: << 3938 up_down -= 1.5f; << 3939 return TRUE; << 3940 case PAUSED_ANIMATION: << 3941 up_down -= 1.5f; << 3942 setStartingPtForAnimation(); << 3943 cam->position = myCam->positio << 3944 return TRUE; << 3945 case GENERAL: << 3946 case VIEWPOINT: << 3947 // Using this allows us to loo << 3948 // changing the camera paramet << 3949 if ((!this->lshiftdown) && (!t << 3950 this->leftWheelMotion(this- << 3951 return TRUE; << 3952 } << 3953 break; << 3954 case ROTATING: << 3955 // For this state, let the key << 3956 // be handled by superclass << 3957 break; << 3958 default: << 3959 SoDebugError::post("G4OpenInve << 3960 "Unhandled << 3961 break; << 3962 } << 3963 break; << 3964 << 3965 case SoKeyboardEvent::UP_ARROW: << 3966 switch(currentState) { << 3967 case BEAMLINE: << 3968 if ((this->lshiftdown) || (t << 3969 refParticleIdx -= step; << 3970 moveCamera(); << 3971 } << 3972 else{ << 3973 if (SoQtExaminerViewer::isA << 3974 stopAnimating(); << 3975 prevState = currentState; << 3976 currentState = ROTATING; << 3977 animateBtwPtsPeriod = 0.08f << 3978 << 3979 rotAxis = camUpVec.cross(ca << 3980 << 3981 rotCnt = ROT_CNT; << 3982 moveCamera(); << 3983 << 3984 rotateCamera(); << 3985 << 3986 << 3987 } << 3988 return TRUE; << 3989 case ANIMATION: << 3990 case REVERSED_ANIMATION: << 3991 up_down += 1.5f; << 3992 return TRUE; << 3993 case PAUSED_ANIMATION: << 3994 up_down += 1.5f; << 3995 setStartingPtForAnimation(); << 3996 cam->position = myCam->positio << 3997 return TRUE; << 3998 case GENERAL: << 3999 case VIEWPOINT: << 4000 // Using this allows us to loo << 4001 // changing the camera paramet << 4002 if ((!this->lshiftdown) && (!t << 4003 this->leftWheelMotion(this- << 4004 return TRUE; << 4005 } << 4006 break; << 4007 case ROTATING: << 4008 // For this state, let the key << 4009 // be handled by superclass << 4010 break; << 4011 default: << 4012 SoDebugError::post("G4OpenInve << 4013 "Unhandled << 4014 break; << 4015 } << 4016 break; << 4017 << 4018 case SoKeyboardEvent::PAGE_UP: << 4019 switch(currentState) { << 4020 case BEAMLINE: << 4021 if (step < (int) refParticleTr << 4022 step++; << 4023 return TRUE; << 4024 case ANIMATION: << 4025 incSpeed(); << 4026 maxSpeed += SPEED_INDICATOR_ST << 4027 if (maxSpeed > 0.8) << 4028 maxSpeed = MAX_SPEED_INDICA << 4029 scheduleRedraw(); << 4030 << 4031 return TRUE; << 4032 case REVERSED_ANIMATION: << 4033 if(!animateSensor->isScheduled << 4034 currentState = ANIMATION; << 4035 if (refParticleIdx << 4036 < (int) refParticleTraj << 4037 refParticleIdx++; << 4038 maxSpeed = SPEED_INDICAT << 4039 scheduleRedraw(); << 4040 animateRefParticle(); << 4041 } << 4042 } << 4043 else{ << 4044 maxSpeed += SPEED_INDICATOR << 4045 decSpeed(); << 4046 scheduleRedraw(); << 4047 } << 4048 return TRUE; << 4049 case PAUSED_ANIMATION: << 4050 maxSpeed += SPEED_INDICATOR_ST << 4051 if (maxSpeed > 0.8) << 4052 maxSpeed = MAX_SPEED_INDICA << 4053 << 4054 if (beforePausing == ANIMATION << 4055 incSpeed(); << 4056 } else { << 4057 decSpeed(); << 4058 if (animateBtwPtsPeriod >= << 4059 beforePausing = ANIMATIO << 4060 } << 4061 << 4062 scheduleRedraw(); << 4063 return TRUE; << 4064 default: //fall through << 4065 break; << 4066 } << 4067 break; << 4068 << 4069 case SoKeyboardEvent::PAGE_DOWN: << 4070 switch(currentState) { << 4071 case BEAMLINE: << 4072 if (step > 1) << 4073 step--; << 4074 return TRUE; << 4075 case ANIMATION: << 4076 if(!animateSensor->isScheduled << 4077 currentState = REVERSED_ANI << 4078 if (refParticleIdx > 1) { << 4079 refParticleIdx--; << 4080 maxSpeed = -SPEED_INDICA << 4081 scheduleRedraw(); << 4082 animateRefParticle(); << 4083 } << 4084 } << 4085 else{ << 4086 maxSpeed -= SPEED_INDICATOR << 4087 decSpeed(); << 4088 scheduleRedraw(); << 4089 } << 4090 return TRUE; << 4091 case REVERSED_ANIMATION: << 4092 incSpeed(); << 4093 maxSpeed -= SPEED_INDICATOR_ST << 4094 if (maxSpeed < -0.8) << 4095 maxSpeed = -MAX_SPEED_INDIC << 4096 scheduleRedraw(); << 4097 return TRUE; << 4098 case PAUSED_ANIMATION: << 4099 maxSpeed -= SPEED_INDICATOR_ST << 4100 if (maxSpeed < -0.8) << 4101 maxSpeed = -MAX_SPEED_INDIC << 4102 if (beforePausing == REVERSED_ << 4103 incSpeed(); << 4104 } else { << 4105 decSpeed(); << 4106 if (animateBtwPtsPeriod >= << 4107 beforePausing = REVERSED << 4108 } << 4109 scheduleRedraw(); << 4110 return TRUE; << 4111 default: << 4112 //fall through << 4113 break; << 4114 } << 4115 break; << 4116 << 4117 // FROM XT VIEWER << 4118 // case SoKeyboardEvent:: << 4119 // this->escapeCallbac << 4120 // break; << 4121 << 4122 default: << 4123 break; // To get rid of compiler << 4124 } << 4125 } << 4126 if (SoKeyboardEvent::isKeyReleaseEvent( << 4127 switch (ke->getKey()) { << 4128 case SoKeyboardEvent::LEFT_SHIFT: << 4129 this->lshiftdown = false; << 4130 return TRUE; << 4131 case SoKeyboardEvent::RIGHT_SHIFT: << 4132 this->rshiftdown = false; << 4133 return TRUE; << 4134 case SoKeyboardEvent::LEFT_CONTROL: << 4135 this->lctrldown = false; << 4136 return TRUE; << 4137 case SoKeyboardEvent::RIGHT_CONTROL: << 4138 this->rctrldown = false; << 4139 return TRUE; << 4140 default: 90 default: 4141 break; 91 break; 4142 } 92 } 4143 } 93 } 4144 } 94 } 4145 << 4146 // Pass the event on to the viewer 95 // Pass the event on to the viewer 4147 // Need some checks here as in Xt viewer? 96 // Need some checks here as in Xt viewer? 4148 << 97 return SoQtExaminerViewer::processSoEvent(ev); 4149 if (currentState == ANIMATION || currentSt << 4150 || currentState == ROTATING) << 4151 return FALSE; << 4152 else << 4153 return SoQtExaminerViewer::processSoEve << 4154 } << 4155 << 4156 << 4157 // REMAINDER OF MENU BAR FUNCTIONS... << 4158 << 4159 << 4160 void G4OpenInventorQtExaminerViewer::FileLoad << 4161 { << 4162 // G4cout << "File: Load scene graph CAL << 4163 << 4164 QFileDialog filedialog(getParentWidget(), << 4165 filedialog.setFileMode(QFileDialog::AnyFil << 4166 filedialog.setFont(*font); << 4167 if (!filedialog.exec()) return; << 4168 QStringList filenameinlist = filedialog.se << 4169 QString filenamein = filenameinlist[0]; << 4170 << 4171 SoInput sceneInput; << 4172 << 4173 if (sceneInput.openFile(qPrintable(filenam << 4174 // Read the whole file into the databas << 4175 newSceneGraph = SoDB::readAll(&sceneInp << 4176 if (newSceneGraph == NULL) { << 4177 QMessageBox msgbox; << 4178 msgbox.setFont(*font); << 4179 QString messagetxt = "Error reading << 4180 messagetxt.append(filenamein); << 4181 msgbox.setText(messagetxt); << 4182 msgbox.exec(); << 4183 sceneInput.closeFile(); << 4184 return; << 4185 } << 4186 } else { << 4187 QMessageBox msgbox; << 4188 msgbox.setFont(*font); << 4189 QString messagetxt = "Error opening sce << 4190 messagetxt.append(filenamein); << 4191 msgbox.setText(messagetxt); << 4192 msgbox.exec(); << 4193 return; << 4194 } << 4195 << 4196 SoSeparator* root = (SoSeparator*)getScene << 4197 root->unref(); << 4198 newSceneGraph->ref(); << 4199 setSceneGraph(newSceneGraph); << 4200 } << 4201 << 4202 void G4OpenInventorQtExaminerViewer::FileSave << 4203 { << 4204 // G4cout << "File: Save scene graph CAL << 4205 << 4206 QFileDialog filedialog(getParentWidget(), << 4207 filedialog.setFileMode(QFileDialog::AnyFil << 4208 // To enable confirmation of overwriting << 4209 filedialog.setAcceptMode(QFileDialog::Acce << 4210 filedialog.setFont(*font); << 4211 if (!filedialog.exec()) return; << 4212 QStringList filenameinlist = filedialog.se << 4213 QString filenamein = filenameinlist[0]; << 4214 << 4215 SoWriteAction writeAction; << 4216 SoSeparator* root = (SoSeparator*)getScene << 4217 << 4218 SoOutput* out = writeAction.getOutput(); << 4219 << 4220 if (out->openFile(qPrintable(filenamein))) << 4221 out->setBinary(FALSE); << 4222 writeAction.apply(root); << 4223 out->closeFile(); << 4224 } else { << 4225 QMessageBox msgbox; << 4226 msgbox.setFont(*font); << 4227 QString messagetxt = "Error opening fil << 4228 messagetxt.append(filenamein); << 4229 msgbox.setText(messagetxt); << 4230 msgbox.exec(); << 4231 } << 4232 } << 4233 << 4234 << 4235 void G4OpenInventorQtExaminerViewer::HelpCont << 4236 { << 4237 // G4cout << "Help: Help Controls CALLBA << 4238 helpmsgbox->show(); << 4239 } 98 } 4240 99 4241 << 4242 HookEventProcState::HookEventProcState(G4Open << 4243 { << 4244 viewer = vwr; << 4245 } << 4246 << 4247 HookEventProcState::~HookEventProcState() << 4248 {;} << 4249 << 4250 G4bool HookEventProcState::Notify(G4Applicati << 4251 { << 4252 #if QT_VERSION < 0x060000 << 4253 if (requestedState == G4State_EventProc) v << 4254 #else << 4255 #ifdef G4MULTITHREADED << 4256 //G.Barrand: on the master thread, we are << 4257 // we raise the newEvents flag o << 4258 G4StateManager* stateManager = G4StateMana << 4259 G4ApplicationState previousState = stateMa << 4260 //if (previousState == G4State_Idle && << 4261 //if (previousState == G4State_GeomClosed && << 4262 //if (previousState == G4State_EventProc && << 4263 if (previousState == G4State_GeomClosed && << 4264 viewer->newEvents = true; << 4265 } << 4266 #else << 4267 if (requestedState == G4State_EventProc) v << 4268 #endif << 4269 #endif 100 #endif 4270 return true; << 4271 } << 4272 101