日曜日, 9月 27, 2026

JavaScriptでAI遊び 107 
Illustratorで選択オブジェクトを指定数ランダム散布

Illustratorで選択したオブジェクトを数だけ指定してアートボード内に散布させるシンプル処理が必要だったので作ってみました。多分過去に作っていないと思います。処理結果はアートボードからはみ出すことはありません。

(function () {

if (app.documents.length === 0) {
alert("ドキュメントが開かれていません。");
return;
}

var doc = app.activeDocument;

// --------------------------------
// 選択チェック
// --------------------------------
if (doc.selection.length === 0) {
alert("散布するオブジェクトを選択してください。");
return;
}

// --------------------------------
// 散布数を入力
// --------------------------------
var input = prompt(
"散布する個数を入力してください。",
"50"
);

if (input === null) {
return; // キャンセル
}

var count = parseInt(input, 10);

if (isNaN(count) || count < 1) {
alert("1以上の整数を入力してください。");
return;
}

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

var abLeft = abRect[0];
var abTop = abRect[1];
var abRight = abRect[2];
var abBottom = abRect[3];

// --------------------------------
// 選択オブジェクトを保存
// --------------------------------
var originals = [];

for (var i = 0; i < doc.selection.length; i++) {
originals.push(doc.selection[i]);
}

// --------------------------------
// 選択オブジェクトをグループ化
// --------------------------------
var group = doc.groupItems.add();

for (var i = 0; i < originals.length; i++) {
originals[i].move(group, ElementPlacement.PLACEATEND);
}

// グループの中心
var gb = group.geometricBounds;

var centerX = (gb[0] + gb[2]) / 2;
var centerY = (gb[1] + gb[3]) / 2;

// --------------------------------
// 複製してランダム散布
// --------------------------------
for (var i = 0; i < count; i++) {

var item = group.duplicate();

// オブジェクトサイズ
var b = item.geometricBounds;

var width = b[2] - b[0];
var height = b[1] - b[3];

// アートボード内に収まる範囲
var minX = abLeft + width / 2;
var maxX = abRight - width / 2;

var minY = abBottom + height / 2;
var maxY = abTop - height / 2;

// ランダム位置
var x = minX + Math.random() * (maxX - minX);
var y = minY + Math.random() * (maxY - minY);

// 移動
item.translate(
x - centerX,
y - centerY
);

// ランダム回転
var angle = Math.random() * 360;

item.rotate(
angle,
true,
true,
true,
true,
Transformation.CENTER
);
}

// --------------------------------
// 元オブジェクトを削除
// --------------------------------
group.remove();

// 選択解除
doc.selection = null;

alert(count + "個のオブジェクトをランダム配置しました。");

})();

べースとなるオブジェクト(※)を選択して実行すると・・・

散布による重なりを想定してオブジェクトを乗算設定しています。

散布する数を指定します。デフォルトは50。

これが表示されれば問題なく完了です。

処理結果はこんな感じ。

散布数を200にし・・・

これが表示されれば完了です。

処理結果はこんな感じ。ちなみにベースオブジェクトは処理後に削除されます。

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