・ 長さ寸法(平行寸法/回転寸法)の測定値を取得する

長さ寸法の測定値は、グループコード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)
    )