(defun c:GetSecPropsFull ( / ent obj area cen cx cy bbox minpt maxpt minx miny maxx maxy dx_lt dx_rt dy_lw dy_up mom xmom ymom zx_up zx_lw zy_lt zy_rt ix iy area_cm xmom_cm ymom_cm zx_up_cm zx_lw_cm zy_lt_cm zy_rt_cm ix_cm iy_cm txt_h cir_r pt d_scale final_txt_h dx_lt_cm dx_rt_cm dy_lw_cm dy_up_cm)
  (vl-load-com)

  ;; 1. 自作したリージョン(REGION)を1つ選択
  (setq ent (car (entsel "\n計算するリージョンを選択してください: ")))

  ;; 選択された図形がリージョンであるかチェック
  (if (and ent (= (cdr (assoc 0 (entget ent))) "REGION"))
    (progn
      ;; 2. VLAオブジェクトに変換
      (setq obj (vlax-ename->vla-object ent))

      ;; 3. 面積と図芯(重心)の取得
      (setq area (vla-get-area obj))
      (setq cen (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
      (setq cx (car cen)
            cy (cadr cen))

      ;; 寸法スタイルから「文字の高さ」と「全体の尺度」を取得してサイズを自動決定
      (setq txt_h (getvar "DIMTXT"))     ; 現在の寸法スタイルの文字高さ
      (setq d_scale (getvar "DIMSCALE")) ; 現在の寸法スタイルの全体尺度

      (if (= d_scale 0.0) (setq d_scale 1.0))
      (setq final_txt_h (* txt_h d_scale))        ; 図面に書き出す文字高
      (setq cir_r       (* txt_h d_scale 2.0))    ; 図芯の円の半径

      ;; 図芯の位置に円を作図
      (command-s "_.circle" (list cx cy 0.0) cir_r)

      ;; 4. 外形寸法(境界ボックス)を取得して重心からの最短距離を計算
      (vla-getboundingbox obj 'minpt 'maxpt)
      (setq minx (car (vlax-safearray->list minpt))
            miny (cadr (vlax-safearray->list minpt))
            maxx (car (vlax-safearray->list maxpt))
            maxy (cadr (vlax-safearray->list maxpt)))

      ;; 重心から【上下左右】の各端線への個別最短距離 (mmベースの縁端距離)
      (setq dx_lt (abs (- cx minx))   ; 左縁
            dx_rt (abs (- maxx cx))   ; 右縁
            dy_lw (abs (- cy miny))   ; 下縁
            dy_up (abs (- maxy cy)))  ; 上縁

      ;; 5. 断面二次モーメント(重心まわり)の取得(平行軸の定理)
      (setq mom (vlax-safearray->list (vlax-variant-value (vla-get-momentofinertia obj))))
      (setq xmom (- (car mom) (* area cy cy))
            ymom (- (cadr mom) (* area cx cx)))

      ;; 6. 断面係数の計算(mmベース:上下左右の最短距離を使用)
      (setq zx_up (if (> dy_up 0) (/ xmom dy_up) 0)
            zx_lw (if (> dy_lw 0) (/ xmom dy_lw) 0)
            zy_lt (if (> dx_lt 0) (/ ymom dx_lt) 0)
            zy_rt (if (> dx_rt 0) (/ ymom dx_rt) 0))

      ;; 断面2次半径 ix, iy の計算 (mm)
      (setq ix (if (> area 0) (sqrt (/ xmom area)) 0)
            iy (if (> area 0) (sqrt (/ ymom area)) 0))

      ;; 7. 各数値を「cm」単位へ換算
      (setq area_cm    (/ area 100.0)
            xmom_cm    (/ xmom 10000.0)
            ymom_cm    (/ ymom 10000.0)
            zx_up_cm   (/ zx_up 1000.0)
            zx_lw_cm   (/ zx_lw 1000.0)
            zy_lt_cm   (/ zy_lt 1000.0)
            zy_rt_cm   (/ zy_rt 1000.0)
            ix_cm      (/ ix 10.0)
            iy_cm      (/ iy 10.0))

      ;; 重心からの各端寸法(縁端距離)をcmに換算
      (setq dx_lt_cm   (/ dx_lt 10.0)
            dx_rt_cm   (/ dx_rt 10.0)
            dy_lw_cm   (/ dy_lw 10.0)
            dy_up_cm   (/ dy_up 10.0))

      ;; 8. 結果の表示(コマンドライン)
      (princ "\n--- 断面性能結果 (極性能削除版) ---")

      ;; 9. 図面へのテキスト書き出し
      (setq pt (getpoint "\n文字を配置する点を指定: "))
      (if pt
        (progn
          (command-s "_.mtext" pt "_H" (rtos final_txt_h 2 3) "_W" "0"
                     (strcat "ex(Upper) = " (rtos dy_up 2 1) " mm  [" (rtos dy_up_cm 2 2) " cm]\\P"
                             "ex(Lower) = " (rtos dy_lw 2 1) " mm  [" (rtos dy_lw_cm 2 2) " cm]\\P"
                             "ey(Left) = " (rtos dx_lt 2 1) " mm  [" (rtos dx_lt_cm 2 2) " cm]\\P"
                             "ey(Right) = " (rtos dx_rt 2 1) " mm  [" (rtos dx_rt_cm 2 2) " cm]\\P"
                             "A = " (rtos area 2 1) " mm2  [" (rtos area_cm 2 2) " cm2]\\P"
                             "Ix = " (rtos xmom 2 1) " mm4  [" (rtos xmom_cm 2 2) " cm4]\\P"
                             "Iy = " (rtos ymom 2 1) " mm4  [" (rtos ymom_cm 2 2) " cm4]\\P"
                             "Zx(Upper) = Ix / ex(Upper) = " (rtos zx_up 2 1) " mm3  [" (rtos zx_up_cm 2 2) " cm3]\\P"
                             "Zx(Lower) = Ix / ex(Lower) = " (rtos zx_lw 2 1) " mm3  [" (rtos zx_lw_cm 2 2) " cm3]\\P"
                             "Zy(Left) = Iy / ey(Left) = " (rtos zy_lt 2 1) " mm3  [" (rtos zy_lt_cm 2 2) " cm3]\\P"
                             "Zy(Right) = Iy / ey(Right) = " (rtos zy_rt 2 1) " mm3  [" (rtos zy_rt_cm 2 2) " cm3]\\P"
                             "ix = √(Ix / A) = " (rtos ix 2 1) " mm  [" (rtos ix_cm 2 2) " cm]\\P"
                             "iy = √(Iy / A) = " (rtos iy 2 1) " mm  [" (rtos iy_cm 2 2) " cm]")
                     "")
        )
      )
    )
    (princ "\nエラー: リージョンオブジェクトが選択されませんでした。")
  )
  (princ)
)