オブジェクトモデルについて

今回の投稿もAdobe Max Japan2018にて私が担当したワークショップ「使わないと損をする! Illustrator & InDesignのScript活用講座 〜あれもこれも便利になります〜」のフォーローアップエントリーとなります。
Workshopではオブジェクトモデルについて概要的な解説を行いました。今回はこのオブジェクトモデルについて少し掘り下げたいと思います。

オブジェクト・モデルとは

ここで言うオブジェクトモデルとは、主にドキュメントの構造とスクリプトやプログラミング言語を接続するものです。
スクリプト等のプログラミング言語から見ると、IllustratorやInDesignではドキュメントやそこに作られているテキストフレームや図形等をオブジェクトという単位で扱います。これらのオブジェクトはデータ構造を論理的なツリーで表現します。ツリーのそれぞれの枝はノードで終わっており、それぞれのノードがオブジェクトを含んでいます。
各アプリケーションのスクリプトからはメソッドを利用してプログラム的にオブジェクト・ツリーにアクセス可能で、ドキュメント構造やスタイル、コンテンツを変更することができます。
と、書くと非常に難解だと思われてしまいます。しかし、このオブジェクトツリーというものはIllustratorやInDesignを日常的に操作している方はほとんど無意識に把握されているものです。
例えばIllustrator上でドキュメントをひとつ開いてそこにテキストフレームを一つ追加した場合を考えてみます。

スクリーンショット 2018-12-04 11.45.39
このテキストフレームは作業中のドキュメント上に配置されている事になります。そして、そのドキュメントはIllustratorアプリケーションのドキュメントである事をわたしたちは知っています。
これを逆から見てみると

Illustratorアプリケーションのドキュメントのテキストフレーム

という構造が既に存在していることに気がつくでしょう。これがオブジェクトモデルの基本構造なのです。手作業であろうとスクリプトであろうと、わたしたちはこの構造の中でデータを構築しているに過ぎないのです。
さて、先程「作業中のドキュメント」という書き方をしましたが、ドキュメント自体はレイヤーやアートボードと同様に配列として扱われることはワークショップでも述べました。今、アプリケーション自体で開かれているドキュメントは一つだけです。この状態をスクリプトで参照すると

app.documents[0]

アプリケーション上の0番目のドキュメントとなります。しかし、開いているドキュメントが複数になった場合、この記述ではスクリプトから作業中のドキュメントを特定することが出来ません。

スクリーンショット 2018-12-04 11.46.09
そのために用意されているのが作業中のドキュメントを参照するための

app.activeDocument

という記述です。アプリケーション上でアクティブ(作業中)なドキュメントという記述になります。この書き方はスクリプト操作における基本となります。
まあ、手作業の時も何番目のドキュメントをどうこうするより作業中のドキュメントにナニカする場合が大半ですよね。

さて、ここまでオブジェクトモデルの基本的な部分を見てきました。しかし、大事なものがもうひとつあります。日頃の作業ではマウスでつついたり、ドラッグして囲ったりしたものに対して色を変えたり、移動したり、拡大したりといった作業を延々と行います。そうです、選択範囲というやつです。これもお約束のような書き方があります。

app.selection

これはアプリケーション上で選択されているオブジェクト達を意味します。selectionと単数形なのですが、達です。複数を含みます。これは選択範囲のオブジェクト自体が複数あるケースが存在するためです。ですからこのselectionは配列となっています。それではよく使われる記述を見てみましょう。

app.selection[0]

この記述は「アプリケーション上で選択されている0番目」のオブジェクトを意味します。

スクリーンショット 2018-12-04 11.45.39

ですから上のようにテキストフレームが一つだけ選択されている状態で、テキストの内容を読み出したい場合は

alert(app.selection[0].contents);

アプリケーションの選択範囲の0番目のコンテンツ」このように記述します。

Adobe社のDTP系のスクリプトはほとんどがこのapp.selection[0]という記述で選択範囲の0番目のオブジェクトを操作することが可能です。

 

各オブジェクトのプロパティ

各オブジェクトにはプロパティと呼ばれる値が含まれます。例えばテキストフレームであれば

スクリーンショット 2018-12-07 10.39.10
上に示したものは簡易プロパティ表示エクステンションのPropertyViewerでの検索結果です。このエクステンションは選択範囲の0番目のオブジェクトのプロパティを現在値と共に表示するものです。ここに見えているcontentsプロパティにアクセスするには、

スクリーンショット 2018-12-04 12.07.13
上に示すようにapp.selection[0]に「.」を挟んでcontentプロパティ名を接続します。

構造を記述してみると「アプリケーションの作業中のドキュメントの選択範囲の0番目のコンテンツ」という具合になります。
日頃少しだけこういった構造を意識して手作業をしてみるとオブジェクトモデルツリーへの理解度が格段に上がります。そして訓練次第ではオブジェクトモデルを頭の中で再現できるようになったりします。

 

最後に

しかしながらオブジェクトモデルはアプリケーションが複雑であるほど難解になる傾向があります。そういったものをトレースするのはとても骨の折れる作業となりかねませんのでESTKのオブジェクトモデルビュアーを利用するのが基本となります。

InDesignはオブジェクトツリーが複雑なのでおーまち先生のページhttp://indesign.cs5.xyz/dom/about.html

を参照するのもよいかと思います。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中