水曜日, 8月 30, 2023

JavaScriptでAI遊び 09 
現在開いているドキュメントの中心に円を描く

作業中のファイルのど真ん中に円を描く・・・なのですが、結果が不安定で困惑中です。

/* center_circle.jsx */
// 現在のアクティブなドキュメントを取得
var doc = app.activeDocument;

// ユーザーに半径を入力させる
var radiusInput = parseFloat(prompt(
"円の半径を入力してください(ピクセル)", "50"));
if (isNaN(radiusInput) || radiusInput <= 0) {
alert("正しい半径を入力してください。");
} else {

// ドキュメントの幅と高さを取得
var docWidth = doc.width;
var docHeight = doc.height;

// 円の中心座標を計算
var centerX = docWidth / 2;
var centerY = docHeight / 2;

// 円を描く
var circle = doc.pathItems.ellipse(centerY + radiusInput,
centerX - radiusInput, radiusInput * 2, radiusInput * 2);
// Illustratorの円描画は左上から描くので、
// centerY - radiusInputではなくて
// centerY + radiusInput

// 円の属性を設定
circle.strokeColor = new RGBColor();
circle.fillColor = new NoColor();
circle.strokeWidth = 2;

// 円を選択状態にする
circle.selected = true;
}
/* center_circle.jsx */

実行すると描画する円の半径を求めてきます。
Illustratorは円を直径で描くので間違えないでください。
直径入力にする場合は・・・

var radiusInput = parseFloat(prompt(
"円の半径を入力してください(ピクセル)", "50"));
            ↓
var radiusInput = parseFloat(prompt(
"円の直径を入力してください(ピクセル)", "100"));

var circle = doc.pathItems.ellipse(centerY + radiusInput,
centerX - radiusInput, radiusInput * 2, radiusInput * 2);
            ↓
var circle = doc.pathItems.ellipse(centerY + radiusInput/2,
centerX - radiusInput/2, radiusInput, radiusInput);

のように変更してください。

以下の環境で確認すると・・・ファイルによって動作が狂います。上手くいくファイルも再処理で狂ったりして意味不明です。正しく動作したり狂ったりなので、Illustrator側に問題があるのかもしれません。

Illustrator 27.7(Windows)
Illustrator 27.8.1(mzcOS)