【悪用厳禁】pyWinAutoを使って「ペイントソフトPixiaのPXAデータをPhotoshop(PSD)ファイルに変換する作業」を自動化

タイトルが長い。。。
ペイントツールのPixiaは使い慣れてるのですが、Vistaだと、よく落ちるのです(汗)

ということで、ほかのツールでも使えるように、ソフト標準形式のPXAで保存してあったデータをPhotoshopのPSD形式で保存しなおすことに。

変換作業自体はPixiaで行うしかないようですけれども、ファイル数が多いので、PythonのpyWinAutoモジュールを使い、作業を自動化することに。

今後使ってみたいモジュール

pyWinAutoで、ちょとだけ困ったこと

  • 便利すぎるので、悪用厳禁!!!
  • 自動操作するためのコードを書くのが、けっこう大変。操作を記録してくれるソフトが有ると助かるかも。
    (RocketMouseみたく) 誰か作ってー
  • SendKeyメソッド (sendkeyモジュール)は英語キーボード用。なので、日本語キーボードだと、コロンなどの記号がうまく入力できず。困った。

以下コード。
あくまで自分用なので、タイミング等によっては、うまく動かないことがあります。

# -*- coding: utf-8 -*-
"""Convert Paint tool  Pixia (PXA )  to  Photoshop (PSD) or PNG
  about Pixia   Paint Tool
   http://www.pixia.jp
"""
import pywinauto
import time
import os
from glob import glob
from pywinauto.application import Application
import sys
from functools import partial

prg=u"C:/フルパス/pixia.exe"

dir_list=[
    [u"C:/フルパス/pxaの有るフォルダ1", u"c:/フルパス/保存先1"],
    [u"C:/フルパス/pxaの有るフォルダ2", u"./保存先2"] #内部でフルパスに変換するので、相対パスでもOK
    ]
#Pixiaを起動
app=Application()
try:
    app.connect(title_re=".*Pixia.*")
except:
    app.start(prg)

def szwait(fn):
    last=0
    for i in xrange(1000):
        time.sleep(1)
        print ".",
        sz=os.path.getsize(fn)
        if last!=sz :
           last =sz
        elif sz>0 :
            break
    else :
        raise Exception

def wait_dlg(ttl,fnc=None):
    time.sleep(1)
    for i in xrange(100):
        time.sleep(.1)
        try:
            print ".",
            if fnc :
                fnc()
            dlg=app.window_(title_re=ttl)
            break
        except:
            continue
    else:
        raise Exception
    print
    return dlg    

def main(dir_list):
    for pxa_dir,save_dir  in dir_list :
        print pxa_dir
        if not os.path.exists(save_dir):
            os.mkdir(save_dir)
        psd_dir=save_dir+"/psd"
        print psd_dir
        if not os.path.exists(psd_dir):
            os.mkdir(psd_dir)
        png_dir=save_dir+"/png"
        print png_dir
        if not os.path.exists(png_dir):
            os.mkdir(png_dir)

        loop2(pxa_dir,save_dir)

def loop2(pxa_dir,save_dir):

    psdmask=os.path.abspath(save_dir+"/psd/%s.psd")
    pngmask=os.path.abspath(save_dir+"/png/%s.png")
    pxamask=os.path.abspath(pxa_dir+"/%s.pxa")
    pxalist=[os.path.abspath(x) for x in glob(pxamask %"*")]
    #ファイル名のボディ部のみに
    fnlist=["".join(os.path.split(i)[1].split(".")[:-1]) for i in pxalist]

    for fn in fnlist:

        pxa_name=pxamask % fn
        png_name=pngmask % fn
        psd_name=psdmask % fn
        cnv(pxa_name,[psd_name,png_name])

def psd_save(psd_name):
    "PhotoShop[*.psd]"
    dlg=wait_dlg("Pixia")
    dlg.TypeKeys("%FA")

    dlg=wait_dlg(u"名前を付けて保存")
    dlg.Edit.SetEditText(psd_name)
    dlg.ComboBox2.Select("PhotoShop[*.psd]")
    time.sleep(1)
    dlg.Button.Click()
    time.sleep(3)
    szwait(psd_name)

def png_save(png_name):
    "PNG[*.png]"
    #PNG
    dlg=wait_dlg("Pixia")
    dlg.TypeKeys("%FA")
    dlg=wait_dlg(u"名前を付けて保存")
    #GUI部品の名前をダンプ。
    #print_ctrl(u"名前を付けて保存")
    #raw_input("stop")
    dlg.Edit.SetEditText(png_name)

    dlg.ComboBox2.Select("PNG[*.png]")
    time.sleep(1)
    dlg.Button.Click()
    #透明情報保存
    dlg=wait_dlg("PNG")
    #print_ctrl("PNG")
    app.PNG.CheckBox2.Check()
    time.sleep(.5)
    dlg.OK.Click()
    time.sleep(3)
    szwait(png_name)

def cnv(pxa_name,save_list,
        sw={"png":png_save,"psd":psd_save}
        ):
    """コンバート本体"""
    not_converted=[]
    for fn in save_list :
        #print fn
        ext=fn.split(".")[-1]
        if not ext : raise u"save 拡張子を指定してください"
        if not os.path.exists(fn)   :
            not_converted.append(fn)
    if not not_converted : return
    print pxa_name

    #コンバート元をロード
    dlg=wait_dlg("Pixia")
    dlg.TypeKeys("%FO")
    dlg=wait_dlg(u"ファイルを開く")
    print pxa_name
    dlg.Edit.SetEditText(pxa_name)
    dlg.Button.Click()
    #コンバート失敗してる場合もあるので、存在してるのも含め、全部コンバートしなおし
    #for fn in not_converted :

    for fn in save_list:
        print fn
        ext=fn.split(".")[-1].lower()
        if not sw.has_key(ext) : raise u"対応していない拡張子です"
        sw[ext](fn)
    #画像を閉じる
    dlg=wait_dlg("Pixia")
    dlg.TypeKeys("^W")

#以下 オマケ
extlist={
        "bmp":"Windowsビットマップ[*.bmp]",
        "dib":"Windowsビットマップ[*.dib]",
        "eps":"Adobe EPS[*.eps]",
        "gif":"GIF[*.gif]",
        "ico":"Windowsアイコン[*.ico]",
        "jpeg":"JPEG[*.jpeg]",
        "jpg":"JPEG[*.jpg]",
        "png":"PNG[*.png]",
        "psd":"PhotoShop[*.psd]",
        "pxa":"標準[*.pxa]",
        "rgb":"フジフィルムベタファイル[*.rgb]",
        "tga":"Targa(TGA)[*.tga]",
        "tif":"TIFF[*.tif]",

def print_ctrl(ttl):
    """GUI部品の名前をダンプ"""
    dlg=app.window_(title_re =ttl)
    dlist=dlg._ctrl_identifiers()
    for i in  dlist:
        for j in dlist[i] :
            print j,"    ",
        print
    print "----"
        "tiff":"TIFF[*.tif]"}

def dump_combobox(ttl):
    #あらかじめ、何らかの画像を開いておく
    dlg=app.window_(title_re =ttl)
    dlist=dlg._ctrl_identifiers()
    for i in  dlist:

        if "ComboBox" in str(i):
            for j in dlist[i]: print j ,"   ",
            print
            print "----"
            for j in dlg[dlist[i][0]].ItemTexts():
                print j
                #tlist=dlg.ComboBox2.ItemTexts()
            print "----"

def dump():
    dlg=wait_dlg("Pixia")
    dlg.TypeKeys("%FA") #名前を付けて保存
    print_ctrl(unicode("名前を付けて保存"))
    dump_combobox(unicode("名前を付けて保存"))

if __name__=="__main__":
    #dump()
    if len(sys.argv)==3:
        dir_list=[sys.argv[0],sys.argv[1]]
    main(dir_list)

Tags: ,

Related posts

Tags: ,

Comments are closed.