■まずは水平垂直からのお試し版です。斜め線はむずいので後日!     
タイトルなし

おつかれさまです。@gorolibです。

急に思い立って、線を二重線にするスクリプトを作りました。

たまーに重要があるんですが、皆様どうされていますでしょうか?

オープンパスならコピー、クローズドパスならオフセット、最近はアピアランスで線追加+オフセット、というところでしょうか。

まあコピーなんかはオプション+矢印キーにて、キー入力分だけ(シフトも押せばその10倍)移動+コピーができますが、そのときのキー入力値が「ちょうどよい二重線の幅」とは限りませんよね。

でなんだかいつもチマチマしてしまうんです…。アピアランスパネルもチマチマしてますしねぇ…。

そこでスクリプトを思い立ちましたが、

こりゃむずい!

いえ、水平垂直のオープンパス、対称系のクローズドパスはいいんですけど、斜め線とか自由図形(パスツールで描いたような)ものの二重線はどうやったらいいか

???

でございます。おそらく以前から作成を試みては行き詰まっている「オフセットをスクリプトで実装する」のと同じ問題にぶち当たってしまいました…。


■オフセット処理ってむずいのか!


なんせ斜め線は斜めに平行にコピーしなくちゃならないので、おそらく

サイン・コサイン・タンジェント

という三角関数の世界がやってくるのです!ウワオ(ますおか岡田風)

そんなの数Ⅱの教科書みないとわかんないよ(笑)なので、今回は機能限定版です。

・水平のオープンパス
・垂直のオープンパス
・一部のクローズドパス

が対称です。オープンパスの斜め、自由なクローズドパスはできまへん。

「一部の」と書いたのは自分でもよくわからないから(なんだそりゃ!)

正方形や正円はできる。でも途中でデコボコのあるやつはだめ。二重線の間隔は見た目の距離(つまり線幅と線幅の間)で1ミリとっているのですが、デコボコがあるとうまくいかんスねぇ。

機能限定版なので、無料にてどうぞ使ってやってください。
タイトルなし

<スクリプトファイル名>
(無料ダウンロードにてご利用ください)

<使い方>
(1)パスアイテムを選びます。
(2)このスクリプトを起動します。

<仕様>
(1)選択オブジェクトの線を二重線にします。
(2)選択された線がちょうど中心になるように、両側に線を作ります。
(3)選択された線はガイドに変更します。
(4)線幅がないものには反応しません。
(5)二重線の間隔(線幅の端から線幅の端まで)は1ミリ固定です。

■カスタマイズのキモっ!

仕様5について。1ミリ固定は5行目の

AKI = 1/ptEQ

にて設定しています。2ミリにしたい場合は、
AKI = 2/ptEQ

0.5ミリにしたい場合は、
AKI = 0.5/ptEQ
にします。


■ダウンロードはこちらから



ソースも公開します。
━━━━━
DOC = activeDocument
SEL = DOC.selection
LAY = DOC.activeLayer
ptEQ = 25.4/72
AKI = 1/ptEQ

MAINfn();

function MAINfn(){
for(s=0; s<SEL.length; s++){
SELfn(SEL[s])
}
}

function SELfn(SELz){
if(SELz.strokeWidth == 0)return false
TRN = (AKI + SELz.strokeWidth)/2

if(SELz.closed == true){
CLOSEfn(SELz)
} else {
OPENfn(SELz)
}
}

function OPENfn(SELz){
BND = SELz.geometricBounds
x1 = BND[0]
y1 = BND[1]
x2 = BND[2]
y2 = BND[3]

if((x1 != x2) && (y1 != y2))return false

if(x1 == x2){

TRNy = 0
TRNx = TRN
LINEfn(SELz)

TRNx = -TRN
LINEfn(SELz)

} else {

TRNx = 0
TRNy = TRN
LINEfn(SELz)

TRNy = -TRN
LINEfn(SELz)
}
GUIDEfn(SELz)
}

function CLOSEfn(SELz){
W1 = SELz.width
H1 = SELz.height

Wout = W1 + TRN*2
Win  = W1 - TRN*2
Hout = H1 + TRN*2
Hin  = H1 - TRN*2

BAIx = Wout / W1 * 100
BAIy = Hout / H1 * 100
RECTfn(SELz)

BAIx = Win  / W1 * 100
BAIy = Hin  / H1 * 100
RECTfn(SELz)

GUIDEfn(SELz)
}

function LINEfn(SELz){
LINE = SELz.duplicate()
LINE.translate(TRNx,TRNy)
LINE.selected = false
}

function RECTfn(SELz){
RECT = SELz.duplicate()
RECT.resize(BAIx,BAIy)
RECT.selected = false
}

function GUIDEfn(SELz){
SELz.guides = true
SELz.selected = false
}
━━━━━
お役に立てれば幸いです!ではでは出羽の海。