MsgResult TEMPLATESGallery::Message(Msg* Message) { if (IS_OUR_DIALOG_MSG(Message)) { DialogMsg* Msg = (DialogMsg*)Message; switch (Msg->DlgMsg) { case DIM_CREATE: SGInit::UpdateGalleryButton(OPTOKEN_DISPLAYTEMPLATEGALLERY, TRUE); break; case DIM_CANCEL: SGInit::UpdateGalleryButton(OPTOKEN_DISPLAYTEMPLATEGALLERY, FALSE); break; } return(SuperGallery::Message(Message)); } // If we have no displaytree, then we have not been shown, or something terrible has // happened, so we don't bother handling any of these messages. if (DisplayTree == NULL) return(SuperGallery::Message(Message)); // **** TO DO **** // Just another note: Most galleries ignore most messages when closed (!IsVisible()) // This means that they must re-create themselves properly to get back up to date // when they are opened - this is done in the PostCreate handler. If you wish to // respond to messages to keep up to date while closed, you should address the // default code in the PostCreate handler as well. if (IsVisible() && MESSAGE_IS_A(Message, DocChangingMsg)) { DocChangingMsg *TheMsg = (DocChangingMsg *) Message; switch ( TheMsg->State ) { case DocChangingMsg::DocState::BORN: // New document - add to display tree { INT32 Extent = GetDisplayExtent(); // Remember previous list extent CreateNewSubtree(TheMsg->pChangingDoc); // Add a subtree for this doc ShadeGallery(FALSE); // Unshade the gallery InvalidateCachedFormat(); // And redraw what is necessary RedrawEverythingBelow(-Extent); } break; // Pass this message on to the base class as well } } return(SuperGallery::Message(Message)); }
void WITVolumeViz::ActiveImageExtents(double transPts[4][3], double transNormal[4]) { // get the active image extents double pts[4][3]; int displayExtent[6]; double planeNormal[4]= {0,0,0,0}; uint dim[4]; // get the image dimensions _vol->getDimension (dim[0], dim[1], dim[2], dim[3]); DTIVoxel lPos = DTIVoxel(3); // map position from ACPC to 3d world space WorldToLocal(_vol->getTransformMatrix(), _vPos, dim, lPos); memset(pts, 0, sizeof(double)*4*3); int i = ActiveImage(); GetDisplayExtent ((DTISceneActorID)i,displayExtent); for (int j = 0; j < 4; j++) pts[j][i] = lPos[i]; planeNormal[i] = 1; // get the 4 corners depending on which image plane is selected switch (ActiveImage()) { case DTI_ACTOR_SAGITTAL_TOMO: pts[1][1] = displayExtent[3]; pts[2][1] = displayExtent[3]; pts[2][2] = displayExtent[5]; pts[3][2] = displayExtent[5]; break; case DTI_ACTOR_CORONAL_TOMO: pts[1][0] = displayExtent[1]; pts[2][0] = displayExtent[1]; pts[2][2] = displayExtent[5]; pts[3][2] = displayExtent[5]; break; case DTI_ACTOR_AXIAL_TOMO: pts[1][0] = displayExtent[1]; pts[2][0] = displayExtent[1]; pts[2][1] = displayExtent[3]; pts[3][1] = displayExtent[3]; break; default: break; }; vtkMatrix4x4 *mx = GetUserMatrix(); // map the points from 3d world space to ACPC space for (int i = 0; i < 4; i++) { double fooIn[4] = {pts[i][0], pts[i][1], pts[i][2], 1}; double fooOut[4]; mx->MultiplyPoint (fooIn, fooOut); transPts[i][0] = fooOut[0]; transPts[i][1] = fooOut[1]; transPts[i][2] = fooOut[2]; } // inverse of transpose: vtkMatrix4x4 *invertedMx = vtkMatrix4x4::New(); vtkMatrix4x4 *transposedMx = vtkMatrix4x4::New(); mx->Invert (mx, invertedMx); mx->Transpose (invertedMx, transposedMx); mx->MultiplyPoint (planeNormal, transNormal); transposedMx->Delete(); invertedMx->Delete(); }