忍者ブログ

ぼんぷろぐ

InDesignとかイラレとかのスクリプトよもやま話

新しいブログに引っ越しました。

こちらのブログはもう更新しませんが、コメント欄は生きてますので疑問、ご指摘などありましたらどうぞ。

[イラレ]
Illustratorで双曲線(反比例のグラフ)の描き方

双曲線(反比例のグラフ)の書き方を考えてみました。
正しくは双曲線の中でも直角双曲線と呼ばれるものです。45°回転して変形すれば一般の双曲線も描けるんじゃないかと思いますが、今回は反比例のグラフが目的なのでそこまでは考えません。
3次ベジェ曲線で厳密な双曲線を描くことはできないのであくまで近似です。


描き方

①円弧ツール選んでドキュメント上をクリックし
 X軸の長さ:15mm
 Y軸の長さ:15mm
 勾配:71.02 のパスを作ります。
②-45°回転
③水平100%、垂直60%に変形
④45°回転

ここまでで、y=1/xのグラフを1マスが1センチの方眼紙に書いた場合の、0.5≦x≦2の部分(近似)が描けたことことになります。
これだけでは範囲が足りないと思いますので、

⑤3つに複製して、
 1つはそのまま…(A)
 1つは水平25%、垂直400%に変形…(B)
 1つは水平400%、垂直25%に変形…(C)
⑥(A)の上側に(B)、(A)の右側に(C)を連結する

これで0.125≦x≦8の範囲ができあがりです。
もしさらに広い範囲が必要なら、同様に6.25%、1600%の変形をして連結します。


動画はこちら


動画内では、
・環境設定でガイド・グリッドのグリッドを10mm、分割数を4に設定
・『グリッドにスナップ』をON
・(A)の上端をx=0.5,y=2のポイントにスナップ
・回転ツールで原点をAlt+クリックで回転コピー
を使ってます。


一般の反比例のグラフ y=a/x を描く場合であれば、垂直方向にa倍の変形をかければOKです。

おしまい

関数の描き方シリーズ

サインカーブの描き方
放物線の描き方
PR

[AutoHotkey]
AutoHotkeyでAcrobatをいじる2:画像ファイルからpdf作成

前回に引き続いて、AutoHotkeyでドロップレット(.ahkファイルに処理したいファイルをドラッグ&ドロップして動かすタイプのスクリプト)を作ってみます。

まずは画像からpdfを作成するドロップレット

Loop,%0%
Loop,% %A_Index%
{
    path:=A_LoopFileLongPath
    ext:=A_LoopFileExt
    pathNoExt:=SubStr(path,1,-StrLen(ext)-1)
    newPdfPath=%pathNoExt%.pdf
    IfExist,%newPdfPath%
    Loop
    {
        newPdfPath=%pathNoExt%(%A_Index%).pdf
        IfNotExist,%newPdfPath%
            Break
    }

    avd:=ComObjCreate("AcroExch.AVDoc")
    result:=avd.Open(path,"")
    If result=-1
    {
        avd.GetPDDoc().Save(1,newPdfPath)
        avd.Close(1)
    }
}

Acrobatのファイルメニューにある「画像からpdf」を自動化するものです。
JPEG,PNGなどAcrobatが対応してる画像ファイルならなんでもいけます。
複数ファイルを同時にドロップした場合は、それぞれ別のpdfになります。

ちょっと解説
例によって最初の2行はおまじないとしまして、
path:=A_LoopFileLongPath
ext:=A_LoopFileExt
pathNoExt:=SubStr(path,1,-StrLen(ext)-1)
newPdfPath=%pathNoExt%.pdf
IfExist,%newPdfPath%
Loop
{
    newPdfPath=%pathNoExt%(%A_Index%).pdf
    IfNotExist,%newPdfPath%
        Break
}
ここらへんは保存するpdfファイルのパス文字列を用意しています。
同名ファイルがあれば上書きしないように(1)をつけて、それもあれば(2)をつけて…という処理です。
AHKの:=と=の使い分けを知らない人は何だコレってなるかも。(参考→AutoHotkey wiki:言語仕様

あとはAcrobat OLEのAVDocで開いて、開くのに成功したら保存して閉じる、という流れです。
なぜか知らないけど画像を開けるのはPDDocでなくAVDocだけのようです。



ちゅぎ

今度は複数の画像ファイルをドロップしたとき、それらをまとめて1つのpdfファイルにするやつ
いわばAcrobatのメニューにある「ファイルを単一のpdfに結合」の自動化です。

Loop,%1%
{
path:=A_LoopFileLongPath
ext:=A_LoopFileExt
pathNoExt:=SubStr(path,1,-StrLen(ext)-1)

newPdfPath=%pathNoExt%.pdf
IfExist,%newPdfPath%
Loop
{
    newPdfPath=%pathNoExt%(%A_Index%).pdf
    IfNotExist,%newPdfPath%
        Break
}

pdd0:=ComObjCreate("AcroExch.PDDoc")
pdd0.Create()

Loop,%0%
Loop,% %A_Index%
{
    path:=A_LoopFileLongPath
    avd1:=ComObjCreate("AcroExch.AVDoc")
    result:=avd1.Open(path,"a")
    If result=-1
    {
        pdd1:=avd1.GetPDDoc()
        pdd0.InsertPages(-2,pdd1,0,1,0)
        avd1.Close(1)
    }
}
pdd0.Save(1,newPdfPath)
pdd0.Close()
}

えー12行目あたりまでは上のと同じ保存するファイルパスの用意ですね。

pdd0:=ComObjCreate("AcroExch.PDDoc")
pdd0.Create()
でPDDocのドキュメントを新規作成して、

AVDocで画像をpdf化して、そのページを新規作成したドキュメントに追加していく、という手順です。
このへんはpdf-file.nnn2.comさんの、こちらのコメント欄がとても参考になりました。ありがたやありがたや。


続くかも?

[AutoHotkey]
AutoHotkeyでAcrobatをいじる話

AutoHotkey(略称:AHK)でアプリを操作といえば、キー入力を送ったり特定の位置にマウスクリックを発生させたりというようなのがAHKの得意とするところなのですが、今回はそういうのではなく、OLEあるいはCOMと呼ばれる仕組みを使ってAcrobatとやりとりする話です。VBSでやれと言われそうですけど、案外書きやすいんです、AHKスクリプト。


AHKを公式のインストーラーでインストールすると、エクスプローラー上で.ahkファイルに対して任意のファイルをドラッグ&ドロップして、そのファイルについての処理をすることができます。adobeユーザーにはこういうの『ドロップレット』っていう言葉で定着してるのかな?私は最近まで知らなかったけど。

たとえばこんなのができます。

D&Dしたpdfのタイトルをファイル名(拡張子除く)にして、作成者名を空欄にして上書き保存するドロップレット

Loop,%0%
Loop,% %A_Index%
{
name:=A_LoopFileName
path:=A_LoopFileLongPath
d:=ComObjCreate("AcroExch.PDDoc")
d.Open(path)
d.SetInfo("Title",SubStr(name,1,-4))
d.SetInfo("Author","")
d.Save(0,path)
d.Close()
}
MsgBox,完了!

えー、スクリプトの解説をしようと思うんですが、まず最初の2行が超説明しづらいのでおまじないと思ってください。これにより以下の"{"から"}"までが、D&Dしたファイルの個数分ループします。

ループの中では、A_LoopFileNameという変数にD&Dしたファイルの名前が入っています。
2回目のループでは2つ目のファイル、3回目のループでは3つ目のファイル…です。便利ですね。
ファイル名以外にもいろいろ取得できます(→AutoHotkey Wiki)。


d:=ComObjCreate("AcroExch.PDDoc")
でAcrobatのPDDocオブジェクトを生成します。
AcrobatのドキュメントオブジェクトはPDDocとAVDocの2つがあるんですが、AVDocは主にドキュメントの画面表示に関することなので今回は使いません。

PDDocのメソッドについては pdf-file.nnn2.com にすばらしい解説があるので、AHKだとこれくらいシンプルに書けるよーということ以外、特に言うことはありません。


なお、昔AHKをインストールして、ドロップレットにできないって人もいるかもしれません。私もいつかのWindowsアップデートでできなくなりました。再インストールすればできるようになるはずです。




つぎはもう少しAHKらしい使い方をしてみます。常駐させてホットキーで動作するタイプのAHKスクリプト。

Acrobatでpdfファイルを開いている状態で、
・F1を押すと、Acrobatで現在開いているファイルをエクスプローラーで参照
・F2を押すと、Acrobatで現在開いているファイルをデスクトップにコピー
できるようにします。

#IfWinActive ahk_class AcrobatSDIWindow

F1::
filePath:=getAcrobatActiveFilePath()
Run,explorer /select`,%filePath%
Return

F2::
MsgBox,4,,pdfをデスクトップにコピーしますか?
IfMsgBox, Yes
{
filePath:=getAcrobatActiveFilePath()
FileCopy, %filePath%, %A_Desktop%\
}
Return

getAcrobatActiveFilePath(){
f:=ComObjCreate("AcroExch.App").GetActiveDoc().GetPDDoc().GetJSObject().path
f:=RegExReplace(f,"^/(.)/","$1:/")
f:=RegExReplace(f,"^/(.+?)/","//$1/")
f:=RegExReplace(f,"/","\")
Return f
}

今回はAcrobatには開いているファイルのパスを教えてもらうだけなんですが、これが意外と大変でした。

Acrobat OLEのメソッドやプロパティは pdf-file.nnn2.comさん の「オブジェクトの連携図」に網羅されているのですが、ここにファイルパスらしいものが見つからないのです。

しかし、AcrobatにはOLEとは別にJavaScriptによる自動化があります。そしてこのJavaScriptと同等のことができることになっている(が実際はそんなにできない)JSObjectというものにOLEからもアクセスできるようになっています。

f:=ComObjCreate("AcroExch.App").GetActiveDoc().GetPDDoc().GetJSObject().path

で、AcrobatのAppオブジェクトから、アクティブなドキュメントのAVDocオブジェクトを取得して、それに関連付けられたPDDocオブジェクトを取得して、そのJSObjectを取得し、そこからパスを取得しています。
ほんとにこんな回りくどいことをしなくちゃいけないのか、定かではないんですが…

ほかの部分を簡単に解説すると、
#IfWinActive ahk_class AcrobatSDIWindow
これは「以下のホットキーをAcrobatのウインドウがアクティブのときだけ有効にする」という意味。

F1::
から
Return
までがF1キーが押されたとき呼ばれるサブルーチン。

MsgBoxは1つ目の引数でタイプを指定できて、4だと「はい」「いいえ」のボタンがあるダイアログになります。
IfMsgBoxは直前のMsgBoxで押されたボタンにより分岐します。


続くかも?

[ExtendScript]
#includeはどこに書いてもよく、コードの断片でもいい

ExtendScriptの#includeって、案外自由度が高くて、

①行頭でさえあればどこに書いてもよく、書いた場所にインクルードしたファイルの内容が展開される。

②インクルードする側、される側のコードがそれぞれJavascriptのコードとして成立していなくてもいい(インクルード後に成立していれば)

という特徴があります。




①は割と重要です。ひょっとしたら#includeは冒頭に書かなきゃいけないと思ってる方もいるのではと思いますが、たとえば

(function (){
    #include "nanka.jsx"
    …
})()

のように書けば、nanka.jsxを関数内のローカルスコープで読み込むことができます。




②はどういうことかと言うと、たとえば、

alert(1

という")"が抜けたコードがあって、

)

という1文字だけのテキストファイルkakkotoji.txtがあったとして、

alert(1
#include "kakkotoji.txt"

を実行すれば、

alert(1
)

と同じになって1がアラートされるのです(kakkotoji.txtは実行するjsxファイルと同じフォルダに入れます)。
だからどうしたという感じですが…

唯一役に立ちそうな使い道として思いついたのが、jsonファイルの読み込みです。
ExtendScriptのオブジェクトとしてそのまま読めるようなjsonファイルであれば、

var hoge=
#include "hoge.json"

とするだけで、変数hogeにhoge.jsonをパースしたオブジェクトが入ります。

他になんか面白い使い道思いついた方は教えてくださーい

プロフィール

kawamoto_α
(あるふぁ(仮))


InDesignで新聞組版のようなことをしています。

ツイッタ

※ブラウザによっては当ブログからDLしたzipファイルが拡張子なしになることがあるようですが、.zipを補って開いてください。



イラレ用トーンカーブスクリプト(¥1500)



クロソイド式角丸長方形スクリプト(¥500)
Illustrator用
InDesign用



イラレスクリプトをキーボードショートカットで実行するやつ(Win用)