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]
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
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
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
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
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
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]
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
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]
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
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
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]
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
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 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
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]
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 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'}
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
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
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'}