2016年11月30日水曜日

BlenderからPhotoshopを制御3-画像をPhotoshpで開くアドオン作成

前回までは基本的な動作を中心に説明してきましたが
今回からはBlenderアドオンとして仕上げます

アドオン作成の細かい説明についてはnutti様が公開している「はじめてのBlenderアドオン開発」がよくまとまっているので、そちらを参考にしていただくといいかと思います

前回までの解説の通り
VB_HubやPhotoshop制御用のJavaScript等複数のファイルで構成される形になっているので
複数ファイルで構成されるBlenderアドオンの作り方で作成を進めていきます。

今回は「UV/画像エディッター」で表示している画像をPhotoshopの現在の書類で開くものを作ります
前のものはレンダリング画像のみが対象でしたが テクスチャペイントで作成した画像等も開くことができるようになります

まずは「img_to_photoshop」という名前でのフォルダ作成してます
ここに今回使用するスクリプトファイル(__init__.py VB_Hub.vbs img_open.jsx)を収めることとします
以下それそれのファイルを解説をします

bl_info = {
    "name": "image to Photoshop",
    "description": "イメージをPhotoshopで開く",
    "author": "Yukimi",
    "version": (0,3),
    "blender": (2, 6, 0),
    "location": "image",
    "warning": "",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Import-Export"}

import bpy
import os
import subprocess
import time
import random

#実行するjavascriptの名前
js_name = "img_open.jsx"
#このスクリプトのあるディレクトリのパス
mydoc_dir = os.path.dirname(__file__)
#実行するスクリプトのパス
VB_Hub = os.path.abspath(os.path.join(mydoc_dir, "VB_Hub.vbs"))
jscript = os.path.abspath(os.path.join(mydoc_dir, js_name))
#Blenderの一時ファイルのパス
tmp_dir = bpy.context.user_preferences.filepaths.temporary_directory

def to_photoshop(context):
    #現在の.blendファイルのあるフォルダに一時ファイルを保存する場合は以下2行をコメントアウト
    #blendpath = bpy.data.filepath
    #tmp_dir  = os.path.join(os.path.split(blendpath)[0],"tmp")
    #日時+3桁のランダムアルファベットでファイル名の作成
    source_str = 'abcdefghijklmnopqrstuvwxyz'
    f_name = time.strftime("%y%m%d%H%M") + "".join([random.choice(source_str) for x in range(3)]) + ".png"
    img_path  = os.path.join(tmp_dir,f_name)
    #表示している画像の保存
    bpy.ops.image.save_as(save_as_render=False, filepath=img_path, relative_path=True)
    #スクリプトの実行
    subprocess.call(["CScript", VB_Hub, jscript, img_path, "//nologo"])
    

###################################################
class DupulicateActionAtCurrentTime(bpy.types.Operator):
    '''add Roop  '''
    bl_idname = "action.to_photoshop"
    bl_label = "open imege on Photoshop"
    def execute(self, context):
        to_photoshop(context)
        return {'FINISHED'}


def menu_func(self, context):
    self.layout.operator("action.to_photoshop", 
        text="Photoshopで開く" )

def register():
    bpy.utils.register_module(__name__)
    bpy.types.IMAGE_MT_image.prepend(menu_func)

def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.IMAGE_MT_image.remove(menu_func)

if __name__ == "__main__":
    register()
##########################################################
フォルダにあるファイルをモジュールとして読み込ませるのに必要なファイルです
通常はアドオンとして読み込ませるための設定と メニューに項目を登録する処理を記述しますが
今回は 本体のスクリプトも短いために こちらに記述しています

処理自体は前回の画像読み込みのスクリプトとほとんど同じですが
前回ではデスクトップに置いていた関連ファイルが同じフォルダ内にあるようにする処理と
表示している画像に日時+ランダムな文字列で Blenderのテンポラリフォルダに保存する処理が加えてあります


他のVB_Hub.vbs img_open.jsxは前回使ったものと同じですが書いておきます
VB_Hub.vbs
Option Explicit
'コマンドライン引数の取得
Dim oParam
Set oParam = WScript.Arguments
'Photoshopを指定
Dim objApp
Set objApp = CreateObject("Photoshop.Application")
Dim arg_count
arg_count = oParam.Count -1 

If arg_count = 0 Then
    '追加の引数がない場合
    objApp.DoJavaScriptFile oParam(0)
Else
    Dim id
 '引数をjavascriptに渡すための配列
    Dim ArgArray()
 ReDim ArgArray(arg_count - 1  )
    '第一引数がスクリプトのパスのため取り除く
    For id = 0 To arg_count - 1
        ArgArray(id) = oParam(id + 1)
    Next
    ''スクリプトの実行
    objApp.DoJavaScriptFile oParam(0),ArgArray
End If


var active_doc = app.activeDocument
//引数で指定したドキュメントを開いて現在のPSDに複製
if (arguments.length > 0){
    var img_file =  File(arguments[0])
    var img = app.open( img_file );
    img.artLayers[0].duplicate(active_doc)
    img.close()
    }
以上のファイルを保存したらフォルダごとアドオンのフォルダにコピーするか
フォルダをzip圧縮してBlenderの「ユーザー設定」の「アドオン」タブ下部にある「ファイルからインストール」をでzipファイルを読み込んで
アドオンを有効にします

正常に読み込まれた場合は
「UV/画像エディッター」の画像メニューに「Photoshopで開く」という項目が追加され
実行するとビュー上で表示している画像をPhotoshopの開いている画像に送ることができるようになります

今回のZipファイルをこちらにアップロードしておきます
いかがでしょうか

0 件のコメント:

コメントを投稿