|
本人制作一路桥专业使用的lisp函数,功能:依据输入的路线交点参数算要求点的坐标,并在绘图区绘出图形。- p( ^, c: m; ]- s; @
但是在使用中发现多次发现,适合一次调用,多次调用时就出现计算坐标结果正确,但是就是部分点绘到一块去了(如图):
, N; H' m) A& H问题出在使用自动序列时,第一次计算,计算的X、Y、方位角值均正确,绘出的图形也没有错误,可若是不重新启动CAD的话,再调用dqx命令就可能出现计算的坐标及方位角均正确,绘出的图形重叠显示。我试验三次的桩号间距分别为5、2.5、1,到桩号为1的时候就出现重叠了,再继续下去也是结果正确绘图重叠。特点好似桩号间距递增(如5、10、15、20……)不出现问题,但桩号间距递减(如10、5、2.5、1)就出现问题了。不能像CAD命令那样在不重启CAD的情况下多次使用。
* ?/ C6 ~* K2 i+ ~' W# u3 {: E7 f& B |; F' Z
. s+ j; r" X3 S& {函数代码如下:(参数区我已经赋值)
5 {" Q( y9 b( o, J(defun c:dqx( / qs qz qszb qs_a qsr qzr k ls ma mi dzh dzh1 jl j n )
/ `. Z% L0 r D0 x3 o! [+ u (setvar "cmdecho" 0)% Q" G$ q. P& e+ X
(princ "\n-------------------------------------------------------------")
$ |4 J6 F' D6 r, q/ q3 a3 A (princ "\n (^_^) 于森制作,欢迎使用。[email protected] (^_^) ")
) q: h7 |1 T2 ` (princ "\n-------------------------------------------------------------")
" e" ]; V" F9 z- F A1 F2 | ;(setq qs (getreal "\n输入曲线始点桩号:"))
3 b' R M m0 Q& T ]& T3 ? (setq qs 25650.926)2 S, Z( u7 c m; ]
;(setq qz (getreal "\n输入曲线终点桩号:"))
8 V2 m4 v4 ~& d/ t (setq qz 25900.926)
3 \- s0 I6 T( O2 Z# S5 a ;(setq qszb (getpoint "\n输入或拾取曲线始点坐标:"))/ }( ` [: u+ I3 K3 m
(setq qszb '( 3252647.051 381399.471))& Q0 F6 D- P& ]7 | s
;(setq qs_a (getreal "\n输入曲线始点顺曲线桩号递增方向的计算方位角(弧度):"))
' m! _& O$ y9 D2 b, z (setq qs_a 2.907134)+ D$ B, T# N4 @: }% j
(if (> qs qz) (setq qs_a (+ qs_a pi)))
2 a( b; ~4 C0 a( B ;(setq qsr (getreal "\n输入曲线始点半径(半径=∞时为0):"))
2 W. `% D' V" A" d& b' v (setq qsr 3650). G/ a; r0 C8 D) h! \( X
(if (= qsr 0) (setq qs_ql (/ 1 10000000)) (setq qs_ql (/ 1 qsr)))* Y0 c1 v9 a: j' y
;(setq qzr (getreal "\n输入曲线终点半径(半径=∞时为0):")), e: p2 n1 P: s4 I/ Y! }. q
(setq qzr 1295.3)% b3 G4 @4 e/ d0 t8 A( K' u- X, h; _" I
(if (= qzr 0) (setq qz_ql (/ 1 10000000)) (setq qz_ql (/ 1 qzr)))
4 G: i/ h) u" j ;(setq k (getreal "\n选择顺曲线桩号递增方向的转向[左(-1)\\右(1)]:"))
8 F- B8 d8 c+ Z& x* A2 D) M (setq k -1)6 X7 b# I: _: W1 G3 x' f0 Q( \
(setq ls (- qz qs))
! R) x5 s4 Y, q& R8 Q" e (setq dzh qs)
( a: N( u" A6 `" K" d, K+ R (setq ma (max qs qz) mi (min qs qz))
0 H, N7 U# B; W. L (princ "\n-------------------------------------------------------------")4 K% \8 P) h2 u
(princ "\n 开始桩号坐标计算,请输入曲线始点至终点间的桩号! ")
/ Q7 B- G7 s5 `) L/ z3 D s (princ "\n-------------------------------------------------------------")
, {3 H* x; g1 }9 A/ V% C3 M4 L/ G0 X (setq dzh (getreal "\n输入桩号[自动序列(-2)]:"))2 y5 I( H* V) ^3 N/ L. n; g5 u6 H
(if (= dzh -2). m& Q6 `4 M/ W: y: o9 V' p
(progn
) t- o7 B2 n# }/ P) a (setq jl (getreal "\n输入自动序列的桩号间距:"))
8 h9 U9 H# m5 L. W# Y (setq j 0)* V# V; o/ V) G# ?% W$ ~
(setq dzh (+ 10 (* 10 (fix (/ mi 10)))))
/ f8 k' b& [0 |) ]- [1 c (zbjs dzh)
, g6 R. R6 a8 r! F1 a, Z, u (setq n (- (fix (/ (- (fix ma) dzh) jl)) 1))4 T; a+ V$ c0 L B9 |
(while (<= j n)2 n9 ?: a5 ^4 q* Z+ q
(setq dzh1 (+ dzh (* j jl)))1 |1 ]" i+ V2 \2 A3 O* K
(setq j (+ 1 j))+ Q) q( x7 a3 X# f% ]
(zbjs dzh1)
2 I o3 N( p1 ~2 z/ D" x$ \, ~9 N )6 ?4 k& Z6 u' T" B6 F
)
7 E0 e' D6 T/ `$ b. j! j (setq dzh ma)1 ~# P+ `- r* Y& o% w
)
& f; t, y( I! v+ z' f (while (/= dzh -1)
: S6 L9 v. K9 `& j! B( g5 W (if (or (> dzh ma) (< dzh mi))+ }. l W: u4 e- |: X
(princ "\n提示:输入桩号不在曲线始点至终点间,请重新输入!")
* i5 o& b8 q* ^& L3 E) u6 c! K @ (zbjs dzh)
- D+ @- W( S. c/ B! L- Q0 `3 y" j ); r; K. D! e* i) f
(setq dzh (getreal "\n输入下一个桩号[放弃(-1)]:"))
$ w3 k; V* @ c' N" k+ k6 E )
0 L! c% L& r- n* v, e (command "zoom" "e")! h+ m3 k5 ~( g) N8 {
(setvar "cmdecho" 1)4 r6 W2 g3 M; g a3 T+ t$ O4 I% d0 |% C
(princ); F K' A0 I5 C& A# C
)
. ~2 k" N/ M. k9 q( @) d(defun zbjs(zh / l a i ac as p a_f x y x1 y1 xy zh0 zh1 zh2 a5 a6 a7 )
z8 n: r3 d; c s" O+ U% l" b (setq l (- zh qs))
# _( i/ {0 T3 E0 c% A0 N (setq a (list 1 2 3 4))
1 v+ w8 K5 |5 A F# _ (setq i 1 ac 0 as 0)
6 x0 E5 W& a m6 j+ u0 x: V1 f: L (setq xy (list "" ""))* W* N* T- N/ X3 J' {3 d' R: `( H( u# L
(while (<= i 4): l" K, G! w" T7 J6 O
(setq p (+ qs_ql (* (/ (* (/ l 4) i) ls) (- qz_ql qs_ql))))* x& E4 h7 d" ]0 n6 v
(setq a_f (+ qs_a (* k (/ (* (+ p qs_ql) (* (/ l 4) i)) 2))))
' J0 ~) u" C6 g; M. x4 X (if (= i 2) (setq ac (+ ac (* 2 (cos a_f))) as (+ as (* 2 (sin a_f)))))
8 Q* R8 \5 [! a1 X (if (= (rem i 2) 1) (setq ac (+ ac (* 4 (cos a_f))) as (+ as (* 4 (sin a_f)))))+ [, K% @ Q9 N+ z
(setq i (1+ i))
- K, f4 W- O+ w/ F0 U& Q8 S )
9 V$ S3 j' O3 M/ b; y" l' c- | (setq ac (+ ac (cos qs_a) (cos a_f)) as (+ as (sin qs_a) (sin a_f)))3 _2 h& _8 c, N4 G( Z$ Y
(setq x (+ (car qszb) (* (/ (abs l) 12) ac)))
$ ?. A, }- z e6 D. @0 F; m' X+ d (setq y (+ (cadr qszb) (* (/ (abs l) 12) as)))- k/ Z7 ]! c5 J* K% Y
;(setq x1 (rtos x 2 5) y1 (rtos y 2 5))
, V7 F2 G4 o0 M" G$ J (setq xy (list x y))+ |8 g1 w1 U' o3 @
(command "point" xy)
; F$ z: h5 ~4 {2 v7 e: M% |; O (setq zh0 (rtos (fix (/ zh 1000)) 2 0))5 O3 V( q/ E( b: g% ^: ^" j6 A
(setq zh1 (rtos(- zh (* 1000 (fix (/ zh 1000)))) 2 3))- Y# k: p+ u+ [
(setq zh2 zh1)
3 c- K1 Y n7 F$ i$ H1 k+ V/ R (setq a5 a_f)( t7 N$ O9 N1 @! K
(if (> qs qz) (setq a5 (- a5 pi)))
% s) N1 b/ e2 P6 Z/ g; r (if (> a5 (* 2 pi)) (setq a5 (- a5 (* 2 pi))))/ ^6 Z6 b1 j' V) ?7 F/ c
(if (< a5 0) (setq a5 (+ a5 (* 2 pi))))
7 z5 m: r: I) B1 w0 j6 r- j (setq a6 (rtos a5 2 6))+ p. ^% \3 v8 v
(setq zh1 (strcat " K" zh0 "+" zh1 " A=" a6 "r"))
1 I- }# h! X# e0 ?' F2 W (setq a7 (rtos (- (* a5 57.295779513) 90) 2 6))
4 U! E! D3 @7 |0 T (command "text" xy "0.25" a7 zh1)% H# A+ I& J: E
(setq x1 (rtos x 2 4) y1 (rtos y 2 4)) R1 E; ]0 Y6 a! \, O( |
(setq a5 (* a5 57.295779513))2 p7 d+ E: F1 T# M
(setq a5 (rtos a5 2 6))- g' ~: \% P( p1 C
(princ (strcat "\n结果:" " K" zh0 "+" zh2 " X=" x1 " Y=" y1 " A=" a5" 度\n" ))
2 V2 x& c4 V' U2 K0 u. i/ E3 U% r# l ) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|