// 雑記 2015年04月 "); } }

雑記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ApplScript][Illustrator] 指定間隔で自動保存 v3

[ApplScript][Illustrator] 指定間隔で自動保存にコメントいただきました

cs5とcs6ではsaveされるのに、 cs3とcs4では一度も保存されてないようですと出て保存されません。


そういえばちょっと前にもTwitterで同様の症状をつぶやいてた人がいたな……


さて、メッセージが出るのはファイルパスが取得できない時なので、早速その部分を確認。

tell application "Adobe Illustrator"
	set path1 to file path of current document
end tel
l

返り値
«data fss 9CFF77EBC400066161612E61694350000000DEBC990270000000B0E4ED43B8E3FFBF93BD99021E2A9F0262BE9902B8E3FFBFE2C19B02B8E4ED43580CEE43B8E3FFBF00000000»


?? パスが返ってこない!?
調べてみると、『どのクラスにも属さない値』らしい。けど何を言ってるのやら……

さらに調べると

tell application "Adobe Illustrator"
	set path1 to file path of current document
set path2 to POSIX path of path1
end tell

返り値
"/Git/Illustrator/cycle_save/aaa.ai"


POSIX pathにcastすればいいようで、無事扱える形で取得する事ができました。


簡単な説明

waitTime
で設定した間隔でIllustratorの最前面にあるファイルを保存し、_versionフォルダに、ファイル名+タイムスタンプでコピーします。

waitTime … 保存する間隔を分単位で設定します。デフォルトは15分。

デフォルトでは『PDF互換』にチェックをいれてませんので、互換ファイルの方がよい方は『on doc_save(doc_path)』の部分を修正してください。

上記を設定の上、別名保存でファイルフォーマットからアプリケーションを選び、実行後、自動的に終了しないにチェックをいれて保存してください。
終了させるにはアプリケーションをアクティブにして終了させるか、Dockから終了させてください。



まずは通常?バージョンから
ファイルはこちらからダウンロードできます。
また、Illustratorの終了時に自動で終了するバージョンと同梱しています。


(*
2012-08-27 v1.0
2015-04-03 v1.1 ファイルパスがalias値で返ってこない時への対応
*)

property waitTime : 15 --分単位

on idle {}
my main()
return waitTime * minutes

end idle


on main()
tell application "Adobe Illustrator"
if (count of document) is not 0 then
set flg_doc to false
tell current document
set doc_name to name
try
set doc_path to file path
set doc_path to (POSIX path of doc_path) as POSIX file
tell application "Finder" to set parent_Folder to parent of (doc_path as alias) as Unicode text

set flg_doc to true
on error
display dialog "一度も保存されていないようです" buttons " OK " default button 1
return
end try
end tell

if modified of current document is true then

my doc_save(doc_path)

if flg_doc then
my doc_copy(parent_Folder, doc_path, doc_name)
end if

end if
end if
end tell
end main


on doc_save(doc_path)
tell application "Adobe Illustrator"
save current document in file doc_path as Illustrator with options {class:Illustrator save options, PDF compatible:false}
--PDF互換にするにはPDF compatible:falseをtrueにする
end tell
end doc_save


on doc_copy(parent_Folder, doc_path, doc_name)
set p_parent_Folder to POSIX path of parent_Folder
set p_doc_path to POSIX path of doc_path

set new_doc_path to p_parent_Folder & "_version/" & my Delimiters(doc_name, ".ai", "_" & my DateToString() & ".ai")

set shellcmd to "cp -p " & quoted form of p_doc_path & " " & quoted form of new_doc_path
--display dialog shellcmd
try
do shell script shellcmd
on error
my make_folder(parent_Folder, doc_path, doc_name)
end try
end doc_copy


on make_folder(parent_Folder, doc_path, doc_name)
tell application "Finder" to make new folder at (parent_Folder as alias) with properties {name:"_version"}
my doc_copy(parent_Folder, doc_path, doc_name)
end make_folder


on Delimiters(theText, serchStr, replaceStr)
set OriginalDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to serchStr
set theText to text items of theText
set AppleScript's text item delimiters to replaceStr
set theText to theText as string
set AppleScript's text item delimiters to OriginalDelimiters
return theText
end Delimiters


on DateToString()
set todayStr to do shell script "date '+%m%d_%k%M'" --秒を追加する時はMのあとに%Sを追加
return (todayStr)
end DateToString



続いて、自動終了バージョン


(*
2012-08-27 v1.0
2012-09-06 v1.1 ドキュメント修正時のみ保存
2014-06-23 v1.2 アプリケーションの終了時に付随して終了させる
2015-04-03 v1.3 ファイルパスがalias値で返ってこない時への対応
*)

property wait_Time : 15 --分 保存する間隔
property idle_Time : 2 --秒 プロセス監視の間隔
property elapsed_Time : 0 --前回保存時よりの経過時間

on idle
my watch_ill()

return idle_Time
end idle


on watch_ill()
try
do shell script "ps cx | grep Illustrator"

if wait_Time * minutes - idle_Time is less than or equal to elapsed_Time then
my main()
set elapsed_Time to 0
end if

on error
quit --Illustratorが起動していない場合は終了
end try

set elapsed_Time to elapsed_Time + idle_Time

end watch_ill


on main()
tell application "Adobe Illustrator"
if (count of document) is not 0 then
set flg_doc to false
tell current document
set doc_name to name
try
set doc_path to file path
set doc_path to (POSIX path of doc_path) as POSIX file
tell application "Finder" to set parent_Folder to parent of (doc_path as alias) as Unicode text

set flg_doc to true
on error
display dialog "一度も保存されていないようです" buttons " OK " default button 1
return
end try
end tell

if modified of current document is true then

my doc_save(doc_path)

if flg_doc then
my doc_copy(parent_Folder, doc_path, doc_name)
end if

end if
end if
end tell
end main


on doc_save(doc_path)
tell application "Adobe Illustrator"
save current document in file doc_path as Illustrator with options {class:Illustrator save options, PDF compatible:false}
--PDF互換にするにはPDF compatible:falseをtrueにする
end tell
end doc_save


on doc_copy(parent_Folder, doc_path, doc_name)
set p_parent_Folder to POSIX path of parent_Folder
set p_doc_path to POSIX path of doc_path

set new_doc_path to p_parent_Folder & "_version/" & my Delimiters(doc_name, ".ai", "_" & my DateToString() & ".ai")

set shellcmd to "cp -p " & quoted form of p_doc_path & " " & quoted form of new_doc_path
--display dialog shellcmd
try
do shell script shellcmd
on error
my make_folder(parent_Folder, doc_path, doc_name)
end try
end doc_copy


on make_folder(parent_Folder, doc_path, doc_name)
tell application "Finder" to make new folder at (parent_Folder as alias) with properties {name:"_version"}
my doc_copy(parent_Folder, doc_path, doc_name)
end make_folder


on Delimiters(theText, serchStr, replaceStr)
set OriginalDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to serchStr
set theText to text items of theText
set AppleScript's text item delimiters to replaceStr
set theText to theText as string
set AppleScript's text item delimiters to OriginalDelimiters
return theText
end Delimiters


on DateToString()
set todayStr to do shell script "date '+%m%d_%k%M'" --秒を追加する時はMのあとに%Sを追加
return (todayStr)
end DateToString




※注意
前回同様、保存という処理の性質上、元に戻せません。ご使用の際には充分な検証をなさった上でご利用下さい。
よくいわれる"At your own risk"でお願いします。
Script処理がはじまった時に、アクティブ(最前面)なファイルに対して保存を行いますので、他のファイルからパーツだけ欲しいという場合等は複製を開いた方がよいでしょう。



最後に
CS3を使う場合には10.4で作業していたため、上位のバージョンのOSでは確認した事がありませんでした。
南部さん、ご報告ありがとうございました。
スポンサーサイト

テーマ:ソフトウェア - ジャンル:コンピュータ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。