def execute(self,context):
        fjw.reject_notmesh()

        canvases = []
        targets = []
        #カスタムプロパティをチェック
        for obj in fjw.get_selected_list():
            if "canvas" in obj:
                canvases.append(obj)
                continue
            if "asset" in obj:
                targets.append(obj)
                continue

        #カンバス群にパッシブ追加
        fjw.deselect()
        fjw.activate(canvases[0])
        fjw.select(canvases)
        bpy.ops.rigidbody.objects_add(type='PASSIVE')

        #ターゲット群にアクティブ追加
        fjw.deselect()
        fjw.activate(targets[0])
        fjw.select(targets)
        bpy.ops.rigidbody.objects_add(type='ACTIVE')

        #アニメーション再生
        bpy.ops.screen.frame_jump()
        bpy.ops.screen.animation_play()

        #self.report({"INFO"},"")
        pass
        return {"FINISHED"}
Exemplo n.º 2
0
 def parent_clear(self):
     """
     ペアレントをクリアする。
     """
     fjw.deselect()
     fjw.activate(self.obj)
     bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM')
Exemplo n.º 3
0
    def bake(self, baketype):
        """
        arguments:
            ベイクタイプ
            baketypes = ['FULL', 'AO', 'SHADOW', 'NORMALS', 'TEXTURE', 'DISPLACEMENT', 'DERIVATIVE', 'VERTEX_COLORS', 'EMIT', 'ALPHA', 'MIRROR_INTENSITY', 'MIRROR_COLOR', 'SPEC_INTENSITY', 'SPEC_COLOR']
            ベイク元オブジェクト群
        """
        fjw.deselect()
        fjw.activate(self.obj)
        bpy.ops.object.shade_smooth()  #ソリッドだとガタガタになる
        fjw.select(self.from_objects)

        img = self.get_bakeimage(baketype)
        img = self.reassign_image_filepath(img)
        tex = self.get_baketex(baketype)
        tex.image = img
        self.save_dirtyimages()
        self.assign_uv_face(img)

        self.set_tslots_state(False)
        render = bpy.context.scene.render
        render.bake_type = baketype
        render.use_bake_to_vertex_color = False
        render.use_bake_selected_to_active = True
        render.use_textures = True
        render.use_bake_normalize = False
        render.bake_margin = 14
        bpy.context.scene.render.bake_distance = 0.2
        bpy.context.scene.render.bake_bias = 0.0001
        bpy.ops.object.bake_image()
        self.set_tslots_state(True)

        self.save_dirtyimages()
        bpy.ops.file.make_paths_relative()
Exemplo n.º 4
0
    def get_avatar_objects_from_its_root(self, child_object):
        """
            オブジェクトからルートオブジェクトを取得して、
            mdobjectsに格納する。
        """
        fjw.deselect()
        root = fjw.get_root(child_object)

        mdobj = self.find_mdobj_by_object(root)
        if mdobj is not None:
            return mdobj

        fjw.activate(root)
        rootname = re.sub("\.\d+", "", root.name)
        bpy.ops.fujiwara_toolbox.command_24259()  #親子選択
        selection = fjw.get_selected_list()

        #selectionの中にMESHオブジェクトがなかったら除外する
        mesh_found = False
        for obj in selection:
            if obj.type == "MESH":
                mesh_found = True
        if not mesh_found:
            return None

        mdobj = MDObject(rootname, selection)
        self.mdobjects.append(mdobj)

        return mdobj
 def attouch_uraporiedge(self):
     fjw.deselect()
     fjw.activate(self.face)
     bpy.ops.object.transform_apply(location=False,
                                    rotation=False,
                                    scale=True)
     bpy.ops.fujiwara_toolbox.command_318722()
    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 dup(self, obj):
     fjw.mode("OBJECT")
     fjw.deselect()
     obj.select = True
     bpy.ops.object.duplicate()
     selection = fjw.get_selected_list()
     return selection[0]
Exemplo n.º 8
0
 def __export_setup(self, dirpath):
     fjw.deselect()
     fjw.select(self.get_export_objects())
     self.__simplify(2)
     for obj in self.objects:
         self.__disable_backsurface_edge(obj)
     #フレーム1に移動
     bpy.ops.screen.frame_jump(end=False)
Exemplo n.º 9
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()
Exemplo n.º 10
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"}
Exemplo n.º 11
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
Exemplo n.º 12
0
def gen_bevelcurve_all_strokes(depth):
        fjw.deselect()
        color = (1,1,1)
        while color:
            color, fill_color = extract_stroke_to_new_layer()
            if color:
                bpy.ops.gpencil.convert(type='CURVE', use_timing_data=True)
                bpy.ops.gpencil.layer_remove()
                selection = fjw.get_selected_list()
                for obj in selection:
                    curve_set_bevel(obj, depth, color)
                    fjw.deselect()
        bpy.ops.gpencil.layer_remove()
Exemplo n.º 13
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
Exemplo n.º 14
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)
Exemplo n.º 15
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)
Exemplo n.º 16
0
 def apply_pose(self):
     """
     ポーズをデフォルトに設定する。トランスフォームも確定する。
     """
     fjw.mode("OBJECT")
     fjw.deselect()
     fjw.activate(self.obj)
     fjw.mode("POSE")
     self.show_all_layers()
     bpy.ops.pose.reveal()
     for pbone in self.obj.pose.bones:
         pbone.bone.hide = False
         pbone.bone.select = True
     bpy.ops.pose.select_all(action='SELECT')
     bpy.ops.pose.visual_transform_apply()
     self.mute_constraints()
     fjw.mode("POSE")
     bpy.ops.pose.armature_apply()
     self.restore_layers()
     self.reset_edit_bones()
Exemplo n.º 17
0
    def assign_image(self, image_path):
        """ベイクの代わりに既にベイクしたイメージを割り当てる。"""
        fjw.deselect()
        fjw.activate(self.obj)
        bpy.ops.object.shade_smooth()

        # イメージ取得。既にロードされてたらそれを使うべき。
        image = None
        for img in bpy.data.images:
            if img.is_library_indirect:
                continue
            if bpy.path.abspath(img.filepath) == bpy.path.abspath(image_path):
                return img
        if not image:
            # 相対パス化。
            image = bpy.data.images.load(filepath=bpy.path.relpath(image_path))

        dirname, name, ext = fjw.splitpath(image_path)
        textype = self.get_identifier(name)
        tex = self.get_baketex(textype)
        tex.image = image
Exemplo n.º 18
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)
    def load_img_with_camera(self, filepath, tilenumber=1, use_json=True):
        dirname = os.path.dirname(filepath)
        basename = os.path.basename(filepath)
        name, ext = os.path.splitext(basename)

        fjw.deselect()
        plane = self.make_plane(self.camera, filepath)
        if not plane:
            return None
        plane.hide_render = True

        if use_json:
            ############json依存ここから
            j = self.load_json(filepath)
            doc_size = [j["document"]["width"], j["document"]["height"]]
            layer_size = [j["layer"]["width"], j["layer"]["height"]]
            layer_pos = Vector(j["layer"]["posmid"])
            tilenumber = j["tile"]

            camscale = self.camera.data.ortho_scale

            #レイヤー座標
            #layer_posを中心を0とした、-0.5~0.5の範囲に変換する
            layer_pos[0] = (layer_pos[0] / doc_size[0] - 0.5)
            layer_pos[1] = (layer_pos[1] / doc_size[1] - 0.5) * -1  #座標逆!!

            #*カメラスケール
            layer_pos *= camscale
            print(layer_pos)
            plane.location = (layer_pos[0], layer_pos[1], 0)

            zpos = (0.5 + len(self.camera.children) * 0.1) * -1
            plane.location[2] = zpos * 0.1

            #レイヤースケール
            #ドキュメントにおけるレイヤーの大きさ割合を算出
            layer_scale = Vector([1, 1])
            layer_scale[0] = layer_size[0] / doc_size[0]
            layer_scale[1] = layer_size[1] / doc_size[1]
            #*カメラスケール
            layer_scale *= camscale
            #8*8分割画像なのでさらに8倍
            layer_scale *= tilenumber
            plane.scale = (layer_scale[0], layer_scale[1], 1)
            ############json依存ここまで
        else:
            camscale = self.camera.data.ortho_scale
            plane.scale = (camscale, camscale, camscale)

        #位置オフセット
        if tilenumber != 1:
            offset = Vector([0, 0])
            offset[0] = plane.scale[0] / 2 - plane.scale[0] / tilenumber / 2
            offset[1] = plane.scale[1] / 2 - plane.scale[0] / tilenumber / 2
            plane.location[0] += offset[0]
            plane.location[1] -= offset[1]

        if use_json:
            plane.scale *= 0.5

        #カメラを移動させてプロジェクタを子にする
        self.camera_state.store_transform()

        self.camera.location = (0, 0, 0)
        self.camera.rotation_euler = (0, 0, 0)
        plane.parent = self.camera

        self.camera_state.restore_transform()

        return plane
Exemplo n.º 20
0
    def setup_mdwork_main(cls, self, context):
        if "_MDWork" not in bpy.data.filepath:
            fjw.framejump(cls.last_frame)
            dir = os.path.dirname(bpy.data.filepath)
            name = os.path.splitext(os.path.basename(bpy.data.filepath))[0]
            blend_md = dir + os.sep + name + "_MDWork.blend"
            bpy.ops.wm.save_as_mainfile(filepath=blend_md)

            bpy.context.scene.layers[0] = True
            for i in range(19):
                bpy.context.scene.layers[i + 1] = False
            for i in range(5):
                bpy.context.scene.layers[i] = True

            #ポーズだけついてるやつをポーズライブラリに登録する
            for armature_proxy in bpy.context.visible_objects:
                if armature_proxy.type != "ARMATURE":
                    continue
                if "_proxy" not in armature_proxy.name:
                    continue
                fjw.deselect()
                fjw.activate(armature_proxy)
                fjw.mode("POSE")
                bpy.ops.pose.select_all(action='SELECT')
                bpy.ops.fujiwara_toolbox.set_key()
                fjw.mode("OBJECT")

            fjw.mode("OBJECT")
            bpy.ops.object.select_all(action='SELECT')

            bpy.ops.file.make_paths_absolute()
            selection = fjw.get_selected_list()
            for obj in selection:
                md_garment_path_list = cls.__get_prop(obj,
                                                      "md_garment_path_list")
                md_export_id = cls.__get_prop(obj, "md_export_id")
                md_garment_index = cls.__get_prop(obj, "md_garment_index")
                md_export_depth = cls.__get_prop(obj, "md_export_depth")

                # obj.dupli_group.library.filepath
                link_path = ""
                if obj.dupli_group is not None and obj.dupli_group.library is not None:
                    link_path = obj.dupli_group.library.filepath
                if link_path == "" or link_path is None:
                    continue

                fjw.deselect()
                fjw.activate(obj)
                bpy.ops.object.duplicates_make_real(use_base_parent=True,
                                                    use_hierarchy=True)
                realized_objects = fjw.get_selected_list()
                for robj in realized_objects:
                    robj["linked_path"] = link_path

                    root = fjw.get_root(robj)
                    if md_garment_path_list is not None:
                        root["md_garment_path_list"] = md_garment_path_list
                    if md_export_id is not None:
                        root["md_export_id"] = md_export_id
                    if md_garment_index is not None:
                        root["md_garment_index"] = md_garment_index
                    if md_export_depth is not None:
                        root["md_export_depth"] = md_export_depth

                    #garment_pathを絶対パス化する
                    if "md_garment_path_list" in robj:
                        pathlist_base = robj["md_garment_path_list"]

                        print("*" * 15)
                        print("* make garment path to abs")
                        print("*" * 15)
                        lib_dir = os.path.dirname(link_path)
                        pathlist_new = []
                        for garment_path in pathlist_base:
                            new_path = bpy.path.abspath(garment_path,
                                                        start=lib_dir)
                            pathlist_new.append(new_path)
                            print(new_path)
                        robj["md_garment_path_list"] = pathlist_new
                        print("*" * 15)

            #proxyの処理
            #同一のアーマチュアデータを使っているものを探してポーズライブラリを設定する。
            for armature_proxy in bpy.data.objects:
                if armature_proxy.type != "ARMATURE":
                    continue
                if "_proxy" not in armature_proxy.name:
                    continue

                for armature in bpy.data.objects:
                    if armature.type != "ARMATURE":
                        continue
                    if armature == armature_proxy:
                        continue

                    if armature.data == armature_proxy.data:
                        #同一データを使用している
                        #のでポーズライブラリの設定をコピーする
                        armature.pose_library = armature_proxy.pose_library

                        #回収したポーズライブラリを反映する
                        fjw.mode("OBJECT")
                        fjw.activate(armature)

                        if fjw.active() is not None:
                            aau = fjw.ArmatureActionUtils(armature)
                            armu = fjw.ArmatureUtils(armature)

                            fjw.active().hide = False
                            fjw.mode("POSE")
                            poselist = aau.get_poselist()
                            if poselist is not None:
                                for pose in aau.get_poselist():
                                    frame = int(
                                        str(pose.name).replace("mdpose_", ""))
                                    fjw.framejump(frame)

                                    #ジオメトリはゼロ位置にする
                                    geo = armu.GetGeometryBone()
                                    armu.clearTrans([geo])
                                    bpy.ops.pose.select_all(action='SELECT')
                                    armu.databone(geo.name).select = False
                                    aau.apply_pose(pose.name)
                            #1フレームではデフォルトポーズに
                            fjw.mode("POSE")
                            fjw.framejump(1)
                            bpy.ops.pose.select_all(action='SELECT')
                            bpy.ops.pose.transforms_clear()

            #proxyの全削除
            fjw.mode("OBJECT")
            prxs = fjw.find_list("_proxy")
            fjw.delete(prxs)

            # bpy.app.handlers.scene_update_post.append(process_proxy)
            bpy.context.space_data.show_only_render = False
Exemplo n.º 21
0
    def mdresult_auto_import_main(cls, self, context, attouch_fjwset=False):
        import_ext = ".obj"

        #存在確認
        # blendname = os.path.splitext(os.path.basename(bpy.data.filepath))[0]
        # dir_path = get_mddatadir() + blendname + os.sep
        dir_path = get_mddatadir()
        self.report({"INFO"}, dir_path)

        if not os.path.exists(dir_path):
            self.report({"INFO"}, "キャンセルされました。")
            # bpy.ops.wm.quit_blender()
            return {'CANCELLED'}

        #既存のリザルトを処分
        fjw.deselect()
        dellist = []
        for obj in bpy.context.scene.objects:
            if obj.type == "MESH" and "result" in obj.name:
                dellist.append(obj)
        fjw.delete(dellist)

        root_objects = []
        for obj in bpy.context.scene.objects:
            if obj.parent is None:
                root_objects.append(obj)

        mdj = MDJson()
        entries = mdj.get_thisfile_entries()
        # files = os.listdir(dir_path)
        # for file in files:
        files = []
        for entry in entries:
            file = entry + import_ext
            # 対応するファイルが実際にあるかをチェックしないとだめ!
            filepath = dir_path + file
            if not os.path.exists(filepath):
                continue
            files.append(file)

        for file in files:
            self.report({"INFO"}, file)
            print("MDResult found:" + file)
            # targetname = file
            # dirname = os.path.basename(os.path.dirname(file))
            targetname = file

            # rootobjでの設置だとルートがないとおかしなことになる
            # dupli_groupの名前でみて、同一名のもののアーマチュアを探して、
            # vislble_objects内のそのデータと同一のプロクシないしアーマチュア、のジオメトリを指定すればいいのでは

            #グループ名だと全部"MainGroup"だからマッチしない!
            #グループの親ファイルパスの名前を見る!!

            #複製子除去
            # targetname = re.sub(r"\.\d+", "", targetname)
            print("basename:%s, targetname:%s" % (file, targetname))

            #fileと同名のdupli_groupを検索
            dupli_group = None
            for group in bpy.data.groups:
                # gname = re.sub(r"\.\d+", "", group.name)
                if group.name == "MainGroup":
                    if group.library is not None:
                        g_filepath = group.library.filepath
                        g_filename = os.path.basename(g_filepath)
                        gname, ext = os.path.splitext(g_filename)
                    else:
                        gname = group.name
                else:
                    gname = group.name

                if targetname == gname:
                    dupli_group = group
                    break

            if not dupli_group:
                print("!targetname not in bpy.data.groups!:%s" % targetname)
            else:
                print("*targetname found*:%s" % targetname)

            if dupli_group:
                dgroup = dupli_group
                #Bodyが参照しているアーマチュアのデータを取得
                target_armature = None
                #この検索問題 名前Bodyじゃない可能性がある まずカスタムプロパティで探すべき
                #普通に全てのアーマチュアがシーン上のアーマチュアと一致したらそれ採用でいいのでは?
                # for obj in dgroup.objects:

                for scene_amature in bpy.context.visible_objects:
                    if scene_amature.type != "ARMATURE":
                        continue
                    linked_object = scene_amature.proxy_group
                    if linked_object:
                        #グループが一致
                        if linked_object.dupli_group == dupli_group:
                            #ルートアーマチュアを採用する
                            target_armature = cls.__find_root_armature(
                                scene_amature)
                            break

                # if "Body" in dgroup.objects:
                #     Body = dgroup.objects["Body"]
                #     modu = fjw.Modutils(Body)
                #     armt = modu.find("Armature")

                #     if armt is not None:
                #         armature = armt.object
                #         if armature is not None:
                #             armature_data = armature.data
                #             for scene_amature in bpy.context.visible_objects:
                #                 if scene_amature.type != "ARMATURE":
                #                     continue
                #                 if scene_amature.data != armature_data:
                #                     continue
                #                 #同一のアーマチュアデータを発見したのでこいつを使用する
                #                 target_armature = scene_amature
                #                 break

                if not target_armature:
                    print("!target_armature not found!")

                if target_armature is not None:
                    print("target_armature:%s" % target_armature)
                    arm = target_armature
                    print("MDImport Step 0")
                    fjw.mode("OBJECT")
                    fjw.deselect()
                    fjw.activate(arm)
                    print("MDImport Step 1")
                    fjw.mode("POSE")
                    armu = fjw.ArmatureUtils(arm)
                    geo = armu.GetGeometryBone()
                    armu.activate(geo)
                    print("MDImport Step 2")
                    fjw.mode("POSE")

                    self.report({"INFO"}, dir_path + file)
                    print("MDImport Selecting GeoBone:" + dir_path + file)

            #インポート
            # mdresultpath = dir_path + file + os.sep + "result" + import_ext
            mdresultpath = dir_path + file
            MarvelousDesingerUtils.import_mdresult(mdresultpath,
                                                   attouch_fjwset)
            print("MDImport Import MDResult:" + mdresultpath)

        fjw.mode("OBJECT")
        for obj in bpy.context.visible_objects:
            if "result" in obj.name:
                obj.select = True

                #テクスチャのパック
                cls.__pack_img_of_obj(obj)
    def facesetup(self):
        """
        ミラーモディファイアの適用
        マテリアル割当←割り当てる前にマテリアルを作っとく必要がある
        目・眉頂点グループを左右別に割り当てる
        眼球用メッシュ分離→厚みマイナスつけてフチのみにする=へこます
        
        まつげ用メッシュ複製分離→まつげ用マテリアルを割り当て

        ・頂点グループ
        Eye, Mouth, Eyebrow
        """
        fjw.deselect()
        fjw.activate(self.face)

        modu = fjw.Modutils(self.face)
        mod_mirror = modu.find_bytype("MIRROR")
        if mod_mirror:
            modu.apply(mod_mirror)
        vgu = fjw.VertexGroupUtils(self.face)

        ########################################
        # メッシュセットアップ
        ########################################
        #鼻線画
        fjw.mode("EDIT")
        self.mesh_deselect()
        bpy.context.scene.tool_settings.mesh_select_mode = [True, False, False]
        self.select_by_vertex_group("Nose")
        bpy.ops.fujiwara_toolbox.make_skin_line()
        bpy.ops.transform.skin_resize(value=(0.0526974, 0.0526974, 0.0526974),
                                      constraint_axis=(False, False, False),
                                      constraint_orientation='LOCAL',
                                      mirror=True,
                                      proportional='DISABLED',
                                      proportional_edit_falloff='SMOOTH',
                                      proportional_size=0.0295401)
        bpy.ops.mesh.subdivide(smoothness=0)
        fjw.mode("OBJECT")
        fjw.deselect()
        fjw.activate(self.face)

        #プロジェクション設定
        #肌
        mat = self.get_material("Skin")
        self.set_projection("Shadow", mat, find=True)
        self.set_projection("Cheek", mat, find=True)
        self.assign_material_to_mesh(mat)

        #まつげテクスチャをつかった目の穴
        mat = self.get_material("Eyehole_R")
        self.set_projection("Eyelid_R", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "x")

        mat = self.get_material("Eyehole_L")
        self.set_projection("Eyelid_L", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "-x")

        #口
        mat = self.get_material("Mouth")
        self.set_projection("Mouth", mat, find=True)
        self.assign_material_by_vetexgroup("Mouth", mat)

        #まゆげ
        #選択したら複製する
        eyebrow = self.mesh_dup("Eyebrow")
        eyebrow.location[1] -= 0.001
        eyebrow.name = "Eyebrow"

        mat = self.get_material("Eyebrow_R")
        self.set_projection("Eyebrow_R", mat, find=True)
        self.assign_material_by_vetexgroup("Eyebrow", mat, "x")

        mat = self.get_material("Eyebrow_L")
        self.set_projection("Eyebrow_L", mat, find=True)
        self.assign_material_by_vetexgroup("Eyebrow", mat, "-x")

        #目
        fjw.mode("OBJECT")
        fjw.activate(self.face)
        fjw.mode("EDIT")
        eye = self.mesh_dup("Eye")
        eye.location[1] += 0.001
        eye.name = "Eye"

        mat = self.get_material("Eye_R")
        self.set_projection("Pupil_R", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "x")

        mat = self.get_material("Eye_L")
        self.set_projection("Pupil_L", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "-x")

        #外周をすこし後ろに
        bpy.ops.mesh.select_all(action='SELECT')
        bpy.ops.mesh.region_to_loop()
        bpy.ops.transform.translate(value=(0, 0.001, 0),
                                    constraint_axis=(False, True, False),
                                    constraint_orientation='GLOBAL',
                                    mirror=True,
                                    proportional='DISABLED',
                                    proportional_edit_falloff='SMOOTH',
                                    proportional_size=1,
                                    release_confirm=True,
                                    use_accurate=False)

        #まつげ Z処理的に、厚み付じゃだめ。座標をズラす。
        fjw.mode("OBJECT")
        fjw.activate(self.face)
        fjw.mode("EDIT")
        eyelid = self.mesh_dup("Eye")
        eyelid.location[1] -= 0.001
        eyelid.name = "Eyelid"

        mat = self.get_material("Eyelid_R")
        self.set_projection("Eyelid_R", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "x")

        mat = self.get_material("Eyelid_L")
        self.set_projection("Eyelid_L", mat, find=True)
        self.assign_material_by_vetexgroup("Eye", mat, "-x")

        #外周の拡張
        bpy.ops.mesh.select_all(action='SELECT')
        bpy.ops.mesh.region_to_loop()
        bpy.ops.fujiwara_toolbox.command_357169()
        bpy.ops.fujiwara_toolbox.pivot_to_individual()
        bpy.ops.mesh.extrude_region_move(
            MESH_OT_extrude_region={"mirror": False},
            TRANSFORM_OT_translate={
                "value": (0, 0, 0),
                "constraint_axis": (False, False, False),
                "constraint_orientation": 'GLOBAL',
                "mirror": False,
                "proportional": 'DISABLED',
                "proportional_edit_falloff": 'SMOOTH',
                "proportional_size": 1,
                "snap": False,
                "snap_target": 'CLOSEST',
                "snap_point": (0, 0, 0),
                "snap_align": False,
                "snap_normal": (0, 0, 0),
                "gpencil_strokes": False,
                "texture_space": False,
                "remove_on_cancel": False,
                "release_confirm": False,
                "use_accurate": False
            })
        bpy.ops.transform.resize(value=(1.66677, 1.66677, 1.66677),
                                 constraint_axis=(False, False, False),
                                 constraint_orientation='GLOBAL',
                                 mirror=True,
                                 proportional='DISABLED',
                                 proportional_edit_falloff='SMOOTH',
                                 proportional_size=1)

        fjw.mode("OBJECT")
        fjw.activate(self.face)
        fjw.mode("OBJECT")

        ########################################
        # マテリアルセットアップ
        ########################################
        mat = self.get_material("Skin")
        self.facemat_basesetup(mat)
        self.facemat_skinsetup(mat)

        mat = self.get_material("Eyehole_R")
        self.facemat_basesetup(mat)
        self.facemat_skinsetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, "Eyelid_R")
        self.tslot_setting(tslot, False, True)

        mat = self.get_material("Eyehole_L")
        self.facemat_basesetup(mat)
        self.facemat_skinsetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, "Eyelid_L")
        self.tslot_setting(tslot, False, True)

        mat = self.get_material("Mouth")
        self.facemat_basesetup(mat)
        self.facemat_skinsetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, mat.name)
        self.tslot_setting(tslot, True, True)

        mat = self.get_material("Eyebrow_R")
        # self.facemat_basesetup(mat)
        # tslot = self.add_projectorimage_to_mat(mat, mat.name)
        # self.tslot_setting(tslot, True, True)
        self.facemat_basesetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, mat.name)
        prj = self.get_projector(mat.name, True)
        img = self.get_projector_image(prj.name)
        img = self.get_noalpha(img)
        #アルファ
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, False, True, True, True)
        #カラー
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, True, False)

        mat = self.get_material("Eyebrow_L")
        # self.facemat_basesetup(mat)
        # tslot = self.add_projectorimage_to_mat(mat, mat.name)
        # self.tslot_setting(tslot, True, True)
        self.facemat_basesetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, mat.name)
        prj = self.get_projector(mat.name, True)
        img = self.get_projector_image(prj.name)
        img = self.get_noalpha(img)
        #アルファ
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, False, True, True, True)
        #カラー
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, True, False)

        mat = self.get_material("Eye_R")
        self.facemat_basesetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, "Pupil_R")
        self.tslot_setting(tslot, True, False)

        mat = self.get_material("Eye_L")
        self.facemat_basesetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, "Pupil_L")
        self.tslot_setting(tslot, True, False)

        mat = self.get_material("Eyelid_R")
        self.facemat_basesetup(mat)
        tslot = self.add_projectorimage_to_mat(mat, mat.name)
        prj = self.get_projector(mat.name, True)
        img = self.get_projector_image(prj.name)
        img = self.get_noalpha(img)
        #アルファ
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, False, True, True, True)
        #カラー
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, True, False)

        mat = self.get_material("Eyelid_L")
        self.facemat_basesetup(mat)
        prj = self.get_projector(mat.name, True)
        img = self.get_projector_image(prj.name)
        img = self.get_noalpha(img)
        #アルファ
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, False, True, True, True)
        #カラー
        tslot = self.set_texture_to_mat(mat, img, prj.name)
        self.tslot_setting(tslot, True, False)

        #仕上げに拡縮を適用して裏ポリエッジをつける
        self.attouch_uraporiedge()