あっぴあらんすとスクリプトとのこらぼshowcase
ちらりちらりとライブエフェクト関連のスクリプトが出てきています。かなり制約があるのですが、色々な方があの手この手で、時には力でねじ伏せるような処理をやってらっしゃるわけですが、わたしもいくつかサンプルを書いてみました。正直言って走り書きです。力尽きています。でも、面白さの一端は垣間見る事が出来ると思うのです。
まあ、適当にアレンジして下さい。
まずは、正統派のエフェクトを扱う例です。
var zigzag = '<LiveEffect name="Adobe Zigzag">' + '<Dict data="R roundness 0 R relAmount 4.026 R amount 4.026 R absoluteness 1 R ridges 17 " />' + '</LiveEffect>'; var trans = '<LiveEffect name="Adobe Transform">' + '<Dict data="B transformPatterns 1 B transformObjects 1 R moveH_Pts 8 B randomize 0 ' + 'I numCopies 90 B scaleLines 1 R scaleH_Percent 100 I pinPoint 4 R scaleH_Factor 1 R moveV_Pts 0 ' + 'B reflectY 0 R rotate_Radians 0 R scaleV_Factor 1 ' + 'R scaleV_Percent 100 B reflectX 0 R rotate_Degrees 0 " /></LiveEffect>'; var clr = app.activeDocument.gradients[1]; var pt = [[40,-328],[40,-470]]; tg = app.activeDocument.pathItems.add(); var pt0 = tg.pathPoints.add(); pt0.anchor = pt[0]; pt0.leftDirection = pt[0]; pt0.rightDirection = pt[0]; var pt1 = tg.pathPoints.add(); pt1.anchor = pt[1]; pt1.leftDirection = pt[1]; pt1.rightDirection = pt[1]; tg.strokeColor = app.activeDocument.swatches.getByName('色あせた空').color; tg.strokeColor.origin = [50,-352]; tg.strokeColor.angle = 0; tg.strokeColor.length = 5.66929133858138; tg.strokeColor.hiliteAngle = 0; tg.strokeColor.hiliteLength = 0; tg.fillColor = app.activeDocument.swatches[0].color; tg.strokeWidth = 5.66929133858138; tg.strokeDashes = [0,8]; tg.strokeCap = StrokeCap.PROJECTINGENDCAP; tg.strokeJoin = StrokeJoin.MITERENDJOIN; tg.strokeDashOffset = 0; tg.applyEffect(zigzag); tg.applyEffect(trans);
ここまではスクリプトで行くのですが、ここから先はオブジェクトに触れないために手作業を行います。
線の設定とグラデーションの設定をそれぞれひとつづつ変更します。
ここで、アピアランスパネルのジグザグを一番上まで移動します。
はい、出来上がりです。人のふんどしで相撲取るような感じで申し訳ないのですが、結構触れない部分があって少し残念な感じです。
次も少し難儀です。テキストに枠がこみをつけるのですが、基本的にスクリプトからは塗りや線を追加することが出来ません。苦肉の策として、duplicateで逃げましょう。その際はグループ化するのを忘れないように
var clr = new CMYKColor; //Line color clr.cyan = 80; clr.magenta = 0; clr.yellow = 0; clr.black = 0; var wt = new CMYKColor; //Background color wt.cyan = 0; wt.magenta = 0; wt.yellow = 0; wt.black = 0; var outlineObject = '<LiveEffect name="Adobe Outline Type"><Dict/></LiveEffect>'; var shapeEffect = '<LiveEffect name="Adobe Shape Effects">' + '<Dict data="R RelWidth 1.984 R AbsWidth 36 R CornerRadius 9 R Absolute 0 ' + 'R RelHeight 1.984 R AbsHeight 36 I Shape 0 " /></LiveEffect>'; var tg = app.selection[0]; //Target as TextFrameItem var obj = tg.duplicate(tg,ElementPlacement.PLACEAFTER); var gp = app.activeDocument.groupItems.add(); tg.move(gp, ElementPlacement.PLACEATEND); obj.move(gp, ElementPlacement.PLACEATEND); obj.paragraphs[0].characterAttributes.fillColor = wt; obj.paragraphs[0].characterAttributes.stroke = true; obj.paragraphs[0].characterAttributes.strokeColor = clr; obj.paragraphs[0].characterAttributes.strokeWeight = 0.3; obj.applyEffect(outlineObject); obj.applyEffect(shapeEffect);
はい、こんな感じです。
つづいて、テーブルですね。一見どうアピアランスが混じっているのかよくわからない例です。このテーブルでは文字のアウトラインを見て調整を行います。仮想ボディだのベースラインだのは全く考えません。無視します。パラグラフに含まれるキャラクタの形しか見ません。こうすると一見各セルのど真ん中に文字が入ったように見えます。
var outlineObject = '<LiveEffect name="Adobe Outline Type"><Dict/></LiveEffect>'; var actionCode = '/version 3 /name [ 8 74656d7053657431] /isOpen 1 /actionCount 1' + '/action-1 {/name [ 7 616374696f6e31] /keyIndex 0 /colorIndex 0 /isOpen 1 /eventCount 1' + '/event-1 {/useRulersIn1stQuadrant 0 /internalName (ai_plugin_appearance)' + '/localizedName [ 18 e382a2e38394e382a2e383a9e383b3e382b9]' + '/isOpen 0 /isOn 1 /hasDialog 0 /parameterCount 1' + '/parameter-1 {/key 1835363957 /showInPalette 4294967295 /type (enumerated)' + '/name [ 27 e382a2e38394e382a2e383a9e383b3e382b9e38292e6b688e58ebb] /value 6}}}'; var tmpFile = File(Folder.desktop + "/tmpSet1.aia"); tmpFile.open('w'); tmpFile.write(actionCode); tmpFile.close(); app.loadAction(tmpFile); var heightMargin = 4; var horizontalMargin = 10; var x = 100, y = -100; var f = File.openDialog("Select a text file"); if (f.open('r')){ var st = []; while (!f.eof) st.push(f.readln().split('\t')); var cols = [], rows = [], hts = []; for (var k=0;k<st[0].length;k++) cols[k] = []; var tmpTx, tx; for (var i, j=0;j<st.length;j++){ for (i=0;i<st[j].length;i++){ tmpTx = app.activeDocument.textFrames.add(); tmpTx.contents = st[j][i]; tmpTx.applyEffect(outlineObject); hts.push(tmpTx.visibleBounds[1] - tmpTx.visibleBounds[3] + heightMargin*2); //collect height cols[i].push(tmpTx.visibleBounds[2] - tmpTx.visibleBounds[0] + horizontalMargin*2); //collect width tmpTx.remove(); } } for (i=0;i<cols.length;i++) cols[i].sort(); hts.sort(doSort); var ct, md, bnds; for (j=0;j<st.length;j++){ for (i=0;i<st[j].length;i++){ tmp = app.activeDocument.pathItems.rectangle(y, x, cols[i][cols[i].length-1], hts[0], false); x += cols[i][cols[i].length-1]; tmp.strokeColor = app.activeDocument.swatches[1].color; tmp.strokeWidth = 0.3; tmp.fillColor = app.activeDocument.swatches[0].color; tx = app.activeDocument.textFrames.add(); tx.contents = st[j][i]; tx.applyEffect(outlineObject); bnds = tmp.geometricBounds; ct = bnds[0] + (bnds[2] - bnds[0]) / 2; md = bnds[1] + (bnds[3] - bnds[1]) / 2; tx.position = [ct - tx.width / 2, md + tx.height / 2 - 1]; tx.selected = true; app.doScript("action1", "tempSet1", false); tx.selected = false; } x = 100; y -= hts[0]; } } app.unloadAction("tempSet1",""); tmpFile.remove();
こ~んな感じのコードですが、キモはライブエフェクトのアウトラインオブジェクトでバウンズを取得している部分ですね。そしてバウンズを得られたらエフェクト自体は消去してしまいます。
以下がテキストソースの状態。
#source aaaa bbb cc 111111 22222 333 あああ いいいいいい ううううううう
と、まあ色々と応用が考えられるものです。うまく利用しましょう。
そうそう、ひとしきりエフェクトをかけまくったあとはちゃんと外しましょう。
function reduceAppearances(){ var actionCode = '/version 3 /name [ 8 74656d7053657431] /isOpen 1 /actionCount 1' + '/action-1 {/name [ 7 616374696f6e31] /keyIndex 0 /colorIndex 0 /isOpen 1 /eventCount 1' + '/event-1 {/useRulersIn1stQuadrant 0 /internalName (ai_plugin_appearance)' + '/localizedName [ 18 e382a2e38394e382a2e383a9e383b3e382b9]' + '/isOpen 0 /isOn 1 /hasDialog 0 /parameterCount 1' + '/parameter-1 {/key 1835363957 /showInPalette 4294967295 /type (enumerated)' + '/name [ 27 e382a2e38394e382a2e383a9e383b3e382b9e38292e6b688e58ebb] /value 6}}}'; var tmp = File(Folder.desktop + "/tmpSet1.aia"); tmp.open('w'); tmp.write(actionCode); tmp.close(); app.loadAction(tmp); app.doScript("action1", "tempSet1", false); app.unloadAction("tempSet1",""); tmp.remove(); } reduceAppearances();
このファンクションが利用可能です。アピアランスを消去コマンドはスクリプトには含まれませんし、executeMenuCommandからもアクセスできません。ですが、アクションには登録可能です。このファンクションではアクションを自動生成→適用→生成したアクションを消去の一連をスクリプトから実行するものです。