OmniGraffle用キャンバス書き出しスクリプト

私はLaTeXの文書に用いる図を OmniGraffle というMac OS X用のソフトウェアで作成しています.このソフトウェアにはおおむね満足していますが,キャンバスという機能を多用しているとEPSやPDFへの書き出し作業が少々面倒だと感じていました.その手間を解消するスクリプトAppleScriptで書いてみたところ,かなり便利になったと感じたのでここに紹介します.

このスクリプトで何ができるのか

OmniGraffleではひとつのファイルに複数のキャンバスを作ることができます.キャンバスとは独立したページのようなもので,バージョン4のProfessional版で導入され,現行のバージョン5では通常版でも利用できるようになっています.

キャンバスには好きな名前を付けることができます.ここに "foo", "bar", "baz" という名前のついた3つのキャンバスをもつ fig.graffle というOmniGraffleファイルがあるとします.ここで紹介するスクリプトを使うと,各キャンバスの内容をそれぞれ fig_foo.pdf, fig_bar.pdf, fig_baz.pdf というファイルに1回の操作(メニューからスクリプトを選んで起動するだけ)で書き出すことができます.PDF以外の形式,例えばEPSやPNGで書き出すようにするのも容易です.

このスクリプトを作るまでは,書き出しの際に以下に説明するような手間がかかっていました.

キャンバスは便利だが,書き出しが面倒

キャンバスの利用方法にはいろいろあると思いますが,私は図ごとにキャンバスを作り,関連した複数の図を1つのファイルにまとめるようにしています.類似・関連した図を多用するとき,こうすることで編集作業が大変楽になります.特にキャンバス間でレイヤーを共有する機能(Professional版のみですが)は非常に便利で,教科書の原稿を書くときに重宝しました.

さて,各キャンバスに描いた図をLaTeX文書で使うためには,PDFやEPSなどのファイルとして図ごとに書き出す必要があります. OmniGraffleではキャンバス毎に書き出しができますが,それぞれ異なるファイル名を付けようとすると以下のような作業が必要になります.

  1. 書き出しダイアログで書き出し先のファイル名を指定します.このときデフォルトの書き出し先が表示されるのですが,これが毎回同じ(オリジナルの.graffleファイルと同じ)名前になっています.したがってキャンバスを書き出す度にファイル名を指定し直さなければなりません.
  2. 書き出し先ファイルが既に存在していると,上書きを注意するダイアログが表示されます.このダイアログでは,上書きを実行したいときはポインティングデバイスを使ってボタンを押さなければなりません.

些細な作業ですが,図を手直ししつつLaTeXにかけて様子を見たい場合,上の1,2を繰り返すことになりなかなか面倒です.以上を自動化することで,少しでも作業を楽にしたいと思ったのでした.

キャンバス書き出しスクリプト(その1)

このスクリプトを起動すると,OmniGraffleで現在選択しているキャンバスの内容をPDFで書き出します.fileExt の値を ".eps" や ".png" 等に変更すればそれぞれの形式で書き出します.ファイル名は.graffleファイルの名前とキャンバス名を "_" でつないだものになりますが,useDocName の値を false にするとキャンバス名のみになります.キャンバスには自分で好きな名前を付けることができるので,適切な名前を付けると良いでしょう.書き出し先は.graffleファイルと同じフォルダです.また,ファイルを上書きする際の確認ダイアログは出ません.

property fileExt : ".pdf"
property useDocName : true
property docNameSep : "_"

on run
	tell application "OmniGraffle Professional 5"
		set doc to first document
		set dpath to path of doc as POSIX file as alias
		tell application "Finder" to set ofolder to POSIX path of (folder of dpath as alias)
		set prefix to mkPrefix(doc) of me
		set cname to name of canvas of first window as text
		set ofile to (ofolder & prefix & cname & fileExt) as POSIX file as text
		save doc in file ofile
	end tell
end run

on mkPrefix(doc)
	set prefix to ""
	if useDocName then
		set dname to name of doc
		if dname ends with ".graffle" then
			set dname to text 1 thru -9 of dname
		end if
		set prefix to dname & docNameSep
	end if
	return prefix
end mkPrefix

キャンバス書き出しスクリプト(その2)

次のスクリプトは,ファイルに含まれる全キャンバスを一度に書き出すものです.書き出し先のファイル名などは上のスクリプトと同じです.

property fileExt : ".pdf"
property useDocName : true
property docNameSep : "_"

on run
	tell application "OmniGraffle Professional 5"
		set currentCanvas to canvas of first window
		set doc to first document
		set dpath to path of doc as POSIX file as alias
		tell application "Finder" to set ofolder to POSIX path of (folder of dpath as alias)
		set prefix to mkPrefix(doc) of me
		repeat with cvs in canvases of doc
			set cname to name of cvs as text
			set ofile to (ofolder & prefix & cname & fileExt) as POSIX file as text
			set canvas of first window to cvs
			save doc in file ofile
		end repeat
		set canvas of first window to currentCanvas
	end tell
end run

on mkPrefix(doc)
	set prefix to ""
	if useDocName then
		set dname to name of doc
		if dname ends with ".graffle" then
			set dname to text 1 thru -9 of dname
		end if
		set prefix to dname & docNameSep
	end if
	return prefix
end mkPrefix

おわりに

以上のスクリプトを書いたのは少し前なのですが,個人的にはそれ以来OmniGraffleでの作業が非常に楽になりました.キャンバスに名前を付けて,それを書き出し先のファイル名とすることを前提としているので,そうでない使い方には合わないと思います.私はこれらのスクリプトスクリプトメニューから起動できるようにしています.QuickSilverからも起動できています.多少手直しが必要ですが,ドロップレットにしたり osascript コマンドで起動するようにしてもよいでしょう.

スクリプトの作成にあたり,次の記事を参考にさせていただきました.

AppleScriptの使用方法全般については次が参考になります.