Пример #1
0
    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]
Пример #4
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")
Пример #5
0
    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
Пример #6
0
    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")
Пример #7
0
    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")
Пример #8
0
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()
Пример #9
0
    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)
Пример #10
0
 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
Пример #11
0
    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)
Пример #13
0
    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"}
Пример #14
0
    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
Пример #15
0
    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
Пример #17
0
    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)
Пример #19
0
 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)
Пример #20
0
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
Пример #21
0
    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
Пример #22
0
    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()
Пример #23
0
    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
Пример #25
0
    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"}
Пример #26
0
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)
Пример #27
0
    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)
Пример #28
0
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
Пример #29
0
    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)
Пример #30
0
 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()