|
|
本人制作一路桥专业使用的lisp函数,功能:依据输入的路线交点参数算要求点的坐标,并在绘图区绘出图形。
+ u+ s1 t" [* U. t. _# k5 s但是在使用中发现多次发现,适合一次调用,多次调用时就出现计算坐标结果正确,但是就是部分点绘到一块去了(如图):
( k' P: G% m2 z问题出在使用自动序列时,第一次计算,计算的X、Y、方位角值均正确,绘出的图形也没有错误,可若是不重新启动CAD的话,再调用dqx命令就可能出现计算的坐标及方位角均正确,绘出的图形重叠显示。我试验三次的桩号间距分别为5、2.5、1,到桩号为1的时候就出现重叠了,再继续下去也是结果正确绘图重叠。特点好似桩号间距递增(如5、10、15、20……)不出现问题,但桩号间距递减(如10、5、2.5、1)就出现问题了。不能像CAD命令那样在不重启CAD的情况下多次使用。
# }, x% _# |/ G8 l( s' X0 T; s% X& W
& ]2 B# |9 M# N! S, M$ M7 Z8 k* H
& [9 C3 c/ `) I函数代码如下:(参数区我已经赋值)
( N! n; o8 u5 [5 f% A- g0 G# ?; }(defun c:dqx( / qs qz qszb qs_a qsr qzr k ls ma mi dzh dzh1 jl j n )/ i1 @7 Z$ t! L3 }+ m( t3 l
(setvar "cmdecho" 0)5 z) {. [4 e6 y. _' h) Z
(princ "\n-------------------------------------------------------------")
- [$ l# G+ v Z( k- h8 { (princ "\n (^_^) 于森制作,欢迎使用。[email protected] (^_^) ")
. k9 E* s& G# J0 b- h (princ "\n-------------------------------------------------------------")6 }/ x& ~& z" R6 u( ]: {! u5 H
;(setq qs (getreal "\n输入曲线始点桩号:")). k& }1 c z1 E3 s
(setq qs 25650.926)
0 w! G1 ^8 m9 Q ;(setq qz (getreal "\n输入曲线终点桩号:"))( v- h' O d% v5 `$ A! `3 ?
(setq qz 25900.926)
* o) B1 k+ }7 g5 k/ c O ;(setq qszb (getpoint "\n输入或拾取曲线始点坐标:"))
0 h1 K$ |! c7 V (setq qszb '( 3252647.051 381399.471))
+ n, p3 I9 y+ d, A. L ;(setq qs_a (getreal "\n输入曲线始点顺曲线桩号递增方向的计算方位角(弧度):"))
2 q6 B8 H4 w& `+ x (setq qs_a 2.907134)
& F; R6 R ^& V7 z5 a (if (> qs qz) (setq qs_a (+ qs_a pi)))" ^; c2 q1 i3 i! @
;(setq qsr (getreal "\n输入曲线始点半径(半径=∞时为0):"))3 |# d6 f0 |* ^' @9 H
(setq qsr 3650)
+ ^" `- o8 W* ~& H" {! s5 Y* Y (if (= qsr 0) (setq qs_ql (/ 1 10000000)) (setq qs_ql (/ 1 qsr)))
, X/ Y+ W. Q0 J5 S3 p" D8 M ;(setq qzr (getreal "\n输入曲线终点半径(半径=∞时为0):"))5 I$ O! E& ]: A& a2 g) Z0 v
(setq qzr 1295.3)
% K: g, y7 t2 N, {: Z7 i) M& v (if (= qzr 0) (setq qz_ql (/ 1 10000000)) (setq qz_ql (/ 1 qzr)))
! s( n8 w7 E, e# e0 e; O ;(setq k (getreal "\n选择顺曲线桩号递增方向的转向[左(-1)\\右(1)]:"))- Q: N( _8 O# ^. g5 U
(setq k -1)9 V. q' W! R" ^9 V; `
(setq ls (- qz qs))
, y5 Q6 g3 S Y5 q& R (setq dzh qs)0 H I& ?; W/ N l5 _7 z' ?
(setq ma (max qs qz) mi (min qs qz))# B/ f r7 z: G1 E1 J2 I
(princ "\n-------------------------------------------------------------"): ?( C+ ]* t3 }
(princ "\n 开始桩号坐标计算,请输入曲线始点至终点间的桩号! ")
+ V( w- I! y8 `4 ~ (princ "\n-------------------------------------------------------------")
2 I' p3 R& e! A- k" q9 a8 v! @8 c (setq dzh (getreal "\n输入桩号[自动序列(-2)]:"))
. j, a2 k- K$ b7 U$ ~+ b (if (= dzh -2)
8 g0 y9 U" [/ x8 G0 f. M (progn1 p$ X/ @( b7 z- ]* x: ^
(setq jl (getreal "\n输入自动序列的桩号间距:"))5 q+ F% K+ W6 n/ ~
(setq j 0)
, Y6 D' a! p( `( I+ D/ t (setq dzh (+ 10 (* 10 (fix (/ mi 10)))))8 p/ D) x6 f: n
(zbjs dzh)! @/ e) t @! f0 S' q
(setq n (- (fix (/ (- (fix ma) dzh) jl)) 1))1 M w# s" x( u8 ^8 s( U5 K
(while (<= j n)
4 Q$ }/ O h' T2 N* I* i- b) K (setq dzh1 (+ dzh (* j jl)))
: j+ v/ W! I. | (setq j (+ 1 j))- a9 E' K$ h) Y1 q$ g0 O
(zbjs dzh1)
$ @. Z" [1 @ H9 g4 z )
, v O n5 h0 _, B9 L5 l$ ]- s )+ m5 _: U) W& i9 A# y
(setq dzh ma)
7 c* ]- _; g0 I' { )
8 o1 s4 r p, H: z (while (/= dzh -1)
/ R/ w( k* m$ z (if (or (> dzh ma) (< dzh mi))
O4 u8 ?- H6 u) {5 P x (princ "\n提示:输入桩号不在曲线始点至终点间,请重新输入!")
0 t! I. g& L. g6 f! l; l (zbjs dzh)
! r. P0 r: K6 |6 b )1 K" n! S( _0 x3 r
(setq dzh (getreal "\n输入下一个桩号[放弃(-1)]:"))( K+ L8 A) N2 A3 R7 t3 m# o( w5 D, |
)
a9 l4 _1 F" l; x (command "zoom" "e")
. R( p3 y$ A; p6 V. z3 m (setvar "cmdecho" 1)
, e0 \7 b/ x6 X: u6 X/ T (princ)
& J0 Q f% }' j )
. N5 {$ B% S) F& P J6 d(defun zbjs(zh / l a i ac as p a_f x y x1 y1 xy zh0 zh1 zh2 a5 a6 a7 )+ k% f6 M( ?5 l. e" p
(setq l (- zh qs))# p; N q- ?) N ]) @' U1 T
(setq a (list 1 2 3 4))
$ _# }3 l( W* m- x' d* _) N (setq i 1 ac 0 as 0)9 w; S) W. `, M2 i# T+ h
(setq xy (list "" ""))2 }, F$ j! h! q: s; J: H0 K
(while (<= i 4)& e0 v/ |4 W" \
(setq p (+ qs_ql (* (/ (* (/ l 4) i) ls) (- qz_ql qs_ql))))
6 c* ?' Q* `* V (setq a_f (+ qs_a (* k (/ (* (+ p qs_ql) (* (/ l 4) i)) 2))))) X( B S m8 r8 r# {. R, Z1 m6 ~
(if (= i 2) (setq ac (+ ac (* 2 (cos a_f))) as (+ as (* 2 (sin a_f)))))) |7 _" j O! A2 T; f" m
(if (= (rem i 2) 1) (setq ac (+ ac (* 4 (cos a_f))) as (+ as (* 4 (sin a_f)))))" a3 K" u$ W. d. k5 ?* Z5 I
(setq i (1+ i)), L( \' ^& g2 S
)
% D/ ?$ W4 [4 Z (setq ac (+ ac (cos qs_a) (cos a_f)) as (+ as (sin qs_a) (sin a_f)))3 ]3 n9 E' C9 Y/ ?' P' w* z" R
(setq x (+ (car qszb) (* (/ (abs l) 12) ac)))) o: K) H0 F5 a6 y" ?
(setq y (+ (cadr qszb) (* (/ (abs l) 12) as)))( J! n2 j! ~' N1 F( Q3 }
;(setq x1 (rtos x 2 5) y1 (rtos y 2 5))0 l6 X* H0 E {
(setq xy (list x y))
1 G" c" }( O- a: y (command "point" xy)
* |; Q) J; p3 p. d (setq zh0 (rtos (fix (/ zh 1000)) 2 0))
( d5 ^4 w' e1 P8 @ y: b5 ?6 ]2 T (setq zh1 (rtos(- zh (* 1000 (fix (/ zh 1000)))) 2 3))
) z; S+ X5 y* t (setq zh2 zh1)
/ i7 z$ A" n% a/ K0 {0 m (setq a5 a_f)
?* C2 r, O/ X (if (> qs qz) (setq a5 (- a5 pi)))1 f1 m" i B& S D0 ~( @7 t
(if (> a5 (* 2 pi)) (setq a5 (- a5 (* 2 pi))))
) t( a+ G/ {- z: o/ u: L+ J (if (< a5 0) (setq a5 (+ a5 (* 2 pi))))
5 v6 q8 f9 j# z7 @' [) a (setq a6 (rtos a5 2 6))6 Z6 z3 \! ~; h3 \ e/ S
(setq zh1 (strcat " K" zh0 "+" zh1 " A=" a6 "r")): J/ m7 A( o8 r: S$ b$ X0 k0 H* S
(setq a7 (rtos (- (* a5 57.295779513) 90) 2 6))
. ^ p* Z% ]2 O# k% Y# B (command "text" xy "0.25" a7 zh1)7 ^4 f6 S0 h% h$ \6 @9 k9 O! x
(setq x1 (rtos x 2 4) y1 (rtos y 2 4))& N# C. R2 M4 _4 r& O
(setq a5 (* a5 57.295779513))" R: m$ a9 u6 F2 s
(setq a5 (rtos a5 2 6))$ A# j. E5 B! ^) A1 C7 E1 m
(princ (strcat "\n结果:" " K" zh0 "+" zh2 " X=" x1 " Y=" y1 " A=" a5" 度\n" ))
6 J1 b" o, r' c5 h4 S* C1 U2 i ) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|