ラベル Illustrator の投稿を表示しています。 すべての投稿を表示
ラベル Illustrator の投稿を表示しています。 すべての投稿を表示

水曜日, 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のアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

木曜日, 7月 23, 2026

JavaScriptでAI遊び 101 
Illustratorで選択したオブジェクトの位置をランダム変更

選択したオブジェクトの位置をランダムに変更じます。

// 選択オブジェクトをランダム移動(mm指定)

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

var doc = app.activeDocument;

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

var rangeMM = parseFloat(prompt("移動範囲 ±(mm)", "5"));

if (isNaN(rangeMM) || rangeMM < 0) {
alert("正しい数値を入力してください。");
exit();
}

// mm → pt
var rangePt = rangeMM * 2.834645669;

function randomOffset(range) {
return (Math.random() * 2 - 1) * range;
}

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

var item = doc.selection[i];

var dx = randomOffset(rangePt);
var dy = randomOffset(rangePt);

item.translate(dx, dy);
}

alert("ランダム移動完了");
}
}


移動距離を指定し・・・

※デフォルトは5mm

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

上は処理結果です。

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

日曜日, 7月 19, 2026

Illustratorでの作図基本 41 
二等辺三角形の作図は2つの方法

Illustratorで二等辺三角形をストレートに作図することはできませんが、プロパティで切り抜けます。

例えば上のような二等辺三角形が欲しい場合・・・

Illustratorの作図は正三角形で概説する縁の半径と同じ半径の正三角形になってしまいます。
なので、とりあえず適当な正三角形を作成してからプロパティでWidthとHightの値変更で作図します。

あるいは、二等辺三角形の底辺と高さに該当する長方形を作成し[オブジェクト]>[パス]>[アンカーポイントを追加]後に上図のようにアンカーポイントを目引きして作図することもできます。

土曜日, 7月 18, 2026

JavaScriptでAI遊び 100 
Illustratorで選択したオブジェクトをレイヤー分け

選択したオブジェクトを個別にルートレイヤーに分けます。いられるのデフォルト機能である[サブレイヤーに分配]とは処理結果が異なります。個人的に[サブレイヤーに分配]は勘違いしやすいので使って居ません。

Illustratorのサブレイヤーに分配が変? 2026/07/13


// 選択グループ内のパーツを前後関係を維持してレイヤー分割

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

var doc = app.activeDocument;

if (doc.selection.length != 1) {
alert("グループを1つ選択してください");
exit();
}

var target = doc.selection[0];

if (target.typename != "GroupItem") {
alert("グループを選択してください");
exit();
}

// pageItemsを配列化
var items = [];

for (var i = 0; i < target.pageItems.length; i++) {
items.push(target.pageItems[i]);
}

// IllustratorのpageItemsは前面→背面なので逆順で処理
for (var j = items.length - 1; j >= 0; j--) {

var item = items[j];

var layer = doc.layers.add();

var num = ("000" + (items.length - j)).slice(-3);
layer.name = "Layer_" + num;

item.move(layer, ElementPlacement.PLACEATBEGINNING);
}

alert(items.length + "個のパーツをレイヤー分割しました");

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

このレイヤー状態は・・・

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

こんな感じです。

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

水曜日, 7月 15, 2026

Illustratorのサブレイヤーに分配が変?

Illustratorで作成したデーターをレイヤー分けする場合、オプションメニューから[サブレイヤーに分配]を選ぶと、ちょっと希望と異なる結果になります。

例えば、上はサンプルデータ画グループからされている状態です。


オプションメニューから[サブレイヤーに分配]を選べるときと選べないときがあり、正直ワケワカメです。


グループ化せずに[レイヤーパレット]>[オプションメニュー]>[サブレイヤーに分配(シーケンス)]の結果はグループ化したときと同じ?

グループ化せずに[レイヤーパレット]>[オプションメニュー]>[サブレイヤーに分配(ビルド)]の結果は一瞬焦りますが、これはAfterEffcts等に取り込むことを想定しているようです。問題は[サブレイヤーに分配(シーケンス)]ですが・・・


グループ解除して[サブレイヤーに分配(シーケンス)]ならPhotoshopにレイヤーを生かして配置できますが・・・

グループ化している状態で[サブレイヤーに分配(シーケンス)]するとPhotoshopは孫レイヤーを見逃します(>_<)

月曜日, 7月 13, 2026

JavaScriptでAI遊び 99 
Illustratorで選択したオブジェクトのサイズをランダム変更

選択したオブジェクトのサイズをランダムに変更じます。

// 選択オブジェクトをランダムスケール

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

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

var minScale = parseFloat(prompt("最小倍率(%)", "50"));
if (isNaN(minScale)) exit();

var maxScale = parseFloat(prompt("最大倍率(%)", "200"));
if (isNaN(maxScale)) exit();

if (minScale > maxScale) {
var tmp = minScale;
minScale = maxScale;
maxScale = tmp;
}

function randomScale(min, max) {
return min + Math.random() * (max - min);
}

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

var item = doc.selection[i];
var scale = randomScale(minScale, maxScale);

item.resize(
scale, // 水平
scale, // 垂直
true, // パターン変形
true, // グラデーション変形
false, // 線幅は維持
true, // 塗りパターン変形
scale // 線幅倍率
);
}

alert("ランダムスケール完了");
}
}

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

最小倍率を指定し・・・

最大倍率を指定するだけです。

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

上は処理結果です。線幅も対応させる場合は、38行目を以下の様に変更すれば完了です。

false, // 線幅は維持
true, // 線幅も変更

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

土曜日, 7月 11, 2026

Illustratorの無駄知識44 
円に対するジグザグの折り返しと結果

円に対するジグザグの折り返しと、その結果を整理しました。

調整するのは[折り返し]だけです。

左はデフォルトの円(アンカーポイント4)、右はアンカーポイントを追加してアンカーポイント8の状態で[折り返し]を[0]にした結果。

[折り返し]を[1]にした結果。

[折り返し]を[2]にした結果。

[折り返し]を[3]にした結果。

[折り返し]を[4]にした結果。

[折り返し]を[5]にした結果。

[折り返し]を[6]にした結果。

[折り返し]を[8]にした結果。

[折り返し]を[10]にした結果。

整理するとこんな感じです。アンカーポイントは[2]以降で落ち着きますね。

火曜日, 7月 07, 2026

JavaScriptでAI遊び 98 
Illustratorで選択したパスの太さを指定範囲でランダム変更

選択したパス(線幅)の太さを指定範囲でランダムに変更します。


// 選択したオブジェクトの線幅をランダム変更

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

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

var minWeight = parseFloat(prompt("最小線幅(pt)", "0.5"));
if (isNaN(minWeight)) exit();

var maxWeight = parseFloat(prompt("最大線幅(pt)", "5"));
if (isNaN(maxWeight)) exit();

if (minWeight > maxWeight) {
var temp = minWeight;
minWeight = maxWeight;
maxWeight = temp;
}

function randomWeight(min, max) {
return min + Math.random() * (max - min);
}

function applyRandomStroke(item) {

if (item.typename === "PathItem") {
if (item.stroked) {
item.strokeWidth =
                        randomWeight(minWeight, maxWeight);
}
}

else if (item.typename === "GroupItem") {
for (var i = 0; i < item.pageItems.length; i++) {
applyRandomStroke(item.pageItems[i]);
}
}

else if (item.typename === "CompoundPathItem") {
for (var j = 0; j < item.pathItems.length; j++) {
if (item.pathItems[j].stroked) {
item.pathItems[j].strokeWidth =
randomWeight(minWeight, maxWeight);
}
}
}
}

for (var k = 0; k < doc.selection.length; k++) {
applyRandomStroke(doc.selection[k]);
}

alert("線幅をランダム変更しました。");
}
}
パスを選択し実行すると・・・

最小線幅を指定し・・・

最大線幅を指定するだけです。

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

上は処理結果です。ハンドルのある曲線やクローズパスにも対応します。

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