def pierced_faces(self, screen_x, screen_y): """pierced_faces(screen_x, screen_y) Output: faces list of faces with each face having axis (0 or 1 or 2 for x or y or z) and side (0 or 1 for -ve or +ve) Return faces pierced. Empty list if none. """ faces = [] xf = self.xform() if xf == None: return faces xyz_region = self.box_bounds() from VolumeViewer import slice xyz_in, xyz_out = slice.box_intercepts(screen_x, screen_y, xf, xyz_region) if xyz_in: faces.append(self.closest_face(xyz_in, xyz_region)) if xyz_out: faces.append(self.closest_face(xyz_out, xyz_region)) return faces
def clicked_mask_region(segmentation, pointer_x, pointer_y): s = segmentation if not s.display: return None if s.mask is None: print 'mouse down: no current segmentation mask' return None mk, mj, mi = s.mask.shape box = ((0, 0, 0), (mi, mj, mk)) from Matrix import xform_matrix, multiply_matrices ijk_to_eye = multiply_matrices(xform_matrix(s.openState.xform), s.point_transform()) from VolumeViewer.slice import box_intercepts, array_slice_values ijk_in, ijk_out = box_intercepts(pointer_x, pointer_y, ijk_to_eye, box, s) if ijk_in is None or ijk_out is None: print 'mouse down: no intercept with mask' return None rnums = array_slice_values(s.mask, ijk_in, ijk_out, method='nearest')[:, 1] r = first_shown_region(s, rnums) if r is None: r = clicked_volume_region(segmentation, pointer_x, pointer_y) if r is None: print 'mouse down: no intercept with region' return None return r
def clicked_volume_region(segmentation, pointer_x, pointer_y): r = None s = segmentation m = s.mask v = s.volume_data() if v and v.shown() and v.single_plane() and not m is None: box = v.region[:2] from Matrix import xform_matrix, multiply_matrices ijk_to_eye = multiply_matrices(xform_matrix(s.openState.xform), s.point_transform()) from VolumeViewer.slice import box_intercepts ijk_in, ijk_out = box_intercepts(pointer_x, pointer_y, ijk_to_eye, box, v) if not ijk_in is None: i, j, k = [int(round(h)) for h in ijk_in] ksz, jsz, isz = m.shape if i >= 0 and i < isz and j >= 0 and j < jsz and k >= 0 and k < ksz: rid = s.mask[k, j, i] r = s.id_to_region.get(rid, None) return r
def sweep_out_box(self, pointer_x, pointer_y): """sweep_out_box(pointer_x, pointer_y) Create box if data region found and it has been transformed. """ data_region = self.data_region() if data_region == None: return #VU 1.2129 # xform = data_region.transform() import SegmentMenu from SegmentMenu import datamenuseg xform = datamenuseg.get_data_region_xform(data_region) if xform == None: return #VU 1.2129 # bounds = data_region.xyz_region() import SegmentMenu from SegmentMenu import datamenuseg bounds = datamenuseg.get_data_region_bounds(data_region) from VolumeViewer import slice xyz_in, xyz_out = slice.box_intercepts(pointer_x, pointer_y, xform, bounds) if xyz_in == None or xyz_out == None: return if self.xyz_in == None: self.xyz_in = xyz_in if self.xyz_out == None: self.xyz_out = xyz_out box = bounding_box((xyz_in, xyz_out, self.xyz_in, self.xyz_out)) self.box_model.reshape_box(box, xform)