def __rigify_ik2fk(self, rig): fjw.activate(rig) fjw.mode("POSE") bpy.ops.pose.select_all(action='SELECT') post_fix = "" for meth in inspect.getmembers(bpy.ops.pose): if "ik2fk" in meth[0]: post_fix = meth[0].split("_")[-1] break if post_fix != "": print("post_fix:%s"%post_fix) bpy.ops.pose.select_all(action='SELECT') evalstr = 'bpy.ops.pose.rigify_leg_ik2fk_'+ post_fix +'(thigh_fk="thigh_fk.L", shin_fk="shin_fk.L", foot_fk="foot_fk.L", mfoot_fk="MCH-foot_fk.L", thigh_ik="thigh_ik.L", shin_ik="MCH-thigh_ik.L", foot_ik="MCH-thigh_ik_target.L", mfoot_ik="MCH-thigh_ik_target.L")' print(evalstr) eval(evalstr) print(evalstr) bpy.ops.pose.select_all(action='SELECT') evalstr = 'bpy.ops.pose.rigify_leg_ik2fk_'+ post_fix +'(thigh_fk="thigh_fk.R", shin_fk="shin_fk.R", foot_fk="foot_fk.R", mfoot_fk="MCH-foot_fk.R", thigh_ik="thigh_ik.R", shin_ik="MCH-thigh_ik.R", foot_ik="MCH-thigh_ik_target.R", mfoot_ik="MCH-thigh_ik_target.R")' eval(evalstr) print(evalstr) bpy.ops.pose.select_all(action='SELECT') evalstr = 'bpy.ops.pose.rigify_arm_ik2fk_'+ post_fix +'(uarm_fk="upper_arm_fk.L", farm_fk="forearm_fk.L", hand_fk="hand_fk.L", uarm_ik="upper_arm_ik.L", farm_ik="MCH-upper_arm_ik.L", hand_ik="hand_ik.L")' eval(evalstr) print(evalstr) bpy.ops.pose.select_all(action='SELECT') evalstr = 'bpy.ops.pose.rigify_arm_ik2fk_'+ post_fix +'(uarm_fk="upper_arm_fk.R", farm_fk="forearm_fk.R", hand_fk="hand_fk.R", uarm_ik="upper_arm_ik.R", farm_ik="MCH-upper_arm_ik.R", hand_ik="hand_ik.R")' eval(evalstr) print(evalstr)
def execute(self, use_active_camera=False, to_active_mat=True): filename = os.path.basename(self.filepath) name, ext = os.path.splitext(filename) obj = fjw.active() current_mode = obj.mode if current_mode == "OBJECT": mat = self.__get_active_mat(obj) elif current_mode == "EDIT": self.__add_new_mat(obj) mat = self.__get_active_mat(obj) bpy.ops.object.material_slot_assign() fjw.mode("OBJECT") active_camera = bpy.context.scene.camera if active_camera and use_active_camera: projector = active_camera else: projector = self.__make_projector(name, obj) if to_active_mat: self.__add_texture_to_mat(mat, self.filepath, projector) else: for mat in obj.data.materials: self.__add_texture_to_mat(mat, self.filepath, projector) self.set_uv_projection(obj, projector) projector.parent = obj
def dup(self, obj): fjw.mode("OBJECT") fjw.deselect() obj.select = True bpy.ops.object.duplicate() selection = fjw.get_selected_list() return selection[0]
def mute_constraints(self): pbones = self.obj.pose.bones for pbone in pbones: for c in pbone.constraints: c.mute = True self.obj.data.update_tag() fjw.mode("OBJECT")
def get_treesort(self): """ 位置操作、ルートからやらないとめちゃくちゃになる。 ので、ルートから子へとソートしたリストを作成する。 結果はボーン名のリスト。 """ fjw.activate(self.obj) fjw.mode("EDIT") """ 階層順にやっていけば間違いない? 途中で複数にわかれている場合どうするの? 探索関数いるのでは? ていうかルートボーンだけ洗い出して、あとは get_childrenメソッドがあればいいのでは """ ebones = self.obj.data.edit_bones roots = self.__get_root_ebones(ebones) result = [] for root in roots: children_list = self.__get_ebone_children(root) result.extend(children_list) return result
def copy_shapes(self, edit_bones_data): """ 受け取ったデータのデータ通りにメタリグの形状を設定する。 """ fjw.activate(self.obj) fjw.mode("EDIT") for ebone in self.edit_bones_data.edit_bones: ebone.disconnect() #ORG-をコピー prefix="ORG-" for ebone in self.edit_bones_data.edit_bones: fixed_name = prefix + ebone.name src = edit_bones_data.get_ebone_byname(fixed_name) if src: ebone.copy_shape(src) else: print("not found:%s"%(fixed_name)) #親のtailを子のheadにあわせる for ebone in self.edit_bones_data.edit_bones: if ebone.has_parent and ebone.use_connect: edit_bone = ebone.get_ebone() parent = edit_bone.parent parent.tail = edit_bone.head for ebone in self.edit_bones_data.edit_bones: ebone.restore_connect() fjw.mode("OBJECT")
def __init__(self, obj, from_objects, width=1024, height=1024, texture_dir=None): """ obj: ベイク先オブジェクト width: テクスチャ幅 height: テクスチャ高さ """ self.obj = obj self.from_objects = from_objects self.width = width self.height = height fjw_id = fjw.id(self.obj) # self.texture_dir = os.path.dirname(bpy.data.filepath) + os.sep + "textures" + os.sep + fjw_id + os.sep # if not os.path.exists(self.texture_dir): # os.makedirs(self.texture_dir) if texture_dir: self.texture_dir = texture_dir else: dirname = os.path.dirname(bpy.data.filepath) self.texture_dir = dirname + os.sep uvu = fjw.UVUtils(self.obj) if uvu.is_empty(): fjw.activate(self.obj) fjw.mode("EDIT") bpy.ops.mesh.select_all(action='SELECT') # bpy.ops.uv.smart_project() bpy.ops.uv.lightmap_pack() fjw.mode("OBJECT")
def add_drawing_curve(name, color, bvel_depth): bpy.context.scene.tool_settings.curve_paint_settings.curve_type = 'POLY' bpy.context.scene.tool_settings.curve_paint_settings.use_pressure_radius = True bpy.context.scene.tool_settings.curve_paint_settings.radius_min = 0 bpy.context.scene.tool_settings.curve_paint_settings.radius_max = 1 bpy.context.scene.tool_settings.curve_paint_settings.depth_mode = 'SURFACE' bpy.context.scene.tool_settings.curve_paint_settings.surface_offset = 1 bpy.context.scene.tool_settings.curve_paint_settings.use_offset_absolute = False bpy.context.scene.tool_settings.curve_paint_settings.use_stroke_endpoints = False for obj in bpy.context.visible_objects: if name in obj.name: return obj bpy.ops.curve.primitive_bezier_curve_add(radius=1, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=bpy.context.scene.layers) curve = fjw.active().data fjw.active().name = name curve.fill_mode = "FULL" curve.bevel_depth = bvel_depth curve.show_handles = False curve.show_normal_face = False mat = bpy.data.materials.new(name) mat.use_shadeless = True mat.diffuse_color = color mat.use_cast_shadows = False curve.materials.append(mat) fjw.mode("EDIT") bpy.ops.curve.select_all(action='SELECT') bpy.ops.curve.dissolve_verts() fjw.mode("OBJECT") return fjw.active()
def armature_autokey(cls): """ アーマチュアのキーをオートで入れる """ if fjw.active().type != "ARMATURE": return fjw.mode("POSE") #アーマチュアのキーをオートで入れる if bpy.context.scene.frame_current == cls.last_frame: rootname = fjw.get_root(fjw.active()).name fjw.active().location = Vector((0, 0, 0)) cls.setkey() #フレーム10なら微調整じゃないのでオートフレーム。 armu = fjw.ArmatureUtils(fjw.active()) geo = armu.GetGeometryBone() armu.clearTrans([geo]) cls.setkey() fjw.framejump(1) selection = armu.select_all() armu.clearTrans(selection) cls.setkey() #選択にズーム bpy.ops.view3d.view_selected(use_all_regions=False) fjw.framejump(cls.last_frame)
def get_ebone(self): fjw.activate(self.obj) fjw.mode("EDIT") edit_bones = self.obj.data.edit_bones if self.name in edit_bones: ebone = edit_bones[self.name] return ebone return None
def execute(self, context): for img in bpy.data.images: if img.is_dirty: img.pack(as_png=True) for obj in bpy.context.visible_objects: obj.show_wire = False fjw.mode("OBJECT") return {"FINISHED"}
def assign_material_to_mesh(self, mat): obj = fjw.active() mode = obj.mode if mat.name not in obj.data.materials: obj.data.materials.append(mat) index = obj.material_slots.find(mat.name) obj.active_material_index = index fjw.mode("EDIT") bpy.ops.object.material_slot_assign() fjw.mode(mode)
def execute(self, context): if bpy.context.scene.render.use_simplify: bpy.context.scene.render.use_simplify = False bpy.context.space_data.show_only_render = True bpy.context.space_data.lock_camera = False fjw.mode("OBJECT") curve_obj = add_drawing_curve("加筆カーブ白", (1, 1, 1), 0.003) fjw.activate(curve_obj) fjw.mode("EDIT") return {"FINISHED"}
def gen_rig_and_reparent(self, metarig, unparent_at_rest=True): """ genrigして再ペアレントする。 """ if metarig.type != "ARMATURE": return False layers_current = fjw.layers_current_state() fjw.layers_showall() objects_bu = fjw.ObjectsPropBackups(bpy.context.scene.objects) objects_bu.store("hide") for obj in bpy.context.scene.objects: obj.hide = False self.set_metarig(metarig) self.set_rig(self.find_rig()) rig_old = None if self.rig: rig_old = self.rig if unparent_at_rest: self.rig.obj.data.pose_position = 'REST' self.rig.rigged_objects.parent_clear() rigdata = self.rig.obj.data fjw.delete([self.rig.obj]) bpy.data.armatures.remove(rigdata) fjw.deselect() fjw.activate(metarig) bpy.ops.pose.rigify_generate() new_rig = Rig(fjw.active()) if self.rig: new_rig.edit_bones_data.restore_info_from(self.rig.edit_bones_data) self.rig.rigged_objects.reset_rig(new_rig.obj) # bpy.ops.view3d.layers(nr=0, extend=False) if self.rig: self.rig.rigged_objects.reparent() # bpy.ops.view3d.layers(nr=0, extend=False) fjw.layers_show_list(layers_current) metarig.hide = True fjw.activate(new_rig.obj) fjw.mode("POSE") if rig_old: new_rig.restore_settings_from(rig_old) objects_bu.restore() return True
def execute(self,context): if bpy.data.filepath == "": self.report({"INFO"},"一度も保存されていません") return {'CANCELLED'} #self.report({"INFO"},"") #カメラにキー入れる fjw.globalview() fjw.mode("OBJECT") fjw.deselect() fjw.activate(bpy.data.objects["Camera"]) bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') selfname = os.path.splitext(os.path.basename(bpy.data.filepath))[0] dir = os.path.dirname(bpy.data.filepath) pname = "page.blend" ppath = dir + os.sep + pname #ページファイルの存在確認 if not os.path.exists(ppath): self.report({"INFO"},"ページファイルが存在しません") return {'CANCELLED'} #キーフレーム対策 #キーフレームオンだと、ツールでカメラ動かした時にトランスフォームが保存されないことがある for obj in bpy.data.objects: if obj.type == "CAMERA": fjw.deselect() obj.select = True try: bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') except : pass bpy.context.space_data.lock_camera = False #保存 bpy.ops.wm.save_mainfile() fjw.globalview() #レンダリング #レンダ設定 renderpath = dir + os.sep + "pageutils" + os.sep + "img" + os.sep + selfname + ".png" render(renderpath,True) #ページファイルを開く bpy.ops.wm.open_mainfile(filepath=ppath) return {"FINISHED"}
def select_by_vertex_group(self, name): fjw.mode("EDIT") #頂点グループで選択する obj = fjw.active() if name not in obj.vertex_groups: return False vg = obj.vertex_groups[name] vgi = obj.vertex_groups.find(name) obj.vertex_groups.active_index = vgi bpy.ops.object.vertex_group_select() return True
def freeze_rig(self,rig): if rig.type != "ARMATURE": return False self.set_rig(rig) self.__rigify_fk2ik(rig) self.__rigify_ikfk_1(rig) self.rig.rigged_objects.apply() self.rig.rigged_objects.parent_clear() self.rig.apply_pose() self.rig.rigged_objects.reparent() fjw.mode("OBJECT")
def assign_material_by_vetexgroup(self, vertex_group, mat, deselect_axis=""): obj = fjw.active() mode = obj.mode fjw.mode("EDIT") self.mesh_deselect() self.select_by_vertex_group(vertex_group) if deselect_axis != "": self.deselect_by_axis(deselect_axis) self.assign_material_to_mesh(mat) fjw.mode(mode)
def export(self): fjw.deselect() fjw.activate(self.obj) if len(self.obj.data.uv_textures) == 0: fjw.mode("EDIT") bpy.ops.mesh.select_all(action='SELECT') bpy.ops.uv.smart_project() fjw.mode("OBJECT") if not os.path.exists(self.src_dir): os.makedirs(self.src_dir) bpy.ops.export_scene.obj(filepath=self.src_obj_path, check_existing=False, use_selection=True, use_mesh_modifiers=False)
def curve_to_pancake(obj, dim_z_div = 4, color=(1,1,1)): fjw.activate(obj) mat = bpy.data.materials.new("Pancake Mat") mat.diffuse_color = color obj.data.materials.append(mat) # obj.data.dimensions = '2D' obj.data.splines[0].use_cyclic_u = True bpy.ops.object.convert(target='MESH') fjw.mode("EDIT") bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.edge_face_add() fjw.mode("OBJECT") bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS') dim_x, dim_y, dim_z = obj.dimensions dim_z = math.sqrt(dim_x*dim_x + dim_y*dim_y) / dim_z_div modu = fjw.Modutils(obj) m = modu.add("Solidify", "SOLIDIFY") m.thickness = dim_z m.offset = 0 modu.apply(m) m = modu.add("Decimate", "DECIMATE") m.decimate_type = "DISSOLVE" m.angle_limit = 0.0872665 modu.apply(m) m = modu.add("Remesh", "REMESH") m.mode = 'SMOOTH' m.octree_depth = 4 m.use_smooth_shade = True m.use_remove_disconnected = False modu.apply(m) m = modu.add("Laplacian Smooth", "LAPLACIANSMOOTH") m.iterations = 2 m.lambda_factor = 1 modu.apply(m) m = modu.add("Remesh", "REMESH") m.mode = 'SMOOTH' m.octree_depth = 4 m.use_smooth_shade = True modu.apply(m) m = modu.add("Subsurf", "SUBSURF") m.levels = 2 bpy.context.scene.render.use_simplify = False
def reparent(self): """ 格納した情報に応じて再ペアレントする。 """ rig = self.get_rig() obj = self.obj modu = fjw.Modutils(self.obj) mod_arm = modu.find_bytype("ARMATURE") if not self.has_armature_mod: fjw.mode("OBJECT") fjw.deselect() obj.select = True fjw.activate(rig) if self.parent_type == "OBJECT": bpy.ops.object.parent_set(type='OBJECT', keep_transform=True) elif self.parent_type == "BONE": if self.parent_bone in rig.data.bones: fjw.mode("POSE") layerstates = [] for state in rig.data.layers: layerstates.append(state) rig.data.layers = [True for i in range(len(rig.data.layers))] rig.data.bones.active = rig.data.bones[self.parent_bone] bpy.ops.object.parent_set(type='BONE_RELATIVE') rig.data.layers = layerstates else: #既存のアーマチュアmodを除去する mod_arms = modu.find_bytype_list("ARMATURE") for mod in mod_arms: modu.remove(mod) fjw.deselect() obj.select = True fjw.activate(rig) if "rigify_parenting" in obj: bpy.ops.object.parent_set(type=obj["rigify_parenting"]) else: bpy.ops.object.parent_set(type='ARMATURE_AUTO') fjw.activate(obj) modu.sort() pass self.obj.hide = self.hide
def delkey(cls): if fjw.active().type == "ARMATURE": fjw.mode("POSE") if fjw.active().mode == "OBJECT": bpy.ops.anim.keyframe_delete_v3d() if fjw.active().mode == "POSE": #MarvelousDesigner用 aau = fjw.ArmatureActionUtils(fjw.active()) aau.set_action("mdwork") frame = bpy.context.scene.frame_current aau.delete_pose("mdpose_" + str(frame)) bpy.ops.pose.select_all(action='SELECT') bpy.ops.anim.keyframe_delete_v3d()
def setkey(cls): if fjw.active().type == "ARMATURE": fjw.mode("POSE") if fjw.active().mode == "OBJECT": bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') if fjw.active().mode == "POSE": #MarvelousDesigner用 aau = fjw.ArmatureActionUtils(fjw.active()) aau.set_action("mdwork") frame = bpy.context.scene.frame_current aau.store_pose(frame, "mdpose_" + str(frame)) bpy.ops.pose.select_all(action='SELECT') bpy.ops.anim.keyframe_insert_menu(type='WholeCharacter')
def mesh_dup(self, vertex_group=""): base = fjw.active() mode = base.mode fjw.mode("OBJECT") fjw.deselect() fjw.mode("EDIT") if vertex_group != "": self.mesh_deselect() self.select_by_vertex_group(vertex_group) bpy.ops.mesh.duplicate(mode=1) bpy.ops.mesh.separate(type='SELECTED') fjw.mode("OBJECT") for obj in fjw.get_selected_list(): if obj != base: fjw.activate(obj) fjw.mode("EDIT") break dup = fjw.active() dup.data.materials.clear() self.clear_mods() # dup.parent = base return dup
def execute(self, context): bpy.context.space_data.viewport_shade = 'MATERIAL' fjw.mode("TEXTURE_PAINT") bpy.context.scene.tool_settings.unified_paint_settings.use_unified_size = False bpy.context.scene.tool_settings.unified_paint_settings.use_unified_strength = False bpy.context.scene.tool_settings.unified_paint_settings.use_unified_color = False brush = get_brush("消去ブラシ") brush.size = 15 brush.use_pressure_size = True brush.use_pressure_strength = False brush.strength = 1 brush.blend = 'ERASE_ALPHA' bpy.context.scene.tool_settings.image_paint.brush = brush fjw.active().show_wire = True return {"FINISHED"}
def save_pre(context): #カメラにキー入らんでどうしようもないからこれでいれる!!!→2017/11/26 Blender2.79で修正されているのを確認 #カメラにキー入れる if bpy.context.scene.tool_settings.use_keyframe_insert_auto: if bpy.context.scene.camera != None: if not fjw.in_localview(): current = fjw.active() current_mode = "OBJECT" if current != None: current_mode = fjw.active().mode fjw.mode("OBJECT") selection = fjw.get_selected_list() fjw.deselect() fjw.activate(bpy.context.scene.camera) bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') if current != None: fjw.deselect() fjw.select(selection) fjw.activate(current) fjw.mode(current_mode)
def apply(self): """ アーマチュア変形やボーン相対変形を適用する。 ペアレントがクリアされている前提。 """ obj = self.obj fjw.mode("OBJECT") fjw.deselect() fjw.activate(obj) fjw.mode("OBJECT") #モディファイアの適用 if obj.type == "MESH": modu = fjw.Modutils(obj) arm = modu.find_bytype("ARMATURE") modu.apply(arm) #トランスフォームの適用 bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
def make_buillboard(width, height): loc = bpy.context.space_data.cursor_location bpy.ops.mesh.primitive_plane_add(radius=1, view_align=True, location=loc, layers=bpy.context.scene.layers) billboard = fjw.active() billboard.name = "ビルボード描画" fjw.mode("EDIT") bpy.ops.uv.unwrap(method='ANGLE_BASED', margin=0.001) fjw.mode("OBJECT") mat = bpy.data.materials.new("ビルボード描画") mat.use_shadeless = True mat.use_transparency = True mat.alpha = 0.0 mat.use_cast_shadows = False mat.use_shadows = False tslot = mat.texture_slots.add() tslot.use_map_alpha = True tex = bpy.data.textures.new("ビルボード描画", "IMAGE") img = bpy.data.images.new("ビルボード描画", width, height, alpha=True) img.generated_color = (0, 0, 0, 0) tex.image = img tslot.texture = tex billboard.data.materials.append(mat) scale = 1024 * 2 dim_x = width / scale dim_y = height / scale billboard.scale.x = dim_x / 2 billboard.scale.y = dim_y / 2 bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) bpy.context.space_data.viewport_shade = 'MATERIAL' return billboard
def remove_not_used_materials(self, obj): if obj.type != "MESH": return current = fjw.active() fjw.activate(obj) fjw.mode("OBJECT") used_indexes = [] for face in obj.data.polygons: i = face.material_index if i not in used_indexes: used_indexes.append(i) print("used_indexes:" + str(used_indexes)) used_materials = [] for i in used_indexes: if i >= len(obj.material_slots): continue mat = obj.material_slots[i].material if mat not in used_materials: used_materials.append(mat) print(used_materials) delmats = [] for m in range(len(used_materials)): for i in range(len(obj.material_slots)): mslot = obj.material_slots[i] print("mslot:" + str(mslot.material)) print("in:" + str(mslot.material in used_materials)) if mslot.material and mslot.material not in used_materials: print("remove:" + str(i) + " " + str(mslot.material)) obj.active_material_index = i bpy.ops.object.material_slot_remove() delmats.append(mslot.material) break for mat in delmats: if mat.users == 0: bpy.data.materials.remove(mat) fjw.activate(current)
def setup(self): fjw.mode("OBJECT") fjw.deselect() fjw.activate(self.obj) fjw.mode("EDIT") for ebone in self.obj.data.edit_bones: self.edit_bones.append(EditBoneData(self.obj, ebone)) fjw.mode("POSE") for ebdata in self.edit_bones: ebdata.set_pose_matrix()