明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1680|回复: 4

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

[复制链接]
发表于 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 d12  a12-dms )
      (graphscr)
            
     (setq  dx (- 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 )  )  )
         (       t  nil )
         )
       (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
     
     (setq  dx (- 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 (+ (+  dx20  dx01 )  dx ) )
     (setq fy (+ (+  dy20  dy01 )  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 y1  x1)
       p2 (list y2  x2 )
       p0 (list y0  x0 )
       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 ""  p0  p1 ""  )
     (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;
}

  烦请各帮忙看看!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2003-6-6 09:09:00 | 显示全部楼层

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

发表于 2003-6-6 12:37:00 | 显示全部楼层

看看是这样吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2003-6-9 10:45:00 | 显示全部楼层

谢谢回复!

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

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 16:52 , Processed in 0.174738 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表