木曜日, 5月 08, 2025

JavaScriptでAI遊び 47 
オブジェクトを別オブジェクトのポイントに複製

最初に描いたオブジェクトのパスのアンカーポイントへ、後から描いたオブジェクトを複製配置します。配置オブジェクトはグループ化もOKです。

// Illustrator Script: Last object's anchor points
// → Duplicate first object
function duplicateToAnchorPoints() {
var doc = app.activeDocument;
var sel = doc.selection;

if (sel.length !== 2) {
alert("2つのオブジェクトを選択してください。");
return;
}

// 最初に描いたオブジェクト(古い順)と
    // 最後に描いたオブジェクト(新しい順)を取得
var firstObject = sel[0];
var lastObject = sel[1];

// 最後のオブジェクトがパスでなければエラー
if (!(lastObject.typename === "PathItem" ||
        lastObject.typename === "CompoundPathItem")) {
alert("オブジェクトはパスオブジェクトである必要があります。");
return;
}

// アンカーポイントを取得
var anchorPoints = [];
if (lastObject.typename === "PathItem") {
for (var i = 0; i < lastObject.pathPoints.length; i++) {
var pt = lastObject.pathPoints[i].anchor;
anchorPoints.push(pt);
}
} else if (lastObject.typename === "CompoundPathItem") {
for (var j = 0; j < lastObject.pathItems.length; j++) {
var subPath = lastObject.pathItems[j];
for (var k = 0; k < subPath.pathPoints.length; k++) {
var pt = subPath.pathPoints[k].anchor;
anchorPoints.push(pt);
}
}
}

// 最後のオブジェクトの中心を取得
var bounds = firstObject.geometricBounds;
var centerX = (bounds[0] + bounds[2]) / 2;
var centerY = (bounds[1] + bounds[3]) / 2;

// 各アンカーポイントにオブジェクトを複製
for (var i = 0; i < anchorPoints.length; i++) {
var newObj = firstObject.duplicate();
var dx = anchorPoints[i][0] - centerX;
var dy = anchorPoints[i][1] - centerY;
newObj.position = [newObj.position[0] +
            dx, newObj.position[1] + dy];
}

alert("複製が完了しました!");
}

duplicateToAnchorPoints();

最初に描いたオブジェクト(黄色の星)に後から描いた円(オレンジと赤の円をグループ化)の両方を選択して実行すれば・・・

最初に描いたオブジェクト(黄色の星)のアンカーポイント上に、後から描いた円(オレンジと赤の円をグループ化)を配置します。