指定行数に長体処理するIllustratorツールを作りました。

先日の某セミナーで、隣に座った人と話した「こんなのあったらいいなぁ」を形にしてみました。

###理想
・指定する行数に長体処理を行う。
・Illustratorで改段処理。

####方法
テキスト原稿をマークダウンで記載し、それを手掛かりとして指定の行数になるように処理をする。
Illustratorでの改段は無理なので、これもマークダウン記載から段頭になるまで改行を入れる。

。。。色々試してみたが、テキストにマーク付けすること自体面倒くさそうだし、しかも正規表現で対象のテキストを取得しても、その文字が何行持っているかを取得できそうにない。
考えるのも面倒になったので、文字を選択しておいて、指定の行数になるようなシンプルな仕様にしました。
※探求心が足りない。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122812/0af98c1e-c376-4168-a082-5e4ce027659d.png)
▲UIはこんな感じ。
　「取り消し」「やり直し」は編集メニューと同じ処理をします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122812/97491238-c542-c59c-8cfc-c23b80a1d1d6.png)
▲0.1%刻みで長体処理をするようにしました。
　文字多いと少し時間がかかる。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122812/79366491-8d70-badc-18a0-b7fbbcb345d1.png)
▲Illustratorのバージョンによって数値を書き換える必要がある。
　CC 2018は22。CC 2017は21。

コードは以下。

```JavaScript:指定行に長体処理_ボタン版.jsx
#target illustrator-22
#targetengine main

/*//////////////////////////////////////////////////  変数定義  ////////////////////////////////////////////////////////////////////*/
var doc = app.activeDocument; //ドキュメント

/*/////////////////////////////////////////////// 入力ダイアログ表示 ////////////////////////////////////////////////////////*/
win = new Window("palette", "指定行数に長体処理", [200, 150, 350, 300]);
var para01Btn = win.add("button", [10, 10, 70, 30], "１行");
var para02Btn = win.add("button", [10, 35, 70, 55], "２行");
var para03Btn = win.add("button", [10, 60, 70, 80], "３行");
var para04Btn = win.add("button", [75, 10, 135, 30], "４行");
var para05Btn = win.add("button", [75, 35, 135, 55], "５行");
var para06Btn = win.add("button", [75, 60, 135, 80], "６行");
var unDoBtn = win.add("button", [10, 90, 70, 110], "取り消し");
var reDoBtn = win.add("button", [75, 90, 135, 110], "やり直し");
var cancelBtn = win.add("button", [10, 120, 135, 140], "キャンセル");

win.show(); //ウィンドウを表示
win.center(); //センターに表示  

/*//////////////////////////////////////////////////////////// 関数 //////////////////////////////////////////////////////////////*/
//▼1～6行のボタンが押されたとき
para01Btn.onClick = function () { //1行
    num = 1;
    btProcess();
};

para02Btn.onClick = function () { //2
    num = 2;
    btProcess();
};

para03Btn.onClick = function () { //3行
    num = 3;
    btProcess();
};

para04Btn.onClick = function () { //4行
    num = 4;
    btProcess();
};

para05Btn.onClick = function () { //5行
    num = 5;
    btProcess();
};

para06Btn.onClick = function () { //6行
    num = 6;
    btProcess();
};

//▼取り消しボタンが押されたとき
unDoBtn.onClick = function () {
    var bridgeTalk = new BridgeTalk(); //BridgeTalkを使用
    bridgeTalk.target = "illustrator-22";
    bridgeTalk.body = "undo();"
    bridgeTalk.send();
};

//▼やり直しボタンが押されたとき
reDoBtn.onClick = function () {
    var bridgeTalk = new BridgeTalk(); //BridgeTalkを使用
    bridgeTalk.target = "illustrator-22";
    bridgeTalk.body = "redo();"
    bridgeTalk.send();
};

//▼キャンセルボタンが押されたとき
cancelBtn.onClick = function () {
    win.close();
};

//▼長体処理関数　BridgeTalk
function btProcess() {
    var bridgeTalk = new BridgeTalk(); //BridgeTalkを使用
    bridgeTalk.target = "illustrator-22";
    bridgeTalk.body = "setBtnValue(num);"
    bridgeTalk.send();
}

//▼行数を指定する関数
function setBtnValue(num) {
    var sel=doc.selection;
    var paraLen = doc.selection.paragraphs.length; //選択している段落数
    //▼エラー処理
    if (paraLen > 1) {
        alert("選択している文字が段落に跨ってます。\r\nご確認ください。");
        return;
    }
    while (sel.lines.length > num) { //指定した行数になるまで-1づつ長体をかける
        sel.horizontalScale -= 0.1;
    }
}

//▼取り消し関数
function doUnDo() {
    undo();
}

//▼やり直し関数
function doReDo() {
    redo();
}

```

###感想
はじめdropdownlistで作っていたがWindows10だと切れてしまったのでボタンにしました。
長体を100%に戻すボタン、長体率を上げるボタンなども設けてもいいかと思った。
関数周りをもう少しスマートに書けるようになりたい。。。