gis_2002 发表于 2003-6-6 08:09:00

能否将计算结果返回定制的对话框内

以下本人学编的一段坐标计算小程序,主要用于三角形中,已知两个点坐标,及三个内角来计算另一个点坐标,并调用CAD绘出图形。
  已知数据以定制的对话框形式输入,现在我想把计算结果坐标也在原来定制的对话框中输出来,并调用CAD绘出图形。
  ;坐标计算 ZBJS.LSP

;度分秒转换成度
(defun DEG (ia / a d m s)

(if(minusp ia )      ;判断角度正负
      (setq sgn -1.0 )
      (setq sgn 1.0 )
   )
(setq a   (abs ia ) )  ;角度绝对值
(setq d (fix a ) )    ;提取度
(setq m (fix (+ (* (- a d) 100 ) 0.01) ) )   ;提取分
(setq s (* (- (* (- a d)100.0)m) 100 ) )   ;提取秒

   (* ( +d( / m 60.0 ) ( / s 3600.0 ) ) sgn )
)


;度转换成弧度
(defun dtor(d)
   (* (/ d 180.0) pi)
)

;弧度转换成度
(defun rtod(r)
   (* (/ r pi) 180.0)
)

;度转换成度分秒
(defun DMS(ia / a d m s )
(if(minusp ia )      ;判断角度正负
      (setq sgn -1.0 )
      (setq sgn 1.0 )
   )
(setq a   (abs ia ) )  ;角度绝对值
(setq d (fix a ) )    ;提取度
(setq m (fix (+ (* (- a d) 60.0 ) 0.01) ) )   ;提取分
(setq s (* (- (* (- a d)60.0)m) 60.0 ) )   ;提取秒

   (* ( +d( / m 100.0 ) ( / s 10000.0 ) 0.0000001) sgn )
)



;方位角计算程序
( defun fwj(x1 y1 x2 y2 / dx dy d12a12-dms )
      (graphscr)
            
   (setqdx (- x2 x1)dy (- y2 y1))   
   (setq d12 (sqrt( + (* dx dx ) (* dy dy ) ) ) )

       (if (= dy 0.0) (setq a12 (/ pi 2.0 ) ) )
       (if (= dx 0.0) (setq a12 0.0000 ) )
       (setq a12(atan (/ dy dx)))
       (cond
       (    (and (< dx 0.0 ) (< dy 0.0 ))      (setq a12(+ a12 pi )))
       (    (and (< dx 0.0 ) (> dy 0.0 ))      (setq a12(+ a12 pi )))
       (    (and (> dx 0.0 ) (< dy 0.0 ))      (setq a12(+ a12 pi pi )))
       (       tnil )
       )
       (setq a12    ( rtod a12 ))
      
    )

(defun c:zbjs ()
(setq k 0 )
(setq dcl_id (load_dialog "dcl_zbjs.dcl"))
(if (not (new_dialog "zbjs" dcl_id )) (exit))
(action_tile "accept" "(zbjs_ok)")
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)

(if (= k 1) ( pron
   
   (setqdx (- x2 x1)dy (- y2 y1))   
   (setq d12 (sqrt( + (* dx dx ) (* dy dy ) ) ) )
      
       (setq a12( fwj x1 y1 x2 y2) )
       (setq a11( dms a12 ) )
            
   ;(setq a0 -48.3418 b0 -60.0206 c0 -71.2306)

      (setq w (- (deg (+ (abs a0 ) (abs b0 ) (abs c0 ) )) 180 ) )
(if(minusp a0 )      ;判断角度正负
      (setq w( * w -1.0 ) )
)
      (setq vb (/ w 3.0 ) )

           (setq a (- (deg a0 )vb )
              b (- (deg b0 )vb )
              c (- (deg c0 )vb ) )      

   (setq k (/ d12(sin (abs (dtor c ) ) ) ) )
   (setq d20 (* k(sin (abs (dtor a ) ) ) ) )
   (setq d10 (* k(sin (abs (dtor b ) ) ) ) )
;方位角算

   (setq a20 (+ (+ a12 180 ) b ))
   (setq a01 (+ (+ a20 180 ) c ))
   (setq a12 (+ (+ a01 180 ) a ))

;坐标增量算

   (setq dx20 (* d20(cos(dtor a20 ) ) ) )
   (setq dy20 (* d20(sin(dtor a20 ) ) ) )
   
   (setq dx01 (* d10(cos(dtor a01 ) ) ) )
   (setq dy01 (* d10(sin(dtor a01 ) ) ) )
   
;坐标增量差
   
   (setq fx (+ (+dx20dx01 )dx ) )
   (setq fy (+ (+dy20dy01 )dy ) )

   (setq k1 ( / (abs dx20 )    (+ (abs dx20 ) (abs dx01 ) )) )
   (setq k2 ( / (abs dx01 )    (+ (abs dx20 ) (abs dx01 ) )) )
   (setq k3 ( / (abs dy20 )    (+ (abs dy20 ) (abs dy01 ) )) )
   (setq k4 ( / (abs dy01 )    (+ (abs dy20 ) (abs dy01 ) )) )

   (setq vx20 (* -1.0 fx k1 ))
   (setq vy20 (* -1.0 fy k3 ))
   (setq vx01 (* -1.0 fx k2 ))
   (setq vy01 (* -1.0 fy k4 ))

   (setq dx20 (+ dx20 vx20 ) )
   (setq dy20 (+ dy20 vy20 ) )
   (setq dx01 (+ dx01 vx01 ) )
   (setq dy01 (+ dy01 vy01 ) )

; 坐标计算

   (setq x0 (+ x2 dx20 ))
   (setq y0 (+ y2 dy20 ))

   (setq xx1 (+ x0 dx01 ))
   (setq yy1 (+ y0 dy01 ))

   (alert (strcat "x:" (rtos x0 2 4) "\ny:" (rtos y0 2 4)))
    (princ "\n x0=")
    (princ x0 )
    (princ "\n y0=")
    (princ y0 )
    (princ)

;绘图处理

   (graphscr)
   (setq
       p1 (list y1x1)
       p2 (list y2x2 )
       p0 (list y0x0 )
       p3 (list (- y1 20)   x1)
       p4 (list (+ y2 20)   x2)
       p5 (list (+ y0 20)   x0)   
      )

   (command "layer" "m" "kzd" "c" "6" "" "")
   (command "circle" p1 2 )
   (command "text" "m" p3 5 0 "(x1,y1)" "" )
   (command "circle" p2 2 )
   (command "text" "m" p4 5 0 "(x2,y2)" "" )
   (command "circle" p0 1 )
   (command "text" "m" p5 5 0 "(x0,y0)" "" )
   (command "pline" p1 "w" 2 ""p2"")
   (command "layer" "m" "tgd" "c" "1" "" "")
   (command "pline" p2 "w" 1 ""p0p1 "")
   (command "zoom" "e")
      
)
    (princ)
   )
    (princ "\n x0=")
    (princ x0 )
    (princ "\n y0=")
    (princ y0 )
    (princ)
   
    ;(alert (strcat "x:" (rtos x0 2 4) "\ny:" (rtos y0 2 4)))       

)



(defun zbjs_ok()
        (setq x1 (atof (get_tile "x01"))
              y1 (atof (get_tile "y01"))
              x2 (atof (get_tile "x02"))
              y2 (atof (get_tile "y02"))
       )
        (setq a0 (atof (get_tile "a0"))
              b0 (atof (get_tile "b0"))
              c0 (atof (get_tile "c0"))
       )
        (setq x0 (atof (get_tile "x0"))
              y0 (atof (get_tile "y0"))
       )
                     
        (setq k 1)
           (done_dialog)
)

以下是对话框


zbjs:dialog
   {
   label="坐标计算数据输入对话框";
   :row
      {
         :boxed_column
            {
                label="已知控制点坐标";
                   :boxed_column
                      {
                         label="控制点1";

                         :edit_box
                            {
                               label="X";
                               key="x01";
                               value="8112.450";
                               edit_width=15;
                            }
                         :edit_box
                            {
                               label="Y";
                               key="y01";
                               value="8482.246";
                               edit_width=15;
                            }
                      }

                   :boxed_column
                      {
                         label="控制点2";
                         :edit_box
                            {
                               label="X";
                               key="x02";
                               value="8180.010";
                               edit_width=15;
                            }
                         :edit_box
                            {
                               label="Y";
                               key="y02";
                               value="8585.793";
                               edit_width=15;
                            }
                      }
            }

         :boxed_column
            {
                label="已知角度数据(左角为正、右角为负)";
                  
                         :edit_box
                            {
                               label="角度A (°.′″)";
                               key="a0";
                               value="-48.3418";
                               edit_width=15;
                            }
                         :edit_box
                            {
                               label="角度B (°.′″)";
                               key="b0";
                               value="-60.0206";
                               edit_width=15;
                            }
                         :edit_box
                            {
                               label="角度c (°.′″)";
                               key="c0";
                               value="-71.2306";
                               edit_width=15;
                            }
                           
                      }
                           
            }

            :column
            {
            :boxed_row
            {
                label="待定点坐标";
                  
                         :edit_box
                            {
                               label="X";
                               key="x0";
                               value="";
                               edit_width=15;
                            }
                         :edit_box
                            {
                               label="y";
                               key="y0";
                               value="";
                               edit_width=15;
                            }
                         :button
                            {
                               label="调用CAD绘图";
                               key="draw";
                               edit_width=15;
                            }
                           
                      }
                   }
                  

      

       ok_cancel;
}

  烦请各帮忙看看!



meflying 发表于 2003-6-6 09:09:00

三角形内角有负的吗?而且只要知道两个内角不就够了吗?

meflying 发表于 2003-6-6 12:37:00

看看是这样吗?

gis_2002 发表于 2003-6-9 10:45:00

谢谢回复!

1、三角形中,观测三个内角,由于测量有误差,所以必须观测三个内角,若不等于180,然后再平均分配误差,这样符合最小二乘原理,可认为经过角度平差后,角度误差很小,比较合理。如果只用任意两个角,这两个则有误差,造成计算不合理,所以不能用余弦定理去推算另一个角。
  2、推算方位角,线路左边的角规定为正角,右边为负角,只是为了计算方位角,并不是角度有正负之分。
  不知我说明白了没有?  
  谢谢帮忙!

meflying 发表于 2003-6-9 11:20:00

那其它部分可以用我给的程序,计算仍用你自己的,注意,修改一下内角返回的个数

页: [1]
查看完整版本: 能否将计算结果返回定制的对话框内