// The view menu dispatch function void imodvViewMenu(int item) { ImodvApp *a = Imodv; Iobj *xobj; Icont *cont; bool freeXobj; switch (item) { case VVIEW_MENU_DB: imodv_setbuffer(a, 1 - a->dblBuf, -1, -1); a->mainWin->setEnabledMenuItem(VVIEW_MENU_TRANSBKGD, a->dblBuf && (a->enableDepthDBal >= 0 || a->enableDepthDBstAl >= 0)); break; case VVIEW_MENU_TRANSBKGD: imodv_setbuffer(a, -1, -1, 1 - a->transBkgd); if (a->transBkgd) a->transBkgd = 0; else a->transBkgd = a->alphaVisual; a->mainWin->setCheckableItem(VVIEW_MENU_TRANSBKGD, a->transBkgd); a->mainWin->setEnabledMenuItem(VVIEW_MENU_DB, a->dbPossible && a->enableDepthSB >= 0 && !a->transBkgd); break; case VVIEW_MENU_INVERTZ: toggleWorldFlag(a->invertZ, VIEW_WORLD_INVERT_Z, VVIEW_MENU_INVERTZ); break; case VVIEW_MENU_LIGHTING: toggleWorldFlag(a->lighting, VIEW_WORLD_LIGHT, VVIEW_MENU_LIGHTING); break; case VVIEW_MENU_WIREFRAME: toggleWorldFlag(a->wireframe, VIEW_WORLD_WIREFRAME, VVIEW_MENU_WIREFRAME); break; case VVIEW_MENU_LOWRES: toggleWorldFlag(a->lowres, VIEW_WORLD_LOWRES, VVIEW_MENU_LOWRES); break; case VVIEW_MENU_STEREO: imodvStereoEditDialog(a, 1); break; case VVIEW_MENU_DEPTH: imodvDepthCueEditDialog(a, 1); break; case VVIEW_MENU_SCALEBAR: scaleBarOpen(); break; case VVIEW_MENU_RESIZE: a->mainWin->openResizeTool(a); break; case VVIEW_MENU_BOUNDBOX: freeXobj = true; if (a->boundBoxExtraObj <= 0) { a->boundBoxExtraObj = ivwGetFreeExtraObjectNumber(a->vi); if (a->boundBoxExtraObj <= 0) return; xobj = ivwGetAnExtraObject(a->vi, a->boundBoxExtraObj); if (xobj) { imodObjectDefault(xobj); strcpy(xobj->name, "Volume bounding box extra object"); xobj->cont = imodContoursNew(6); if (xobj->cont) { xobj->contsize = 6; xobj->flags |= IMOD_OBJFLAG_OPEN | IMOD_OBJFLAG_WILD | IMOD_OBJFLAG_EXTRA_MODV | IMOD_OBJFLAG_EXTRA_EDIT | IMOD_OBJFLAG_ANTI_ALIAS | IMOD_OBJFLAG_MODV_ONLY; xobj->red = 1.; xobj->green = 1.; xobj->blue = 0.; xobj->linewidth = 2; if (!imodvAddBoundingBox(a)) freeXobj = false; } } } if (freeXobj) { ivwFreeExtraObject(a->vi, a->boundBoxExtraObj); a->boundBoxExtraObj = 0; } a->mainWin->setCheckableItem(VVIEW_MENU_BOUNDBOX, !freeXobj); imodvObjedNewView(); imodvDraw(a); break; case VVIEW_MENU_CURPNT: freeXobj = true; if (a->curPointExtraObj <= 0) { a->curPointExtraObj = ivwGetFreeExtraObjectNumber(a->vi); if (a->curPointExtraObj <= 0) return; xobj = ivwGetAnExtraObject(a->vi, a->curPointExtraObj); if (xobj) { imodObjectDefault(xobj); strcpy(xobj->name, "Current point extra object"); xobj->flags |= IMOD_OBJFLAG_SCAT | IMOD_OBJFLAG_MESH | IMOD_OBJFLAG_NOLINE | IMOD_OBJFLAG_FILL | IMOD_OBJFLAG_EXTRA_MODV | IMOD_OBJFLAG_EXTRA_EDIT | IMOD_OBJFLAG_MODV_ONLY; xobj->pdrawsize = 7. * a->vi->xybin; xobj->red = 1.; xobj->green = 0.; xobj->blue = 0.; xobj->quality = 4; cont = imodContourNew(); if (cont) { imodPointAppendXYZ(cont, 0., 0., 0.); imodPointSetSize(cont, 0, 5. * a->vi->xybin); if (cont->psize && cont->sizes && imodObjectAddContour(xobj, cont) >= 0) freeXobj = false; free(cont); } } } if (freeXobj) { ivwFreeExtraObject(a->vi, a->curPointExtraObj); a->curPointExtraObj = 0; } a->mainWin->setCheckableItem(VVIEW_MENU_CURPNT, !freeXobj); imodvObjedNewView(); imodvDraw(a); break; } }
// This function performs the action after the delay is up. It returns // true if the program is still to quit bool ImodClipboard::executeMessage() { int returnValue, arg; int succeeded = 1; static int checkSum = 0; int newCheck; QString convName; QDir *curdir; ZapFuncs *zap; int movieVal, xaxis, yaxis, zaxis, taxis; int objNum, type, symbol, symSize, ptSize, mode, mask, interval; bool props1; Imod *imod; Iobj *obj; int symTable[] = { IOBJ_SYM_NONE, IOBJ_SYM_CIRCLE, IOBJ_SYM_SQUARE, IOBJ_SYM_TRIANGLE }; // Number of arguments required - for backward compatibility, going to // model mode does not require one but should have one int requiredArgs[] = {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 5, 0, 2, 4, 4, 3, 1, 1}; int numArgs = sMessageStrings.count(); // Loop on the actions in the list; set arg to numArgs to break loop for (arg = 0; arg < numArgs; arg++) { imod = App->cvi->imod; // Get the action, then check that there are enough values for it sMessageAction = sMessageStrings[arg].toInt(); if (sMessageAction >= 0 && sMessageAction < sizeof(requiredArgs) / sizeof(int) && arg + requiredArgs[sMessageAction] >= numArgs) { imodPrintStderr("imodExecuteMessage: not enough values sent" " with action command %d\n", sMessageAction); succeeded = 0; break; } // If still in initial load, skip the arguments (and one more if model mode message) if (sInitialLoad) { if (sMessageAction >= 0 && sMessageAction < sizeof(requiredArgs) / sizeof(int)) arg += requiredArgs[sMessageAction]; if (arg < numArgs - 1 && sMessageAction == MESSAGE_MODEL_MODE) arg++; // Stop processing after a plugin message because the length is unknown // and stop after seeing a quit if (sMessageAction == MESSAGE_PLUGIN_EXECUTE || sMessageAction == MESSAGE_QUIT) arg = numArgs; continue; } if (Imod_debug) { QTime curTime = QTime::currentTime(); wprint("%02d:%02d.%03d: Executing message action %d\n", curTime.minute(), curTime.second(), curTime.msec(), sMessageAction); imodPrintStderr("%02d:%02d.%03d: imodHCM in executeMessage: executing message " "action %d\n", curTime.minute(), curTime.second(), curTime.msec(), sMessageAction); if (imodDebug('C')) { newCheck = imodChecksum(App->cvi->imod); wprint("Checksum before = %d\n", newCheck); if (checkSum && newCheck != checkSum) wprint("\aIT CHANGED SINCE LAST TIME\n"); checkSum = newCheck; } } if (ImodvClosed || !Imodv->standalone) { switch (sMessageAction) { case MESSAGE_OPEN_MODEL: case MESSAGE_OPEN_KEEP_BW: curdir = new QDir(); convName = curdir->cleanPath(sMessageStrings[++arg]); delete curdir; // Since this could open a dialog with an indefinite delay, just send // the OK signal now succeeded = -1; sendResponse(1); inputRaiseWindows(); // DNM 6/3/04: switch to keeping BW values in the first place returnValue = openModel(LATIN1(convName), sMessageAction == MESSAGE_OPEN_KEEP_BW, false); if(returnValue == IMOD_IO_SUCCESS) { wprint("%s loaded.\n", LATIN1(QDir::convertSeparators(QString(Imod_filename)))); } else if(returnValue == IMOD_IO_SAVE_ERROR) { wprint("Error Saving Model. New model not loaded.\n"); arg = numArgs; } else if(returnValue == IMOD_IO_SAVE_CANCEL) { wprint("Operation cancelled. New model not loaded.\n"); arg = numArgs; } // The model does not exist yet. Try creating a new model. else if(returnValue == IMOD_IO_DOES_NOT_EXIST) { returnValue = createNewModel(LATIN1(convName)); if(returnValue == IMOD_IO_SUCCESS) { wprint("New model %s created.\n", LATIN1(QDir::convertSeparators(QString(Imod_filename)))); } else { wprint("Could not create a new model %s.\n", LATIN1(sMessageStrings[arg])); arg = numArgs; } } else if(returnValue == IMOD_IO_NO_ACCESS_ERROR) { wprint("Error opening model. Check file permissions\n."); arg = numArgs; } else { wprint("Unknown return code, new model not loaded!!\n"); arg = numArgs; } break; case MESSAGE_SAVE_MODEL: succeeded = -1; sendResponse(1); imod->blacklevel = App->cvi->black; imod->whitelevel = App->cvi->white; returnValue = SaveModel(imod); break; case MESSAGE_VIEW_MODEL: imod_autosave(imod); inputRaiseWindows(); imodv_open(); break; case MESSAGE_QUIT: arg = numArgs; break; case MESSAGE_RAISE_WINDOWS: inputRaiseWindows(); break; case MESSAGE_MODEL_MODE: movieVal = 1; if (arg < numArgs - 1) movieVal = sMessageStrings[++arg].toInt(); if (movieVal > 0) imod_set_mmode(IMOD_MMODEL); else { imod_set_mmode(IMOD_MMOVIE); if (movieVal < 0) { xaxis = (-movieVal) & 1 ? 1 : 0; yaxis = (-movieVal) & 2 ? 1 : 0; zaxis = (-movieVal) & 4 ? 1 : 0; taxis = (-movieVal) & 8 ? 1 : 0; imodMovieXYZT(App->cvi, xaxis, yaxis, zaxis, taxis); } } break; case MESSAGE_OPEN_BEADFIXER: imodPlugOpenByName("Bead Fixer"); break; case MESSAGE_ONE_ZAP_OPEN: inputRaiseWindows(); if (!imodDialogManager.windowCount(ZAP_WINDOW_TYPE) && imodLoopStarted()) imod_zap_open(App->cvi, 0); break; case MESSAGE_RUBBERBAND: zapReportRubberband(); break; case MESSAGE_SLICER_ANGLES: slicerReportAngles(); break; case MESSAGE_OBJ_PROPERTIES: case MESSAGE_NEWOBJ_PROPERTIES: case MESSAGE_OBJ_PROPS_2: case MESSAGE_NEWOBJ_PROPS_2: props1 = sMessageAction == MESSAGE_OBJ_PROPERTIES || sMessageAction == MESSAGE_NEWOBJ_PROPERTIES; objNum = sMessageStrings[++arg].toInt(); type = sMessageStrings[++arg].toInt(); symbol = sMessageStrings[++arg].toInt(); symSize = sMessageStrings[++arg].toInt(); if (props1) ptSize = sMessageStrings[++arg].toInt(); // Object is numbered from 1, so decrement and test for substituting // current object if (--objNum < 0) objNum = imod->cindex.object; if (objNum < 0 || objNum >= imod->objsize) { imodPrintStderr("imodExecuteMessage: illegal object # sent with " "object property command\n"); succeeded = 0; arg = numArgs; break; } obj = &imod->obj[objNum]; // If object has contours, skip for NEWOBJ message if (obj->contsize && (sMessageAction == MESSAGE_NEWOBJ_PROPERTIES || sMessageAction == MESSAGE_NEWOBJ_PROPS_2)) break; if (props1) { // Process the changes if not -1: object type if (type >= 0 && type < 3) { switch (type) { case 0: obj->flags &= ~(IMOD_OBJFLAG_OPEN | IMOD_OBJFLAG_SCAT); break; case 1: obj->flags |= IMOD_OBJFLAG_OPEN; obj->flags &= ~IMOD_OBJFLAG_SCAT; break; case 2: obj->flags |= IMOD_OBJFLAG_SCAT | IMOD_OBJFLAG_OPEN; break; } } // Symbol type and filled if (symbol >= 0) { if ((symbol & 7) < (sizeof(symTable) / sizeof(int))) obj->symbol = symTable[symbol & 7]; utilSetObjFlag(obj, 0, (symbol & 8) != 0, IOBJ_SYMF_FILL); } // Symbol size, 3d point size if (symSize > 0) obj->symsize = symSize; if (ptSize >= 0) obj->pdrawsize = ptSize; } else { // Points per contour if (type >= 0) obj->extra[IOBJ_EX_PNT_LIMIT] = type; // Planar contours if (symbol >= 0) utilSetObjFlag(obj, 0, symbol != 0, IMOD_OBJFLAG_PLANAR); // Sphere on sec only if (symSize >= 0) utilSetObjFlag(obj, 0, symSize != 0, IMOD_OBJFLAG_PNT_ON_SEC); } // The general draw updates object edit window, but need to call // imodv object edit for it to update imodDraw(App->cvi, IMOD_DRAW_MOD); imodvObjedNewView(); // If no contours and only 1 obj, set checksum to avoid save requests if (imod->objsize == 1 && !obj->contsize) { imod->csum = imodChecksum(imod); if (imodDebug('C')) wprint("handleMessage set checksum %d\n", imod->csum); } break; case MESSAGE_GHOST_MODE: mode = sMessageStrings[++arg].toInt(); mask = sMessageStrings[++arg].toInt(); App->cvi->ghostmode = (App->cvi->ghostmode & ~mask) | (mode & mask); interval = sMessageStrings[++arg].toInt(); if (interval >= 0) App->cvi->ghostdist = interval; imodDraw(App->cvi, IMOD_DRAW_MOD); break; case MESSAGE_ZAP_HQ_MODE: mode = sMessageStrings[++arg].toInt() != 0 ? 1 : 0; zap = getTopZapWindow(false); if (zap) { zap->stateToggled(ZAP_TOGGLE_RESOL, mode); zap->mQtWindow->setToggleState(ZAP_TOGGLE_RESOL, mode); } else zapSetNextOpenHQstate(mode); break; case MESSAGE_OPEN_DIALOGS: if (!ImodvClosed) imodvOpenSelectedWindows(LATIN1(sMessageStrings[arg + 1])); ImodInfoWin->openSelectedWindows(LATIN1(sMessageStrings[++arg]), ImodvClosed ? 0 : 1); break; case MESSAGE_PLUGIN_EXECUTE: arg++; if (imodPlugMessage(App->cvi, &sMessageStrings, &arg)) { succeeded = 0; arg = numArgs; break; } break; default: imodPrintStderr("imodExecuteMessage: action %d not recognized\n" , sMessageAction); succeeded = 0; arg = numArgs; } } else { // Messages for 3dmodv switch (sMessageAction) { case MESSAGE_QUIT: arg = numArgs; break; case MESSAGE_RAISE_WINDOWS: imodvInputRaise(); break; case MESSAGE_OPEN_DIALOGS: imodvOpenSelectedWindows(LATIN1(sMessageStrings[++arg])); break; default: imodPrintStderr("imodExecuteMessage: action %d not recognized by" " 3dmodv\n" , sMessageAction); succeeded = 0; arg = numArgs; } } } if (imodDebug('C')) { wprint("Checksum after = %d\n", newCheck); if (newCheck != checkSum) wprint("\aIT CHANGED IN THAT OPERATION\n"); checkSum = newCheck; } // Now set the clipboard with the response as long as we aren't doing deferred if (succeeded >= 0 && mDeferredHandling <= 0) sendResponse(succeeded); // Only do deferred handling once if (mDeferredHandling > 0) mDeferredHandling = 0; return sMessageAction == MESSAGE_QUIT; }
void ImodvOlist::actionButtonClicked(int which) { Imod *imod = Imodv->imod; IobjGroup *group, *ogroup; int ob, index, changed = 1; if (which != OBJGRP_NEW && which != OBJGRP_DELETE) { group = (IobjGroup *)ilistItem(imod->groupList, imod->curObjGroup); if (!group) return; } switch (which) { case OBJGRP_NEW: imodvRegisterModelChg(); group = objGroupListExpand(&imod->groupList); if (!group) break; ogroup = (IobjGroup *)ilistItem(imod->groupList, imod->curObjGroup); if (ogroup) group->objList = ilistDup(ogroup->objList); imod->curObjGroup = ilistSize(imod->groupList) - 1; updateGroups(Imodv); break; case OBJGRP_DELETE: if (imod->curObjGroup < 0) return; imodvRegisterModelChg(); if (objGroupListRemove(imod->groupList, imod->curObjGroup)) break; imod->curObjGroup = B3DMIN(B3DMAX(0, imod->curObjGroup - 1), ilistSize(imod->groupList) - 1); updateGroups(Imodv); break; case OBJGRP_CLEAR: imodvRegisterModelChg(); ilistTruncate(group->objList, 0); updateGroups(Imodv); break; case OBJGRP_ADDALL: imodvRegisterModelChg(); if (group->objList) ilistTruncate(group->objList, 0); for (ob = 0; ob < imod->objsize; ob++) if (objGroupAppend(group, ob)) return; updateGroups(Imodv); break; case OBJGRP_SWAP: imodvRegisterModelChg(); for (ob = 0; ob < imod->objsize; ob++) { index = objGroupLookup(group, ob); if (index >= 0) ilistRemove(group->objList, index); else if (objGroupAppend(group, ob)) return; } updateGroups(Imodv); break; case OBJGRP_TURNON: case OBJGRP_TURNOFF: case OBJGRP_OTHERSON: case OBJGRP_OTHERSOFF: changed = 0; for (ob = 0; ob < imod->objsize; ob++) { index = objGroupLookup(group, ob); if (((index >= 0 && which == OBJGRP_TURNON) || (index < 0 && which == OBJGRP_OTHERSON)) && iobjOff(imod->obj[ob].flags)) { imodvRegisterObjectChg(ob); imod->obj[ob].flags &= ~IMOD_OBJFLAG_OFF; changed = 1; } else if (((index >= 0 && which == OBJGRP_TURNOFF) || (index < 0 && which == OBJGRP_OTHERSOFF)) && !iobjOff(imod->obj[ob].flags)) { imodvRegisterObjectChg(ob); imod->obj[ob].flags |= IMOD_OBJFLAG_OFF; changed = 1; } } imodvDraw(Imodv); imodvDrawImodImages(); imodvObjedNewView(); break; } if (changed) imodvFinishChgUnit(); }