38 #include <X11/keysym.h> 
   43 #include <Xm/MessageB.h> 
   45 #include <Xm/ToggleB.h> 
   46 #include <Xm/CascadeB.h> 
   47 #include <Xm/ArrowBG.h> 
   49 #include <Xm/RowColumn.h> 
   50 #include <Xm/FileSB.h> 
   51 #include <Xm/SelectioB.h> 
   52 #include <Xm/Protocols.h> 
   53 #include <Xm/SeparatoG.h> 
   54 #include <Xm/DialogS.h>   
   55 #include <Xm/PanedW.h> 
   56 #include <Xm/LabelG.h> 
   58 #include <Xm/DrawingA.h> 
   60 #include <Inventor/Xt/SoXt.h> 
   62 #include <Inventor/Xt/SoXtCursor.h> 
   63 #include <Inventor/events/SoKeyboardEvent.h> 
   64 #include <Inventor/events/SoMouseButtonEvent.h> 
   65 #include <Inventor/events/SoLocation2Event.h> 
   66 #include <Inventor/nodes/SoSeparator.h> 
   67 #include <Inventor/nodes/SoOrthographicCamera.h> 
   68 #include <Inventor/nodes/SoPerspectiveCamera.h> 
   69 #include <Inventor/nodes/SoEventCallback.h> 
   70 #include <Inventor/nodes/SoLineSet.h> 
   71 #include <Inventor/nodes/SoMaterial.h> 
   72 #include <Inventor/errors/SoDebugError.h> 
   73 #include <Inventor/SoPickedPoint.h> 
   74 #include <Inventor/actions/SoWriteAction.h> 
   79 #include <Inventor/sensors/SoTimerSensor.h>    
   80 #include <Inventor/sensors/SoNodeSensor.h>     
   92 #include <Inventor/nodes/SoCallback.h> 
   93 #include <Inventor/nodes/SoSwitch.h> 
   94 #include <Inventor/nodes/SoScale.h> 
   95 #include <Inventor/nodes/SoTranslation.h> 
   96 #include <Inventor/actions/SoSearchAction.h> 
   97 #include <Inventor/actions/SoGetBoundingBoxAction.h> 
   99 #include <Inventor/nodes/SoCoordinate3.h> 
  101 #include <Inventor/nodes/SoText2.h> 
  102 #include <Inventor/nodes/SoFont.h> 
  103 #include <Inventor/nodes/SoPointSet.h> 
  104 #include <Inventor/nodes/SoDrawStyle.h> 
  105 #include <Inventor/nodes/SoBaseColor.h> 
  108 #include <Inventor/nodekits/SoBaseKit.h> 
  112 static const char* thisClassName = 
"G4OpenInventorXtExaminerViewer";
 
  114 #define MIN_SPEED  2.1        // Lower number means faster 
  115 #define START_STEP 0.3 
  116 #define SPEED_INDICATOR_STEP 0.045 
  117 #define MAX_SPEED_INDICATOR  0.81 
  123                 const char *
name, SbBool embed,
 
  124         SoXtFullViewer::BuildFlag flag, SoXtViewer::Type type) :
 
  125    SoXtExaminerViewer(parent, name, embed, flag, type, 
FALSE)
 
  128    this->constructor(
TRUE);
 
  133                 const char *
name, SbBool embed,
 
  134                 SoXtFullViewer::BuildFlag flag, SoXtViewer::Type type,
 
  136    SoXtExaminerViewer(parent, name, embed, flag, type, 
FALSE)
 
  138    this->constructor(build);
 
  142 void G4OpenInventorXtExaminerViewer::constructor(
const SbBool build)
 
  144    setClassName(thisClassName);
 
  147    this->newEvents = 
false;
 
  149    fileName = 
".bookmarkFile"; 
 
  151    animateSensor = 
new SoTimerSensor(
 
  152                        G4OpenInventorXtExaminerViewer::animateSensorCB, 
this);
 
  153    animateSensorRotation = 
new SoTimerSensor(
 
  154                G4OpenInventorXtExaminerViewer::animateSensorRotationCB, 
this);
 
  156    currentState = GENERAL;
 
  157    myCam = 
new SoPerspectiveCamera;
 
  161    curViewPtName = 
new char[MAX_VP_NAME + 1];
 
  162    left_right = up_down = 0; 
 
  168    lshiftdown = rshiftdown = 
false;
 
  171    lctrldown = rctrldown = 
false;
 
  175    prevColorField = NULL;
 
  178    openFileDialog = newFileDialog = listsDialog = (Widget) NULL;
 
  179    loadRefCoordsDialog = saveRefCoordsDialog = NULL;
 
  180    loadSceneGraphDialog = saveSceneGraphDialog = NULL;
 
  181    myElementList = NULL;
 
  183    newSceneGraph = NULL;
 
  184    zcoordSetFlag = 
false;
 
  191    static const char * superimposed[] = {
 
  192       "#Inventor V2.1 ascii", 
"",
 
  199       "     OrthographicCamera ",
 
  205       "     DEF soxt->callback Callback { }",
 
  208       "     DEF soxt->translation Translation ",
 
  210       "             translation 0 0 0",
 
  212       "     DEF soxt->scale Scale ",
 
  214       "             scaleFactor 1 1 1",
 
  216       "     DEF soxt->geometry Coordinate3 ",
 
  220       "             -0.81   -0.04   0,  -0.81   0       0,",
 
  221       "             -0.81   0.04    0,  0       -0.04   0,",
 
  223       "             0.81    -0.04   0,  0.81    0       0,",
 
  226       "             0.81    0.02    0,  0.81    -0.02   0,",
 
  229       "             0.4     0.01    0,  0.4     -0.01   0,",
 
  234       "     DEF soxt->animSpeedOutlineSwitch Switch ",
 
  239       "                emissiveColor 0 0 0",
 
  245       "                     12, 11, 10, 9, -1",
 
  250       "     DEF soxt->axisSwitch Switch ",
 
  269       "     DEF soxt->animSpeedSwitch Switch ",
 
  274       "             emissiveColor 0 1 0",
 
  280       "                     16, 15, 14, 13, -1",
 
  286       " DEF soxt->curInfoSwitch Switch ",
 
  289       "     DEF soxt->curInfoTrans Translation ",
 
  291       "             translation 10 20 30    ",
 
  293       "     DEF soxt->curInfoFont Font ",
 
  295       "             name defaultFont:Bold",
 
  298       "     DEF soxt->curInfoText Text2 ",
 
  307       "     DEF soxt->mouseOverTransLogName Translation ",
 
  309       "             translation 0 0 0    ",
 
  311       "     DEF soxt->mouseOverFontLogName Font ",
 
  313       "             name defaultFont:Bold",
 
  316       "     DEF soxt->mouseOverTextLogName Text2 { } ",
 
  320       "     DEF soxt->mouseOverTransSolid Translation ",
 
  322       "             translation 0 0 0    ",
 
  324       "     DEF soxt->mouseOverFontSolid Font ",
 
  326       "             name defaultFont:Bold",
 
  329       "     DEF soxt->mouseOverTextSolid Text2 { } ",
 
  333       "     DEF soxt->mouseOverTransMaterial Translation ",
 
  335       "             translation 0 0 0    ",
 
  337       "     DEF soxt->mouseOverFontMaterial Font ",
 
  339       "             name defaultFont:Bold",
 
  342       "     DEF soxt->mouseOverTextMaterial Text2 { } ",
 
  346       "     DEF soxt->mouseOverTransZPos Translation ",
 
  348       "             translation 0 0 0    ",
 
  350       "     DEF soxt->mouseOverFontZPos Font ",
 
  352       "             name defaultFont:Bold",
 
  355       "     DEF soxt->mouseOverTextZPos Text2 { } ",
 
  361    for (i = bufsize = 0; superimposed[i]; i++)
 
  362       bufsize += strlen(superimposed[i]) + 1;
 
  363    char * buf = 
new char[bufsize + 1];
 
  364    for (i = bufsize = 0; superimposed[i]; i++) {
 
  365       strcpy(buf + bufsize, superimposed[i]);
 
  366       bufsize += strlen(superimposed[i]);
 
  370    SoInput * input = 
new SoInput;
 
  371    input->setBuffer(buf, bufsize);
 
  372    SbBool ok = SoDB::read(input, this->superimposition);
 
  377    this->superimposition->ref();
 
  379    this->sscale = (SoScale *) this->getSuperimpositionNode(
 
  380                                  this->superimposition, 
"soxt->scale");
 
  381    this->stranslation = (SoTranslation *) this->getSuperimpositionNode(
 
  382                                  this->superimposition, 
"soxt->translation");
 
  383    this->sgeometry = (SoCoordinate3 *) this->getSuperimpositionNode(
 
  384                                  this->superimposition, 
"soxt->geometry");
 
  385    this->axisSwitch = (SoSwitch *) this->getSuperimpositionNode(
 
  386                                  this->superimposition, 
"soxt->axisSwitch");
 
  387    this->animSpeedOutlineSwitch = (SoSwitch *) this->getSuperimpositionNode(
 
  388                        this->superimposition, 
"soxt->animSpeedOutlineSwitch");
 
  389    this->animSpeedSwitch = (SoSwitch *) this->getSuperimpositionNode(
 
  390                        this->superimposition, 
"soxt->animSpeedSwitch");
 
  391    this->curInfoSwitch = (SoSwitch *) this->getSuperimpositionNode(
 
  392                              this->superimposition, 
"soxt->curInfoSwitch");
 
  393    this->curInfoTrans = (SoTranslation *) this->getSuperimpositionNode(
 
  394                              this->superimposition, 
"soxt->curInfoTrans");
 
  395    this->curInfoFont = (SoFont *) this->getSuperimpositionNode(
 
  396                              this->superimposition, 
"soxt->curInfoFont");
 
  397    this->curInfoText = (SoText2 *) this->getSuperimpositionNode(
 
  398                              this->superimposition, 
"soxt->curInfoText");
 
  399    this->mouseOverTransLogName = (SoTranslation*)this->getSuperimpositionNode(
 
  400                    this->superimposition, 
"soxt->mouseOverTransLogName");
 
  401    this->mouseOverFontLogName = (SoFont *) this->getSuperimpositionNode(
 
  402                    this->superimposition, 
"soxt->mouseOverFontLogName");
 
  403    this->mouseOverTextLogName = (SoText2 *) this->getSuperimpositionNode(
 
  404                    this->superimposition, 
"soxt->mouseOverTextLogName");
 
  405    this->mouseOverTransSolid = (SoTranslation *) this->getSuperimpositionNode(
 
  406                    this->superimposition, 
"soxt->mouseOverTransSolid");
 
  407    this->mouseOverFontSolid = (SoFont *) this->getSuperimpositionNode(
 
  408                    this->superimposition, 
"soxt->mouseOverFontSolid");
 
  409    this->mouseOverTextSolid = (SoText2 *) this->getSuperimpositionNode(
 
  410                    this->superimposition, 
"soxt->mouseOverTextSolid");
 
  411    this->mouseOverTransMaterial = (SoTranslation*)this->getSuperimpositionNode(
 
  412                    this->superimposition, 
"soxt->mouseOverTransMaterial");
 
  413    this->mouseOverFontMaterial = (SoFont *) this->getSuperimpositionNode(
 
  414                    this->superimposition, 
"soxt->mouseOverFontMaterial");
 
  415    this->mouseOverTextMaterial = (SoText2 *) this->getSuperimpositionNode(
 
  416                    this->superimposition, 
"soxt->mouseOverTextMaterial");
 
  417    this->mouseOverTransZPos = (SoTranslation *) this->getSuperimpositionNode(
 
  418                    this->superimposition, 
"soxt->mouseOverTransZPos");
 
  419    this->mouseOverFontZPos = (SoFont *) this->getSuperimpositionNode(
 
  420                    this->superimposition, 
"soxt->mouseOverFontZPos");
 
  421    this->mouseOverTextZPos = (SoText2 *) this->getSuperimpositionNode(
 
  422                    this->superimposition, 
"soxt->mouseOverTextZPos");
 
  424    SoCallback * cb = (SoCallback *) this->getSuperimpositionNode(
 
  425                    this->superimposition, 
"soxt->callback");
 
  426    cb->setCallback(superimpositionCB, 
this);
 
  428    this->addSuperimposition(this->superimposition);
 
  429    this->setSuperimpositionEnabled(this->superimposition, 
FALSE);
 
  430    axisSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
  431    animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
  432    animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
  460 G4OpenInventorXtExaminerViewer::getSuperimpositionNode(SoNode *root,
 
  464       this->searcher = 
new SoSearchAction;
 
  466    searcher->setName(SbName(name));
 
  467    searcher->setInterest(SoSearchAction::FIRST);
 
  468    searcher->setSearchingAll(
TRUE);
 
  469    searcher->apply(root);
 
  470    assert(searcher->getPath());
 
  471    return searcher->getPath()->getTail();
 
  475 void G4OpenInventorXtExaminerViewer::superimpositionCB(
void * closure,
 
  485 void G4OpenInventorXtExaminerViewer::superimpositionEvent(SoAction * action)
 
  488    if (!action->isOfType(SoGLRenderAction::getClassTypeId()))
 
  490    SbViewportRegion vpRegion =
 
  491       ((SoGLRenderAction *) action)->getViewportRegion();
 
  492    SbVec2s viewportSize = vpRegion.getViewportSizePixels();
 
  494    float aspect = float(viewportSize[0]) / float(viewportSize[1]);
 
  495    float factorx = 1.0f / float(viewportSize[1]) * 220.0f;
 
  496    float factory = factorx;
 
  499       this->stranslation->translation.setValue(SbVec3f(0.0
f, -0.4
f, 0.0
f));
 
  501       this->stranslation->translation.setValue(
 
  502                        SbVec3f(0.0
f, -0.4
f / aspect, 0.0
f));
 
  506    if (viewportSize[0] > 500)
 
  507       factorx *= 500.0f / 400.0f;
 
  509       factorx *= float(viewportSize[0]) / 400.0f;
 
  510    this->sscale->scaleFactor.setValue(SbVec3f(factorx, factory, 1.0
f));
 
  512    float xInfo, yInfo, xMouseLogName, yMouseLogName, xMouseSolid, yMouseSolid,
 
  513       xMouseMaterial, yMouseMaterial, xMouseZPos, yMouseZPos;
 
  517    yMouseLogName = -.75;
 
  520    xMouseMaterial = 0.0;
 
  521    yMouseMaterial = -.81;
 
  527       xMouseSolid *= aspect;
 
  528       xMouseMaterial *= aspect;
 
  529       this->curInfoTrans->translation.setValue(SbVec3f(xInfo, yInfo, 0.0));
 
  530       this->mouseOverTransLogName->translation.setValue(
 
  531                         SbVec3f(xMouseLogName, yMouseLogName, 0.0));
 
  532       this->mouseOverTransSolid->translation.setValue(
 
  533                         SbVec3f(xMouseSolid, yMouseSolid, 0.0));
 
  534       this->mouseOverTransMaterial->translation.setValue(
 
  535                         SbVec3f(xMouseMaterial, yMouseMaterial, 0.0));
 
  536       this->mouseOverTransZPos->translation.setValue(
 
  537                         SbVec3f(xMouseZPos, yMouseZPos, 0.0));
 
  540       yMouseSolid /= aspect;
 
  541       yMouseMaterial /= aspect;
 
  542       this->curInfoTrans->translation.setValue(SbVec3f(xInfo, yInfo, 0.0));
 
  543       this->mouseOverTransLogName->translation.setValue(
 
  544                         SbVec3f(xMouseLogName, yMouseLogName, 0.0));
 
  545       this->mouseOverTransSolid->translation.setValue(
 
  546                         SbVec3f(xMouseSolid, yMouseSolid, 0.0));
 
  547       this->mouseOverTransMaterial->translation.setValue(
 
  548                         SbVec3f(xMouseMaterial, yMouseMaterial, 0.0));
 
  549       this->mouseOverTransZPos->translation.setValue(
 
  550                         SbVec3f(xMouseZPos, yMouseZPos, 0.0));
 
  553    if (currentState == VIEWPOINT) { 
 
  554       this->curInfoFont->size.setValue(15);
 
  555       this->curInfoFont->name.setValue(
"defaultFont:Italic");
 
  556       this->curInfoText->string.setValue(SbString(curViewPtName));
 
  558    else if(currentState == GENERAL) { 
 
  559       this->curInfoFont->size.setValue(16);
 
  560       this->curInfoFont->name.setValue(
"defaultFont:Bold");
 
  561       this->curInfoText->string.setValue(SbString(
""));
 
  564       if (refParticleIdx < (
int) refParticleTrajectory.size() - 1) {
 
  565          this->curInfoFont->size.setValue(16);
 
  566          this->curInfoFont->name.setValue(
"defaultFont:Bold");
 
  569          sprintf(zPos, 
"%7.2f [m]", refZPositions[refParticleIdx] / 1000);
 
  571          this->curInfoText->string.setValue(SbString(zPos));
 
  579    if (superimposition != NULL) {
 
  580       removeSuperimposition(superimposition);
 
  581       superimposition->unref();
 
  582       superimposition = NULL;
 
  584    if (animateSensor->isScheduled())
 
  585       animateSensor->unschedule();
 
  586    delete animateSensor;
 
  587    delete sceneChangeSensor;
 
  589    delete[] curViewPtName;
 
  600    Atom WM_DELETE_WINDOW;
 
  603       SoDebugError::post(
"G4OpenInventorXtExaminerViewer::buildWidget", 
"Error: Parent is null.");
 
  606    XtSetArg(args[0], XmNtopAttachment, XmATTACH_FORM);
 
  607    XtSetArg(args[1], XmNleftAttachment, XmATTACH_FORM);
 
  608    XtSetArg(args[2], XmNrightAttachment, XmATTACH_FORM);
 
  609    XtSetArg(args[3], XmNbottomAttachment, XmATTACH_FORM);
 
  610    Widget form = XmCreateForm(parent, (
char *) 
"Form", args, 4);
 
  613    shell = XtParent(form);
 
  614    WM_DELETE_WINDOW = XInternAtom(XtDisplay(parent), 
"WM_DELETE_WINDOW",
 
  616    XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW,
 
  617                            (XtCallbackProc)closeMainWindowCB, 
this);
 
  619    XtSetArg(args[0], XmNtopAttachment, XmATTACH_FORM);
 
  620    XtSetArg(args[1], XmNleftAttachment, XmATTACH_FORM);
 
  621    XtSetArg(args[2], XmNrightAttachment, XmATTACH_FORM);
 
  622    menuBar = XmCreateMenuBar(form, (
char *) 
"MenuBar", args, 3);
 
  623    XtManageChild(menuBar);
 
  626    this->
addButton(fileMenu, 
"Open Viewpoint File...", openViewPtFileCB);
 
  627    addButton(fileMenu, 
"New Viewpoint File", newViewPtFileCB);
 
  628    addButton(fileMenu, 
"Load Ref. Coords", loadRefCoordsDialogCB);
 
  629    addButton(fileMenu, 
"Save Ref. Coords", saveRefCoordsDialogCB);
 
  630    addButton(fileMenu, 
"Load Scene Graph", loadSceneGraphDialogCB);
 
  631    addButton(fileMenu, 
"Save Scene Graph", saveSceneGraphDialogCB);
 
  633           XmCreateSeparatorGadget(fileMenu, (
char *) 
"Separator", NULL, 0));
 
  635    Widget menu = 
addMenu(
"Tools");
 
  636    addButton(menu, 
"Animate Ref. Particle", animateRefParticleCB);
 
  637    addButton(menu, 
"Go to start of Ref path", gotoRefPathStartCB);
 
  638    addButton(menu, 
"Invert Ref path", invertRefPathCB);
 
  640    Widget viewerBase = SoXtFullViewer::buildWidget(form);
 
  642    XtSetArg(args[0], XmNtopAttachment, XmATTACH_WIDGET);
 
  643    XtSetArg(args[1], XmNtopWidget, menuBar);
 
  644    XtSetArg(args[2], XmNleftAttachment, XmATTACH_FORM);
 
  645    XtSetArg(args[3], XmNrightAttachment, XmATTACH_FORM);
 
  646    XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM);
 
  647    XtSetValues(viewerBase, args, 5);
 
  657    Widget menu = XmCreatePulldownMenu(menuBar, (
char *) name.c_str(), NULL, 0);
 
  659    XtSetArg(args[0], XmNsubMenuId, menu);
 
  660    Widget w = XmCreateCascadeButton(menuBar, (
char *) name.c_str(), args, 1);
 
  671    Widget button = XmCreatePushButton(menu, (
char *) name.c_str(), NULL, 0);
 
  672    XtManageChild(button);
 
  673    XtAddCallback(button, XmNactivateCallback, cb, 
this);
 
  679                                                        SbPList * buttonlist)
 
  683    Widget saveViewPtButton, abbrOutputButton, pickRefPathButton;
 
  686    SoXtExaminerViewer::createViewerButtons(parent, buttonlist);
 
  689    Widget emptyButton = XtVaCreateManagedWidget(
"", xmPushButtonWidgetClass,
 
  691    buttonlist->append(emptyButton);
 
  695    XtSetArg(args[n], XmNtopPosition, 1);    n++;
 
  696    XtSetArg(args[n], XmNbottomPosition, 2); n++;
 
  697    XtSetArg(args[n], XmNleftPosition, 0);   n++;
 
  698    XtSetArg(args[n], XmNrightPosition, 1);  n++;
 
  699    XtSetArg(args[n], XmNarrowDirection, XmARROW_LEFT);  n++;
 
  700    XtSetArg(args[n], XmNsensitive, False);  n++;
 
  701    prevViewPtButton = XmCreateArrowButtonGadget(parent, (
char *) 
"ArrowL",
 
  703    XtManageChild(prevViewPtButton);
 
  704    XtAddCallback(prevViewPtButton, XmNactivateCallback,
 
  705                  G4OpenInventorXtExaminerViewer::prevViewPtCB, 
this);
 
  706    buttonlist->append(prevViewPtButton);
 
  710    XtSetArg(args[n], XmNtopPosition, 1);    n++;
 
  711    XtSetArg(args[n], XmNbottomPosition, 2); n++;
 
  712    XtSetArg(args[n], XmNleftPosition, 0);   n++;
 
  713    XtSetArg(args[n], XmNrightPosition, 1);  n++;
 
  714    XtSetArg(args[n], XmNarrowDirection, XmARROW_RIGHT); n++;
 
  715    XtSetArg(args[n], XmNsensitive, False);  n++;
 
  716    nextViewPtButton = XmCreateArrowButtonGadget(parent, (
char *) 
"ArrowR",
 
  718    XtManageChild(nextViewPtButton);
 
  719    XtAddCallback(nextViewPtButton, XmNactivateCallback,
 
  720                  G4OpenInventorXtExaminerViewer::nextViewPtCB, 
this);
 
  721    buttonlist->append(nextViewPtButton);
 
  724    saveViewPtButton = XtVaCreateManagedWidget(
"Save", xmPushButtonWidgetClass,
 
  726    XtAddCallback(saveViewPtButton, XmNactivateCallback,
 
  727                  G4OpenInventorXtExaminerViewer::saveViewPtCB, 
this);
 
  728    Pixmap saveVP, saveVP_ins;
 
  732                                                   saveViewPt_xpm, 
TRUE);
 
  733    XtVaSetValues(saveViewPtButton, XmNlabelType, XmPIXMAP, XmNlabelPixmap,
 
  734                  saveVP, XmNselectPixmap, saveVP, XmNlabelInsensitivePixmap,
 
  735                  saveVP_ins, XmNselectInsensitivePixmap, saveVP_ins, NULL);
 
  736    buttonlist->append(saveViewPtButton);
 
  739    abbrOutputButton = XtVaCreateManagedWidget(
"Abbr",
 
  740                                               xmToggleButtonWidgetClass, parent, XmNindicatorOn, False, NULL);
 
  741    XtAddCallback(abbrOutputButton, XmNdisarmCallback, G4OpenInventorXtExaminerViewer::abbrOutputCB,
 
  743    Pixmap consolexpm, consolexpm_ins;
 
  748    XtVaSetValues(abbrOutputButton, XmNlabelType, XmPIXMAP, XmNlabelPixmap,
 
  749                  consolexpm, XmNselectPixmap, consolexpm, XmNlabelInsensitivePixmap,
 
  750                  consolexpm_ins, XmNselectInsensitivePixmap, consolexpm_ins, NULL);
 
  751    buttonlist->append(abbrOutputButton);
 
  754    pickRefPathButton = XtVaCreateManagedWidget(
"Refpath", xmPushButtonWidgetClass,
 
  756    XtAddCallback(pickRefPathButton, XmNactivateCallback,
 
  757                  G4OpenInventorXtExaminerViewer::pickRefPathCB, 
this);
 
  758    Pixmap favoritesxpm, favoritesxpm_ins;
 
  762                                                         favorites_xpm, 
TRUE);
 
  763    XtVaSetValues(pickRefPathButton, XmNlabelType, XmPIXMAP, XmNlabelPixmap,
 
  764        favoritesxpm, XmNselectPixmap, favoritesxpm, XmNlabelInsensitivePixmap,
 
  765        favoritesxpm_ins, XmNselectInsensitivePixmap, favoritesxpm_ins, NULL);
 
  766    buttonlist->append(pickRefPathButton);
 
  775    SoXtExaminerViewer::afterRealizeHook();
 
  779    SoCamera *cam = getCamera();
 
  781       if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
  783             ((SoPerspectiveCamera *) cam)->heightAngle.getValue();
 
  786             ((SoOrthographicCamera *) cam)->height.getValue();
 
  790             ((SoOrthographicCamera *) cam)->height.getValue();
 
  793          if (cam->isOfType(SoPerspectiveCamera::getClassTypeId()))
 
  795                ((SoPerspectiveCamera *) cam)->heightAngle.getValue();
 
  801    fileIn.open(fileName.c_str());
 
  802    if (!fileIn.fail()) {
 
  804          String dialogName = (
char *) 
"Error Loading File";
 
  805          std::string msg = 
"Wrong or corrupted input file.";
 
  810          fileOut.seekp(0, std::ios::end); 
 
  811          constructListsDialog(getParentWidget(), 
this, NULL); 
 
  813          if (viewPtList.size()) {
 
  817             XtSetSensitive(nextViewPtButton, True);
 
  818             XtSetSensitive(prevViewPtButton, True);
 
  825       fileOut.open(fileName.c_str());
 
  826       constructListsDialog(getParentWidget(), 
this, NULL); 
 
  831    SoSeparator *root = (SoSeparator *) (getSceneManager()->getSceneGraph());
 
  833       SoDebugError::post(
"G4OpenInventorXtExaminerViewer::afterRealizeHook", 
"Root is null.");
 
  835       root->addChild(myCam); 
 
  838    sceneChangeSensor = 
new SoNodeSensor;
 
  839    sceneChangeSensor->setFunction(sceneChangeCB);
 
  840    sceneChangeSensor->attach(root);
 
  841    sceneChangeSensor->setData(
this);
 
  847    SoEventCallback *moCB = 
new SoEventCallback;
 
  848    moCB->addEventCallback(
 
  849                           SoLocation2Event::getClassTypeId(),
 
  850                           mouseoverCB, static_cast<void *>(
this));
 
  851    root->addChild(moCB);
 
  855    SoEventCallback *pickCB = 
new SoEventCallback;
 
  856    pickCB->addEventCallback(
 
  857                             SoMouseButtonEvent::getClassTypeId(),
 
  858                             pickingCB, static_cast<void *>(
this));
 
  859    root->addChild(pickCB);
 
  868    SoCamera *cam = getCamera();
 
  874    SbVec3f camPosNew = prevPt - (
camDir*distance);
 
  875    cam->position = camPosNew;
 
  877    cam->focalDistance = (prevPt - camPosNew).length();
 
  881    if (animateSensorRotation->isScheduled()) {
 
  882       animateSensorRotation->unschedule();
 
  885    animateSensorRotation->setBaseTime(SbTime::getTimeOfDay());
 
  886    animateSensorRotation->setInterval(SbTime(0.02));
 
  887    animateSensorRotation->schedule();
 
  896    SoCamera *cam = getCamera();
 
  901    if(refParticleTrajectory.size() == 0) {
 
  906          distance = (cam->position.getValue() - center).length();
 
  908       cam->position.setValue(center + offsetFromCenter*distance);
 
  909       cam->focalDistance = (cam->position.getValue() - center).length();
 
  910       cam->pointAt(center, upVector);
 
  916       if (refParticleIdx >= (
int) refParticleTrajectory.size() - 1) {
 
  917          prevPt = refParticleTrajectory[refParticleIdx - step];
 
  918          dist = (prevPt - cam->position.getValue()).length();
 
  923       if (refParticleIdx < 0) {
 
  924          prevPt = refParticleTrajectory[refParticleIdx + step];
 
  925          dist = (prevPt - cam->position.getValue()).length();
 
  926          refParticleIdx = refParticleTrajectory.size() - 2;
 
  930       p1 = refParticleTrajectory[refParticleIdx];
 
  931       p2 = refParticleTrajectory[refParticleIdx + step];
 
  934       particleDir = p2 - p1;
 
  935       particleDir.normalize();
 
  937       if(prevParticleDir == SbVec3f(0,0,0)){
 
  948          SbRotation rot(SbVec3f(0,0,1), particleDir);
 
  953       else if(particleDir != prevParticleDir) {
 
  956          SbRotation rot(prevParticleDir, particleDir);
 
  962       if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
  964             distance = (prevPt - cam->position.getValue()).length();
 
  969       if (cam->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
  971             distance = (prevPt - cam->position.getValue()).length();
 
  978       prevPt.getValue(x,y,z);
 
  981       if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
  982          camPosNew = p2 - (
camDir*distance);
 
  984       if (cam->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
  985          camPosNew = p2 - (
camDir);
 
  988       cam->position = camPosNew;
 
  995       camPosNew.getValue(x,y,z);
 
  997       prevParticleDir = particleDir;
 
 1005 void G4OpenInventorXtExaminerViewer::pickingCB(
void *aThis, 
 
 1006                                                SoEventCallback *eventCB)
 
 1008    SoHandleEventAction* action = eventCB->getAction();
 
 1009    const SoPickedPoint *
pp = action->getPickedPoint();
 
 1014       SoPath* path = pp->getPath();
 
 1015       SoNode* node = ((SoFullPath*)path)->getTail();
 
 1017       if(node->getTypeId() == SoLineSet::getClassTypeId()){
 
 1027             SoLineSet * trajectory = (SoLineSet *)node;
 
 1033             SoSeparator * grpNode = 
 
 1034                (SoSeparator*)(((SoFullPath*)path)->getNodeFromTail(1));
 
 1039             int nodeIndex = grpNode->findChild(trajectory);
 
 1042             SoCoordinate3 * coords = 0;
 
 1046             for(
int i = 0; i < 100; ++i) {
 
 1049                tmpNode = grpNode->getChild(nodeIndex);
 
 1050                if(tmpNode->getTypeId() == SoCoordinate3::getClassTypeId()){
 
 1052                   coords = (SoCoordinate3 *)tmpNode;
 
 1058                String dialogName = (
char *) 
"No coordinates";
 
 1059                std::string msg = 
"Could not find the coordinates node" 
 1060                   " for the picked trajectory." 
 1061                   " Reference trajectory not set";
 
 1067             if ((This->lshiftdown)  || (This->rshiftdown))
 
 1068                This->setReferencePath(trajectory, coords, 
true);
 
 1070                This->setReferencePath(trajectory, coords, 
false);
 
 1078             if(attHolder && attHolder->
GetAttDefs().size()) {
 
 1080                std::string strTrajPoint = 
"G4TrajectoryPoint:";
 
 1081                std::ostringstream oss;
 
 1082                for (
size_t i = 0; i < attHolder->
GetAttDefs().size(); ++i) {
 
 1087                   if(oss.str().find(strTrajPoint) != std::string::npos) {
 
 1102                G4String cls((
char*)node->getTypeId().getName().getString());
 
 1103                G4cout << 
"SoNode : " << node
 
 1104                       << 
" SoType : " << cls
 
 1105                       << 
" name : " << name
 
 1122       if(attHolder && attHolder->
GetAttDefs().size()) {
 
 1123          for (
size_t i = 0; i < attHolder->
GetAttDefs().size(); ++i) {
 
 1129          G4String cls((
char*)node->getTypeId().getName().getString());
 
 1130          G4cout << 
"SoNode : " << node
 
 1131                 << 
" SoType : " << cls
 
 1132                 << 
" name : " << name
 
 1138       eventCB->setHandled();
 
 1143 void G4OpenInventorXtExaminerViewer::mouseoverCB(
void *aThis, SoEventCallback *eventCB)
 
 1145    SoHandleEventAction* action = eventCB->getAction();
 
 1146    const SoPickedPoint *pp = action->getPickedPoint();
 
 1154       const SbViewportRegion & viewportRegion = action->getViewportRegion();
 
 1156       std::string sLogName;
 
 1158       std::stringstream ssZPos;
 
 1159       std::stringstream ssSolids;
 
 1160       std::stringstream ssMaterials;
 
 1161       SoPath * path = pp->getPath();
 
 1162       SoNode* node = ((SoFullPath*)path)->getTail();
 
 1164       if(node->getTypeId() == Geant4_SoPolyhedron::getClassTypeId()) {
 
 1166          sLogName = 
"Logical Volume:  ";
 
 1169          SoGetBoundingBoxAction bAction(viewportRegion);
 
 1170          bAction.apply((SoFullPath*)path);
 
 1171          SbBox3f bBox = bAction.getBoundingBox();
 
 1172          SbVec3f center = bBox.getCenter();
 
 1173          center.getValue(x,y,z);
 
 1174          ssZPos << 
"Pos:  " << x << 
"  " << y << 
"  " << 
z;
 
 1177          if(attHolder && attHolder->
GetAttDefs().size()) {
 
 1179             std::vector<const std::map<G4String,G4AttDef>*> vecDefs =
 
 1181             std::vector<const std::vector<G4AttValue>*> vecVals =
 
 1183             for (
size_t i = 0; i < vecDefs.size(); ++i) {
 
 1184                const std::vector<G4AttValue> * vals = vecVals[i];
 
 1186                std::vector<G4AttValue>::const_iterator iValue;
 
 1188                for (iValue = vals->begin(); iValue != vals->end(); ++iValue) {
 
 1189                   const G4String& valueName = iValue->GetName();
 
 1192                   if(valueName == 
"Solid") {
 
 1193                      if(ssSolids.str() == 
"")
 
 1194                         ssSolids << 
"Solid Name:  " << value;
 
 1196                         ssSolids << 
", " << 
value;
 
 1199                   if(valueName == 
"Material") {
 
 1200                      if(ssMaterials.str() == 
"")
 
 1201                         ssMaterials << 
"Material Name:  " << value;
 
 1203                         ssMaterials << 
", " << 
value;
 
 1210       bool redraw = 
false;
 
 1211       if(std::string(This->mouseOverTextLogName->string.getValues(0)->getString()) != sLogName) {
 
 1212          This->mouseOverTextLogName->string.setValue(SbString(sLogName.c_str()));
 
 1215       if(std::string(This->mouseOverTextSolid->string.getValues(0)->getString()) != ssSolids.str()) {
 
 1216          This->mouseOverTextSolid->string.setValue(SbString(ssSolids.str().c_str()));
 
 1219       if(std::string(This->mouseOverTextMaterial->string.getValues(0)->getString()) != ssMaterials.str()){
 
 1220          This->mouseOverTextMaterial->string.setValue(SbString(ssMaterials.str().c_str()));
 
 1223       if(std::string(This->mouseOverTextZPos->string.getValues(0)->getString()) != ssZPos.str()) {
 
 1224          This->mouseOverTextZPos->string.setValue(SbString(ssZPos.str().c_str()));
 
 1229          This->setSuperimpositionEnabled(This->superimposition, 
TRUE);
 
 1230          This->scheduleRedraw();
 
 1233       eventCB->setHandled();
 
 1236       if(std::string(This->mouseOverTextLogName->string.getValues(0)->getString()) != 
"") {
 
 1237          This->mouseOverTextLogName->string.setValue(SbString(
""));
 
 1238          This->scheduleRedraw();
 
 1240       if(std::string(This->mouseOverTextSolid->string.getValues(0)->getString()) != 
"") {
 
 1241          This->mouseOverTextSolid->string.setValue(SbString(
""));
 
 1242          This->scheduleRedraw();
 
 1244       if(std::string(This->mouseOverTextMaterial->string.getValues(0)->getString()) != 
"") {
 
 1245          This->mouseOverTextMaterial->string.setValue(SbString(
""));
 
 1246          This->scheduleRedraw();
 
 1248       if(std::string(This->mouseOverTextZPos->string.getValues(0)->getString()) != 
"") {
 
 1249          This->mouseOverTextZPos->string.setValue(SbString(
""));
 
 1250          This->scheduleRedraw();
 
 1257    SoCamera *cam = getCamera();
 
 1258    const SoType type(ev->getTypeId());
 
 1260    if (type.isDerivedFrom(SoMouseButtonEvent::getClassTypeId())) {
 
 1261       SoMouseButtonEvent * me = (SoMouseButtonEvent *) ev;
 
 1263       if (currentState == ANIMATION || currentState == REVERSED_ANIMATION
 
 1264           || currentState == PAUSED_ANIMATION) {
 
 1265          switch (me->getButton()) {
 
 1266          case SoMouseButtonEvent::BUTTON4: 
 
 1267             if (me->getState() == SoButtonEvent::DOWN) {
 
 1268                if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 1270                      ((SoPerspectiveCamera *) cam)->heightAngle.getValue();
 
 1271                   ((SoPerspectiveCamera *) cam)->heightAngle = hAngle
 
 1274                } 
else if (cam->isOfType(
 
 1275                                         SoOrthographicCamera::getClassTypeId())) {
 
 1277                      ((SoOrthographicCamera *) cam)->height.getValue();
 
 1278                   ((SoOrthographicCamera *) cam)->height = height + 5;
 
 1283          case SoMouseButtonEvent::BUTTON5: 
 
 1284             if (me->getState() == SoButtonEvent::DOWN) {
 
 1285                if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 1287                      ((SoPerspectiveCamera *) cam)->heightAngle.getValue();
 
 1289                      ((SoPerspectiveCamera *) cam)->heightAngle = hAngle
 
 1292                } 
else if (cam->isOfType(
 
 1293                                         SoOrthographicCamera::getClassTypeId())) {
 
 1295                      ((SoOrthographicCamera *) cam)->height.getValue();
 
 1297                      ((SoOrthographicCamera *) cam)->height = height - 5;
 
 1306       if (currentState == GENERAL) {
 
 1311    if (type.isDerivedFrom(SoKeyboardEvent::getClassTypeId())) {
 
 1312       SoKeyboardEvent * ke = (SoKeyboardEvent *) ev;
 
 1314       if (SoKeyboardEvent::isKeyPressEvent(ev, ke->getKey())) {
 
 1315          switch (ke->getKey()) {
 
 1316          case SoKeyboardEvent::LEFT_SHIFT:
 
 1317             this->lshiftdown = 
true;
 
 1319          case SoKeyboardEvent::RIGHT_SHIFT:
 
 1320             this->rshiftdown = 
true;
 
 1322          case SoKeyboardEvent::LEFT_CONTROL:
 
 1323             this->lctrldown = 
true;
 
 1325          case SoKeyboardEvent::RIGHT_CONTROL:
 
 1326             this->rctrldown = 
true;
 
 1328          case SoKeyboardEvent::SPACE:
 
 1329             if (currentState == ANIMATION
 
 1330                 || currentState == REVERSED_ANIMATION) {
 
 1331                beforePausing = currentState;
 
 1332                currentState = PAUSED_ANIMATION;
 
 1333                if (animateSensor->isScheduled())
 
 1334                   animateSensor->unschedule();
 
 1336             } 
else if (currentState == PAUSED_ANIMATION) {
 
 1338                   if ((beforePausing == ANIMATION
 
 1340                        < (
int) refParticleTrajectory.size() - 1)
 
 1341                       || (beforePausing == REVERSED_ANIMATION
 
 1342                           && refParticleIdx > 0)) {
 
 1343                      currentState = beforePausing;
 
 1344                      animateRefParticle();
 
 1350          case SoKeyboardEvent::ESCAPE:
 
 1351             if (currentState == ANIMATION
 
 1352                 || currentState == REVERSED_ANIMATION
 
 1353                 || currentState == PAUSED_ANIMATION) {
 
 1355                if (animateSensor->isScheduled())
 
 1356                   animateSensor->unschedule();
 
 1357                currentState = prevState;
 
 1358                refParticleIdx = prevRefIdx;
 
 1359                setSuperimpositionEnabled(superimposition, 
FALSE);
 
 1364                if (currentState == VIEWPOINT) {
 
 1365                   setSuperimpositionEnabled(superimposition, 
TRUE);
 
 1366                   axisSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 1367                   animSpeedOutlineSwitch->whichChild.setValue(
 
 1369                   animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 1377          case SoKeyboardEvent::DELETE:
 
 1378             if (viewPtList.size()
 
 1379                 && (currentState != ANIMATION
 
 1380                     || currentState != REVERSED_ANIMATION
 
 1381                     || currentState != PAUSED_ANIMATION)) {
 
 1382                String dialogName = (
char *) 
"Delete Viewpoint";
 
 1383                std::string msg = 
"Are you sure you want to delete current viewpoint?";
 
 1388          case SoKeyboardEvent::LEFT_ARROW:
 
 1389             switch (currentState) {
 
 1391                if ((this->lshiftdown)   || (this->rshiftdown)){
 
 1392                   refParticleIdx -= step;
 
 1395                else if ((this->lctrldown)   || (this->rctrldown)){
 
 1396                   if (SoXtExaminerViewer::isAnimating())
 
 1398                   prevState = currentState;
 
 1399                   currentState = ROTATING;
 
 1400                   animateBtwPtsPeriod = 0.08f;
 
 1412                   if (SoXtExaminerViewer::isAnimating())
 
 1414                   prevState = currentState;
 
 1415                   currentState = ROTATING;
 
 1416                   animateBtwPtsPeriod = 0.08f;
 
 1431             case REVERSED_ANIMATION:
 
 1434             case PAUSED_ANIMATION:
 
 1436                setStartingPtForAnimation();
 
 1437                cam->position = myCam->position;
 
 1441                if ((!this->lshiftdown) && (!this->rshiftdown)) {
 
 1444                   this->bottomWheelMotion(
 
 1445                                           this->getBottomWheelValue() + 0.1
f);
 
 1455                SoDebugError::post(
"G4OpenInventorXtExaminerViewer::processSoEvent",
 
 1456                                   "Unhandled viewer state");
 
 1461          case SoKeyboardEvent::RIGHT_ARROW:
 
 1462             switch(currentState){
 
 1464                if ((this->lshiftdown)   || (this->rshiftdown)){
 
 1465                   refParticleIdx += step;
 
 1468                else if ((this->lctrldown)   || (this->rctrldown)){
 
 1469                   if (SoXtExaminerViewer::isAnimating())
 
 1471                   prevState = currentState;
 
 1472                   currentState = ROTATING;
 
 1473                   animateBtwPtsPeriod = 0.08f;
 
 1483                   if (SoXtExaminerViewer::isAnimating())
 
 1485                   prevState = currentState;
 
 1486                   currentState = ROTATING;
 
 1487                   animateBtwPtsPeriod = 0.08f;
 
 1499             case REVERSED_ANIMATION:
 
 1502             case PAUSED_ANIMATION:
 
 1504                setStartingPtForAnimation();
 
 1505                cam->position = myCam->position;
 
 1509                if ((!this->lshiftdown) && (!this->rshiftdown)) {
 
 1512                   this->bottomWheelMotion(
 
 1513                                           this->getBottomWheelValue() - 0.1
f);
 
 1522                SoDebugError::post(
"G4OpenInventorXtExaminerViewer::processSoEvent",
 
 1523                                   "Unhandled viewer state");
 
 1528          case SoKeyboardEvent::DOWN_ARROW:
 
 1529             switch(currentState){
 
 1532                if ((this->lshiftdown)   || (this->rshiftdown)){
 
 1533                   refParticleIdx -= step;
 
 1537                   if (SoXtExaminerViewer::isAnimating())
 
 1539                   prevState = currentState;
 
 1540                   currentState = ROTATING;
 
 1541                   animateBtwPtsPeriod = 0.08f;
 
 1554             case REVERSED_ANIMATION:
 
 1557             case PAUSED_ANIMATION:
 
 1559                setStartingPtForAnimation();
 
 1560                cam->position = myCam->position;
 
 1566                if ((!this->lshiftdown) && (!this->rshiftdown)) {
 
 1567                   this->leftWheelMotion(this->getLeftWheelValue() - 0.1
f);
 
 1576                SoDebugError::post(
"G4OpenInventorXtExaminerViewer::processSoEvent",
 
 1577                                   "Unhandled viewer state");
 
 1582          case SoKeyboardEvent::UP_ARROW:
 
 1583             switch(currentState){
 
 1585                if ((this->lshiftdown)   || (this->rshiftdown)){
 
 1586                   refParticleIdx -= step;
 
 1590                   if (SoXtExaminerViewer::isAnimating())
 
 1592                   prevState = currentState;
 
 1593                   currentState = ROTATING;
 
 1594                   animateBtwPtsPeriod = 0.08f;
 
 1607             case REVERSED_ANIMATION:
 
 1610             case PAUSED_ANIMATION:
 
 1612                setStartingPtForAnimation();
 
 1613                cam->position = myCam->position;
 
 1619                if ((!this->lshiftdown) && (!this->rshiftdown)) {
 
 1620                   this->leftWheelMotion(this->getLeftWheelValue() + 0.1
f);
 
 1629                SoDebugError::post(
"G4OpenInventorXtExaminerViewer::processSoEvent",
 
 1630                                   "Unhandled viewer state");
 
 1635          case SoKeyboardEvent::PAGE_UP:
 
 1636             switch(currentState){
 
 1638                if (step < (
int) refParticleTrajectory.size() / 5) 
 
 1649             case REVERSED_ANIMATION:
 
 1650                if(!animateSensor->isScheduled()){
 
 1651                   currentState = ANIMATION;
 
 1653                       < (
int) refParticleTrajectory.size() - 1) {
 
 1657                      animateRefParticle();
 
 1666             case PAUSED_ANIMATION:
 
 1671                if (beforePausing == ANIMATION) {
 
 1676                      beforePausing = ANIMATION;
 
 1686          case SoKeyboardEvent::PAGE_DOWN:
 
 1687             switch(currentState){
 
 1693                if(!animateSensor->isScheduled()){
 
 1694                   currentState = REVERSED_ANIMATION;
 
 1695                   if (refParticleIdx > 1) {
 
 1699                      animateRefParticle();
 
 1708             case REVERSED_ANIMATION:
 
 1711                if (maxSpeed < -0.8)
 
 1715             case PAUSED_ANIMATION:
 
 1717                if (maxSpeed < -0.8)
 
 1719                if (beforePausing == REVERSED_ANIMATION) {
 
 1724                      beforePausing = REVERSED_ANIMATION;
 
 1734          case SoKeyboardEvent::E:
 
 1735             this->escapeCallback(this->examinerObject);
 
 1742       if (SoKeyboardEvent::isKeyReleaseEvent(ev, ke->getKey())) {
 
 1743          switch (ke->getKey()) {
 
 1744          case SoKeyboardEvent::LEFT_SHIFT:
 
 1745             this->lshiftdown = 
false;
 
 1747          case SoKeyboardEvent::RIGHT_SHIFT:
 
 1748             this->rshiftdown = 
false;
 
 1750          case SoKeyboardEvent::LEFT_CONTROL:
 
 1751             this->lctrldown = 
false;
 
 1753          case SoKeyboardEvent::RIGHT_CONTROL:
 
 1754             this->rctrldown = 
false;
 
 1762    if (currentState == ANIMATION || currentState == REVERSED_ANIMATION
 
 1763        || currentState == ROTATING)
 
 1766       return SoXtExaminerViewer::processSoEvent(ev);
 
 1770 void G4OpenInventorXtExaminerViewer::incSpeed() {
 
 1771     if (std::ceil(animateBtwPtsPeriod * 100) >= 4) {
 
 1772         if (speedStep > 0.08)
 
 1776         animateBtwPtsPeriod -= speedStep;
 
 1778         animateBtwPtsPeriod = 0.0;
 
 1780     if (currentState != PAUSED_ANIMATION) {
 
 1781         int lastIdx = refParticleTrajectory.size() - 1;
 
 1782         if (refParticleIdx < lastIdx && !animateSensor->isScheduled())
 
 1783             animateRefParticle();
 
 1788 void G4OpenInventorXtExaminerViewer::decSpeed() {
 
 1789     animateBtwPtsPeriod += speedStep;
 
 1791         if (std::floor(animateBtwPtsPeriod * 100) == 12) { 
 
 1793         } 
else if (animateBtwPtsPeriod > 0.12)
 
 1799         if (animateSensor->isScheduled())
 
 1800             animateSensor->unschedule();
 
 1805 void G4OpenInventorXtExaminerViewer::updateSpeedIndicator(
void) {
 
 1806     assert(this->sgeometry != NULL);
 
 1808     SbVec3f * points = this->sgeometry->point.startEditing();
 
 1810     if (points[10][0] == 0.0
f)
 
 1811         this->animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_ALL);
 
 1812     if (points[14][0] == 0.0
f)
 
 1813         this->animSpeedSwitch->whichChild.setValue(SO_SWITCH_ALL);
 
 1814     points[10][0] = this->maxSpeed;
 
 1815     points[11][0] = this->maxSpeed;
 
 1816     points[14][0] = this->maxSpeed;
 
 1817     points[15][0] = this->maxSpeed;
 
 1818     this->sgeometry->point.finishEditing();
 
 1820     if (this->maxSpeed == 0.0
f) {
 
 1821         this->animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 1822         this->animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 1826 void G4OpenInventorXtExaminerViewer::actualRedraw(
void) {
 
 1827     switch (currentState) {
 
 1829     case REVERSED_ANIMATION:
 
 1830     case PAUSED_ANIMATION:
 
 1831         updateSpeedIndicator();
 
 1832         SoXtExaminerViewer::actualRedraw();
 
 1835         SoXtExaminerViewer::actualRedraw();
 
 1840 void G4OpenInventorXtExaminerViewer::setReferencePath(SoLineSet *lineset, SoCoordinate3 *coords, 
bool append)
 
 1881    SbVec3f refParticlePt;
 
 1884       this->refParticleTrajectory.clear();
 
 1886    for(
int i = 0; i < lineset->numVertices.getNum(); ++i){
 
 1887       for(
int j = 0; j < lineset->numVertices[i]; ++j){
 
 1888          refParticlePt = coords->point[j];
 
 1889          this->refParticleTrajectory.push_back(refParticlePt);
 
 1893    this->evenOutRefParticlePts();
 
 1894    this->setReferencePathZPos();
 
 1895    this->sortElements();
 
 1899 void G4OpenInventorXtExaminerViewer::setReferencePathZPos()
 
 1901    refZPositions.clear();
 
 1902    refZPositions.push_back(0);
 
 1904    for(
unsigned int i=0; i < this->refParticleTrajectory.size() - 1; ++i){
 
 1905       dist = (refParticleTrajectory[i] - 
 
 1906               refParticleTrajectory[i + 1]).length();
 
 1907       refZPositions.push_back(refZPositions[i] + dist);
 
 1912 void G4OpenInventorXtExaminerViewer::findAndSetRefPath()
 
 1914    SoSearchAction action;
 
 1915    action.setType(SoLineSet::getClassTypeId(),
false);
 
 1916    action.setInterest(SoSearchAction::ALL);
 
 1917    action.apply(this->getSceneGraph());
 
 1919    SoPathList &pathList = action.getPaths();
 
 1921    if(pathList.getLength() != 0){
 
 1923       SoCoordinate3 * coords = NULL;
 
 1924       std::vector<SoCoordinate3 *> coordvec;
 
 1925       std::vector<SoLineSet *> linevec;
 
 1927       bool refPathFound = 
false;
 
 1928       for(
int i = 0; i < pathList.getLength(); ++i) {
 
 1929          SoFullPath *path = (SoFullPath *)pathList[i];
 
 1932          for (
size_t j = 0; j < attHolder->
GetAttDefs().size(); ++j) {
 
 1933             std::ostringstream oss;
 
 1936             std::string findStr = 
"Type of trajectory (Type): ";
 
 1937             std::string compareValue = 
"REFERENCE";
 
 1938             size_t idx = oss.str().find(findStr);
 
 1940             if(idx != std::string::npos) {
 
 1941                if(oss.str().substr(idx + findStr.size(), compareValue.size()) == compareValue) {
 
 1942                   coords = this->getCoordsNode(path);
 
 1944                      refPathFound = 
true;
 
 1945                      coordvec.push_back(coords);
 
 1946                      linevec.push_back((SoLineSet *)path->getTail());
 
 1952             findStr = 
"Track ID (ID): ";
 
 1953             idx = oss.str().find(findStr);
 
 1954             if(idx != std::string::npos) {
 
 1956                std::string tmpstr = oss.str().substr(idx + findStr.size(),1);
 
 1957                std::istringstream 
buffer(tmpstr);
 
 1964                   const char * nextChar = 
 
 1965                      oss.str().substr(idx + findStr.size() + 1,1).c_str();
 
 1966                   if(std::isdigit(nextChar[0]))
 
 1969                   coords = this->getCoordsNode(path);
 
 1971                      coordvec.push_back(coords);
 
 1972                      linevec.push_back((SoLineSet *)path->getTail());
 
 1988       if(coordvec.empty())
 
 1993          this->setReferencePath(linevec.back(), coordvec.back());
 
 1999       float longestLength = 0.0;
 
 2001       for(
unsigned int i=0;i < linevec.size(); ++i){
 
 2004          std::vector<SbVec3f> trajectory;
 
 2006          for(
int j=0; j < linevec[i]->numVertices.getNum(); ++j){
 
 2008             for(
int k=0; k < linevec[i]->numVertices[j]; ++k){
 
 2009                trajectory.push_back(coordvec[i]->point[k]);
 
 2014          float tmpLength=0.0;
 
 2015          for(
unsigned int j=0; j < trajectory.size() - 1; ++j){
 
 2016             tmpLength += (trajectory[j] - trajectory[j + 1]).length();
 
 2019          if(tmpLength > longestLength){
 
 2021             longestLength = tmpLength;
 
 2026       this->setReferencePath(linevec[longestIdx], coordvec[longestIdx]);
 
 2031 SoCoordinate3 * G4OpenInventorXtExaminerViewer::getCoordsNode(SoFullPath *path)
 
 2033    SoLineSet *trajectory = (SoLineSet *)path->getTail();
 
 2034    SoSeparator * grpNode = (SoSeparator*)(((SoFullPath*)path)->getNodeFromTail(1));
 
 2035    int nodeIndex = grpNode->findChild(trajectory);
 
 2040    for(
int i = 0; i < 100; ++i){
 
 2043       tmpNode = grpNode->getChild(nodeIndex);
 
 2044       if(tmpNode->getTypeId() == SoCoordinate3::getClassTypeId()){
 
 2046          return (SoCoordinate3 *)tmpNode;
 
 2055 void G4OpenInventorXtExaminerViewer::getSceneElements()
 
 2057    std::string field, eltName;
 
 2059    std::map<std::string, int> duplicates;
 
 2060    std::map<std::string, int> sceneElts;
 
 2061    SoSearchAction search;
 
 2063    SoGroup *root = (SoGroup *)getSceneManager()->getSceneGraph();
 
 2065    SoBaseKit::setSearchingChildren(
TRUE);
 
 2068    search.setSearchingAll(
TRUE);
 
 2069    search.setInterest(SoSearchAction::ALL);
 
 2070    search.setType(Geant4_SoPolyhedron::getClassTypeId(), 0);
 
 2073    SoPathList &
pl = search.getPaths();
 
 2077    for(
int i = 0; i < pl.getLength(); i++) {
 
 2078       SoFullPath *path = (SoFullPath *)pl[i];
 
 2080       eltName = node->getName();
 
 2081       if(duplicates.count(eltName))
 
 2082          duplicates[eltName]++;
 
 2084          duplicates[eltName] = 1;
 
 2087    for(
int i = 0; i < pl.getLength(); i++) {
 
 2089       std::stringstream ssCount;
 
 2090       SoFullPath *path = (SoFullPath *)pl[i];
 
 2092       eltName = node->getName();
 
 2094       if(duplicates[eltName] == 1)
 
 2097          if(sceneElts.count(eltName))
 
 2098             sceneElts[eltName]++;
 
 2100             sceneElts[eltName] = 1;
 
 2102          ssCount << sceneElts[eltName];
 
 2106       field += ssCount.str();
 
 2108       SoGetBoundingBoxAction bAction(getViewportRegion());
 
 2109       bAction.apply(path);
 
 2110       SbBox3f bBox = bAction.getBoundingBox();
 
 2112       SbVec3f centr = bBox.getCenter();
 
 2113       centr.getValue(x,y,z);
 
 2116       sceneElement el = { field, path, centr, 0.0 };
 
 2117       this->sceneElements.push_back(el);
 
 2122 float G4OpenInventorXtExaminerViewer::sqrlen(
const SbVec3f &
a)
 
 2126    return x*x + y*y + z*
z;
 
 2130 void G4OpenInventorXtExaminerViewer::distanceToTrajectory(
const SbVec3f &q,
 
 2132                                                 SbVec3f &closestPoint,
 
 2167    const size_t count = this->refParticleTrajectory.size();
 
 2170    SbVec3f 
b = this->refParticleTrajectory[0];
 
 2171    SbVec3f dbq = b - q;
 
 2172    float sqrDist = sqrlen(dbq);
 
 2175    for (
size_t i = 1; i < count; ++i) {
 
 2176       const SbVec3f a = 
b;
 
 2177       const SbVec3f daq = dbq;
 
 2178       b = this->refParticleTrajectory[i];
 
 2180       const SbVec3f dab = a - 
b;
 
 2182       float dab_x, dab_y, dab_z;
 
 2183       dab.getValue(dab_x,dab_y,dab_z);
 
 2184       float daq_x, daq_y, daq_z;
 
 2185       daq.getValue(daq_x, daq_y, daq_z);
 
 2186       float dbq_x, dbq_y, dbq_z;
 
 2187       dbq.getValue(dbq_x, dbq_y, dbq_z);
 
 2189       const float inv_sqrlen = 1./sqrlen(dab);
 
 2190       const float t = (dab_x*daq_x + dab_y*daq_y + dab_z*daq_z)*inv_sqrlen;
 
 2201          current_dist = daq_x*daq_x + daq_y*daq_y + daq_z*daq_z
 
 2202             - t*(daq_x*dab_x + daq_y*dab_y + daq_z*dab_z)
 
 2203             + t*t*(dab_x*dab_x + dab_y*dab_y + dab_z*dab_z);
 
 2208          current_dist = sqrlen(dbq);
 
 2211       if (current_dist < sqrDist){
 
 2212          sqrDist = current_dist;
 
 2213          closestPoint = a + t*(b-
a);
 
 2218    dist = std::sqrt(sqrDist);
 
 2222 void G4OpenInventorXtExaminerViewer::sortElements()
 
 2224    if(this->refParticleTrajectory.empty())
 
 2227    float * trajLength = 
new float[this->refParticleTrajectory.size()];
 
 2228    typedef std::map<elementForSorting, sceneElement> sortedMap;
 
 2234    std::vector<SbVec3f>::iterator itRef = this->refParticleTrajectory.begin();
 
 2237    trajLength[trajIndex] = 0.0;
 
 2240    for(; itRef != this->refParticleTrajectory.end(); ++itRef, ++trajIndex){
 
 2241       trajLength[trajIndex] = trajLength[trajIndex-1] + (*itRef - prevPoint).length();
 
 2249    SoGetBoundingBoxAction bAction(this->getViewportRegion());
 
 2250    SbVec3f elementCoord;
 
 2251    std::vector<sceneElement>::iterator itEl;
 
 2253    elementForSorting el;
 
 2254    for(itEl = this->sceneElements.begin(), elementIndex = 0;
 
 2255        itEl != this->sceneElements.end(); ++itEl, ++elementIndex){
 
 2256       bAction.apply(itEl->path);
 
 2257       elementCoord = bAction.getBoundingBox().getCenter();
 
 2260       distanceToTrajectory(elementCoord, el.smallestDistance, el.closestPoint, index);
 
 2261       itEl->closestPointZCoord = el.closestPointZCoord = trajLength[
index];
 
 2262       el.distanceToBeamlineStart = (itEl->center - this->refParticleTrajectory[0]).length();
 
 2269       sorted.insert(std::make_pair(el,*itEl));
 
 2273    this->sceneElements.clear();
 
 2275    sortedMap::iterator itSorted = sorted.begin();
 
 2276    for(; itSorted != sorted.end(); itSorted++)
 
 2277       this->sceneElements.push_back(itSorted->second);
 
 2279    this->zcoordSetFlag = 
true;
 
 2282    Widget formTop = XtNameToWidget(this->listsDialog, 
"FormTop");
 
 2283    Widget formTopRight = XtNameToWidget(formTop, 
"FormTopRight");
 
 2285    this->createElementsList(formTopRight);
 
 2287    delete[] trajLength;
 
 2291 void G4OpenInventorXtExaminerViewer::createElementsList(Widget formTopRight)
 
 2293    if(this->myElementList != NULL)
 
 2294       XtUnmanageChild(this->myElementList);
 
 2296    int size = this->sceneElements.size();
 
 2297    XmString *elements = (XmString *) XtMalloc(size * 
sizeof(XmString));
 
 2299    std::vector<sceneElement>::const_iterator it;
 
 2301    std::stringstream ss;
 
 2302    for(it=this->sceneElements.begin(); it!=this->sceneElements.end(); ++it) {
 
 2305          ss << 
" [" << it->closestPointZCoord << 
"]";
 
 2306       elements[count] = XmStringCreateLocalized((
char *)ss.str().c_str());
 
 2317    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
 
 2319    labelRight = XmCreateLabelGadget(formTopRight, (
char*)
"Element [S mm]",
 
 2321    XtManageChild(labelRight);
 
 2325    XtSetArg(args[n], XmNvisibleItemCount, 7);   n++;
 
 2326    XtSetArg(args[n], XmNitemCount, size);   n++;
 
 2327    XtSetArg(args[n], XmNitems, elements);   n++;
 
 2328    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);    n++;
 
 2329    XtSetArg(args[n], XmNtopWidget, labelRight); n++;
 
 2330    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);    n++;
 
 2331    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);   n++;
 
 2332    XtSetArg(args[n], XmNwidth, 280);    n++;
 
 2335    this->myElementList = XmCreateScrolledList(formTopRight, (
char *) 
"ListRight", args, n);
 
 2337    XtAddCallback(this->myElementList, XmNbrowseSelectionCallback,
 
 2338                  (XtCallbackProc) lookAtSceneElementCB, 
this);
 
 2340    XtManageChild(this->myElementList);
 
 2342    if (elements != NULL) {
 
 2343       for (
int i = 0; i < size; i++)
 
 2344          XmStringFree(elements[i]);
 
 2345       XtFree((
char *) elements);
 
 2353 void G4OpenInventorXtExaminerViewer::constructListsDialog(Widget w,
 
 2354                                              XtPointer client_data,
 
 2358    if (This->listsDialog) {
 
 2362    if (This->currentState == ANIMATION || This->currentState == PAUSED_ANIMATION) {
 
 2363       if (This->animateSensor->isScheduled())
 
 2364          This->animateSensor->unschedule();
 
 2365       This->refParticleIdx = This->prevRefIdx;
 
 2366       This->restoreCamera();
 
 2367       This->currentState = This->prevState;
 
 2371    This->refParticleIdx = 0;
 
 2372    if (This->refParticleTrajectory.size()){
 
 2373       This->prevPt = This->refParticleTrajectory[0]; 
 
 2376    This->getSceneElements();
 
 2380    Atom WM_DELETE_WINDOW;
 
 2385    topShell = SoXt::getShellWidget(This->getParentWidget());
 
 2388    std::string dialogNameStr = This->fileName.substr(This->fileName.rfind(
'/') + 1);
 
 2389    char *dialogName = 
new char[dialogNameStr.size() + 1];
 
 2390    strcpy(dialogName, dialogNameStr.c_str());
 
 2393    XtSetArg(args[n], XmNx, 610);    n++;
 
 2394    This->myShellDialog = XmCreateDialogShell(topShell, dialogName, args, n);
 
 2396    delete[] dialogName;
 
 2397    WM_DELETE_WINDOW = XInternAtom(XtDisplay(w), 
"WM_DELETE_WINDOW", False);
 
 2398    XmAddWMProtocolCallback(This->myShellDialog, WM_DELETE_WINDOW,
 
 2399                            (XtCallbackProc)closeListsDialogCB, This);
 
 2403    XtSetArg(args[n], XmNsashWidth, 1);  n++;
 
 2404    XtSetArg(args[n], XmNsashHeight, 1); n++;
 
 2405    XtSetArg(args[n], XmNseparatorOn, False);    n++;
 
 2406    This->listsDialog = XmCreatePanedWindow(This->myShellDialog, (
char *) 
"MainPane",
 
 2412    Widget formTop = XmCreateForm(This->listsDialog, (
char *) 
"FormTop", args, n);
 
 2415    XtSetArg(args[n], XmNmarginWidth, 8);    n++;
 
 2416    XtSetArg(args[n], XmNmarginHeight, 8);   n++;
 
 2417    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
 
 2418    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);    n++;
 
 2419    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);   n++;
 
 2420    Widget formTopRight = XmCreateForm(formTop, (
char *) 
"FormTopRight", args,
 
 2424    XtSetArg(args[n], XmNmarginWidth, 8);    n++;
 
 2425    XtSetArg(args[n], XmNmarginHeight, 8);   n++;
 
 2426    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
 
 2427    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2428    XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET);  n++;
 
 2429    XtSetArg(args[n], XmNrightWidget, formTopRight); n++;
 
 2430    XtSetArg(args[n], XmNrightOffset, 10);   n++;
 
 2431    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);   n++;
 
 2432    Widget formTopLeft = XmCreateForm(formTop, (
char *) 
"FormTopLeft", args, n);
 
 2436    This->createElementsList(formTopRight);
 
 2437    XtManageChild(formTopRight);
 
 2443    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
 
 2444    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2445    Widget labelLeft = XmCreateLabelGadget(formTopLeft, (
char *) 
"ViewPoints",
 
 2447    XtManageChild(labelLeft);
 
 2451    XtSetArg(args[n], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE);  n++;
 
 2452    XtSetArg(args[n], XmNvisibleItemCount, 7);   n++;
 
 2454    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);    n++;
 
 2455    XtSetArg(args[n], XmNtopWidget, labelLeft);  n++;
 
 2456    XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET);  n++;
 
 2457    XtSetArg(args[n], XmNrightWidget, This->myElementList);  n++;
 
 2458    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2459    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);   n++;
 
 2460    XtSetArg(args[n], XmNwidth, 200);    n++;
 
 2462    This->myViewPtList = XmCreateScrolledList(formTopLeft, (
char *) 
"ListLeft",
 
 2464    if (This->viewPtList.size())
 
 2465       This->addViewPoints();
 
 2466    XtAddCallback(This->myViewPtList, XmNbrowseSelectionCallback,
 
 2467                  (XtCallbackProc) loadBookmarkCB, This);
 
 2470    XtManageChild(This->myViewPtList);
 
 2472    XtManageChild(formTopLeft);
 
 2474    XtManageChild(formTop);
 
 2478    XtSetArg(args[n], XmNmarginWidth, 6);    n++;
 
 2479    Widget formMiddle = XmCreateForm(This->listsDialog, (
char *) 
"MiddleForm", args,
 
 2484    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2485    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);    n++;
 
 2486    XtSetArg(args[n], XmNtopWidget, This->myViewPtList); n++;
 
 2487    Widget label = XmCreateLabelGadget(formMiddle, (
char *) 
"Selection", args,
 
 2489    XtManageChild(label);
 
 2493    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2494    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);    n++;
 
 2495    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);    n++;
 
 2496    XtSetArg(args[n], XmNtopWidget, label);  n++;
 
 2497    XtSetArg(args[n], XmNtopOffset, 3);  n++;
 
 2498    XtSetArg(args[n], XmNmaxLength, This->MAX_VP_NAME);  n++;
 
 2499    This->viewPtSelection = XmCreateText(formMiddle, (
char *) 
"Txt", args, n);
 
 2500    XtManageChild(This->viewPtSelection);
 
 2502    Dimension 
h1, 
h2, h;
 
 2503    XtVaGetValues(label, XmNheight, &h1, NULL);
 
 2504    XtVaGetValues(This->viewPtSelection, XmNheight, &h2, NULL);
 
 2506    h = (Dimension) (1.1 * (h1 + h2));
 
 2508    XtVaSetValues(formMiddle, XmNpaneMaximum, h, XmNpaneMinimum, h, NULL);
 
 2509    XtManageChild(formMiddle);
 
 2514    XtSetArg(args[n], XmNfractionBase, 4);   n++;
 
 2515    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);    n++;
 
 2516    XtSetArg(args[n], XmNtopWidget, This->viewPtSelection);  n++;
 
 2517    Widget formAction = XmCreateForm(This->listsDialog, (
char *) 
"ActionForm", args,
 
 2521    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
 
 2522    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);    n++;
 
 2523    XtSetArg(args[n], XmNtopOffset, 3);  n++;
 
 2524    XtSetArg(args[n], XmNbottomOffset, 5);   n++;
 
 2525    Widget separator = XmCreateSeparatorGadget(formAction, (
char *) 
"Sep", args, n);
 
 2527    XtManageChild(separator);
 
 2529    Widget button = XmCreatePushButton(formAction, (
char *) 
"Delete", NULL, 0);
 
 2530    XtVaSetValues(button, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,
 
 2531                  separator, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment,
 
 2532                  XmATTACH_POSITION, XmNleftPosition, 0, XmNrightAttachment,
 
 2533                  XmATTACH_POSITION, XmNrightPosition, 1,
 
 2534                  XmNdefaultButtonShadowThickness, 2, XmNwidth, 40, XmNheight, 30,
 
 2537    XtAddCallback(button, XmNactivateCallback,
 
 2538                  (XtCallbackProc) deleteBookmarkCB, This);
 
 2539    XtManageChild(button);
 
 2541    button = XmCreatePushButton(formAction, (
char *) 
"Rename", NULL, 0);
 
 2542    XtVaSetValues(button, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,
 
 2543                  separator, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment,
 
 2544                  XmATTACH_POSITION, XmNleftPosition, 1, XmNrightAttachment,
 
 2545                  XmATTACH_POSITION, XmNrightPosition, 2,
 
 2546                  XmNdefaultButtonShadowThickness, 2, XmNwidth, 40, XmNheight, 30,
 
 2549    XtAddCallback(button, XmNactivateCallback,
 
 2550                  (XtCallbackProc) renameBookmarkCB, This);
 
 2551    XtManageChild(button);
 
 2553    button = XmCreatePushButton(formAction, (
char *) 
"Sort", NULL, 0);
 
 2554    XtVaSetValues(button, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,
 
 2555                  separator, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment,
 
 2556                  XmATTACH_POSITION, XmNleftPosition, 2, XmNrightAttachment,
 
 2557                  XmATTACH_POSITION, XmNrightPosition, 3,
 
 2558                  XmNdefaultButtonShadowThickness, 2, XmNwidth, 40, XmNheight, 30,
 
 2561    XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) sortBookmarksCB, This);
 
 2562    XtManageChild(button);
 
 2564    button = XmCreatePushButton(formAction, (
char *) 
"Close", NULL, 0);
 
 2565    XtVaSetValues(button, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget,
 
 2566                  separator, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment,
 
 2567                  XmATTACH_POSITION, XmNleftPosition, 3, XmNrightAttachment,
 
 2568                  XmATTACH_POSITION, XmNrightPosition, 4,
 
 2569                  XmNdefaultButtonShadowThickness, 2, XmNwidth, 40, XmNheight, 30,
 
 2572    XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) closeListsDialogCB, This);
 
 2573    XtManageChild(button);
 
 2575    XtManageChild(formAction);
 
 2576    XtVaGetValues(button, XmNheight, &h1, NULL);
 
 2577    XtVaSetValues(formAction, XmNpaneMaximum, h1, XmNpaneMinimum, h1, NULL);
 
 2579    XtManageChild(This->listsDialog);
 
 2587 void G4OpenInventorXtExaminerViewer::lookAtSceneElementCB(Widget,
 
 2588                                            XtPointer client_data,
 
 2589                                            XtPointer call_data)
 
 2592    std::string elementField;
 
 2594    SoCamera * cam = This->getCamera();
 
 2596    if (This->SoXtExaminerViewer::isAnimating())
 
 2597       This->stopAnimating();
 
 2599    XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
 
 2601    value = (
char *) XmStringUnparse(cbs->item, XmFONTLIST_DEFAULT_TAG,
 
 2602                                     XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
 
 2603    if (This->currentState == ANIMATION || This->currentState == REVERSED_ANIMATION
 
 2604        || This->currentState == PAUSED_ANIMATION ) {
 
 2605       if (This->animateSensor->isScheduled())
 
 2606          This->animateSensor->unschedule();
 
 2607       This->setSuperimpositionEnabled(This->superimposition, 
FALSE);
 
 2608       This->maxSpeed = 0.0f;
 
 2609       This->scheduleRedraw();
 
 2610       This->restoreCamera();
 
 2611       This->currentState = This->prevState;
 
 2612    } 
else if (This->currentState == VIEWPOINT)
 
 2613       This->setSuperimpositionEnabled(This->superimposition, 
FALSE);
 
 2615    elementField = 
value;
 
 2617    int idx = elementField.find_last_of(
"[");
 
 2619       idx = elementField.size(); 
 
 2625    SoSearchAction search;
 
 2626    SoNode *root = This->getSceneManager()->getSceneGraph();
 
 2627    int counter, idxUnderscore = elementField.find_last_of(
"_");
 
 2629    This->
parseString<
int>(counter, elementField.substr(idxUnderscore + 1, idx), error);
 
 2631    SoBaseKit::setSearchingChildren(
TRUE);
 
 2633    search.setSearchingAll(
TRUE);
 
 2636       This->
curEltName = elementField.substr(0, idx);
 
 2640       path = (SoFullPath *)search.getPath();
 
 2643       This->
curEltName = elementField.substr(0, idxUnderscore);
 
 2644       search.setInterest(SoSearchAction::ALL);
 
 2648       SoPathList &pl = search.getPaths();
 
 2649       path = (SoFullPath *)pl[counter - 1]; 
 
 2654    if ((idx > 0) && (path)) {
 
 2656       if(!This->refParticleTrajectory.empty()){
 
 2658          SoGetBoundingBoxAction bAction(This->getViewportRegion());
 
 2659          bAction.apply(path);
 
 2660          SbBox3f bBox = bAction.getBoundingBox();
 
 2661          SbVec3f elementCoord = bBox.getCenter();
 
 2663          This->refParticleIdx = 0;
 
 2666          float absLengthNow, absLengthMin;
 
 2667          int maxIdx = This->refParticleTrajectory.size() - 2;
 
 2671          p = This->refParticleTrajectory[This->refParticleIdx];
 
 2672          absLengthMin = (p - elementCoord).length();
 
 2673          This->refParticleIdx++;
 
 2676          while (This->refParticleIdx < maxIdx) {
 
 2677             p = This->refParticleTrajectory[This->refParticleIdx];
 
 2678             absLengthNow = (p - elementCoord).length();
 
 2680             if (absLengthNow < absLengthMin) {
 
 2681                absLengthMin = absLengthNow;
 
 2682                targetIdx = This->refParticleIdx;
 
 2684             This->refParticleIdx++;
 
 2687          if (This->currentState != BEAMLINE) { 
 
 2689             This->currentState = BEAMLINE;
 
 2690             This->prevParticleDir = SbVec3f(0,0,0); 
 
 2692             p1 = This->prevPt = This->refParticleTrajectory[0];
 
 2693             pN = This->refParticleTrajectory[This->refParticleTrajectory.size() - 1];
 
 2694             This->distance = (pN - p1).length() / 10;
 
 2697             if (cam->isOfType(SoOrthographicCamera::getClassTypeId()))
 
 2698                ((SoOrthographicCamera *) cam)->height.setValue(This->defaultHeight);
 
 2700             else if (cam->isOfType(SoPerspectiveCamera::getClassTypeId()))
 
 2701                ((SoPerspectiveCamera *) cam)->heightAngle.setValue(
 
 2702                                                                    This->defaultHeightAngle);
 
 2704             if (cam->isOfType(SoPerspectiveCamera::getClassTypeId()))
 
 2705                This->distance = (This->prevPt - cam->position.getValue()).length();
 
 2707          This->refParticleIdx = targetIdx;
 
 2710          This->setSuperimpositionEnabled(This->superimposition, 
TRUE);
 
 2711          This->axisSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2712          This->animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2713          This->animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2714          This->scheduleRedraw();
 
 2722          This->offsetFromCenter.setValue(0, 0, 1);
 
 2723          This->distance = 50;
 
 2724          This->upVector.setValue(0, 1, 0);
 
 2727          cam->viewAll(path, This->getViewportRegion());
 
 2731    XmTextSetString(This->viewPtSelection, NULL);
 
 2737 void G4OpenInventorXtExaminerViewer::closeListsDialogCB(Widget, 
 
 2738                                          XtPointer client_data,
 
 2743    This->sceneElements.clear();
 
 2744    This->refParticleTrajectory.clear();
 
 2746    This->currentState = GENERAL;
 
 2747    XtDestroyWidget(This->myShellDialog);
 
 2748    This->listsDialog = NULL;
 
 2752 void G4OpenInventorXtExaminerViewer::prevViewPtCB(Widget, XtPointer client_data,
 
 2756    if (This->viewPtIdx == 0)
 
 2757       This->viewPtIdx = This->viewPtList.size() - 1;
 
 2761    This->writeViewPtIdx();
 
 2766 void G4OpenInventorXtExaminerViewer::nextViewPtCB(Widget, XtPointer client_data,
 
 2770    if (This->viewPtIdx >= (
int) This->viewPtList.size() - 1)
 
 2771       This->viewPtIdx = 0;
 
 2775    This->writeViewPtIdx();
 
 2782 void G4OpenInventorXtExaminerViewer::writeViewPtIdx()
 
 2785    std::stringstream out;
 
 2788    fileOut.seekp(0, std::ios::beg);
 
 2790    while ((
int) idxStr.length() < MAX_VP_IDX) {
 
 2794    fileOut << idxStr << 
"\n";
 
 2796    fileOut.seekp(0, std::ios::end);
 
 2802 void G4OpenInventorXtExaminerViewer::setViewPt()
 
 2804    if (currentState == ANIMATION || currentState == REVERSED_ANIMATION
 
 2805        || currentState == ROTATING) {
 
 2807       if (animateSensor->isScheduled())
 
 2808          animateSensor->unschedule();
 
 2809       setSuperimpositionEnabled(superimposition, 
FALSE);
 
 2814    SoCamera * camera = getCamera();
 
 2815    if (camera == NULL) {
 
 2816       String dialogName = (
char *) 
"Missing Camera Node";
 
 2817       std::string msg = 
"Camera is null. Unable to set the viewpoint.";
 
 2822    if (!viewPtList.size()) {
 
 2823       String dialogName = (
char *) 
"Missing Viewpoints";
 
 2824       std::string msg = 
"There are no viewpoints to load.";
 
 2829    if (SoXtExaminerViewer::isAnimating())
 
 2832    if (currentState != VIEWPOINT) {
 
 2833       currentState = VIEWPOINT;
 
 2835       setSuperimpositionEnabled(superimposition, 
TRUE);
 
 2836       axisSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2837       animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2838       animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 2844    curViewPtName = viewPtList[viewPtIdx].viewPtName;
 
 2845    camera->viewportMapping = viewPtList[viewPtIdx].viewportMapping;
 
 2846    camera->position = viewPtList[viewPtIdx].position;
 
 2847    camera->orientation = viewPtList[viewPtIdx].orientation;
 
 2848    camera->aspectRatio = viewPtList[viewPtIdx].aspectRatio;
 
 2849    camera->nearDistance = viewPtList[viewPtIdx].nearDistance;
 
 2850    camera->farDistance = viewPtList[viewPtIdx].farDistance;
 
 2851    camera->focalDistance = viewPtList[viewPtIdx].focalDistance;
 
 2854    if (camera->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 2855       if (viewPtList[viewPtIdx].camType == ORTHOGRAPHIC) {
 
 2857          camera = getCamera();
 
 2858          ((SoOrthographicCamera *) camera)->height.setValue(
 
 2859                                                             viewPtList[viewPtIdx].height);
 
 2861          ((SoPerspectiveCamera *) camera)->heightAngle.setValue(
 
 2862                                                                 viewPtList[viewPtIdx].height);
 
 2863    } 
else if (camera->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
 2864       if (viewPtList[viewPtIdx].camType == PERSPECTIVE) {
 
 2866          camera = getCamera();
 
 2867          ((SoPerspectiveCamera *) camera)->heightAngle.setValue(
 
 2868                                                                 viewPtList[viewPtIdx].height);
 
 2870          ((SoOrthographicCamera *) camera)->height.setValue(
 
 2871                                                             viewPtList[viewPtIdx].height);
 
 2873       SoDebugError::post(
"G4OpenInventorXtExaminerViewer::setViewPt",
 
 2874                          "Only Perspective and Orthographic cameras are supported.");
 
 2883 void G4OpenInventorXtExaminerViewer::saveViewPtCB(Widget w, 
 
 2884                                      XtPointer client_data,
 
 2889    if (This->fileName.empty()) {
 
 2890       newViewPtFileCB(w, This, NULL);
 
 2891       This->returnToSaveVP = 
true;
 
 2897    Widget nameViewPtDialog;
 
 2898    Widget parent = This->getParentWidget(); 
 
 2899    XmString label = XmStringCreateLocalized((
char *) 
"Name the viewpoint:");
 
 2901    XtSetArg(args[n], XmNselectionLabelString, label);   n++;
 
 2902    XtSetArg(args[n], XmNautoUnmanage, False);   n++;    
 
 2906    nameViewPtDialog = XmCreatePromptDialog(parent, (
char *) 
"Save Viewpoint",
 
 2909    XmStringFree(label);
 
 2910    XtAddCallback(nameViewPtDialog, XmNokCallback, getViewPtNameCB, This);
 
 2911    XtAddCallback(nameViewPtDialog, XmNcancelCallback,
 
 2912                  (XtCallbackProc) XtDestroyWidget, NULL);
 
 2914    Widget text = XtNameToWidget(nameViewPtDialog, 
"Text");
 
 2915    XtVaSetValues(text, XmNmaxLength, This->MAX_VP_NAME, NULL);
 
 2916    std::string autoName = 
"";
 
 2918       autoName = This->viewPtAutoName();
 
 2921    XmTextSetString(text, (
char *) autoName.c_str());
 
 2922    XmTextSetInsertionPosition(text, autoName.length());
 
 2924    XtUnmanageChild(XtNameToWidget(nameViewPtDialog, 
"Help"));
 
 2925    XtManageChild(nameViewPtDialog);
 
 2929 std::string G4OpenInventorXtExaminerViewer::viewPtAutoName()
 
 2932    std::stringstream sstream;
 
 2933    std::vector<int> existingViewPts;
 
 2937    for (
unsigned int i = 0; i < this->viewPtList.size(); ++i) {
 
 2938       viewPt = this->viewPtList[i].viewPtName;
 
 2939       if (viewPt.find(
"viewpoint_") != std::string::npos) {
 
 2940          tmp = atoi(viewPt.substr(10).c_str());
 
 2943             if (!viewPt.compare(
"viewpoint_0"))
 
 2944                existingViewPts.push_back(0);
 
 2946             existingViewPts.push_back(tmp);
 
 2954    if (existingViewPts.size() > 0) {
 
 2957          if (std::find(existingViewPts.begin(), existingViewPts.end(), vpNum)
 
 2958              == existingViewPts.end()) {
 
 2959             sstream << 
"viewpoint_" << vpNum;
 
 2960             return sstream.str();
 
 2965       return "viewpoint_0";
 
 2971 void G4OpenInventorXtExaminerViewer::abbrOutputCB(Widget,
 
 2972                                    XtPointer client_data,
 
 2981 void G4OpenInventorXtExaminerViewer::pickRefPathCB(Widget,
 
 2982                                     XtPointer client_data,
 
 2989    if(This->isViewing())
 
 2990       This->setViewing(
false);
 
 2991    This->setComponentCursor(SoXtCursor(SoXtCursor::CROSSHAIR));
 
 2998 void G4OpenInventorXtExaminerViewer::getViewPtNameCB(Widget w, 
 
 2999                                         XtPointer client_data,
 
 3000                                         XtPointer call_data)
 
 3003    std::string strName;
 
 3005    XmSelectionBoxCallbackStruct *cbs =
 
 3006       (XmSelectionBoxCallbackStruct *) call_data;
 
 3007    XmStringGetLtoR(cbs->value, XmFONTLIST_DEFAULT_TAG, &name);
 
 3020    int beg = strName.find_first_not_of(
' '); 
 
 3021    int end = strName.find_last_not_of(
' ');
 
 3022    strName = strName.substr(beg, end - beg + 1);
 
 3024    bool nameExists = 
false;
 
 3025    int size = This->viewPtList.size();
 
 3026    for (
int i = 0; i < size; i++) {
 
 3027       if (!strcmp(This->viewPtList[i].viewPtName, strName.c_str())) {
 
 3034       name = 
new char[This->MAX_VP_NAME + 1];
 
 3035       strcpy(name, strName.c_str());
 
 3036       if (This->viewPtIdx == -1)
 
 3037          This->viewPtIdx = 0;
 
 3038       This->saveViewPt(name);
 
 3039       if (This->listsDialog) {
 
 3040          XmListAddItemUnselected(This->myViewPtList, cbs->value, 0); 
 
 3045       String dialogName = (
char *) 
"Existing Viewpoint";
 
 3046       std::string msg = 
"The viewpoint already exists.";
 
 3055 void G4OpenInventorXtExaminerViewer::saveViewPt(
char *name)
 
 3059    float x, 
y, 
z, angle;
 
 3060    SoCamera * camera = getCamera();
 
 3062    if (viewPtList.size() == 0) {
 
 3064       XtSetSensitive(nextViewPtButton, True); 
 
 3065       XtSetSensitive(prevViewPtButton, True);
 
 3068    tmp.viewPtName = 
name;
 
 3069    tmp.viewportMapping = camera->viewportMapping.getValue();
 
 3070    tmp.position = camera->position.getValue();
 
 3071    tmp.orientation = camera->orientation.getValue();
 
 3072    tmp.aspectRatio = camera->aspectRatio.getValue();
 
 3073    tmp.nearDistance = camera->nearDistance.getValue();
 
 3074    tmp.farDistance = camera->farDistance.getValue();
 
 3075    tmp.focalDistance = camera->focalDistance.getValue();
 
 3078    if (camera->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 3079       tmp.height = ((SoPerspectiveCamera *) camera)->heightAngle.getValue();
 
 3080       tmp.camType = PERSPECTIVE;
 
 3081    } 
else if (camera->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
 3082       tmp.height = ((SoOrthographicCamera *) camera)->height.getValue();
 
 3083       tmp.camType = ORTHOGRAPHIC;
 
 3085       SoDebugError::post(
"G4OpenInventorXtExaminerViewer::saveViewPtCB",
 
 3086                          "Only Perspective and Orthographic cameras are supported.");
 
 3090    viewPtList.push_back(tmp);
 
 3093    std::string vpName = 
name;
 
 3095    while ((
int) vpName.size() <= MAX_VP_NAME)
 
 3098    fileOut << vpName << std::endl;
 
 3099    tmp.position.getValue(x, y, z);
 
 3100    fileOut << x << 
" " << y << 
" " << z << std::endl;
 
 3103    tmp.orientation.getValue(axis, angle);
 
 3104    axis.getValue(x, y, z);
 
 3105    fileOut << x << 
" " << y << 
" " << z << 
" " << angle << std::endl;
 
 3107    fileOut << tmp.camType << 
" " << tmp.height << std::endl;
 
 3108    fileOut << tmp.focalDistance << 
" ";
 
 3109    fileOut << tmp.nearDistance << 
" ";
 
 3110    fileOut << tmp.farDistance << std::endl;
 
 3111    fileOut << tmp.viewportMapping << 
" ";
 
 3112    fileOut << tmp.aspectRatio << 
"\n" << std::endl;
 
 3118 void G4OpenInventorXtExaminerViewer::deleteViewPtCB(Widget,
 
 3119                                      XtPointer client_data,
 
 3124    This->deleteViewPt();
 
 3131 void G4OpenInventorXtExaminerViewer::deleteViewPt(
char *vpName)
 
 3135    fileIn.open(fileName.c_str());
 
 3136    std::ofstream out(
"temporaryFile.txt");
 
 3139       vpName = viewPtList[viewPtIdx].viewPtName;
 
 3142       XmString vpNameStr = XmStringCreateLocalized(vpName);
 
 3144       XmListDeleteItem(myViewPtList, vpNameStr);
 
 3145       XmStringFree(vpNameStr);
 
 3148    getline(fileIn, line); 
 
 3149    out << line << 
"\n";
 
 3151    while (getline(fileIn, line)) {
 
 3152       end = line.find_last_not_of(
' ');
 
 3153       line = line.substr(0, end + 1);
 
 3154       if (!strcmp(line.c_str(), vpName)) { 
 
 3155          while (line.size()) {
 
 3156             getline(fileIn, line);
 
 3159          while (getline(fileIn, line))
 
 3160             out << line << 
"\n";
 
 3162          while (line.size()) {
 
 3163             out << line << 
"\n";
 
 3164             getline(fileIn, line);
 
 3171    int size = viewPtList.size();
 
 3172    while (idx < size) {
 
 3173       if (!strcmp(viewPtList[idx].viewPtName, vpName)) {
 
 3174          viewPtList.erase(viewPtList.begin() + idx);
 
 3185    remove(fileName.c_str());
 
 3186    rename(
"temporaryFile.txt", fileName.c_str());
 
 3189    fileOut.seekp(0, std::ios::end);
 
 3191    if (!viewPtList.size()) { 
 
 3192       curViewPtName = (
char *) 
"";
 
 3194       XtSetSensitive(nextViewPtButton, False);
 
 3195       XtSetSensitive(prevViewPtButton, False);
 
 3197       if (viewPtIdx >= (
int) viewPtList.size())
 
 3207 void G4OpenInventorXtExaminerViewer::renameViewPt(
char *vpName)
 
 3209    int idx = 0, end, pos;
 
 3210    int size = viewPtList.size();
 
 3211    std::string line, newName;
 
 3212    fileIn.open(fileName.c_str());
 
 3215    while ((
int) newName.size() < MAX_VP_NAME)
 
 3218    getline(fileIn, line);
 
 3219    pos = fileIn.tellg();
 
 3220    while (getline(fileIn, line)) {
 
 3221       end = line.find_last_not_of(
' ');
 
 3222       line = line.substr(0, end + 1);
 
 3223       if (!strcmp(line.c_str(), curViewPtName)) {
 
 3226          fileOut.seekp(0, std::ios::end); 
 
 3230          getline(fileIn, line);
 
 3231       pos = fileIn.tellg();
 
 3237    while (idx < size) {
 
 3238       if (!strcmp(viewPtList[idx].viewPtName, curViewPtName)) {
 
 3239          strcpy(viewPtList[idx].viewPtName, vpName);
 
 3249 void G4OpenInventorXtExaminerViewer::sortViewPts(std::vector<std::string> sortedViewPts) 
 
 3252    float x, 
y, 
z, angle;
 
 3253    int sortIdx = 0, unsortIdx = 0;
 
 3255    if (fileOut.is_open())
 
 3258    fileOut.open(fileName.c_str()); 
 
 3262    int size = sortedViewPts.size();
 
 3263    while (sortIdx < size) {
 
 3264       while (strcmp(sortedViewPts[sortIdx].c_str(),
 
 3265                     viewPtList[unsortIdx].viewPtName))
 
 3268       std::string vpName = viewPtList[unsortIdx].viewPtName;
 
 3270       while ((
int) vpName.size() < MAX_VP_NAME)
 
 3272       fileOut << vpName << std::endl;
 
 3273       viewPtList[unsortIdx].position.getValue(x, y, z);
 
 3274       fileOut << x << 
" " << y << 
" " << z << std::endl;
 
 3277       viewPtList[unsortIdx].orientation.getValue(axis, angle);
 
 3278       axis.getValue(x, y, z);
 
 3279       fileOut << x << 
" " << y << 
" " << z << 
" " << angle << std::endl;
 
 3281       fileOut << viewPtList[unsortIdx].camType << 
" " 
 3282               << viewPtList[unsortIdx].height << std::endl;
 
 3283       fileOut << viewPtList[unsortIdx].focalDistance << 
" ";
 
 3285       fileOut << viewPtList[unsortIdx].nearDistance << 
" ";
 
 3287       fileOut << viewPtList[unsortIdx].farDistance << std::endl;
 
 3289       fileOut << viewPtList[unsortIdx].viewportMapping << 
" ";
 
 3290       fileOut << viewPtList[unsortIdx].aspectRatio << 
"\n" << std::endl;
 
 3308    float x, 
y, 
z, angle;
 
 3312    parseString<int>(viewPtIdx, token, error);
 
 3313    getline(fileIn, token); 
 
 3315    while (getline(fileIn, token)) {
 
 3317       int end = token.find_last_not_of(
' '); 
 
 3318       token = token.substr(0, end + 1);
 
 3320       char *vpName = 
new char[token.size() + 1];
 
 3321       strcpy(vpName, token.c_str());
 
 3322       tmp.viewPtName = vpName;
 
 3325       parseString<float>(
x, token, error);
 
 3327       parseString<float>(
y, token, error);
 
 3329       parseString<float>(
z, token, error);
 
 3331       tmp.position = axis.setValue(x, y, z);
 
 3333       parseString<float>(
x, token, error);
 
 3335       parseString<float>(
y, token, error);
 
 3337       parseString<float>(
z, token, error);
 
 3339       parseString<float>(angle, token, error);
 
 3341       orient.setValue(axis.setValue(x, y, z), angle);
 
 3342       tmp.orientation = orient.getValue();
 
 3345       parseString<int>(camType, token, error);
 
 3347       tmp.camType = (CameraType) camType;
 
 3349       parseString<float>(tmp.height, token, error);
 
 3351       parseString<float>(tmp.focalDistance, token, error);
 
 3353       parseString<float>(tmp.nearDistance, token, error);
 
 3355       parseString<float>(tmp.farDistance, token, error);
 
 3357       parseString<int>(tmp.viewportMapping, token, error);
 
 3359       parseString<float>(tmp.aspectRatio, token, error);
 
 3361       getline(fileIn, token); 
 
 3362       getline(fileIn, token);
 
 3369       viewPtList.push_back(tmp);
 
 3382    std::istringstream str(s);
 
 3383    if ((str >> t).fail())
 
 3390 void G4OpenInventorXtExaminerViewer::popUpFileSelDialog(Widget &dialog,
 
 3391                                                 std::string dialogName,
 
 3392                                                 std::string buttonLabel,
 
 3393                                                 XtCallbackProc cbOK)
 
 3397    Widget parent, scrollWidget;
 
 3398    parent = SoXt::getShellWidget(getParentWidget());
 
 3400    if (dialog == NULL) {
 
 3403       XmString str = XmStringCreateLocalized((
char *) buttonLabel.c_str());
 
 3406       XtSetArg(args[n], XmNokLabelString, str);     n++;
 
 3407       XtSetArg(args[n], XmNresizePolicy, XmRESIZE_NONE);        n++;
 
 3409       dialog = XmCreateFileSelectionDialog(parent,
 
 3410                                            (
char *) dialogName.c_str(), args, 
n);
 
 3412       XtAddCallback(dialog, XmNokCallback, cbOK, 
this);
 
 3413       XtAddCallback(dialog, XmNcancelCallback, cancelFileSelDialogCB, 
this);
 
 3416       scrollWidget = XmFileSelectionBoxGetChild(dialog, XmDIALOG_DIR_LIST);
 
 3419       scrollWidget = XmFileSelectionBoxGetChild(dialog, XmDIALOG_LIST);
 
 3423       XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
 
 3426    XtManageChild(dialog);
 
 3432 void G4OpenInventorXtExaminerViewer::cancelFileSelDialogCB(Widget w,
 
 3442 void G4OpenInventorXtExaminerViewer::openViewPtFileCB(Widget,
 
 3443                                        XtPointer client_data,
 
 3448    This->popUpFileSelDialog(This->openFileDialog, 
"Open File", 
"Load",
 
 3449                             viewPtFileSelectedCB);
 
 3453 void G4OpenInventorXtExaminerViewer::viewPtFileSelectedCB(Widget w, 
 
 3454                                              XtPointer client_data,
 
 3455                                              XtPointer call_data)
 
 3459    XmFileSelectionBoxCallbackStruct *cbs =
 
 3460       (XmFileSelectionBoxCallbackStruct *) call_data;
 
 3464       if (!(file = (
char *) XmStringUnparse(cbs->value,
 
 3465                                             XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0,
 
 3467          SoDebugError::post(
"G4OpenInventorXtExaminerViewer::fileSelectedCB",
 
 3468                             "Internal error during file opening");
 
 3472       This->fileIn.open(file);
 
 3473       if (!This->fileIn.fail()) {
 
 3475          This->cleanUpAfterPrevFile();
 
 3477             String dialogName = (
char *) 
"Error Loading File";
 
 3478             std::string msg = 
"Wrong or corrupted input file.";
 
 3481             This->fileName = 
file;
 
 3482             This->fileOut.open(This->fileName.c_str(), 
std::ios::in);
 
 3483             This->fileOut.seekp(0, std::ios::end);
 
 3485             if (!This->listsDialog)
 
 3486                constructListsDialog(w, This, NULL); 
 
 3488                This->addViewPoints();
 
 3490             std::string newDialogName = This->fileName.substr(
 
 3491                                                               This->fileName.rfind(
'/') + 1);
 
 3492             XtVaSetValues(This->myShellDialog, XmNtitle,
 
 3493                           (
char *) newDialogName.c_str(), NULL);
 
 3495             if (This->viewPtList.size()) {
 
 3497                XmTextSetString(This->viewPtSelection, NULL);
 
 3498                XtSetSensitive(This->nextViewPtButton, True);
 
 3499                XtSetSensitive(This->prevViewPtButton, True);
 
 3501                XtSetSensitive(This->nextViewPtButton, False);
 
 3502                XtSetSensitive(This->prevViewPtButton, False);
 
 3508          This->fileIn.close();
 
 3510          String dialogName = (
char *) 
"Nonexistent File";
 
 3511          std::string msg = 
"Unable to open file.";
 
 3516    This->fileIn.clear();
 
 3523 void G4OpenInventorXtExaminerViewer::addViewPoints()
 
 3525    int size = viewPtList.size();
 
 3531    viewPts = (XmString *) XtMalloc(size * 
sizeof(XmString));
 
 3532    for (
int i = 0; i < size; i++)
 
 3533       viewPts[i] = XmStringCreateLocalized(viewPtList[i].viewPtName);
 
 3535    XmListAddItemsUnselected(myViewPtList, viewPts, size, 1);
 
 3537    if (viewPts != NULL) {
 
 3538       for (
int i = 0; i < size; i++)
 
 3539          XmStringFree(viewPts[i]);
 
 3540       XtFree((
char *) viewPts);
 
 3548 void G4OpenInventorXtExaminerViewer::cleanUpAfterPrevFile()
 
 3552    setSuperimpositionEnabled(superimposition, 
FALSE);
 
 3554    currentState = GENERAL;
 
 3555    if (fileOut.is_open())
 
 3558       XmListDeleteAllItems(myViewPtList);
 
 3570    XmString warningMsg;
 
 3572    warningMsg = XmStringCreateLocalized((
char *)msg.c_str());
 
 3575    XtSetArg(args[n], XmNmessageString, warningMsg); n++;
 
 3576    Widget warningDialog = XmCreateWarningDialog(getParentWidget(), dialogName, args, n);
 
 3578       XtAddCallback(warningDialog, XmNokCallback, cb, 
this);
 
 3580    XmStringFree(warningMsg);
 
 3582    XtVaSetValues (warningDialog, XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, NULL);
 
 3583    XtUnmanageChild(XtNameToWidget(warningDialog, 
"Help"));
 
 3584    XtUnmanageChild(XtNameToWidget(warningDialog, 
"Cancel"));
 
 3586    XtManageChild(warningDialog);
 
 3590 void G4OpenInventorXtExaminerViewer::newViewPtFileCB(Widget,
 
 3591                                                      XtPointer client_data,
 
 3596    This->popUpFileSelDialog(This->newFileDialog, 
"New File", 
"Save",
 
 3601 void G4OpenInventorXtExaminerViewer::createNewVPFileCB(Widget w, 
 
 3602                                                        XtPointer client_data,
 
 3603                                                        XtPointer call_data)
 
 3608    XmFileSelectionBoxCallbackStruct *cbs =
 
 3609       (XmFileSelectionBoxCallbackStruct *) call_data;
 
 3613       if (!(file = (
char *) XmStringUnparse(cbs->value,
 
 3614                                             XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0,
 
 3616          SoDebugError::post(
"G4OpenInventorXtExaminerViewer::createNewVPFileCB",
 
 3617                             "Internal error during file opening");
 
 3621       This->fileName = 
file;
 
 3622       fName = This->fileName.substr(This->fileName.rfind(
'/') + 1); 
 
 3623       This->fileIn.open(file);
 
 3624       if (This->fileIn.fail()) { 
 
 3625          This->cleanUpAfterPrevFile();
 
 3626          This->fileOut.open(file); 
 
 3627          XtSetSensitive(This->nextViewPtButton, False);
 
 3628          XtSetSensitive(This->prevViewPtButton, False);
 
 3629          if (This->listsDialog)
 
 3630             closeListsDialogCB(w, This, NULL);
 
 3631          constructListsDialog(w, This, NULL);
 
 3633          if (This->returnToSaveVP) {
 
 3634             This->returnToSaveVP = 
false;
 
 3635             saveViewPtCB(NULL, This, NULL);
 
 3638          String dialogName = (
char *) 
"Existing File";
 
 3639          std::string msg = 
"'" + fName + 
"' already exists. Do you want to overwrite it?";
 
 3641          This->fileIn.close();
 
 3643       This->fileIn.clear();
 
 3649 void G4OpenInventorXtExaminerViewer::overwriteFileCB(Widget, 
 
 3650                                                      XtPointer client_data,
 
 3654    This->cleanUpAfterPrevFile();
 
 3655    XtSetSensitive(This->nextViewPtButton, False);
 
 3656    XtSetSensitive(This->prevViewPtButton, False);
 
 3658    XtUnmanageChild(This->newFileDialog);
 
 3660    This->fileOut.open(This->fileName.c_str());
 
 3662    if (This->returnToSaveVP) {
 
 3663       This->returnToSaveVP = 
false;
 
 3664       saveViewPtCB(NULL, This, NULL);
 
 3669 void G4OpenInventorXtExaminerViewer::loadRefCoordsDialogCB(Widget,
 
 3670                                             XtPointer client_data,
 
 3675    This->popUpFileSelDialog(This->loadRefCoordsDialog, 
"Load Ref Coords",
 
 3676                             "Load", loadRefCoordsCB);
 
 3680 void G4OpenInventorXtExaminerViewer::loadRefCoordsCB(Widget w, 
 
 3681                                                      XtPointer client_data,
 
 3682                                                      XtPointer call_data)
 
 3686    XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *)call_data;
 
 3691       file = (
char *)XmStringUnparse(cbs->value, XmFONTLIST_DEFAULT_TAG,
 
 3692                                      XmCHARSET_TEXT, XmCHARSET_TEXT,
 
 3693                                      NULL, 0, XmOUTPUT_ALL);
 
 3695       std::ifstream ifs(file);
 
 3697          This->refParticleTrajectory.clear();
 
 3699          while(ifs >> x >> y >> z){
 
 3700             This->refParticleTrajectory.push_back(SbVec3f(x,y,z));
 
 3706          String dialogName = (
char *) 
"Problem reading file";
 
 3707          std::string msg = 
"Problem reading file";
 
 3718 void G4OpenInventorXtExaminerViewer::saveRefCoordsDialogCB(Widget,
 
 3719                                             XtPointer client_data,
 
 3724    if (!This->refParticleTrajectory.size()) {
 
 3725       String dialogName = (
char *) 
"No Reference Trajectory";
 
 3726       std::string msg = 
"You need to start a run or load a reference trajectory from a file";
 
 3733    Widget parent, scrollWidget;
 
 3734    parent = SoXt::getShellWidget(This->getParentWidget());
 
 3736    if (This->saveRefCoordsDialog == NULL) {
 
 3739       XmString str = XmStringCreateLocalized((
char *)
"Save");
 
 3742       XtSetArg(args[n], XmNokLabelString, str);     n++;
 
 3743       XtSetArg(args[n], XmNresizePolicy, XmRESIZE_NONE);        n++;
 
 3745       This->saveRefCoordsDialog = XmCreateFileSelectionDialog(parent,(
char *)
"Save Ref Coords", args, n);
 
 3747       XtAddCallback(This->saveRefCoordsDialog, XmNokCallback, saveRefCoordsCB, This);
 
 3748       XtAddCallback(This->saveRefCoordsDialog, XmNcancelCallback, cancelFileSelDialogCB, This);
 
 3751       scrollWidget = XmFileSelectionBoxGetChild(This->saveRefCoordsDialog, XmDIALOG_DIR_LIST);
 
 3754       scrollWidget = XmFileSelectionBoxGetChild(This->saveRefCoordsDialog, XmDIALOG_LIST);
 
 3758       XtUnmanageChild(XmSelectionBoxGetChild(This->saveRefCoordsDialog, XmDIALOG_HELP_BUTTON));
 
 3764    XtManageChild(This->saveRefCoordsDialog);
 
 3769 void G4OpenInventorXtExaminerViewer::saveRefCoordsCB(Widget w, 
 
 3770                                                      XtPointer client_data,
 
 3771                                                      XtPointer call_data)
 
 3775    XmFileSelectionBoxCallbackStruct *cbs =
 
 3776       (XmFileSelectionBoxCallbackStruct *) call_data;
 
 3781       file = (
char *)XmStringUnparse(cbs->value, XmFONTLIST_DEFAULT_TAG,
 
 3782                                      XmCHARSET_TEXT, XmCHARSET_TEXT,
 
 3783                                      NULL, 0, XmOUTPUT_ALL);
 
 3785       std::ifstream ifile(file);
 
 3790          Widget parent = This->getParentWidget();   
 
 3791          Widget confirmOverwriteDialog;
 
 3794          confirmOverwriteDialog = XmCreateQuestionDialog (parent, (
char *)
"Confirm overwrite", args, 0);
 
 3795          msg = XmStringCreateLocalized ((
char *)
"File exists. Overwrite?");
 
 3796          XtVaSetValues (confirmOverwriteDialog, XmNmessageString, msg, NULL);
 
 3801          XtVaSetValues (confirmOverwriteDialog, XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, NULL);
 
 3802          XtAddCallback (confirmOverwriteDialog, XmNokCallback, saveRefCoordsOverWriteCB, client_data);
 
 3803          XtAddCallback (confirmOverwriteDialog, XmNcancelCallback, saveRefCoordsOverWriteCB, client_data);
 
 3811          XtUnmanageChild(XtNameToWidget(confirmOverwriteDialog, 
"Help"));
 
 3812          XtManageChild(confirmOverwriteDialog);
 
 3818          std::ofstream ofs(file);
 
 3821             for(
unsigned int i=0; i < This->refParticleTrajectory.size(); ++i){
 
 3822                This->refParticleTrajectory[i].getValue(x,y,z);
 
 3823                ofs << x << 
" " << y << 
" " << z << 
"\n";
 
 3829             String dialogName = (
char *) 
"Error opening file";
 
 3830             std::string msg = 
"There was a problem trying to open the file '";
 
 3843 void G4OpenInventorXtExaminerViewer::saveRefCoordsOverWriteCB(Widget w, 
 
 3844                                                  XtPointer client_data,
 
 3845                                                  XtPointer call_data)
 
 3847    XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data;
 
 3850    switch (cbs->reason) {
 
 3858             for(
unsigned int i=0; i < This->refParticleTrajectory.size(); ++i){
 
 3859                This->refParticleTrajectory[i].getValue(x,y,z);
 
 3860                ofs << x << 
" " << y << 
" " << z << 
"\n";
 
 3867             String dialogName = (
char *) 
"Error opening file";
 
 3868             std::string msg = 
"There was a problem trying to open the file '";
 
 3882          XmProcessTraversal(XtNameToWidget(This->
saveRefCoordsWidget, 
"Text"), XmTRAVERSE_CURRENT);
 
 3895 void G4OpenInventorXtExaminerViewer::loadSceneGraphDialogCB(Widget,
 
 3896                                              XtPointer client_data,
 
 3901    This->popUpFileSelDialog(This->loadSceneGraphDialog, 
"Load Scene Graph",
 
 3902                             "Load", loadSceneGraphCB);
 
 3907 void G4OpenInventorXtExaminerViewer::loadSceneGraphCB(Widget w, 
 
 3908                                                       XtPointer client_data,
 
 3909                                                       XtPointer call_data)
 
 3913    XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *)call_data;
 
 3917       file = (
char *)XmStringUnparse(cbs->value, XmFONTLIST_DEFAULT_TAG,
 
 3918                                      XmCHARSET_TEXT, XmCHARSET_TEXT,
 
 3919                                      NULL, 0, XmOUTPUT_ALL);
 
 3922       if (!sceneInput.openFile(file)) {
 
 3923          String dialogName = (
char *) 
"Problem opening file";
 
 3924          std::string msg = 
"Cannot open file ";
 
 3928          sceneInput.closeFile();
 
 3932       This->newSceneGraph = SoDB::readAll(&sceneInput);
 
 3933       if (This->newSceneGraph == NULL) {
 
 3934          String dialogName = (
char *) 
"Problem reading file";
 
 3935          std::string msg = 
"Problem reading file";
 
 3941       This->setSceneGraph(This->newSceneGraph);
 
 3948 void G4OpenInventorXtExaminerViewer::saveSceneGraphDialogCB(Widget, 
 
 3949                                              XtPointer client_data,
 
 3956    Widget parent, scrollWidget;
 
 3957    parent = SoXt::getShellWidget(This->getParentWidget());
 
 3959    if (This->saveSceneGraphDialog == NULL) {
 
 3962       XmString str = XmStringCreateLocalized((
char *)
"Save");
 
 3965       XtSetArg(args[n], XmNokLabelString, str);     n++;
 
 3966       XtSetArg(args[n], XmNresizePolicy, XmRESIZE_NONE);        n++;
 
 3968       This->saveSceneGraphDialog = XmCreateFileSelectionDialog(parent,(
char *)
"Save Scene Graph", args, n);
 
 3970       XtAddCallback(This->saveSceneGraphDialog, XmNokCallback, saveSceneGraphCB, This);
 
 3971       XtAddCallback(This->saveSceneGraphDialog, XmNcancelCallback, cancelFileSelDialogCB, This);
 
 3974       scrollWidget = XmFileSelectionBoxGetChild(This->saveSceneGraphDialog, XmDIALOG_DIR_LIST);
 
 3977       scrollWidget = XmFileSelectionBoxGetChild(This->saveSceneGraphDialog, XmDIALOG_LIST);
 
 3981       XtUnmanageChild(XmSelectionBoxGetChild(This->saveSceneGraphDialog, XmDIALOG_HELP_BUTTON));
 
 3987    XtManageChild(This->saveSceneGraphDialog);
 
 3993 void G4OpenInventorXtExaminerViewer::saveSceneGraphCB(Widget w, 
 
 3994                                                       XtPointer client_data,
 
 3995                                                       XtPointer call_data)
 
 3999    XmFileSelectionBoxCallbackStruct *cbs =
 
 4000       (XmFileSelectionBoxCallbackStruct *) call_data;
 
 4004       file = (
char *)XmStringUnparse(cbs->value, XmFONTLIST_DEFAULT_TAG,
 
 4005                                      XmCHARSET_TEXT, XmCHARSET_TEXT,
 
 4006                                      NULL, 0, XmOUTPUT_ALL);
 
 4008       std::ifstream ifile(file);
 
 4013          Widget parent = This->getParentWidget();   
 
 4014          Widget confirmOverwriteDialog;
 
 4017          confirmOverwriteDialog = XmCreateQuestionDialog (parent, (
char *)
"Confirm overwrite", args, 0);
 
 4018          msg = XmStringCreateLocalized ((
char *)
"File exists. Overwrite?");
 
 4019          XtVaSetValues (confirmOverwriteDialog, XmNmessageString, msg, NULL);
 
 4024          XtVaSetValues (confirmOverwriteDialog, XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, NULL);
 
 4025          XtAddCallback (confirmOverwriteDialog, XmNokCallback, saveSceneGraphOverWriteCB, client_data);
 
 4026          XtAddCallback (confirmOverwriteDialog, XmNcancelCallback, saveSceneGraphOverWriteCB, client_data);
 
 4034          XtUnmanageChild(XtNameToWidget(confirmOverwriteDialog, 
"Help"));
 
 4035          XtManageChild(confirmOverwriteDialog);
 
 4041          SoWriteAction writeAction;
 
 4042          SoSeparator *root = (SoSeparator *) (This->getSceneGraph());
 
 4044          SoOutput * out = writeAction.getOutput();
 
 4046          if(out->openFile(file)){
 
 4047             out->setBinary(
FALSE);
 
 4048             writeAction.apply(root);
 
 4054             String dialogName = (
char *) 
"Error opening file";
 
 4055             std::string msg = 
"There was a problem trying to open the file '";
 
 4070 void G4OpenInventorXtExaminerViewer::saveSceneGraphOverWriteCB(Widget w, 
 
 4071                                                   XtPointer client_data,
 
 4072                                                   XtPointer call_data)
 
 4074    XmAnyCallbackStruct *cbs = (XmAnyCallbackStruct *) call_data;
 
 4077    switch (cbs->reason) {
 
 4082          SoWriteAction writeAction;
 
 4083          SoSeparator *root = (SoSeparator *) (This->getSceneGraph());
 
 4085          SoOutput * out = writeAction.getOutput();
 
 4087             out->setBinary(
FALSE);
 
 4088             writeAction.apply(root);
 
 4097             String dialogName = (
char *) 
"Error opening file";
 
 4098             std::string msg = 
"There was a problem trying to open the file '";
 
 4129 void G4OpenInventorXtExaminerViewer::loadBookmarkCB(Widget, 
 
 4130                                                     XtPointer client_data,
 
 4131                                                     XtPointer call_data)
 
 4135    XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
 
 4137    vpName = (
char *) XmStringUnparse(cbs->item, XmFONTLIST_DEFAULT_TAG,
 
 4138                                      XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
 
 4140    for (
int i = 0; i < (
int) This->viewPtList.size(); i++) {
 
 4141       if (!strcmp(This->viewPtList[i].viewPtName, vpName)) {
 
 4142          This->viewPtIdx = i;
 
 4146    XmTextSetString(This->viewPtSelection, vpName);
 
 4148    This->writeViewPtIdx();
 
 4155 void G4OpenInventorXtExaminerViewer::deleteBookmarkCB(Widget, 
 
 4156                                                       XtPointer client_data,
 
 4162    vpName = XmTextGetString(This->viewPtSelection);
 
 4164    XmString vpNameStr = XmStringCreateLocalized(vpName);
 
 4166    if (XmListItemExists(This->myViewPtList, vpNameStr)) {
 
 4167       XmListDeleteItem(This->myViewPtList, vpNameStr);
 
 4168       This->deleteViewPt(vpName);
 
 4171    XmStringFree(vpNameStr);
 
 4172    XmTextSetString(This->viewPtSelection, NULL);
 
 4177 void G4OpenInventorXtExaminerViewer::renameBookmarkCB(Widget, 
 
 4178                                                       XtPointer client_data,
 
 4181    std::string vpNameStr;
 
 4183    int *pos_list, pos_cnt;
 
 4186    vpName = XmTextGetString(This->viewPtSelection);
 
 4188    if (!strlen(vpName) || !strcmp(This->curViewPtName, vpName)) {
 
 4195    int beg = vpNameStr.find_first_not_of(
' '); 
 
 4196    int end = vpNameStr.find_last_not_of(
' ');
 
 4197    vpNameStr = vpNameStr.substr(beg, end - beg + 1);
 
 4198    vpName = 
new char[vpNameStr.size() + 1];
 
 4199    strcpy(vpName, vpNameStr.c_str());
 
 4201    int size = This->viewPtList.size();
 
 4202    for (
int i = 0; i < size; i++) {
 
 4203       if (!strcmp(vpName, This->viewPtList[i].viewPtName)) {
 
 4205          String dialogName = (
char *) 
"Existing Viewpoint";
 
 4206          std::string msg = 
"'";
 
 4208          msg += 
"' already exists. Choose a different name";
 
 4215    XmString vpNameXmStr = XmStringCreateLocalized(vpName);
 
 4217    if (XmListGetSelectedPos(This->myViewPtList, &pos_list, &pos_cnt)) {
 
 4218       XmListReplaceItemsPos(This->myViewPtList, &vpNameXmStr, 1, pos_list[0]);
 
 4219       This->renameViewPt(vpName);
 
 4220       XtFree((
char *) pos_list);
 
 4223    if (This->currentState == VIEWPOINT)
 
 4224       This->scheduleRedraw();
 
 4226    XmStringFree(vpNameXmStr);
 
 4230 void G4OpenInventorXtExaminerViewer::sortBookmarksCB(Widget, 
 
 4231                                                      XtPointer client_data,
 
 4236    XmString *strList, *newStrList;
 
 4237    std::vector<std::string> charList;
 
 4240    if (This->viewPtList.size() < 2)
 
 4244    XtVaGetValues(This->myViewPtList, XmNitemCount, &size, XmNitems, &strList,
 
 4247    for (
int i = 0; i < size; i++) {
 
 4248       vpName = (
char *) XmStringUnparse(strList[i], XmFONTLIST_DEFAULT_TAG,
 
 4249                                         XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
 
 4250       charList.push_back(vpName);
 
 4254    std::sort(charList.begin(), charList.end());
 
 4256    newStrList = (XmString *) XtMalloc(size * 
sizeof(XmString));
 
 4257    for (
int i = 0; i < size; i++) {
 
 4259       if (!strcmp(charList[i].c_str(), This->curViewPtName))
 
 4260          This->viewPtIdx = i;
 
 4261       char *vpName2 = 
new char[charList[i].size() + 1];
 
 4262       strcpy(vpName2, charList[i].c_str());
 
 4263       newStrList[i] = XmStringCreateLocalized(vpName2);
 
 4267    XmListDeleteAllItems(This->myViewPtList);
 
 4268    XmListAddItemsUnselected(This->myViewPtList, newStrList, size, 1);
 
 4270    This->sortViewPts(charList);
 
 4272    if (newStrList != NULL) {
 
 4273       for (
int i = 0; i < size; i++)
 
 4274          XmStringFree(newStrList[i]);
 
 4275       XtFree((
char *) newStrList);
 
 4280 void G4OpenInventorXtExaminerViewer::evenOutRefParticlePts()
 
 4282    if(this->refParticleTrajectory.empty())
 
 4285    SbVec3f p1, p2, p3, dirNow, dirNxt, 
dir, p2_tmp, p_start, p_corner, p_nxt;
 
 4286    float avgDistBtwPts = 0;
 
 4287    float totalDistBtwPts = 0;
 
 4288    std::vector<SbVec3f> newRefParticleTrajectory;
 
 4290    int size = refParticleTrajectory.size() - 1;
 
 4292    for (
int i = 0; i < size; i++) {
 
 4293       p1 = refParticleTrajectory[i];
 
 4294       p2 = refParticleTrajectory[i + 1];
 
 4298       totalDistBtwPts += (p2 - p1).length();
 
 4301    avgDistBtwPts = totalDistBtwPts / numOfPts;
 
 4302    float minDistAllowed = 0.75 * avgDistBtwPts;
 
 4308       p1 = refParticleTrajectory[i];
 
 4309       p2 = refParticleTrajectory[i + 1];
 
 4312       p1.getValue(x, y, z);
 
 4314       newRefParticleTrajectory.push_back(refPoint);
 
 4317       while ((p2 - p1).length() < minDistAllowed && j < (size - 1)) {
 
 4320          p1 = refParticleTrajectory[j];
 
 4321          p2 = refParticleTrajectory[j + 1];
 
 4329    refParticleTrajectory.clear();
 
 4330    refParticleTrajectory = newRefParticleTrajectory;
 
 4336 void G4OpenInventorXtExaminerViewer::closeMainWindowCB(Widget, 
 
 4337                                                        XtPointer client_data,
 
 4343    if (This->openFileDialog)
 
 4344       XtUnmanageChild(This->openFileDialog);
 
 4346    if (This->newFileDialog)
 
 4347       XtUnmanageChild(This->newFileDialog);
 
 4349    if (This->listsDialog)
 
 4350       closeListsDialogCB(NULL, This, NULL);
 
 4354 void G4OpenInventorXtExaminerViewer::saveCurCamera()
 
 4356    SoCamera *cam = getCamera();
 
 4357    camB4Animation.viewportMapping = cam->viewportMapping.getValue();
 
 4358    camB4Animation.position = cam->position.getValue();
 
 4359    camB4Animation.orientation = cam->orientation.getValue();
 
 4360    camB4Animation.aspectRatio = cam->aspectRatio.getValue();
 
 4361    camB4Animation.nearDistance = cam->nearDistance.getValue();
 
 4362    camB4Animation.farDistance = cam->farDistance.getValue();
 
 4363    camB4Animation.focalDistance = cam->focalDistance.getValue();
 
 4365    if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 4366       camB4Animation.height =
 
 4367          ((SoPerspectiveCamera *) cam)->heightAngle.getValue();
 
 4368       camB4Animation.camType = PERSPECTIVE;
 
 4369    } 
else if (cam->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
 4370       camB4Animation.height =
 
 4371          ((SoOrthographicCamera *) cam)->height.getValue();
 
 4372       camB4Animation.camType = ORTHOGRAPHIC;
 
 4377 void G4OpenInventorXtExaminerViewer::restoreCamera()
 
 4379    SoCamera *cam = getCamera();
 
 4381    cam->viewportMapping = camB4Animation.viewportMapping;
 
 4382    cam->position = camB4Animation.position;
 
 4383    cam->orientation = camB4Animation.orientation;
 
 4384    cam->aspectRatio = camB4Animation.aspectRatio;
 
 4385    cam->nearDistance = camB4Animation.nearDistance;
 
 4386    cam->farDistance = camB4Animation.farDistance;
 
 4387    cam->focalDistance = camB4Animation.focalDistance;
 
 4389    if (cam->isOfType(SoPerspectiveCamera::getClassTypeId())) {
 
 4390       if (camB4Animation.camType == ORTHOGRAPHIC) {
 
 4393          ((SoOrthographicCamera *) cam)->height.setValue(
 
 4394                                                          camB4Animation.height);
 
 4396          ((SoPerspectiveCamera *) cam)->heightAngle.setValue(
 
 4397                                                              camB4Animation.height);
 
 4398    } 
else if (cam->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
 4399       if (camB4Animation.camType == PERSPECTIVE) {
 
 4402          ((SoPerspectiveCamera *) cam)->heightAngle.setValue(
 
 4403                                                              camB4Animation.height);
 
 4405          ((SoOrthographicCamera *) cam)->height.setValue(
 
 4406                                                          camB4Animation.height);
 
 4411 void G4OpenInventorXtExaminerViewer::animateSensorRotationCB(
void *
data, 
 
 4414    SbTime curTime = SbTime::getTimeOfDay();
 
 4416    SoTimerSensor *
s = (SoTimerSensor *) sensor;
 
 4418    float t = float((curTime - s->getBaseTime()).getValue())
 
 4419       / This->animateBtwPtsPeriod;
 
 4421    if ((t > 1.0
f) || (t + s->getInterval().getValue() > 1.0f))
 
 4423    SbBool end = (t == 1.0f);
 
 4426       This->animateSensorRotation->unschedule();
 
 4433          This->currentState = This->prevState;
 
 4443 void G4OpenInventorXtExaminerViewer::animateSensorCB(
void *data, 
 
 4446    SbTime curTime = SbTime::getTimeOfDay();
 
 4448    SoCamera *cam = This->getCamera();
 
 4449    SoTimerSensor *s = (SoTimerSensor *) sensor;
 
 4451    float t = float((curTime - s->getBaseTime()).getValue())
 
 4452       / This->animateBtwPtsPeriod;
 
 4454    if ((t > 1.0
f) || (t + s->getInterval().getValue() > 1.0f))
 
 4456    SbBool end = (t == 1.0f);
 
 4458    cam->orientation = SbRotation::slerp(This->camStartOrient, This->camEndOrient, t);
 
 4459    cam->position = This->camStartPos + (This->camEndPos - This->camStartPos) * t;
 
 4462       This->animateSensor->unschedule();
 
 4464       if (This->currentState == ANIMATION) {
 
 4465          if (This->refParticleIdx < (
int) (This->refParticleTrajectory.size() - 1))
 
 4466             This->animateRefParticle();
 
 4472       if (This->currentState == REVERSED_ANIMATION) {
 
 4473          if (This->refParticleIdx >= 1)
 
 4474             This->animateRefParticle();
 
 4484 void G4OpenInventorXtExaminerViewer::setStartingPtForAnimation()
 
 4486    if (SoXtExaminerViewer::isAnimating())
 
 4490    SbVec3f p1, p2, p2_tmp, camUpV, camD, camD_tmp, leftRightAxis;
 
 4493    if (currentState == ANIMATION) {
 
 4494       p1 = refParticleTrajectory[refParticleIdx];
 
 4495       p2 = refParticleTrajectory[++(refParticleIdx)];
 
 4496    } 
else if (currentState == REVERSED_ANIMATION) {
 
 4497       p2 = refParticleTrajectory[refParticleIdx];
 
 4498       p1 = refParticleTrajectory[--(refParticleIdx)];
 
 4499    } 
else if (currentState == PAUSED_ANIMATION) {
 
 4500       if (refParticleIdx < (
int) refParticleTrajectory.size()) {
 
 4501          p1 = refParticleTrajectory[refParticleIdx];
 
 4502          p2 = refParticleTrajectory[refParticleIdx + 1];
 
 4504          p1 = refParticleTrajectory[refParticleIdx - 1];
 
 4505          p2 = refParticleTrajectory[refParticleIdx];
 
 4508    p1.getValue(x1, y1, z1);
 
 4509    p2.getValue(x2, y2, z2);
 
 4514    p2_tmp.setValue(x2, y1, z2);
 
 4515    camD_tmp = p2_tmp - p1;
 
 4516    camD_tmp.normalize();
 
 4518    camUpV.setValue(0, 1, 0);
 
 4519    rot.setValue(camD_tmp, camD);
 
 4520    rot.multVec(camUpV, camUpV);
 
 4522    leftRightAxis = camD.cross(camUpV);
 
 4524    myCam->position = p1;
 
 4525    myCam->pointAt(p2, camUpV);
 
 4528    p1 = p1 + (up_down * camUpV) + (left_right * leftRightAxis);
 
 4529    myCam->position = p1;
 
 4533 void G4OpenInventorXtExaminerViewer::gotoRefPathStart()
 
 4535    G4OpenInventorXtExaminerViewer::gotoRefPathStartCB(NULL, (
void *)
this, 
 
 4540 void G4OpenInventorXtExaminerViewer::gotoRefPathStartCB(Widget, 
 
 4541                                                         XtPointer client_data, 
 
 4546    if (!This->refParticleTrajectory.size()) {
 
 4547       String dialogName = (
char *) 
"No Reference Trajectory";
 
 4548       std::string msg = 
"You need to start a run or load a reference trajectory from a file";
 
 4553    if (This->currentState == ROTATING)
 
 4555    if (This->currentState == ANIMATION || This->currentState == REVERSED_ANIMATION
 
 4556        || This->currentState == PAUSED_ANIMATION) {
 
 4557       if (This->animateSensor->isScheduled())
 
 4558          This->animateSensor->unschedule();
 
 4559       This->setSuperimpositionEnabled(This->superimposition, 
FALSE);
 
 4560       This->maxSpeed = 0.0f;
 
 4561       This->scheduleRedraw();
 
 4563       This->saveCurCamera();
 
 4564       This->prevState = This->currentState;
 
 4565       This->prevRefIdx = This->refParticleIdx;
 
 4568    if (This->SoXtExaminerViewer::isAnimating())
 
 4569       This->stopAnimating();
 
 4572    This->left_right = 0;
 
 4575    This->refParticleIdx = 0;
 
 4576    This->currentState = BEAMLINE;
 
 4577    This->setSuperimpositionEnabled(This->superimposition, 
TRUE);
 
 4578    This->axisSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 4579    This->animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 4580    This->animSpeedSwitch->whichChild.setValue(SO_SWITCH_NONE);
 
 4581    This->scheduleRedraw();
 
 4588    This->prevParticleDir = SbVec3f(0,0,0);
 
 4591    SbVec3f p1 = This->refParticleTrajectory[0];
 
 4592    SbVec3f pN = This->refParticleTrajectory[This->refParticleTrajectory.size() - 1];
 
 4593    This->distance = (pN - p1).length() / 10;
 
 4599 void G4OpenInventorXtExaminerViewer::invertRefPathCB(Widget,
 
 4600                                                      XtPointer client_data,
 
 4605    This->invertRefPath();
 
 4609 void G4OpenInventorXtExaminerViewer::invertRefPath()
 
 4612                 this->refParticleTrajectory.end());
 
 4613    this->setReferencePathZPos();
 
 4614    this->sortElements();
 
 4618 void G4OpenInventorXtExaminerViewer::animateRefParticleCB(Widget, 
 
 4619                                            XtPointer client_data,
 
 4624    if (!This->refParticleTrajectory.size()) {
 
 4625       This->returnToAnim = 
true;
 
 4626       String dialogName = (
char *) 
"No Reference Trajectory";
 
 4627       std::string msg = 
"You need to start a run or load a reference trajectory from a file";
 
 4632    if (!This->refParticleTrajectory.size())
 
 4636    This->setSuperimpositionEnabled(This->superimposition, 
TRUE);
 
 4638    This->axisSwitch->whichChild.setValue(SO_SWITCH_ALL);
 
 4639    This->animSpeedOutlineSwitch->whichChild.setValue(SO_SWITCH_ALL);
 
 4640    This->animSpeedSwitch->whichChild.setValue(SO_SWITCH_ALL);
 
 4641    This->scheduleRedraw();
 
 4644    SoCamera *cam = This->getCamera();
 
 4647    if (This->currentState == ANIMATION || This->currentState == REVERSED_ANIMATION
 
 4648        || This->currentState == ROTATING)
 
 4651    if (This->currentState != PAUSED_ANIMATION) {
 
 4653       This->saveCurCamera();
 
 4654       This->prevState = This->currentState;
 
 4655       This->prevRefIdx = This->refParticleIdx;
 
 4657       if (cam->isOfType(SoOrthographicCamera::getClassTypeId())) {
 
 4658          This->toggleCameraType();
 
 4659          cam = This->getCamera();
 
 4662       This->refParticleIdx = 0; 
 
 4665       This->left_right = This->up_down = 0;
 
 4667       cam->focalDistance = 0.1f;
 
 4668       ((SoPerspectiveCamera *) cam)->heightAngle = 0.50f;
 
 4671    This->currentState = ANIMATION;
 
 4672    This->setStartingPtForAnimation();
 
 4674    cam->position = (This->myCam)->
position.getValue();
 
 4675    cam->orientation = (This->myCam)->orientation.getValue();
 
 4676    This->animateRefParticle(); 
 
 4680 void G4OpenInventorXtExaminerViewer::animateRefParticle()
 
 4682    SoCamera *cam = getCamera();
 
 4684    camStartPos = cam->position.getValue();
 
 4685    camStartOrient = cam->orientation.getValue();
 
 4687    if (currentState != BEAMLINE)
 
 4688       setStartingPtForAnimation();
 
 4690    camEndPos = myCam->position.getValue();
 
 4691    camEndOrient = myCam->orientation.getValue();
 
 4693    if (animateSensor->isScheduled())
 
 4694       animateSensor->unschedule();
 
 4696    animateSensor->setBaseTime(SbTime::getTimeOfDay());
 
 4697    animateSensor->setInterval(SbTime(0.02));
 
 4699    animateSensor->schedule();
 
 4704                          void (*callback)(
void *), 
void * 
object)
 
 4706    this->escapeCallback = callback;
 
 4707    this->examinerObject = object;
 
 4711 void G4OpenInventorXtExaminerViewer::sceneChangeCB(
void *
userData, SoSensor *)
 
 4715    if(This->newEvents){
 
 4716       This->findAndSetRefPath();
 
 4717       This->newEvents = 
false;
 
 4735       this->viewer->newEvents = 
true;