punk…

ichiroのクロールがひどい。先月は200MBものトラフィックを食べ散らかしています。ちなみにぐぐる先生のところはフェッチャーあわせても70MBほど。その他のあやしいbotと認識されるトラフィック合計しても60MB程度ですから、gooのクローラは群を抜いて負荷をかける悪い子認定しちゃいます。ここ数ヶ月こんな調子です。そのうちdenyしちゃいますよ。
さて、こちらが本題。久々にベジエいじって何かしようと思ったのが今週の頭。しかしながら仕事に追われると時間の経つのが早い事w
今回は意表をついてIllustratorではなく、Indesignでパスをコントロールしてみようと思います。非常に手抜きっぽくなりましたが、ご覧下さい。

まずは何をやりたいかと言うと…

punk.png

こんな感じです。パンクってやつですね。

var tgt = app.activeDocument.selection[0].paths[0].pathPoints;
var num = tgt.length;
var x = y =0;                 //unit = point
var dr = new Array();        //temporary array
var ofst = new Array();    //tmp array for store distance
var dist = Number (prompt(‘ratio=’,-0.5));  //ratio
for (var i=0;i<num;i++){
    x += tgt[i].anchor[0];
    y += tgt[i].anchor[1];
    }
var ctr = [x/num,y/num]; //selected objects center point
for (i=0;i<num;i++){
    tgt[i].pointType = PointType.CORNER;
    ofst =[(ctr[0]-tgt[i].leftDirection[0])*dist,
            (ctr[1]-tgt[i].leftDirection[1])*dist];
    dr = tgt[i].leftDirection;
    tgt[i].leftDirection= [dr[0]-ofst[0],dr[1]-ofst[1]];
    ofst =[(ctr[0]-tgt[i].rightDirection[0])*dist,
            (ctr[1]-tgt[i].rightDirection[1])*dist];
    dr = tgt[i].rightDirection;
    tgt[i].rightDirection = [dr[0]-ofst[0],dr[1]-ofst[1]];
    }<num;i++){ x="" +="tgt[i].anchor[0];" y="" }="" var="" ctr="[x/num,y/num];" selected="" objects="" center="" point="" for="" (i="0;i<num;i++){" tgt[i].pointtype="PointType.CORNER;" ofst="[(ctr[0]-tgt[i].leftDirection[0])*dist," (ctr[1]-tgt[i].leftdirection[1])*dist];="" dr="tgt[i].leftDirection;" tgt[i].leftdirection="[dr[0]-ofst[0],dr[1]-ofst[1]];" (ctr[1]-tgt[i].rightdirection[1])*dist];="" tgt[i].rightdirection="[dr[0]-ofst[0],dr[1]-ofst[1]];" }

IndesignとIllustratorのOM上でのパスオブジェクトの扱いは良く似ていますが全く同じとはいきません。Indesignの場合、rectangleやovalを選択した場合のオブジェクト階層は

selection.paths.pathPoints

という階層になります。ここでselectionは生成したオブジェクトで、例えばrectangleを選択している場合はrectanglesが帰る事になります。オブジェクトを生成した瞬間に形状の事は忘れてpathPointsの塊としての認識しか持たないAIとくらべると面倒くさいかんじですが、rectangleやpolygon等の形状情報を保持しているが故に形状の切替えをメニューから選択するだけで行えるIDの場合、形状による振り分けが簡単に出来る事が特徴です。AIの場合は生成後はrectangleなのかellipseなのか簡単に判別ができませんのでメリットと言えばメリットですね。まあ、わたし的にはメソッドによる生成後、全てがpathItemsになってしまうAIのオブジェクトモデルがトリッキーではないかとも思ってしまっていたりします。
処理の流れも押さえておきましょう。
パンク処理は各アンカーのハンドルが中心方向に倒れ込むもしくは中心を基準に膨張するのが特徴ですので、オブジェクトの中心が必要になります。この処理は全てのアンカーポイントの座標を拾い、x・y別々に足してしまったものをポイントの数で割ってやればOKです。
あとはループして各ポイントのleftDirection及びrightDirectionを比率に応じて移動すれば完成です。一つ注意しなければならないのはIndesignでは各アンカーがpointTypeプロパティを持っていて、Illustratorの様に単純にleftDirectionまたはrightDirectionを移動するだけではハンドルを折る事が出来ません。そのポイントのプロパティを調整するのが

tgt[i].pointType = PointType.CORNER;

の行です。Indesignでは明示的にコーナーポイントに指定しなければ反対側のハンドルが追随して動きます。

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする

コメントを残す