火曜日, 3月 04, 2025

JavaScriptでAI遊び 36 
オブジェクトのアンカーポイントでカットしセグメントをバラバラに

オブジェクトをアンカーポイントでカットして、セグメントをバラバラにします。

function splitPathPreservingHandles() {
var doc = app.activeDocument;
var sel = doc.selection;

if (!(sel && sel.length > 0)) {
alert("パスを選択してください。");
return;
}

for (var i = 0; i < sel.length; i++) {
if (sel[i].typename !== "PathItem") continue; // パスアイテムのみ処理

var path = sel[i];
var points = path.pathPoints;
var newPaths = [];

// クローズパスかどうか
var isClosed = path.closed;

for (var j = 0; j < points.length - 1; j++) {
createNewSegment(doc, points[j], points[j + 1],
                path, newPaths);
}

// クローズパスの場合、最終セグメントと最初のセグメントを分割
if (isClosed) {
createNewSegment(doc, points[points.length - 1],
                points[0], path, newPaths);
}

path.remove(); // 元のパスを削除
}

alert("選択したパスをハンドルを保持して分割しました。");
}

// 指定された2点を結ぶ新しいセグメントを作成
function createNewSegment(doc, startPoint, endPoint,
    originalPath, newPaths) {
var newPath = doc.pathItems.add();
newPath.setEntirePath([
[startPoint.anchor[0], startPoint.anchor[1]],
[endPoint.anchor[0], endPoint.anchor[1]]
]);

var newPoints = newPath.pathPoints;
newPoints[0].leftDirection = startPoint.leftDirection;
newPoints[0].rightDirection = startPoint.rightDirection;
newPoints[1].leftDirection = endPoint.leftDirection;
newPoints[1].rightDirection = endPoint.rightDirection;

newPath.stroked = originalPath.stroked;
newPath.strokeColor = originalPath.strokeColor;
newPath.fillColor = originalPath.fillColor;
newPath.filled = false; // 塗りなし
newPaths.push(newPath);
}

splitPathPreservingHandles();


サンプルオブジェクトを選択して実行すれば・・・

セグメントだけがのこります。ただし、処理直後はアウトライン表示にしないと確認できません。全選択で任意の色を設定すると良いでしょう。

ダイレクト選択ツールでバラバラを確認できます。