Beispiel #1
0
 def hover(self,context,x,y):
     '''
     hovering happens in mixed 3d and screen space.  It's a mess!
     '''
     
     if len(self.b_pts) == 0:
         return
     
     region = context.region
     rv3d = context.region_data
     self.mouse = Vector((x, y))
     coord = x, y
     loc3d_reg2D = view3d_utils.location_3d_to_region_2d
     
     view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
     ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
     ray_target = ray_origin + (view_vector * 1000)
     
     if self.snap_type == 'OBJECT':
         mx = self.snap_ob.matrix_world
         imx = mx.inverted()
     
         if bversion() < '002.077.000':
             loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target)
             if face_ind == -1: 
                 #do some shit
                 pass
         else:
             res, loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target - imx * ray_origin)
             if not res:
                 #do some shit
                 pass
     elif self.snap_type == 'SCENE':
         
         mx = Matrix.Identity(4) #scene ray cast returns world coords
         if bversion() < '002.077.000':
             res, obj, omx, loc, no = context.scene.ray_cast(ray_origin, ray_target)
         else:
             res, loc, no, ind, obj, omx = context.scene.ray_cast(ray_origin, view_vector)
             
                 
     def dist(v):
         diff = v - Vector((x,y))
         return diff.length
     
     def dist3d(v3):
         if v3 == None:
             return 100000000
         delt = v3 - mx * loc
         return delt.length
     
     closest_3d_point = min(self.b_pts, key = dist3d)
     screen_dist = dist(loc3d_reg2D(context.region, context.space_data.region_3d, closest_3d_point))
     
     if screen_dist  < 20:
         self.hovered = ['POINT',self.b_pts.index(closest_3d_point)]
         return
     
     
         self.hovered = [None, -1]
Beispiel #2
0
    def grab_mouse_move(self, context, x, y):
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        crv_mx = self.crv_obj.matrix_world
        i_crv_mx = crv_mx.inverted()

        hit = False
        if self.snap_type == 'SCENE':

            if bversion() < '002.077.000':
                res, obj, omx, loc, no = context.scene.ray_cast(
                    ray_origin, ray_target)
            else:
                res, loc, no, ind, obj, mx = context.scene.ray_cast(
                    ray_origin, view_vector)
            mx = Matrix.Identity(4)
            if res:
                hit = True

            else:
                #cast the ray into a plane a
                #perpendicular to the view dir, at the last bez point of the curve
                hit = True
                view_direction = rv3d.view_rotation * Vector((0, 0, -1))
                plane_pt = self.grab_undo_loc
                loc = intersect_line_plane(ray_origin, ray_target, plane_pt,
                                           view_direction)

        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()
            loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin,
                                                      imx * ray_target)

            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target - imx * ray_origin)
                if ok:
                    hit = True

        if not hit:
            self.grab_cancel()

        else:
            local_loc = i_crv_mx * mx * loc
            self.crv_data.splines[0].bezier_points[
                self.selected].co = local_loc
            self.b_pts[self.selected] = mx * loc
Beispiel #3
0
  def grab_mouse_move(self,context,x,y):
      region = context.region
      rv3d = context.region_data
      coord = x, y
      view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
      ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
      ray_target = ray_origin + (view_vector * 1000)
      
      crv_mx = self.crv_obj.matrix_world
      i_crv_mx = crv_mx.inverted()  
      
      
      hit = False
      if self.snap_type == 'SCENE':
          
          mx = Matrix.Identity(4) #scene ray cast returns world coords
          if bversion() < '002.077.000':
              res, obj, omx, loc, no = context.scene.ray_cast(ray_origin, ray_target)
          else:
              res, loc, no, ind, obj, omx = context.scene.ray_cast(ray_origin, view_vector)
          
          if res:
              hit = True
      
          else:
              #cast the ray into a plane a
              #perpendicular to the view dir, at the last bez point of the curve
              hit = True
              view_direction = rv3d.view_rotation * Vector((0,0,-1))
              plane_pt = self.grab_undo_loc
              loc = intersect_line_plane(ray_origin, ray_target,plane_pt, view_direction)
              
      elif self.snap_type == 'OBJECT':
          mx = self.snap_ob.matrix_world
          imx = mx.inverted()
          
          if bversion() < '002.077.000':
              loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target)
              if face_ind != -1:
                  hit = True
          else:
              ok, loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
              if ok:
                  hit = True
 
      if not hit:
          self.grab_cancel()
          
      else:
          local_loc = i_crv_mx * mx * loc
          self.crv_data.splines[0].bezier_points[self.selected].co = local_loc
          self.b_pts[self.selected] = mx * loc
Beispiel #4
0
    def snap_poly_line(self):
        '''
        only needed if processing an outside mesh
        '''
        locs = []
        self.face_map = []
        self.normals = []
        self.face_changes = []
        mx = self.cut_ob.matrix_world
        imx = mx.inverted()
        for i, v in enumerate(self.pts):
            if bversion() < '002.077.000':
                loc, no, ind, d = self.bvh.find(imx * v)
            else:
                loc, no, ind, d = self.bvh.find_nearest(imx * v)

            self.face_map.append(ind)
            self.normals.append(no)
            locs.append(loc)
            if i > 0:
                if ind != self.face_map[i - 1]:
                    self.face_changes.append(i - 1)

            #do double check for the last point
            if i == len(self.pts) - 1:
                if ind != self.face_map[0]:
                    self.face_changes.append(i)
        self.cut_pts = locs
Beispiel #5
0
 def snap_poly_line(self):
     '''
     only needed if processing an outside mesh
     '''
     locs = []
     self.face_map = []
     self.normals = []
     self.face_changes = []
     mx = self.cut_ob.matrix_world
     imx = mx.inverted()
     for i, v in enumerate(self.pts):
         if bversion() < '002.077.000':
             loc, no, ind, d = self.bvh.find(imx * v)
         else:
             loc, no, ind, d = self.bvh.find_nearest(imx * v)
         
         self.face_map.append(ind)
         self.normals.append(no)
         locs.append(loc)
         if i > 0:
             if ind != self.face_map[i-1]:
                 self.face_changes.append(i-1)
         
         #do double check for the last point
         if i == len(self.pts) - 1:
             if ind != self.face_map[0] :
                 self.face_changes.append(i)      
     self.cut_pts = locs
Beispiel #6
0
    def set_axis(self, context, event):

        coord = (event.mouse_region_x, event.mouse_region_y)
        v3d = context.space_data
        rv3d = v3d.region_3d
        view_vector = view3d_utils.region_2d_to_vector_3d(
            context.region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(
            context.region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        if bversion() < '002.077.000':
            res, obj, loc, no, mx = context.scene.ray_cast(
                ray_origin, ray_target)
        else:
            res, loc, no, ind, obj, mx = context.scene.ray_cast(
                ray_origin, view_vector)

        if res:
            obj.name = str(self.target)
            for ob in bpy.data.objects:
                ob.select = False
            obj.select = True
            obj.show_name = True
            context.scene.objects.active = obj
            bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='BOUNDS')
            return True
        else:
            return False
Beispiel #7
0
    def click_seed_select(self, context, x, y):

        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        mx = self.cut_ob.matrix_world
        imx = mx.inverted()
        if bversion() < '002.077.000':
            loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin,
                                                     imx * ray_target)
        else:
            ok, loc, no, face_ind = self.cut_ob.ray_cast(
                imx * ray_origin, imx * ray_target - imx * ray_origin)
        if face_ind != -1:
            self.face_seed = face_ind
            print('face selected!!')
            return True

        else:
            self.face_seed = None
            print('face not selected')
            return False
 def slice(self):
     self.clear_draw()
     
     self.get_pt_and_no()
     
     mx = self.snap_ob.matrix_world
     imx = mx.inverted()
     if bversion() < '002.077.000':
         pt, no, seed, dist = self.bvh.find(imx * self.cut_pt)
     else:
         pt, no, seed, dist = self.bvh.find_nearest(imx * self.cut_pt)
     
     verts_x, eds = cross_section_seed_ver1(self.bme, mx, self.cut_pt, self.cut_no_x, seed, max_tests = 100)
     verts_y, eds = cross_section_seed_ver1(self.bme, mx, self.cut_pt, self.cut_no_y, seed, max_tests = 100)
     #put them in world space
     self.slice_points_x = [mx*v for v in verts_x]
     self.slice_points_y = [mx*v for v in verts_y]
 
     bmx = self.bracket_data.bracket_obj.matrix_world
     bracket_x = bmx.to_3x3()*Vector((1,0,0))
     bracket_y = bmx.to_3x3()*Vector((0,1,0))
     bracket_z = bmx.to_3x3()*Vector((0,0,1))
     
     v0 = self.cut_pt
     v1 = v0 + self.incisal_d * bracket_y
     v_l = v1 - 4 * bracket_z
     v_m = v1 + 2 * bracket_x
     v_d = v1 - 2 * bracket_x
     self.reference_L = [v0, v1, v_l, v_m, v_d]
Beispiel #9
0
    def click_add_point(self, context, x, y):
        '''
        x,y = event.mouse_region_x, event.mouse_region_y
        
        this will add a point into the bezier curve or
        close the curve into a cyclic curve
        '''
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        mx = self.cut_ob.matrix_world
        imx = mx.inverted()

        if bversion() < '002.077.000':
            loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin,
                                                     imx * ray_target)
        else:
            ok, loc, no, face_ind = self.cut_ob.ray_cast(
                imx * ray_origin, imx * ray_target - imx * ray_origin)

        if face_ind == -1:
            self.selected = -1
            return

        if self.hovered[0] == None:  #adding in a new point
            self.pts += [mx * loc]
            self.cut_pts += [loc]
            self.normals += [no]
            self.face_map += [face_ind]
            self.selected = len(self.pts) - 1

        if self.hovered[0] == 'POINT':
            self.selected = self.hovered[1]
            if self.hovered[1] == 0:  #clicked on first bpt, close loop
                self.cyclic = self.cyclic == False
            return

        elif self.hovered[0] == 'EDGE':  #cut in a new point
            self.pts.insert(self.hovered[1] + 1, mx * loc)
            self.cut_pts.insert(self.hovered[1] + 1, loc)
            self.normals.insert(self.hovered[1] + 1, no)
            self.face_map.insert(self.hovered[1] + 1, face_ind)
            self.selected = self.hovered[1] + 1
            return
Beispiel #10
0
    def slice(self):
        self.clear_draw()

        self.get_pt_and_no()

        mx = self.snap_ob.matrix_world
        imx = mx.inverted()
        if bversion() < '002.077.000':
            pt, no, seed, dist = self.bvh.find(imx * self.cut_pt)
        else:
            pt, no, seed, dist = self.bvh.find_nearest(imx * self.cut_pt)

        verts_x, eds = cross_section_seed_ver1(self.bme,
                                               mx,
                                               self.cut_pt,
                                               self.cut_no_x,
                                               seed,
                                               max_tests=100)
        verts_y, eds = cross_section_seed_ver1(self.bme,
                                               mx,
                                               self.cut_pt,
                                               self.cut_no_y,
                                               seed,
                                               max_tests=100)
        #put them in world space

        if verts_x != None:
            self.slice_points_x = [mx * v for v in verts_x]
        else:
            self.slice_points_x = []
        if verts_y != None:
            self.slice_points_y = [mx * v for v in verts_y]
        else:
            self.slice_points_y = []

        bmx = self.bracket_data.bracket_obj.matrix_world
        bracket_x = bmx.to_3x3() * Vector((1, 0, 0))
        bracket_z = bmx.to_3x3() * Vector((0, 0, 1))
        bracket_y = bracket_z.cross(self.cut_no_x)

        v0 = self.cut_pt
        v1 = v0 + self.b_gauge * bracket_y
        v_l = v1 - 4 * bracket_z
        v_m = v1 + 2 * bracket_x
        v_d = v1 - 2 * bracket_x
        self.reference_L = [v0, v1, v_l, v_m, v_d]
Beispiel #11
0
    def click_add_point(self,context,x,y):
        '''
        x,y = event.mouse_region_x, event.mouse_region_y
        
        this will add a point into the bezier curve or
        close the curve into a cyclic curve
        '''
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        mx = self.cut_ob.matrix_world
        imx = mx.inverted()

        if bversion() < '002.077.000':
            loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target)
        else:
            ok, loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
            
        if face_ind == -1: 
            self.selected = -1
            return
        
        if self.hovered[0] == None:  #adding in a new point
            self.pts += [mx * loc]
            self.cut_pts += [loc]
            self.normals += [no]
            self.face_map += [face_ind]
            self.selected = len(self.pts) -1
                
        if self.hovered[0] == 'POINT':
            self.selected = self.hovered[1]
            if self.hovered[1] == 0:  #clicked on first bpt, close loop
                self.cyclic = self.cyclic == False
            return
         
        elif self.hovered[0] == 'EDGE':  #cut in a new point
            self.pts.insert(self.hovered[1]+1, mx * loc)
            self.cut_pts.insert(self.hovered[1]+1, loc)
            self.normals.insert(self.hovered[1]+1, no)
            self.face_map.insert(self.hovered[1]+1, face_ind)
            self.selected = self.hovered[1] + 1
            return
Beispiel #12
0
    def set_axis(self, context, event):

        if not self.target:
            return

        empty_name = self.target.name + 'root_empty'
        if empty_name in context.scene.objects:
            ob = context.scene.objects[empty_name]
            ob.empty_draw_type = 'SINGLE_ARROW'
            ob.empty_draw_size = 10
        else:
            ob = bpy.data.objects.new(empty_name, None)
            ob.empty_draw_type = 'SINGLE_ARROW'
            ob.empty_draw_size = 10
            context.scene.objects.link(ob)

        coord = (event.mouse_region_x, event.mouse_region_y)
        v3d = context.space_data
        rv3d = v3d.region_3d
        view_vector = view3d_utils.region_2d_to_vector_3d(
            context.region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(
            context.region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        if bversion() < '002.077.000':
            res, obj, loc, no, mx = context.scene.ray_cast(
                ray_origin, ray_target)
        else:
            res, loc, no, ind, obj, mx = context.scene.ray_cast(
                ray_origin, view_vector)

        if res:
            if obj != self.target:
                return

            ob.location = loc
        else:
            return

        if ob.rotation_mode != 'QUATERNION':
            ob.rotation_mode = 'QUATERNION'

        vrot = rv3d.view_rotation
        ob.rotation_quaternion = vrot
Beispiel #13
0
 def slice(self):
     self.slice_points = []
     
     if len(self.crv_dat.b_pts) < 2 or self.crv_dat.selected == -1:
         return
     
     self.get_pt_and_no()
     
     mx = self.snap_ob.matrix_world
     imx = mx.inverted()
     if bversion() < '002.077.000':
         pt, no, seed, dist = self.bvh.find(imx * self.cut_pt)
     else:
         pt, no, seed, dist = self.bvh.find_nearest(imx * self.cut_pt)
     
     
     verts, eds = cross_section_seed_ver1(self.bme, mx, self.cut_pt, self.cut_no, seed, max_tests = 40)
     
     #put them in world space
     self.slice_points = [mx*v for v in verts]
Beispiel #14
0
    def grab_mouse_move(self,context,x,y):
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        mx = self.cut_ob.matrix_world
        imx = mx.inverted()
        if bversion() < '002.077.000':
            loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target)
        else:
            ok, loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
        
        if face_ind == -1:        
            self.grab_cancel()  
        else:
            self.pts[self.selected] = mx * loc
            self.cut_pts[self.selected] = loc
            self.normals[self.selected] = no
            self.face_map[self.selected] = face_ind
Beispiel #15
0
 def click_seed_select(self, context, x, y):
     
     region = context.region
     rv3d = context.region_data
     coord = x, y
     view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
     ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
     ray_target = ray_origin + (view_vector * 1000)
     mx = self.cut_ob.matrix_world
     imx = mx.inverted()
     if bversion() < '002.077.000':
         loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target)
     else:
         ok, loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
     if face_ind != -1:
         self.face_seed = face_ind
         print('face selected!!')
         return True
         
     else:
         self.face_seed = None
         print('face not selected')
         return False
Beispiel #16
0
    def grab_mouse_move(self, context, x, y):
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        mx = self.cut_ob.matrix_world
        imx = mx.inverted()
        if bversion() < '002.077.000':
            loc, no, face_ind = self.cut_ob.ray_cast(imx * ray_origin,
                                                     imx * ray_target)
        else:
            ok, loc, no, face_ind = self.cut_ob.ray_cast(
                imx * ray_origin, imx * ray_target - imx * ray_origin)

        if face_ind == -1:
            self.grab_cancel()
        else:
            self.pts[self.selected] = mx * loc
            self.cut_pts[self.selected] = loc
            self.normals[self.selected] = no
            self.face_map[self.selected] = face_ind
Beispiel #17
0
    def slice(self):
        self.slice_points = []

        if len(self.crv_dat.b_pts) < 2 or self.crv_dat.selected == -1:
            return

        self.get_pt_and_no()

        mx = self.snap_ob.matrix_world
        imx = mx.inverted()
        if bversion() < '002.077.000':
            pt, no, seed, dist = self.bvh.find(imx * self.cut_pt)
        else:
            pt, no, seed, dist = self.bvh.find_nearest(imx * self.cut_pt)

        verts, eds = cross_section_seed_ver1(self.bme,
                                             mx,
                                             self.cut_pt,
                                             self.cut_no,
                                             seed,
                                             max_tests=40)

        #put them in world space
        self.slice_points = [mx * v for v in verts]
Beispiel #18
0
    def click_add_point(self, context, x, y):
        '''
        x,y = event.mouse_region_x, event.mouse_region_y
        
        this will add a point into the bezier curve or
        close the curve into a cyclic curve
        '''
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        crv_mx = self.crv_obj.matrix_world
        i_crv_mx = crv_mx.inverted()

        hit = False
        if self.snap_type == 'SCENE':
            mx = Matrix.Identity(
                4
            )  #loc is given in world loc...no need to multiply by obj matrix
            if bversion() < '002.077.000':
                res, obj, omx, loc, no = context.scene.ray_cast(
                    ray_origin, ray_target)  #changed in 2.77
            else:
                res, loc, no, ind, obj, omx = context.scene.ray_cast(
                    ray_origin, view_vector)

            hit = res
            if not hit:
                #cast the ray into a plane a
                #perpendicular to the view dir, at the last bez point of the curve

                view_direction = rv3d.view_rotation * Vector((0, 0, -1))

                if len(self.b_pts):
                    if self.hovered[0] == 'EDGE':
                        plane_pt = self.b_pts[self.hovered[1]]
                    else:
                        plane_pt = self.b_pts[-1]
                else:
                    plane_pt = context.scene.cursor_location
                loc = intersect_line_plane(ray_origin, ray_target, plane_pt,
                                           view_direction)
                hit = True
        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()

            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target - imx * ray_origin)
                if ok:
                    hit = True

            if face_ind != -1:
                hit = True

        if not hit:
            self.selected = -1
            return

        if self.hovered[0] == None:  #adding in a new point
            if self.started:
                self.crv_data.splines[0].bezier_points.add(count=1)
                bp = self.crv_data.splines[0].bezier_points[-1]
                bp.handle_right_type = 'AUTO'
                bp.handle_left_type = 'AUTO'
                bp.co = i_crv_mx * mx * loc
                self.b_pts.append(mx * loc)

            else:
                self.started = True
                delta = i_crv_mx * mx * loc - self.crv_data.splines[
                    0].bezier_points[-1].co
                bp = self.crv_data.splines[0].bezier_points[0]
                bp.co += delta
                bp.handle_left += delta
                bp.handle_right += delta
                self.b_pts.append(mx * loc)

        if self.hovered[0] == 'POINT':
            self.selected = self.hovered[1]
            if self.hovered[1] == 0:  #clicked on first bpt, close loop
                self.crv_data.splines[0].use_cyclic_u = self.crv_data.splines[
                    0].use_cyclic_u == False
            return

        elif self.hovered[0] == 'EDGE':  #cut in a new point
            self.b_pts.insert(self.hovered[1] + 1, mx * loc)
            self.update_blender_curve_data()
            return
Beispiel #19
0
    def execute(self, context):
        layers_copy = [layer for layer in context.scene.layers]
        context.scene.layers[0] = True

        for ob in context.selected_objects:
            mods = [mod.type for mod in ob.modifiers]
            if 'HOOK' in mods:
                self.report({'WARNING'}, 'There are hook modifiers in' +
                            ob.name + '.  Please apply or remove them')
            elif 'LAPLACIANDEFORM' in mods:
                self.report({'WARNING'},
                            'There are laplacial deform modifiers in' +
                            ob.name + '.  Please apply or remove them')
            elif 'SHRINKWRAP' in mods:
                self.report(
                    {'WARNING'},
                    'There are shrinkwrap modifiers in' + ob.name +
                    '.  Use Flexi Tooth BEFORE any margin seating or contact grinding'
                )
                continue

            else:
                if ob.type == 'MESH':
                    mx = ob.matrix_world
                    imx = mx.inverted()

                    if ob.data.name[0:2] not in v_groups: continue

                    ob.lock_location = [True, True, True]
                    #ob.hide_select = True
                    data_name = ob.data.name[0:2]

                    hook_parent = bpy.data.objects.new(data_name + '_hook',
                                                       None)
                    context.scene.objects.link(hook_parent)
                    hook_parent.matrix_world = ob.matrix_world

                    v_islands = v_groups[ob.data.name[0:2]]
                    modnames = [
                        data_name + '_hook.' + str(k).zfill(3)
                        for k in range(len(v_islands))
                    ]

                    bpy.ops.object.select_all(action='DESELECT')
                    context.scene.objects.active = ob
                    ob.select = True
                    N_mods = len(ob.modifiers)
                    for grp, modname in zip(v_islands, modnames):
                        bpy.ops.object.mode_set(mode='EDIT')
                        bpy.ops.mesh.select_all(action='DESELECT')
                        bpy.ops.object.mode_set(mode='OBJECT')
                        center = Vector((0, 0, 0))
                        for ind in grp:
                            ob.data.vertices[ind].select = True
                            center += ob.data.vertices[ind].co
                        center *= 1 / len(grp)

                        hook = bpy.data.objects.new(modname, None)
                        context.scene.objects.link(hook)

                        if bversion() < '002.077.000':
                            new_loc, no, ind = ob.closest_point_on_mesh(center)

                        else:
                            ok, new_loc, no, ind = ob.closest_point_on_mesh(
                                center)
                        world_loc = mx * new_loc

                        hook.parent = hook_parent
                        hook.matrix_world[0][3] = world_loc[0]
                        hook.matrix_world[1][3] = world_loc[1]
                        hook.matrix_world[2][3] = world_loc[2]

                        hook.empty_draw_type = 'SPHERE'
                        hook.empty_draw_size = .5

                        mod = ob.modifiers.new(modname, type='HOOK')
                        mod.object = hook

                        for n in range(0, N_mods):
                            bpy.ops.object.modifier_move_up(modifier=mod.name)
                        bpy.ops.object.mode_set(mode='EDIT')
                        bpy.ops.object.hook_reset(modifier=mod.name)
                        bpy.ops.object.hook_assign(modifier=mod.name)
                        #old_obs = [ob.name for ob in bpy.data.objects]
                        #bpy.ops.object.hook_add_newob()
                        #for obj in bpy.data.objects:
                        #    if obj.name not in old_obs:
                        #        hook = obj
                        #        hook.name = modname
                        #        hook.empty_draw_type = 'SPHERE'
                        #        hook.empty_draw_size = .5
                        #        hook.show_x_ray = True
                        #        loc = hook.location
                        #        bpy.ops.object.mode_set(mode = 'OBJECT')
                        #        new_loc, no, ind = ob.closest_point_on_mesh(imx*loc)
                        #       hook.location = mx * new_loc
                        #TODO, parent in place and keep transform

                    for mod in ob.modifiers:
                        if mod.type == 'HOOK':
                            mod.show_expanded = False
                    if 'Anchor' not in ob.vertex_groups:
                        ob.vertex_groups.new('Anchor')

                    bpy.ops.object.vertex_group_set_active(group='Anchor')
                    bpy.ops.object.mode_set(mode='EDIT')
                    bpy.ops.object.vertex_group_remove_from(use_all_verts=True)
                    bpy.ops.mesh.select_all(action='DESELECT')
                    bpy.ops.object.mode_set(mode='OBJECT')
                    for grp in v_islands:
                        for v in grp:
                            ob.data.vertices[v].select = True

                    bpy.ops.object.mode_set(mode='EDIT')
                    context.scene.tool_settings.vertex_group_weight = 1
                    bpy.ops.object.vertex_group_assign()
                    bpy.ops.object.mode_set(mode='OBJECT')

                    mod = ob.modifiers.new('flexitooth', 'LAPLACIANDEFORM')
                    mod.vertex_group = 'Anchor'
                    mod.iterations = 20

                    for n in range(0, N_mods):
                        bpy.ops.object.modifier_move_up(modifier="flexitooth")
                    bpy.ops.object.mode_set(mode='EDIT')
                    bpy.ops.object.laplaciandeform_bind(modifier="flexitooth")
                    bpy.ops.object.mode_set(mode='OBJECT')

                    for mod in ob.modifiers:
                        if mod.type == 'HOOK':
                            mod.show_expanded = False

                    #ob.modifiers.new

        return {'FINISHED'}
Beispiel #20
0
    def click_add_point(self,context,x,y):
        '''
        x,y = event.mouse_region_x, event.mouse_region_y
        
        this will add a point into the bezier curve or
        close the curve into a cyclic curve
        '''
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)
        
        crv_mx = self.crv_obj.matrix_world
        i_crv_mx = crv_mx.inverted()  
        
        
        hit = False
        if self.snap_type == 'SCENE':
            mx = Matrix.Identity(4)  #loc is given in world loc...no need to multiply by obj matrix
            if bversion() < '002.077.000':
                res, obj, omx, loc, no = context.scene.ray_cast(ray_origin, ray_target)  #changed in 2.77
            else:
                res, loc, no, ind, obj, omx = context.scene.ray_cast(ray_origin, view_vector)
                
            hit = res
            if not hit:
                #cast the ray into a plane a
                #perpendicular to the view dir, at the last bez point of the curve
            
                view_direction = rv3d.view_rotation * Vector((0,0,-1))
            
                if len(self.b_pts):
                    if self.hovered[0] == 'EDGE':
                        plane_pt = self.b_pts[self.hovered[1]]
                    else:
                        plane_pt = self.b_pts[-1]
                else:
                    plane_pt = context.scene.cursor_location
                loc = intersect_line_plane(ray_origin, ray_target,plane_pt, view_direction)
                hit = True
        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()
            
            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
                if ok:
                    hit = True
            
            if face_ind != -1:
                hit = True
        
        if not hit: 
            self.selected = -1
            return
        
        if self.hovered[0] == None:  #adding in a new point
            if self.started:
                self.crv_data.splines[0].bezier_points.add(count = 1)
                bp = self.crv_data.splines[0].bezier_points[-1]
                bp.handle_right_type = 'AUTO'
                bp.handle_left_type = 'AUTO'
                bp.co =i_crv_mx* mx * loc
                self.b_pts.append(mx * loc)
                
            else:
                self.started = True
                delta = i_crv_mx *mx * loc - self.crv_data.splines[0].bezier_points[-1].co
                bp = self.crv_data.splines[0].bezier_points[0]
                bp.co += delta
                bp.handle_left += delta
                bp.handle_right += delta  
                self.b_pts.append(mx * loc) 
          
        if self.hovered[0] == 'POINT':
            self.selected = self.hovered[1]
            if self.hovered[1] == 0:  #clicked on first bpt, close loop
                self.crv_data.splines[0].use_cyclic_u = self.crv_data.splines[0].use_cyclic_u == False
            return

            
        elif self.hovered[0] == 'EDGE':  #cut in a new point
            self.b_pts.insert(self.hovered[1]+1, mx * loc)
            self.update_blender_curve_data()   
            return
    def grab_mouse_move(self,context,x,y, normal = False):
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        
        hit = False
        if self.snap_type == 'SCENE':
            
            if bversion() < '002.077.000':
                res, obj, mx, loc, no = context.scene.ray_cast(ray_origin, ray_target)
            else:
                res, loc, no, ind, obj, mx = context.scene.ray_cast(ray_origin, view_vector)
            if res:
                hit = True
        
        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()
            
            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
                if ok:
                    hit = True
   
        if not hit:
            self.grab_cancel()
            
        else:
            world_location = mx * loc
            imx = mx.inverted()
            
            #this will be the object Z axis
            world_normal = mx.transposed().to_3x3() * no

            if normal:
                ob_Z = world_normal
            
                view_X = rv3d.view_rotation * Vector((1,0,0))
                ob_Y = ob_Z.cross(view_X)
                ob_X = ob_Y.cross(ob_Z)
                ob_X.normalize(), ob_Y.normalize(), ob_Z.normalize()
            
                #rotation matrix from principal axes
                T = Matrix.Identity(3)  #make the columns of matrix U, V, W
                T[0][0], T[0][1], T[0][2]  = ob_X[0] ,ob_Y[0],  ob_Z[0]
                T[1][0], T[1][1], T[1][2]  = ob_X[1], ob_Y[1],  ob_Z[1]
                T[2][0] ,T[2][1], T[2][2]  = ob_X[2], ob_Y[2],  ob_Z[2]
        
                rot = T.to_4x4()
                
            else:
                rot = self.bracket_obj.matrix_world.to_3x3().to_4x4()
                
            loc = Matrix.Translation(world_location)    
            self.bracket_obj.matrix_world = loc * rot
Beispiel #22
0
    def click_add_point(self,context,x,y, label = None):
        '''
        x,y = event.mouse_region_x, event.mouse_region_y
        
        this will add a point into the bezier curve or
        close the curve into a cyclic curve
        '''
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        hit = False
        if self.snap_type == 'SCENE':
            mx = Matrix.Identity(4)  #loc is given in world loc...no need to multiply by obj matrix
            imx = Matrix.Identity(4)
            no_mx = Matrix.Identity(3)
            if bversion() < '002.077.000':
                res, obj, omx, loc, no = context.scene.ray_cast(ray_origin, ray_target)  #changed in 2.77
            else:
                res, loc, no, ind, obj, omx = context.scene.ray_cast(ray_origin, view_vector)
                iomx = omx.inverted()
                no_mx = iomx.to_3x3().transposed()
            hit = res
            if not hit:
                #cast the ray into a plane a
                #perpendicular to the view dir, at the last bez point of the curve
            
                view_direction = rv3d.view_rotation * Vector((0,0,-1))
            
                if len(self.b_pts):
                    plane_pt = self.b_pts[-1]
                else:
                    plane_pt = context.scene.cursor_location
                loc = intersect_line_plane(ray_origin, ray_target,plane_pt, view_direction)
                hit = True
        
        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()
            no_mx = imx.to_3x3().transposed()
            
            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(imx * ray_origin, imx * ray_target - imx*ray_origin)
                if ok:
                    hit = True
            
            if face_ind != -1:
                hit = True
        
        if not hit: 
            self.selected = -1
            return
        
        if self.hovered[0] == None:  #adding in a new point
            self.b_pts.append(mx * loc)
            self.normals.append(no_mx * no)
            self.labels.append(label)
            return True    
        if self.hovered[0] == 'POINT':
            self.selected = self.hovered[1]
            return
Beispiel #23
0
    def grab_mouse_move(self, context, x, y, normal=False):
        region = context.region
        rv3d = context.region_data
        coord = x, y
        view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord)
        ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord)
        ray_target = ray_origin + (view_vector * 1000)

        hit = False
        if self.snap_type == 'SCENE':

            if bversion() < '002.077.000':
                res, obj, mx, loc, no = context.scene.ray_cast(
                    ray_origin, ray_target)
            else:
                res, loc, no, ind, obj, mx = context.scene.ray_cast(
                    ray_origin, view_vector)
            if res:
                hit = True

        elif self.snap_type == 'OBJECT':
            mx = self.snap_ob.matrix_world
            imx = mx.inverted()

            if bversion() < '002.077.000':
                loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target)
                if face_ind != -1:
                    hit = True
            else:
                ok, loc, no, face_ind = self.snap_ob.ray_cast(
                    imx * ray_origin, imx * ray_target - imx * ray_origin)
                if ok:
                    hit = True

        if not hit:
            self.grab_cancel()

        else:
            world_location = mx * loc
            imx = mx.inverted()

            #this will be the object Z axis
            world_normal = imx.transposed().to_3x3() * no

            if normal:
                ob_Z = world_normal
                ob_Z.normalize()

                view_Y = rv3d.view_rotation * Vector((0, 1, 0))
                if self.bracket_obj.name.startswith(
                        "U") or self.bracket_obj.name.startswith("u"):
                    view_Y *= -1

                #project view y into the tangetnt plane of teh surface
                ob_Y = view_Y - view_Y.dot(ob_Z) * ob_Z
                ob_Y.normalize()

                ob_X = ob_Y.cross(ob_Z)
                ob_X.normalize()

                #rotation matrix from principal axes
                T = Matrix.Identity(3)  #make the columns of matrix X, Y, Z
                T[0][0], T[0][1], T[0][2] = ob_X[0], ob_Y[0], ob_Z[0]
                T[1][0], T[1][1], T[1][2] = ob_X[1], ob_Y[1], ob_Z[1]
                T[2][0], T[2][1], T[2][2] = ob_X[2], ob_Y[2], ob_Z[2]

                rot = T.to_4x4()

            else:
                rot = self.bracket_obj.matrix_world.to_3x3().to_4x4()

            loc = Matrix.Translation(world_location)
            self.bracket_obj.matrix_world = loc * rot
    def execute(self, context):
        layers_copy = [layer for layer in context.scene.layers]
        context.scene.layers[0] = True
        
        for ob in context.selected_objects:
            mods = [mod.type for mod in ob.modifiers]
            if 'HOOK' in mods:
                self.report({'WARNING'}, 'There are hook modifiers in' + ob.name +'.  Please apply or remove them') 
            elif 'LAPLACIANDEFORM' in mods:
                self.report({'WARNING'}, 'There are laplacial deform modifiers in' + ob.name +'.  Please apply or remove them')  
            elif 'SHRINKWRAP' in mods:
                self.report({'WARNING'}, 'There are shrinkwrap modifiers in' + ob.name +'.  Use Flexi Tooth BEFORE any margin seating or contact grinding') 
                continue
            
            else:
                if ob.type == 'MESH':
                    mx = ob.matrix_world
                    imx = mx.inverted()
                    
                    if ob.data.name[0:2] not in v_groups: continue
                    
                    ob.lock_location = [True, True, True]
                    #ob.hide_select = True
                    data_name = ob.data.name[0:2]
                    
                    hook_parent = bpy.data.objects.new(data_name + '_hook', None)
                    context.scene.objects.link(hook_parent)
                    hook_parent.matrix_world = ob.matrix_world
                    
                    v_islands = v_groups[ob.data.name[0:2]]
                    modnames = [data_name + '_hook.'+str(k).zfill(3) for k in range(len(v_islands))]
                    
                    bpy.ops.object.select_all(action = 'DESELECT')
                    context.scene.objects.active = ob
                    ob.select = True
                    N_mods = len(ob.modifiers)
                    for grp, modname in  zip(v_islands,modnames):
                        bpy.ops.object.mode_set(mode = 'EDIT')
                        bpy.ops.mesh.select_all(action = 'DESELECT')
                        bpy.ops.object.mode_set(mode = 'OBJECT')
                        center = Vector((0,0,0))
                        for ind in grp:
                            ob.data.vertices[ind].select = True
                            center += ob.data.vertices[ind].co
                        center *= 1/len(grp)
                        
                        hook = bpy.data.objects.new(modname, None)
                        context.scene.objects.link(hook)
                        
                        if bversion() < '002.077.000':
                            new_loc, no, ind = ob.closest_point_on_mesh(center)
                        
                        else:
                            ok, new_loc, no, ind = ob.closest_point_on_mesh(center)
                        world_loc = mx * new_loc
                    

                        hook.parent = hook_parent
                        hook.matrix_world[0][3] = world_loc[0]
                        hook.matrix_world[1][3] = world_loc[1]
                        hook.matrix_world[2][3] = world_loc[2]
                        
                        hook.empty_draw_type = 'SPHERE'
                        hook.empty_draw_size = .5
                        
                        
                        mod = ob.modifiers.new(modname, type='HOOK')         
                        mod.object = hook
                        
                        for n in range(0, N_mods):
                            bpy.ops.object.modifier_move_up(modifier = mod.name)
                        bpy.ops.object.mode_set(mode = 'EDIT')
                        bpy.ops.object.hook_reset(modifier = mod.name)
                        bpy.ops.object.hook_assign(modifier=mod.name)
                        #old_obs = [ob.name for ob in bpy.data.objects]
                        #bpy.ops.object.hook_add_newob()
                        #for obj in bpy.data.objects:
                        #    if obj.name not in old_obs:
                        #        hook = obj
                        #        hook.name = modname
                        #        hook.empty_draw_type = 'SPHERE'
                        #        hook.empty_draw_size = .5
                        #        hook.show_x_ray = True
                        #        loc = hook.location
                        #        bpy.ops.object.mode_set(mode = 'OBJECT')
                        #        new_loc, no, ind = ob.closest_point_on_mesh(imx*loc)
                         #       hook.location = mx * new_loc
                                #TODO, parent in place and keep transform
                        
                        
                    
                    for mod in ob.modifiers:
                        if mod.type == 'HOOK':
                            mod.show_expanded = False
                    if 'Anchor' not in ob.vertex_groups:
                        ob.vertex_groups.new('Anchor')
                    
                    bpy.ops.object.vertex_group_set_active(group = 'Anchor')
                    bpy.ops.object.mode_set(mode = 'EDIT')
                    bpy.ops.object.vertex_group_remove_from(use_all_verts = True)
                    bpy.ops.mesh.select_all(action = 'DESELECT')
                    bpy.ops.object.mode_set(mode = 'OBJECT')
                    for grp in v_islands:
                        for v in grp:
                            ob.data.vertices[v].select = True
                            
                    bpy.ops.object.mode_set(mode = 'EDIT')
                    context.scene.tool_settings.vertex_group_weight = 1
                    bpy.ops.object.vertex_group_assign()
                    bpy.ops.object.mode_set(mode = 'OBJECT')
                    
                    mod = ob.modifiers.new('flexitooth', 'LAPLACIANDEFORM')
                    mod.vertex_group = 'Anchor'
                    mod.iterations = 20
                    
                    for n in range(0, N_mods):      
                        bpy.ops.object.modifier_move_up(modifier = "flexitooth")
                    bpy.ops.object.mode_set(mode = 'EDIT')
                    bpy.ops.object.laplaciandeform_bind(modifier = "flexitooth")
                    bpy.ops.object.mode_set(mode = 'OBJECT')    
                    
                    for mod in ob.modifiers:
                        if mod.type == 'HOOK':
                            mod.show_expanded = False
                            
                            
                    #ob.modifiers.new
        
        return {'FINISHED'}