能否将计算结果返回定制的对话框内
以下本人学编的一段坐标计算小程序,主要用于三角形中,已知两个点坐标,及三个内角来计算另一个点坐标,并调用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;
}
烦请各帮忙看看!
三角形内角有负的吗?而且只要知道两个内角不就够了吗?
看看是这样吗?
谢谢回复!
1、三角形中,观测三个内角,由于测量有误差,所以必须观测三个内角,若不等于180,然后再平均分配误差,这样符合最小二乘原理,可认为经过角度平差后,角度误差很小,比较合理。如果只用任意两个角,这两个则有误差,造成计算不合理,所以不能用余弦定理去推算另一个角。2、推算方位角,线路左边的角规定为正角,右边为负角,只是为了计算方位角,并不是角度有正负之分。
不知我说明白了没有?
谢谢帮忙!
那其它部分可以用我给的程序,计算仍用你自己的,注意,修改一下内角返回的个数
页:
[1]