Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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)