「shag」のこと

えー、長く携わっておきながら自分のblogでは一切触れていなかった「shag」について、
現状とこれからのことをお話します。

「shag」計画は、中綴千頁さん作「仕上げ屋」を原型とする模倣品を制作とする物でした。
当時、本家のほうはInDesignのバージョン対応を兼ねた新バージョンがリリース目前、調整中といった様子のまま長らく動きを見せておらず、主要機能の模造を依頼されたときは業界の需要を感じ、なんとかかんとか形にしてリリースしました。
これがshagバージョン0.46です。

このあと、幾人かの開発協力を得てshagは機能を増やし、精度と信頼性を上げていきました。
当時のウチはコレを実務で大いに活用していたので、有用と思われる機能の発案はとどめるところを知らず。できるかできないかは後で考えるといった体で次第にパレットは肥大化していきました。ハリボテですけど。
それでいて操作性はそれなりのわかりやすさであったと自負していますが…
作り始めた当初、ここまで巨大なスクリプトになるとは思わず、ついついダラッとした設計をしてしまい、後でものすごく苦しむ事になりましたが。

といった流れでみちみちと完成に近付いていってたのですが。
が。
2014年夏、身辺に変化が起こりました。転職というやつです。
これにより、実務での実用・テストの機会を失いました。
加えて、アイドル歌手という職業に於けるタイトなスケジュール管理の下での開発時間捻出は非常に困難となりました。
ウチだけでなく主要開発陣についても同様の変化があったようです。
みんな忙しすぎて身動きが取れないのです。仕事の単価は下がる一方です。

そうしてほぼ2年が過ぎまして。
フリー版としてリリースした物に含まれていない機能は2つ。
処理範囲指定とフィルタリング。
処理範囲指定は完成しております。
画像の種類でふるい分けするフィルタリング機能は、脳内では完成しておりましたが手つかずに終わりました。
拙作「SelectionExpander.jsx」のソースを応用すれば雑作もない事ではあったのですが。

以上で「shag」計画はひとまずの区切りをつける形となりました。

今後のこと

正直なところ、当時の自分が書いたコードを今の自分が見て思った事は
「ぜんぜんわからん」、「ぐちゃぐちゃだなあ」、「見たくないなあ」です。
しかし根幹から書き直す時間的余裕はありません。
今後ですが、
・実装予定で結局実装しなかった機能のコントロールを削除(トルツメ)
・いずれ公開しようとしていたPro版にのみ搭載していた機能(ページ範囲指定など)を有効化
を整えた物を最終版として公開、以後はサポート作業のみ
という事で開発陣一同、手打ちとなりました。
それへの着手もいつになるかさっぱり見えないのですが。。

以上、さえない状況報告でした。

Facebooktwittergoogle_plus

タイトル考えてなかったけどInDesignでスクリプト覚えましょうそうしましょう(日)

どもども。ども。

前回の反響、ひとことで言うと「おー、やったー! なんかわかりそうな気がする(けどわからん)!」
手前勝手に書き殴ったスクリプトを一行ずつ解説しても、全体がなんでそんなカタチなのかを省いているため、あんまりお役に立ててなかったかもっぽいですなあ。
「スクリプト拾ってきたぜ、ちょっといじりたいぜ、でも何が書かれてるのかサッパリなんだぜ」
というときの読み解きのヒントになれば、とも思ったのですが。
手作業的思考とスクリプト的思考の垣根をとっぱらうのを先にやるべきなのでしょう。

奇しくも前回の次にやろうとした「縦組みにも対応させよう」は、実はもともと対応できちゃっててコケたため、
また、「回転のかかったテキストフレームへの対応」はあまりにもニッチすぎる上、ふつうに書ける人向けになってしまうので、今回はその「手作業ではこうだけどスクリプトではどうなの」をやります。resolve( )の出番は今度だ。。


今回もInDesignをダシに進めていきます。
例はCS6でやりますが、CS4以降ならなんでもいいです。CS3以前は今回ごめんなさい。

まず、InDesignを起動します。
対応バージョンのExtendScriptToolKit(以下ESTK)を起動します。
ESTKで「新規Javascript」を開きます。
新規書類「ソース1」が出ました。やったー。
160502a

今回はInDesign用のスクリプトを書くので、左上の対象アプリケーションをInDesignにします。
これで、ESTK上からスクリプトを実行するとInDesignを対象とすることができます。
冒頭の行に
#target indesign
と書いて実行してもも同様の結果なんですけど、まあ地味に基本からということで。。

また、右上のメニューから当該バージョンのInDesignを選択しておくと、オブジェクト名の入力補助が行われます。これ、挙動の遅さに我慢できない人もいると思うので、まあ任意で。
160502b

ではこの中にスクリプトを書いていきます。


まずは以下の一行だけ。書いたらすぐ実行してみましょう。
app.documents.add( );
実行すると新規ドキュメントが開かれます。
前回っぽく言うと、InDesignのドキュメントコレクションに要素を1つ追加しています。

理解を深めるため、確認を兼ねてちょっと書き足します。
開かれているInDesign上の新規ドキュメントは閉じちゃっていいですが、どっちでもいいです。


function pepsi ( ) {
alert (app.documents.length);
}

pepsi ( );
app.documents.add ( );
pepsi ( );


はいいきなり出しましたけど関数。Documentsのアイテム数をアラートで参照するという内容。
別々のところで計2回やる処理なので、わざとらしく関数化してみました。
pepsi( )と書いた行でalert(app.documents.length); が実行されます。
ドキュメントを追加、その前後でドキュメントの個数を確認、という内容です。


次に、新規ドキュメントの中に、なんとなく長方形を作ってみましょう。
開かれているInDesign上の新規ドキュメントは閉じちゃっていいですが、どっちでもいいです。

app.documents.add( );
app.documents[0].rectangles.add( );

一行目は最初に書いた物と同じ、新規ドキュメントを開きます。
二行目で、Documentsコレクションの0番目のアイテム(最前面ドキュメント)に長方形追加しています。
Rectangleは長方形オブジェクト。正方形でも長方形オブジェクトとなります。
この長方形は今のところ「長方形こしらえます」しか書いていないので、位置やサイズはてきとうになりますが、今回はそこまでやりません。
この長方形ができたドキュメント、次でも使うのでそのままにしといてください。


次、この長方形を削除してみましょう。
の前に、手作業だとどういう手段になるでしょうか。
・選択してdeleteキー
・選択してメニュー 編集>消去
とかでしょうか。なんにせよ選択は必須ですか。

スクリプトではこうなりますか。
ドキュメント0個目の、長方形0個目を、削除するスクリプト
app.documents[0].rectangles[0].remove( );
このように、ひとつのオブジェクトを処理するために、そのオブジェクトが何の中の、そのまた何の中にあるのか、を書かなければいけません。
めんどくさいでしょうか。まどろっこしいでしょうか。でも選択してなくても削除できるんですよこれ。わーすごーい。


もうひとつ。今度はあらかじめ手作業で、前面ドキュメント上に楕円形を1個作成しといてください。
まんまるじゃない方がいいです。
160502c

では、これを20°回転する、1行のスクリプトを書いてみましょう。
app.activeDocument.ovals[0].rotationAngle = app.activeDocument.ovals[0].rotationAngle + 20;

app.activeDocumentは、ドキュメントが何個あっても関係なく、最前面ドキュメントの事。
app.documents[0]と大差ないんですが、2個以上のドキュメントをとっかえひっかえ処理する場合以外はもうコレの方が間違いないかと。
Ovalは楕円形。まんまるでも楕円形オブジェクトとなります。
rotationAngle は、図形オブジェクトクラスが持っている回転角の値。これをプロパティといいます。用語の使用は極力避けて進めてますが、これは覚えましょう。「お前の回転角は、お前の回転角+20だわよ」と書いたわけです。決して「お前、20°回転しろ」ではないので注意。プロパティはオブジェクトの状態を表す物、という覚え方でいいんでないかなあ。命令というよりは指定、というか。ふんわり進行ですけども。
160502d

このスクリプトは、こう書くこともできます。同じ意味となります。
app.activeDocument.ovals[0].rotationAngle += 20;
この「+=」の仲間については「代入演算子」で調べるとよいです。


仮にこの楕円形を何度も何度も処理する場合、いちいち
app.activeDocument.ovals[0].rotationAngle
と書くと、書く方も読む方も疲れるので(実行する方は疲れませんが)、変数に入れてしまうとよいです。
var obj = app.activeDocument.ovals[0];
obj.rotationAngle += 20;
これで変数objを楕円形オブジェクトとして扱うことができます。

ただし、こう書くと具合が違います。
var obj = app.activeDocument.ovals[0].rotationAngle;
obj += 20;
この場合、変数objには楕円形の回転角のがなんでもないひとつの数値として代入されるだけで、いくらobjの値を変えても楕円形はビクともしません
プロパティには書き換え可能な物と読み取り専用の物があります。どれがどれなのかはオブジェクトモデルビューア(後述)を参照します。


次。引き続き、楕円形のあるドキュメントを流用します。
前面ドキュメントの0個目の楕円形をX方向に10、Y方向に20の位置に複製するスクリプト
var obj = app.activeDocument.ovals[0];
obj.duplicate (“”, [1020] );
書いたら何度か繰り返し実行してみましょう。

前述のプロパティが「お前の◯◯は◯◯だ」的な内容だったのに対し、こちらは「お前、◯◯しろ」となります。メソッド(関数)といいます。
複製されたオブジェクトは元オブジェクトの前面に作成されるので、次回実行時はその複製された楕円形が0個目として処理対象となり、結果、実行するたびずんずん右下に複製されていきます。
160502e

プロパティが状態を表す物なら、メソッドは命令そのものです。おけつに( )が必ずつきます。( )内に「どのぐらい」、「何を」といった引数が必要な物と不要な物があります。


対象オブジェクトのプロパティを見たり書き換えたり、メソッドを実行したりすることが「スクリプトで処理する」ということです。突き詰めればこれだけなのですわ。。
ある程度構文が書けるようになると、今度はその当該プロパティ探しで苦戦する事となります。間違いない。
twitter上で「おーけー流星号、◯◯のプロパティ教えて」と書くと30秒ほどで教えてもらえるという都市伝説があります。


プロパティ(メソッド)のさがしかた(日)

ESTKのヘルプメニューから「オブジェクトモデルビューア」を開きます。
過去に小さな勉強会で配布した資料よりスクショ引用。
160502f

でアプリケーションを選択すると、にそのアプリケーションで使えるクラス(オブジェクト)がだーっと出ます。そこから1つ選ぶと、
次は、まあおいといて(てきとうてきとう)
で選んだクラスが持つプロパティ、メソッドなどがだーっと出ます。そこから1つ選ぶと
にその説明やデータ型などが英語で出る、という仕組みです。英語だいすき(白目)
青の「=X」アイコンがプロパティ、赤の「{}」アイコンがメソッドです。
には、プロパティは「名前:データ型」、メソッドは「名前:返り値のデータ型」として書かれています。
任意のテキストフレームからストーリーをいじりたいと思ったら、textFrame.parentStoryと書くと辿りつけるわけです。
それでまたからStoryクラスを選んで…という。七面鳥くさいですか。ですね。


プロパティ(メソッド)のさがしかた(月)

スクリプトを書きます。プロパティを見たいオブジェクトをてきとうに変数に入れておきます。
長方形かなんか、てきとうに選択しといてください。
var a = app.selection[0];
alert(“うんこうんこうんこ”);
この2行ぶんを書いたら、2行目の行番号の脇の空いたところをカチします。赤丸がつきます。
これをブレークポイントといいます。赤丸がある行を実行する直前でスクリプトは一時停止されます。
あとで用済みになった赤丸はカチカチすると消えます。茶丸もあるんですが今回は割愛。
赤丸をつけるかわりに
$.bp( );
と書いても一時停止できるんですけど、これも今回は割愛。
160502g

行が黄色くなったらそこで一時停止中です。ここでウィンドウメニューからデータブラウザを出してみましょう。
変数aが上の方にいます。aのオブジェクトクラス名が見えますね。
これの▶︎を展開すると、aの持つプロパティやメソッドがだーっと見れます。
160502h

この中でどれかプロパティを選択すると、データブラウザの一番上にある欄に値が出ます。ここで値を書き換えるとじかにそのプロパティの値を変更できるのですが、近年バージョン(特にIllustrator)はレスポンスがイマイチ不安なので覚えなくていいです。
その代わりに、ウィンドウメニューからJavaScriptコンソールを出します。ここに式を書いてreturnすると結果が出ます。
1 + 1 と書いてreturnバシすると「結果:2」が返ります。もう電卓いらない!
長方形を選択している状態で、
a.rotationAngle と打ち込んでreturnしてみると、長方形の回転角が結果として出ます。
↑この行にまたカーソルを送り、後ろに続けて
+= 20 と打ち込んでreturnしてみると、長方形が+20°回転します。ドキュメント上ですぐには反映しないかも。
160502i「ソース1」ウィンドウの実行ボタン(再生ボタンっぽいやつ)を押すと処理は続行され、スクリプトは終了します。
停止ボタンはその時点で処理を中断終了します。
終了後、ドキュメント上ではオブジェクトが回転されているかと思います。


プロパティにはそれぞれ固有のデータ型があります。上で紹介した2通りのどちらでも確認することができます。
たいがいは数値(整数限定の場合あり)や文字列ですが、固有オブジェクトの場合もあります。
長方形の属性を見てみましょう。オブジェクトメニュー>オブジェクトの属性 で見れるやつです。
JavaScriptコンソールに以下を入力して実行
a.contentType
ウチは空のグラフィックフレームを作ったので、結果はGRAPHIC_TYPE と出ました。
バージョンによっては、よくわからん10ケタの数字が出るかもしれません。が今回は割愛。
160502j
試しにこれをテキストフレームに変換してみましょう。
オブジェクトモデルビューアでRectangleクラスを選択、contentTypeプロパティを見ると、contentTypeプロパティのデータ型はContentTypeクラスだぜ、と表示されております。
160502k

右ペインの青文字になったContentTypeをカチすると、ContentTypeクラスのオブジェクトモデルを見ることができます。
するとプロパティが3種。グラフィックフレーム、テキストフレーム、割り当てなし。 ソース1を終了して、以下を書き足します。
a.contentType = ContentType.TEXT_TYPE;
ここ、a.contentType = TEXT_TYPE; とはならないので注意。とりゃえず、「だってそうなんだもん」として覚えておきましょう。
実行すると長方形はテキストフレームに変わります。スクショありません。



まとめ(無理矢理)
・したい処理の対象になるプロパティ、メソッドを探す
・見つけたらデータ型を確認する
・データ型を確認したらプロパティの値を書き換える

ここまでざっくりでも理解できたら、あとはやる気だけっすわ。ほんとに。
次回、実際にスクリプトをゼロから書くぜって時のウチなりの組み立て方などを。

でーす。

Facebooktwittergoogle_plus

対象が小さいと挙動が変わっちゃってしまっちゃう操作

どもども。だんだん老害芸めいてきてますけども。

アプリケーションを操作してて、結果が一意でないモノが少し見つかったのでメモっときます。
最近たまたま見つけた分だけなので他にもきっとあるんでしょうけど、
この記事に随時追加するほどはマメではないので、読み捨てといてください。


事例その(日)

Illustratorで長方形を置いてみます。
挙動がわかりやすいように左上をアートボードのカドに合わせてあります。
160216a

バウンディングボックスで下辺をつまんで、上方向にきゅーっと縮めます。
すると。
バウンディンスボックスが少し外側につき直ります。はあ。
160216b

 

再度、下辺をつまんで、今度は下方向ににゅーっと伸ばします。
すると。どうだ。
(自堕落スクショの関係で一時的にShift押したせいでフレームがヨコにも伸びてますが許す)
160216c

表示の都合でひとまわり外側についていたバウンディングボックスがそのまま基準になって変形が行われてしまい、上辺が元の座標から大きくズレてしまう結果に。
160216d

この件、わけがわからなくてTwitterで数名様に確かめていただいたところ、
オブジェクトのサイズそのものは関係なくて、ドキュメントの画面上の表示が小さいときにこうなってしまうみたい。
バウンディングボックスのつまみポイント(なんていうの、カドとか辺の中央にある玉っこ)
が重なって潰れないようにとの施策と思われます。
PhotoshopとInDesignでは起こりませんでした。
なんか、どうでもいい箇所がどうでもいいなりにけっこうズレる事があるなあと思ってたらコレのせいだったようで。。
寸法がきっちりしてないといけない作業は基本的に値入力してるから、いいっちゃいいんですけども。
おおこわい。


 

事例その(月)

InDesignのパスファインダーパネルのヤンチャな一番手「パスの結合」
今度はこいつ。
160216e

InDesignでオープンパスを用意します。
人に頼まれてタダでトレースしてやったやつの流用ですけども。
160216f

オープンパスを選択して「パスの結合」ボタンをカチ。
えー、パスが閉じます。
160216g

今度は絵柄をめっさ縮小してから同じことします。
すると挙動が変わる。パスの座標が平均化される。
160216h

こちらは最初のイラスターの事例と違い、パス間の距離によって変わるみたい。
ちまちま試したところ、2.2166mm以下だと平均化されるようで。

しかし。
「パスの結合」ボタンの2つお隣に「パスを閉じる」ボタンというのがありまして。
機能はというと、まんま、オープンパスを閉じる物。機能がかぶってる。
ともすると、オブジェクトが小さい時の挙動がむしろ正常なんでしょうかね。
InDesign上でパスいじりもメッタにしないけど、覚えておきます(自己完結)。

にしても、
一体どっちが正しいんだろうと思ってオンラインヘルプ見たけど書いてませんでした。
期待はしてなかった。
それはそれでまたよくわからん文章が。

Adobe Community Help InDesign / パスの編集

以下引用:

InDesign では、パスファインダーパネルを使ってパスを結合することもできます。 オープンパスのパスを閉じるには、選択ツールを使用してパスを選択してから、パスファインダーパネルの「パスを閉じる」をクリックします。2 つのパスの間の終点を閉じるには、パスを選択してから「パスの結合」をクリックします。「パスの結合」を 2 回クリックすると、2 つ目の終点を結合します。

2回クリック…とな。
なんかわからんけど、やってみましょうか。
オープンパスを2つ用意。
160216i

「パスの結合」ボタンを、
1回、
160216j

2回。
ほうほうなるほど。
160216k

…でもこれ、ほんとに終点なの? と疑問に思ったら、どうも違う。
2つのオープンパスの端点のいちばん近いものが結合する仕様みたい。
始点も終点も関係ない。
160216l

ズラしてみたらこのザマだよ。
うそつきめー。

というわけです。クセを理解してうまく使ってやりましょう。
仮にバグだとしてもどうせ報告しても直りゃせんです。何度も報告したさ。
「うんー、わかったー、今度ゆっとくー」しか言われないしね。むかむか。
個人情報漏らされようがシステムに悪さするアップデートがあろうがついていくしかないんです。
アホビめー。

ですー。
あ、今回はスクリプトありません(最後に言うやつ)

 

Facebooktwittergoogle_plus

Adobe Add-onsのユーザー評価に気を付けないで!

ちょっとイヤンな出来事があったので、
皆様に同じく吠え面をかいてもらおうと思い、
やり方を記録しておきますね。

皆様、Adobe IDお持ちですよね。
まだの人は今すぐ取ってきてください。

Adobe ID の作成方法

Adobe IDができたら、フォーラムなどに書き込んでみましょう。

アドビ ジャパンフォーラム

書き込みましたか? まだ? 早くやれよもう。

書き込んだら、自分の投稿を見てみましょう。
そこにはスクリーンネームではなく製品登録時に入力した実名が見えており、
ぎょぎょっとしますが、これは自分にしか見えていないやつです。
他のユーザからは、ちゃんとスクリーンネームで見えていますのでご安心。
でも他人に画面を覗き込まれた時、ちょっとつらい。いやけっこうつらい。

次に、Add-onsを見に行きましょう。

Adobe Add-ons

本題はココです。
ここには便利なエクステンション(プラグイン)がたくさんあります。
ありがたいことです。
インストールしたら、ぜひユーザー評価を入れてさしあげましょう。
てな感じで、ウチは知人の作品にサクラのつもりで好評価レビューを入れました。
皆様もぜひそうしましょう。

後日、制作者様より連絡を頂きました。
「***(ウチの実名)って誰?」
蒼白。

Adobe IDのプロフィール編集画面に入り確認したんですが、
個人情報に絡む欄はほぼ全て非公表になっておりました。
まるで意味がわからない。

バグである、との噂を聞きつけ、Adobeサポートにメール。
…のつもりが送信フォームやサポート受け付けメールアドレスまで辿り着けなかったので
チャットサポートというやつで問い合わせてみました。

確認作業として長らく待たされたあと、結論としては「仕様です」
まさかの。
「評価のとき『匿名』にチェックを入れなかったから名前が出たわけだガハハ」
と言われました。
え、ちょ、でもスクリーンネームじゃなくて実名でちゃうのこれ。。

改めてレビュー投稿画面。

151215

ここに、「匿名」というチェックが確かにあります
ふと下の方の投稿済みのものを見ると、投稿者名に匿名さんいらっしゃいますね。
えー、ここは恩着せがましくいきたいところですよねえ。
この私が褒めてやってるんだぜ、とか。
知人の作品ならなおのこと。
で、当時のウチは恩着せがましく「匿名」チェックは入れないままレビューを入れたみたいです。
はい、ここが吠え面ポイントです。皆様もぜひ。

しかし、匿名希望じゃないからってイキナリ実名を出されては…
この「匿名」とだけ書かれたチェックボックスでそこまで想像できる人いると思う?
みたいな事を「どうお考えでしょうか?」と問いかけてみたところ、
「ご指摘の件については上申させていただきます
…この「うんうん、わかったー。ゆっとくゆっとくー」という返答が来た場合、
まず改善はないものとみておいたほうが後々ガッカリしなくて済みます。。

※2015.12.28 追記:
あとで記憶が蘇ってきたですが、投稿直後、自分でも実名での投稿後画面を確認していました。
しかしフォーラムの仕様にのっとり、他人にはスクリーンネームで見えているのだろう、
という薄い根拠のままヨシとしたのでした。ここが罠。

 

というわけで、
皆様もさあ、レッツ吠え面!

ですー。

Facebooktwittergoogle_plus