・ 長さ寸法(平行寸法/回転寸法)の測定値を取得する
長さ寸法の測定値は、グループコード42を調べればわかります。
しかし、この値は丸められていて正確ではないようです。
これは、誤りでした。
エンティティーデータの数値は丸められて表示されますが、内部的には十分に信頼できる制度で保持されています。(2005/06/04修正)
必要ないけど、定義点から再度取得してみました・・・・(^^ゞ
平行寸法は、定義点1と定義点2の距離を取得すればよいのですが、回転寸法はかなり面倒・・・・(~_~;)
DXF13→DXF14のベクトルを、寸法線の方向ベクトルに正射影して、その長さを取得します。
(defun Jo_dim_len ( / ) ;**********************************************************************************; ;サブルーチン (選択した寸法の計測値); (defun Jof_dim_dist ( v_0 e_13 e_14 / ) (Jof_v_len (Jof_v_orth v_0 (mapcar '- e_14 e_13))) ) ;************************************************************************************; ;サブルーチン ベクトルの長さを返す (defun Jof_v_len ( v;ベクトル; / ) (sqrt (apply '+ (mapcar '(lambda (x) (expt x 2)) v))) ) ;************************************************************************************; ;サブルーチン ベクトルの内積(inner product) ; 2ベクトルが直交する場合 0 となる (defun Jof_v_inp ( v1;ベクトル; v2;ベクトル; / ) (apply '+ (mapcar '* v1 v2)) ) ;************************************************************************************; ;サブルーチン 正射影ベクトルを返す ; v2のv1への正射影ベクトルを取得 (defun Jof_v_orth( v1;ベクトル; v2;ベクトル; / v3 ) (setq v3 (/ (Jof_v_inp v1 v2) (expt (Jof_v_len v1) 2))) (mapcar '(lambda (x) (* v3 x)) v1) ) ;**********************************************************************************; ;サブルーチン (選択した寸法の寸法線の方向ベクトル); (defun Jof_v_0 ( ed / e_13 e_14 e_50 e_14a e_14b) (setq e_13 (cdr (assoc 13 ed))) (setq e_14 (cdr (assoc 14 ed))) (setq e_50 (cdr (assoc 50 ed))) (if (= 1 (logand (cdr (assoc 70 ed)) 1)) ;平行寸法なら ; (mapcar '- e_14 e_13) (progn (setq e_14a (polar e_14 e_50 1)) (setq e_14b (polar e_14 e_50 -1)) (if (> (distance e_13 e_14a)(distance e_13 e_14b)) (polar '(0 0 0) e_50 1) (polar '(0 0 0) e_50 -1) ) ) ) ) ;**********************************************************************************; ;メインルーチン (setq ed (entget (car (entsel "\n長さ寸法を選択")))) (setq d_len (Jof_dim_dist (Jof_v_0 ed) (cdr (assoc 13 ed)) (cdr (assoc 14 ed)))) (princ (strcat "\n長さは" (rtos d_len))) (princ) )