水曜日, 7月 29, 2026

JavaScriptでAI遊び 102 
Illustratorで選択したオブジェクト群の重なりを修正

選択したオブジェクト群の重なりを修正し、アートボード内に再配置します。

// アートボード内にランダム配置(重なり回避)

if (app.documents.length == 0) {
alert("ドキュメントを開いてください");
exit();
}

var doc = app.activeDocument;
var sel = doc.selection;

if (sel.length == 0) {
alert("オブジェクトを選択してください");
exit();
}

var marginMM = Number(prompt("オブジェクト間の余白(mm)", "2"));

if (isNaN(marginMM)) {
exit();
}

var margin = marginMM * 2.834645669;

// 現在のアートボード
var abIndex = doc.artboards.getActiveArtboardIndex();
var ab = doc.artboards[abIndex].artboardRect;

// [left, top, right, bottom]
var abLeft = ab[0];
var abTop = ab[1];
var abRight = ab[2];
var abBottom = ab[3];

function overlap(a, b) {
return !(
a.right + margin < b.left ||
a.left > b.right + margin ||
a.top < b.bottom - margin ||
a.bottom > b.top + margin
);
}

var placed = [];

for (var i = 0; i < sel.length; i++) {

var item = sel[i];
var gb = item.geometricBounds;

var w = gb[2] - gb[0];
var h = gb[1] - gb[3];

var placedOK = false;

for (var attempt = 0; attempt < 1000; attempt++) {

var x = abLeft + Math.random() * ((abRight - abLeft) - w);
var y = abTop - Math.random() * ((abTop - abBottom) - h);

var rect = {
left: x,
top: y,
right: x + w,
bottom: y - h
};

var hit = false;

for (var j = 0; j < placed.length; j++) {
if (overlap(rect, placed[j])) {
hit = true;
break;
}
}

if (!hit) {

item.position = [x, y];

placed.push({
left: x,
top: y,
right: x + w,
bottom: y - h
});

placedOK = true;
break;
}
}

if (!placedOK) {
alert(
"配置できないオブジェクトがあります。\n" +
"アートボードを大きくするか、選択数を減らしてください。"
);
break;
}
}

alert("配置完了");

オブジェクト群を選択し実行すると・・・

間隔値(※)を設定し・・・

※デフォルトは2mm

このパレットが表示されたら完了です。

アート簿度内にかさなっる事無く配置されます。ただし、選択群の数が多いと一部のオブジェクトは重なったままになります。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。