M.C.P.C.

―むり・くり―プラスコミュニケーション


« 2008年9月 | トップページ | 2008年11月 »

2008.10.31

Webブラウザの$関数とAdobeアプリの$オブジェクトは違うのだ

InDesign - JavaScript小技 - 名もないテクノ手 [d.hatena.ne.jp]

OSとバージョンを得る
var my_fileSys = $.os;

うちの環境だと "Macintosh OS 10.5.5"と返ります。JSTG p.198

やってみた。


▲$.osをコンソールで入力してEnter

なるほど、$はHelper Objectといって、ビルトインなオブジェクトなんですね。

MacIE5のWebばっかりやっていたもので、$はスクリプトの最初で

function $(id){ return document.getElementById(id); }

をおまじないのごとく唱えるものと思い込んでいました。

あと、この手のことはJavaScript Tool Guideを参照すればいいのですね。

[PDF] JAVASCRIPT TOOLS GUIDE : p.199 [www.adobe.com]

せうぞーさん、ありがとうございました!

[Script] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.30

InDesignでHTTPのUser-Agent文字列を作るにはどうしたらいいの?

InDesignでSocketクラスの上位クラスを作りHTTPでアクセス - CLの日記 [d.hatena.ne.jp]

this.userAgent = 'InDesign/5.0.3 '
+'(Windows; U; Windows NT 6.0; ja;)';

[22171] platform/indesign/javascript: indesign用iCalendar利用カレンダー。ファーストリリース。 [coderepos.org]

function Lwp() { 
  // コンストラクタ。ここでUser-Agent名や
  // timeout値など準備しておくといいよね
  this.userAgent = "InDesign/" + app.version +" "
  +'(Windows; U; Windows NT 6.0; ja;)';
};

[22215] platform/indesign/javascript: ユーザエージェント文字列でInDesignというのを、app.nameで生成させることにした。 [coderepos.org]

function Lwp() {
  // コンストラクタ。ここでUser-Agent名や
  // timeout値など準備しておくといいよね
  this.userAgent = app.name + "/" + app.version + " "
  + "(Windows; U; Windows NT 6.0; ja;)";
};

ここまで来た。あとは、InDesignのJavaScriptでプラットフォーム名(WindowsとかMacintoshとか)が得られるといいのだけれども、どうやるんだろう?

[DTP] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.29

Edyしかない

きのう買い物してレジで金払おうと思ったら1000円しか無くて、なんでそんなに財布の中が空っぽになったかなーと思ったら、先週調子こいてEdyに10000円チャージしたあと夜の街に出たら会社の先輩がいてそのままずるずるお店回ってその分支払うことになって、あっという間に無くなっていってしまっていたのでした。

ここら辺でEdy使える店はサークルKかローソンしかないので、晩飯をローソンで買うことにしましたが、ローソンといえば僕にとって食べたあと吐き気を催すお弁当ばかり売っているという印象があるのですが、さすがに最近は変わっているだろうと思ってローソンで買って食ったら吐き気がしました。

給料日まではサークルKにします。

[日記・コラム・つぶやき] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.28

IllustratorのJavaScriptでItemをまとめて操作するItemManagerクラスを作り、XY方向連続複製スクリプトを作る

IllustratorのJavaScriptで面付けしろっていうミッション。おそらくどっか見たら複数のItemを一気に操作する方法ありそうだけれども(GoogleMapsですらGMarkerクラスのオブジェクトをまとめて扱うGMarkerManagerクラスがあった)、ここはJavaScriptだからItemをまとめて操作するクラスItemManagerクラスを自分で作るのがおもしろそうだと思って、やってみました。

Filename: multiplecopy.jsx

(function(){
  // ItemManagerクラス(まとめて操作する)
  function ItemManager() {
    // コンストラクタ
    this.items = [];
    this.length = 0;
  }
  // アイテム追加
  ItemManager.prototype.push = function(item) {
    this.items.push(item);
    this.length = this.items.length;
  }
  // アイテム複製
  ItemManager.prototype.duplicate = function() {
    var dupItems = new ItemManager;
    for (var i = 0; i < this.items.length; i++) {
      var dupItem = this.items[i].duplicate();
      dupItems.push(dupItem);
    }
    return dupItems;
  }
  // アイテムの移動
  ItemManager.prototype.translate = function(x, y) {
    for (var i = 0; i < this.items.length; i++) {
      this.items[i].translate(x, y);
    }
  }
  // アイテムの削除
  ItemManager.prototype.remove = function() {
    for (var i=0; i < this.items.length; i++) {
      this.items[i].remove();
    }
    this.items = [];
    this.length = 0;
  }
  // アイテムをまとめて登録
  ItemManager.prototype.addItems = function(objs) {
    for (var i = 0; i < objs.length; i++) {
      this.push(objs[i]);
    }
  }
  
  // main
  if (app.documents.length == 0) {
    alert("ドキュメントを開いてから実行してください。");
    return;
  }
  if (app.activeDocument.selection.length == 0) {
    alert("複製したいアイテムを1つ以上選択してから"
      + "実行してください。");
    return;
  }
  var impositionString
    = prompt("連続複製指示を、Δx,Δx,x方向ステップ数,"
    + "y方向ステップ数の順でコンマ区切りで入力"
    + "(移動単位はmm)","100,100,2,2");
  if (impositionString) {
    var param = impositionString.split(",");
    var imposition = {
      dx: param[0] * 72 / 25.4,
      dy: param[1] * 72 / 25.4,
      sx: param[2],
      sy: param[3]
    };
    var sourceItems = new ItemManager;
      // ItemManagerクラス(まとめて操作する)
    sourceItems.addItems(activeDocument.selection);
      // Illustrator GUI側で選択中のアイテムを登録
    
    for (var y = 0; y < imposition.sy; y++ ) {
      for (var x = 0; x < imposition.sx; x++ ) {
        if ( x != 0 || y != 0 ) {
          // 始点のアイテムを複製する必要はない
          var dupItems = sourceItems.duplicate();
            // 最初のアイテムを複製
          dupItems.translate(imposition.dx * x, imposition.dy * y);
            // 複製したアイテムを移動
        }
      } 
    }
  }
})();

どこがおもしろいか、っていうのを説明すると、隊長職(itemManagerクラス)の人に指令すれば部下(Itemども)が一気に動くように設計したということです。今回のスクリプトの前半は、隊長職の人は何をすればいいかという指示書を書いているわけですね。

[DTP] | 固定リンク | コメント (2) | トラックバック (1) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.27

InDesignの勉強部屋 InD-boardのRSSが全文配信になった!

InDesignの勉強部屋 InD-boardのRSSを都合3種類読んでいるのですが、どうやら、掲示板に備え付けのRSS Feed

http://www2.rocketbbs.com/11/rss/thats.rdf

が、全文配信になっているようです。

今までは、最初の1行だけしか読めなかったのでわけわかめだったりしました。

これで情報がより流通しやすくなったと思います。業界の力を維持するには、情報の流通は欠かせないものだけに、この変更は大きい意味を持つと思います。

最近のブラウザにはfeed購読機能がついていますが、オンラインRSSリーダーではまとめ読みが出来るようになっているものもあり、そちらの方の利用もいいかと思います。

[InDesign] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.26

2009年11月12日臨時祝日にも対応できる予定のiCalendar利用カレンダー組版InDesign用JavaScript

(2008-10-27 19:28訂正)利用していたiCalendarファイルのURLが古いものでした。正しいものと差し替えましたので、既にダウンロードして使っている方は、もう一度ダウンロードし直してください。

来年11月12日を臨時休日へ 天皇即位20年で自民 [www.47news.jp]

 自民党は22日午前の内閣部会で、即位の礼から20年目となる来年11月12日を臨時の休日とする法案を了承した。天皇陛下在位20年を祝う目的。

そういうのは2年前から決めておいてほしい。カレンダー屋さん涙目。

んで、法案が決定してからカレンダー上の休日・祝日が確定するわけですけれども、日本国はそういう祝日データを配布していないくさくて電子政府とか笑わせてくれるぜ、と思いました。

それで、日本国がやってくれないことをGoogleがやってくれているので、GoogleカレンダーのJapanese HolidaysのiCalendarファイルを利用して、祝日を取得すればそのうちGoogleの中の人もiCalendarファイルを直してくれるだろうから、自動的に対応できることになりそうです。

というわけで、InDesignでiCalendarファイルをパースして、カレンダーとして組版してくれるJavaScriptを書いてみました。

今回長いので、CodeReposにおいておきます。

http://svn.coderepos.org/share/platform/indesign/javascript/icalcalendar/trunk/

このスクリプトを、

Windows Vistaであれば、C:\Users\ユーザ名\AppData\Roaming\Adobe\InDesign\Version 5.0-J\Scripts\Scripts Panelに入れまして、スクリプトパネルから実行します。

Icalcalendar01
▲いつのカレンダーを生成するかを問うダイアログ

そうすると、上の画面のようにいつのカレンダーを作るか聞いてくるのでお好きな月を入れてください。

Icalcalendar02
▲カレンダーが描画された。下は表スタイルを適用したあと

このようにカレンダーが組版されます。10月13日の「体育の日」の文字は、iCalendarファイルから取得されたものです。iCalendarファイル内では、「体育の日」は10月の第2月曜日と指定されているので、毎年計算し直して表示しています。

カレンダーの表示が素っ気ないと思ったので、表スタイルを作ってあるInDesignファイルも同じディレクトリにおいてあるので、使ってみてください。

これは何がよいの?

GoogleカレンダーのJapanese Holidaysというたくさんの人に使われているiCalendarファイルを使うことで、祝日情報が自動更新されます。

応用例として、月刊誌編集などでイベントカレンダーの組版をこれを改造して使うことで、編集部員がオンラインのカレンダーソフト上でイベントを入力しておけば、自動的に最新のイベントカレンダーができあがります。

問題点

iCalendarのパースには、ijp [code.google.com] というライブラリを使いましたが、そのほかに、RRULEという、繰り返し予定されるものの繰り返しルールをパースする部分は自分で作らなければなりませんでした。その部分のパースは、とりあえず処理できる程度になっていまして、複雑なルールには対応できないことが予想されます。

CodeReposにおいてあるので、誰でも更新できますので、直していただけるとありがたいです。

スクリプトの見所

InDesignのJavaScriptでも他のプラットフォーム用JavaScriptライブラリを使えるはずだと思いやってみました。

Dateクラスを拡張して、Dateクラスでymd()メソッドとparseYmd()メソッドていうのが使えるようになっています。スクリプトを参考にされる方はその点を念頭において、ほかのプログラムで使って「うごかんー」とか悩まないようにしてください。

拡張するコード:

  Date.prototype.ymd = function() {
    return this.getFullYear()
      +("0"+(this.getMonth()+1)).slice(-2)
      +("0"+(this.getDate())).slice(-2);
  }
  Date.prototype.parseYmd = function(dateString) {
    this.setFullYear( parseFloat(dateString.slice(0,4)) );
    this.setMonth(parseFloat(dateString.slice(4,6)) -1 );
    this.setDate(parseFloat(dateString.slice(-2)) );
    return;
  }

免責

モノがカレンダーなので、間違えるととんでもない印刷事故になります。このスクリプトで生成されたカレンダーは、絶対正しいとは保証しませんので、利用者の判断でお使いください。

参考

新JavaScript入門 13 Date [homepage3.nifty.com]
JavaScriptのDateクラス。InDesignのJavaScriptでも同じ(コアクラスなので)。良く忘れるのでここ見て思い出しました。
ひとりぶろぐ: Adobe InDesign CS / CS2用JavaScript「表組基本設定(履歴付き)」ver.1.0.4(2006.11.30版) [moyashi.air-nifty.com]
ダイアログボックスを作るところをぱくりました。
表を作成する [www.openspc2.org]
表を作るサンプルを参考にしました(そのまんま)。
itok's Lab : iCalとiCalendar [110k.net]
iCalendarの読み方を参考にしました。
InDesign Object Model - Table [www15.ocn.ne.jp]
InDesign上のTableオブジェクト操作で参考にしました。
InDesignでSocketクラスの上位クラスを作りHTTPでアクセス - CLの日記 [d.hatena.ne.jp]
最初はiCalendarファイルを埋め込んでいたのですが、Webから取得するために、上記エントリで作ったクラスを使いました。

[DTP] | 固定リンク | コメント (1) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.25

Illustratorで現在のドキュメント名を入力するJavaScript

Illustrator 10~CS3のJavaScriptで、選択しているテキストパスに、現在のドキュメント名を入力します。ただし、Illustrator CS1では全く役に立ちませんw

用途として、Illustratorで手動面付けしている事業所さんなんかで、トンボ外にドキュメント名を表示することで、出力したものを取り違えないようにするのに使えます。

機能の割に長いのは、Illustrator 10~CS3対応するため、Illustrator 10においてCS以降のアクセス方法が使えるようなappオブジェクトを拡張しているからです。無駄だよね……

Filename: input_filename.jsx (Illustrator 10の場合は拡張子jsの方がいいのかな)

/*
  input_filename.jsx : 選択したテキストにファイル名を入力します
*/
(function(){
  // 機能拡張:AI10の場合、appオブジェクトを拡張
  if (typeof app == "undefined") {
    // Illustrator10の場合
    app = {};
    app.documents = documents;
    if (app.documents.length != 0) { 
      // activeDocumentが存在していないとアクセスすらできない
      app.activeDocument = activeDocument;
    }
  }
  // main
  if (app.documents.length != 0) { 
    // ドキュメントを1つ以上開いている
    var objDoc  = app.activeDocument;
    var selObjs = objDoc.selection;
    switch ( selObjs.length ) {
      case 0: // 選択無し
        alert("テキストパスを1つだけ選択してください。");
        break;
      case 1: // 1つだけ選択
        if ( (selObjs[0].typename == "TextFrame") // AICS以降
          || (selObjs[0].typename == "TextArtItem") ) {
          // TextFrameだった
          selObjs[0].contents = objDoc.name;
        }
        else { // TextFrame以外だった
          alert("テキストパスを選択してください。");
        }
        break;
      default: // 2つ以上選択
        alert("複数選択しています。"
            + "テキストパスを1つだけ選択しなおしてください。");
    }
  }
  else { // ドキュメントを開いていない
    alert("Illustratorで書類を開いてから実行してください。");
  }
})();

CodeReposにIllustratorのディレクトリ掘っていいかなー
http://svn.coderepos.org/share/platform/illustrator
あたりかな。

[Script] | 固定リンク | コメント (2) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.10.24

InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ(2):使用ソフトのバージョンによって使い分けよう

昨日のAdobeのソフトでオブジェクトの種類(クラス名)がわかるための方法が3つあるよ、というので、

(function(){
  var objDoc  = app.activeDocument;
  var selObjs = objDoc.selection;
  
  alert(selObjs[0].constructor.name); // ①JavaScript実装
  alert(selObjs[0].typename);         // ②PICTRIX風
  alert(selObjs[0].toString() );      // ③古籏一浩風
  
})();

これをIllustrator CS3で、テキストを選んで実行させると、

AI CS3:

① TextFrame
② TextFrame
③ [TextFrame ]

と得られるので、どれがいい? ていう話なんですけれども、大本命の①はIllustrator 10では動かないことが判明!

AI 10:

① ×(エラー)
② TextArtItem
③ [TextArtItem ]

よって、

  • Illustrator 10対応を考えたときは②
  • Illustrator 10対応をしないときは①または②、JavaScript的には①
  • という感じがしました。②の方法は、Adobeのオブジェクトだけ出来るのかな?

    一応、比較のために、自作のクラスで試すため下記コードをIllustrator 10/Illustrator CS3で実行したところ、

    function Hoge() {};
    var x = new Hoge; 
    alert(x.constructor.name); // ①JavaScript実装
    alert(x.typename);         // ②PICTRIX風
    alert(x.toString());       // ③古籏一浩風

    AI 10:

    ① undefined
    ② undefined
    ③ [object Object]

    AI CS3:

    ① Hoge
    ② undefined
    ③ [object Object]

    となりました。これから言えるのは、typenameというプロパティは自作のオブジェクトじゃ使えないこと、AI 10が微妙、ていうことです。ちなみにコアオブジェクトにもtypenameプロパティはない。あったら怖い。

    参考:
    任意のオブジェクトのクラス名をどうやって得るの? - 理系学生日記 [d.hatena.ne.jp]

    [DTP] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

    2008.10.23

    InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ

    InDesignやIllustratorのJavaScriptで、選んでいるアイテムがなんであるか調べたいっていうことがあります。ブラウザのJavaScriptでいえば、DOMをdocument.getElementsByTagNameで絞ったあと、アイテムを1点ずつclassNameを見て照合するみたいなイメージになるでしょうか。

    そんで、選んだオブジェクトが何であるか、というのを調べるコード、いろんなのが流通しているみたい。

    (function(){
      var objDoc  = app.activeDocument;
      var selObjs = objDoc.selection;
      
      alert(selObjs[0].constructor.name); // JavaScript実装
      
      alert(selObjs[0].typename);         // PICTRIX風
      
      alert(selObjs[0].toString() );      // 古籏一浩風
      
    })();

    さてこれのうちどれを使うのがいいのかな。

    [Script] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

    2008.10.22

    < 最後 « これより前10ä»¶ | 全件