■人工知能プロジェクト第2弾!まだ考えてくれるレベルではないので無料です(笑)   

おつかれさまです。@gorolibです。
先般ぶちあげたのはいいんですけど、鳴かず飛ばずとなっている人工知能プロジェクトです。

ちょっとヒントが得られたので前進してみます。やっと第二弾ですけどね(笑)

2つのオブジェクトから自動レイアウトするスクリプトです。
そう、プロジェクトの立ち上げに「構想はあるけどまとまらない」とボヤいていたやつです。
(これ)
2ed70b4d

 
まとまらないのは「変数が多すぎる」からみたいですね。

ほら、そのぉ、なんだ、あれですよ。

変数が2つなら連立方程式が2組必要とか、たぶんそういう仕組みなんだと思いますよ(適当^ ^ )

ふと思いついたのは、あまりにもパターンが多いので、

・2つのオブジェクトのせまいほうのスキマを採用して、
・全体のスキマを埋めたらどうなるか、

にて実験してみました。


<スクリプトファイル名>

<使い方>
(1)ふたつのオブジェクトを選択します。
(2)このスクリプトを起動します。

<仕様>
(1)ふたつのオブジェクトのスキマを使って全体のスキマを埋めます
(2)オブジェクトが重なっているときはスキマとは認めません
(3)x軸とy軸、他方が重なっていれば、そうでないほうをスキマにします
(4)両軸ともにスキマがあれば、せまいほうを採用します


■ダウンロードはこちらから(無料です)





■わりとうまくいくー\(^o^)/(そうでないものも…)


うん、わりとうまくいきそう。特に互い違いになっている2つのオブジェクトならスキマを埋めてくれます。

ただ、内部で仮想的にX軸・Y軸に並べ替えているところで、

同じ位置にあるもの

の並べ替えがうまくいかず座礁している感じです。

(たがいちがいになっているのはうまくいきます)
51
00

(重なっているやつはスキマなしとみなして、反応させません)
15


(プレビュー境界オンオフにも対応しています!芸がこまかい!)←自分で^ ^
20
23

(クリッピングマスクにも対応します)
32
37

ともあれ、実験プロジェクトですのでまずは無料公開!遊んでみてください。



ではでは出羽の海。



ソースも公開します。

G126_AutoLayout2.jsx
━━━━━
DOC = activeDocument
SEL = DOC.selection
STB = app.preferences.getBooleanPreference("includeStrokeInBounds")

MAINfn();

function MAINfn(){
if(SEL.length != 2) return false
ARx = SORTfn1(SEL)
ARy = SORTfn2(SEL)

BNDx0 = BNDfn(ARx[0])
BNDx1 = BNDfn(ARx[1])

BNDy0 = BNDfn(ARy[0])
BNDy1 = BNDfn(ARy[1])

D1 = BNDx1[0]-BNDx0[2]
D2 = BNDy0[3]-BNDy1[1]

CASEfn()
}

function CASEfn(){
if((D1<0) && (D2<0))return false

if(D2<0){
DD = D1
} else if(D1<0){
DD = D2
} else if(D1<D2){
DD = D1
} else {
DD = D2
}

if(BNDx0[1] <= BNDx1[1]){
CASEAfn()
} else {
CASEBfn()
}
}

function CASEAfn(){
L1 = BNDx0[0]
T1 = BNDy0[1]
W1 = BNDx1[0]-L1-DD
H1 = T1-BNDy1[1]-DD

NEWfn()

L1 = BNDx0[2]+DD
T1 = BNDy0[3]-DD
W1 = BNDx1[2]-L1
H1 = T1-BNDy1[3]

NEWfn()
}

function CASEBfn(){
L1 = BNDx0[0]
T1 = BNDy0[3]-DD
W1 = BNDx1[0]-L1-DD
H1 = T1-BNDy1[3]

NEWfn()

L1 = BNDx0[2]+DD
T1 = BNDy0[1]
W1 = BNDx1[2]-L1
H1 = T1-BNDy1[1]-DD

NEWfn()
}

function NEWfn(){
if((W1<0)||(H1<0))return false
NEW = DOC.pathItems.rectangle(T1, L1, W1, H1);
NEW.stroked = false
NEW.filled = true
NEW.fillColor = CMYKfn(0,0,0,20)
}

function SORTfn1(f0){
f1=[]
for(i=0;i<f0.length;i++) f1.push(f0[i])
f1.sort(function(a,b){
if(a.position[0] < b.position[0]){
return -1
} else if(a.position[0] > b.position[0]){
return 1
} else {
return 0
}
})
return f1
}

function SORTfn2(f0){
f1=[]
for(i=0;i<f0.length;i++) f1.push(f0[i])
f1.sort(function(a,b){
if(a.position[1] > b.position[1]){
return -1
} else if(a.position[1] < b.position[1]){
return 1
} else {
return 0
}
})
return f1
}

function BNDfn(SELz){
if(SELz.typename == "GroupItem" && SELz.clipped == true){
BNDz = SELz.pageItems[0].geometricBounds
} else if(STB == true){
BNDz = SELz.visibleBounds
} else {
BNDz = SELz.geometricBounds
}
return BNDz
}

function CMYKfn(c,m,y,k){
COL = new CMYKColor();
COL.cyan = c
COL.magenta = m
COL.yellow = y
COL.black = k
return COL;
}
━━━━━