Q5:楕円の周長を求めて図に書き込む/EllipseLengthText
このマクロでできること
| 要素 | 内容 |
| ---- | --------------------------------- |
| 対象 | ユーザーが選んだ楕円(ELLIPSE) |
| 計算方法 | ラマヌジャン第2公式による近似周長 |
| 丸め処理 | 小数点1位を**切り上げて**整数化(例:123.1 → 124) |
| 出力 | 結果をその場に**テキストオブジェクトで配置**(楕円の中心付近) |
使用手順
.lsp ファイルに保存(例:EllipseLengthText.lsp)
AutoCAD で APPLOAD → ファイルを読み込み
コマンド EllipseLengthText を実行
楕円をクリックで選択 楕円の中心に 周長 ≒ xxx のテキストが挿入されます(文字高さ10)
■楕円の周長算出→図面に記載(EllipseLengthText.lsp)
(defun c:EllipseLengthText ( / ent obj a b h perimeter rounded txtpt )
(vl-load-com)
(prompt "\n周長を求めたい楕円を選択してください:")
(setq ent (car (entsel "\n楕円を選択: ")))
(if ent
(progn
(setq obj (vlax-ename->vla-object ent))
(if (= (vla-get-objectname obj) "AcDbEllipse")
(progn
;; 長軸と短軸の半径を取得
(setq a (vla-get-MajorRadius obj))
(setq b (vla-get-MinorRadius obj))
;; ラマヌジャン第2公式による近似周長
(setq h (/ (expt (- a b) 2.0) (expt (+ a b) 2.0)))
(setq perimeter (* pi (+ a b) (+ 1.0 (/ (* 3 h) (+ 10 (sqrt (- 4 (* 3
h))))))))
;; 小数第1位で切り上げ → 整数
(setq rounded (fix (1+ (fix perimeter))))
;; 楕円の中心座標を取得(テキストの挿入点に使用)
(setq txtpt (vlax-get obj 'Center))
;; テキストオブジェクト作成(高さ10、文字スタイルは図面の既定)
(entmake
(list
(cons 0 "TEXT")
(cons 10 txtpt) ; 挿入点
(cons 40 10.0) ; 高さ
(cons 1 (strcat "周長 ≒ " (itoa rounded))) ; 内容
(cons 7 "STANDARD") ; 文字スタイル(必要に応じて変更可能)
(cons 8 "0") ; レイヤー(現在のままでもOK)
)
)
(prompt (strcat "\n楕円の周長 ≒ " (itoa rounded) "(切り上げ) を図面に配置しました。"))
)
(prompt "\n選択されたオブジェクトは楕円ではありません。")
)
)
(prompt "\nオブジェクトが選択されませんでした。")
)
(princ)
)

