(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)
)