|
|
本人制作一路桥专业使用的lisp函数,功能:依据输入的路线交点参数算要求点的坐标,并在绘图区绘出图形。$ s q3 g8 W9 [; c& Q5 k& u7 i8 C u6 b
但是在使用中发现多次发现,适合一次调用,多次调用时就出现计算坐标结果正确,但是就是部分点绘到一块去了(如图):
* q: s& m( c$ ?2 t问题出在使用自动序列时,第一次计算,计算的X、Y、方位角值均正确,绘出的图形也没有错误,可若是不重新启动CAD的话,再调用dqx命令就可能出现计算的坐标及方位角均正确,绘出的图形重叠显示。我试验三次的桩号间距分别为5、2.5、1,到桩号为1的时候就出现重叠了,再继续下去也是结果正确绘图重叠。特点好似桩号间距递增(如5、10、15、20……)不出现问题,但桩号间距递减(如10、5、2.5、1)就出现问题了。不能像CAD命令那样在不重启CAD的情况下多次使用。
4 p; k% g9 `8 K! @! h1 y. |: |# ~' Q3 M& s* D3 t3 r; }3 }3 p
6 J* p3 U% i) K6 l" P函数代码如下:(参数区我已经赋值)2 Q1 f8 c6 l8 S$ ^& N
(defun c:dqx( / qs qz qszb qs_a qsr qzr k ls ma mi dzh dzh1 jl j n )
C, b' k2 n4 u! n/ V6 ]7 E8 B (setvar "cmdecho" 0)2 \# Y( g$ o0 S) t; g5 p6 G9 I f
(princ "\n-------------------------------------------------------------")
" z4 J/ L/ R' g" a% R4 L/ ~, i' ~1 z( v (princ "\n (^_^) 于森制作,欢迎使用。[email protected] (^_^) ")- \& R0 p$ Y8 N
(princ "\n-------------------------------------------------------------")
% | k0 D6 P5 O! ` ;(setq qs (getreal "\n输入曲线始点桩号:"))4 H8 I6 ~2 ] n. }/ y e* |( R+ ]+ o
(setq qs 25650.926)
4 m/ A1 _$ q* `. k+ Z' ] ;(setq qz (getreal "\n输入曲线终点桩号:")): T/ I% |8 g0 D/ ~! j" `) S
(setq qz 25900.926)
2 m2 r/ j0 v. Z) V+ q9 l ;(setq qszb (getpoint "\n输入或拾取曲线始点坐标:"))) W# O6 {/ H9 j, c! T
(setq qszb '( 3252647.051 381399.471))
6 A0 X4 ?8 F& g3 [, n5 o0 S ;(setq qs_a (getreal "\n输入曲线始点顺曲线桩号递增方向的计算方位角(弧度):"))$ J) q& @' t7 Y( g* H9 b, k r5 ?
(setq qs_a 2.907134)
P) ], _; M/ _; ^1 W" {; v r' X9 w, E (if (> qs qz) (setq qs_a (+ qs_a pi)))) k1 w6 E" M& Y% R0 z7 e9 }
;(setq qsr (getreal "\n输入曲线始点半径(半径=∞时为0):"))
& f' j% h5 O, _7 Y% g (setq qsr 3650)# v, g' t: f4 |" ~7 z/ d
(if (= qsr 0) (setq qs_ql (/ 1 10000000)) (setq qs_ql (/ 1 qsr)))
+ G7 J8 m- b% m ;(setq qzr (getreal "\n输入曲线终点半径(半径=∞时为0):"))
3 v5 y: {( Q: b6 }# c' g$ q. r- B (setq qzr 1295.3)
, F0 H% ?, L# V5 O- P' A6 C8 S' P (if (= qzr 0) (setq qz_ql (/ 1 10000000)) (setq qz_ql (/ 1 qzr)))
& E/ ~2 P, C7 w! @ ?) H0 d" ` ;(setq k (getreal "\n选择顺曲线桩号递增方向的转向[左(-1)\\右(1)]:"))
8 P! k5 t0 D8 H( a/ }1 v6 s4 Z (setq k -1)
! L; E: T% T- d$ C (setq ls (- qz qs))* Q3 W: a; p* s/ B. ^# u
(setq dzh qs)/ N6 H5 x8 ^$ F0 R
(setq ma (max qs qz) mi (min qs qz))
2 I0 a) T4 h( a6 _9 g( h& X: \ (princ "\n-------------------------------------------------------------") g4 n( ^# {' u7 I& v( a
(princ "\n 开始桩号坐标计算,请输入曲线始点至终点间的桩号! ")5 o4 L3 c2 s) L. r' g
(princ "\n-------------------------------------------------------------")' |# G. ~8 T5 }: u K
(setq dzh (getreal "\n输入桩号[自动序列(-2)]:")). U1 l1 K& F* I/ g; W5 [8 C
(if (= dzh -2)
- Y7 K; w& `; @# Y6 |7 D5 y: t) z (progn- g- t; D2 h6 d7 J6 _, U, V
(setq jl (getreal "\n输入自动序列的桩号间距:"))9 d6 \6 B0 K i! ~- q$ g
(setq j 0)5 h: L% j/ X; w8 a) V
(setq dzh (+ 10 (* 10 (fix (/ mi 10)))))4 i3 o/ u$ |( O% w) J
(zbjs dzh)
3 y/ c$ q/ @7 K5 k# m6 s) i (setq n (- (fix (/ (- (fix ma) dzh) jl)) 1))
4 Q, N- V4 t% U6 z (while (<= j n)
; E. w9 t2 H4 m* h, k (setq dzh1 (+ dzh (* j jl)))
! j3 \6 M& a% B5 ] (setq j (+ 1 j))
: L! F4 F# ~" z( F g" o (zbjs dzh1)
% E4 E6 G) K$ b( r, ` )
. Q! `' s6 w" u8 b7 D )
+ q! F4 b' S; E! a4 \ (setq dzh ma)6 `! k$ x! ~( {$ x4 L( \
)
% k, M: S0 U4 g4 L$ Q$ j (while (/= dzh -1)- n7 g7 f* z- L0 v1 q
(if (or (> dzh ma) (< dzh mi))
! X9 W. J* c* J (princ "\n提示:输入桩号不在曲线始点至终点间,请重新输入!")
L; |" b9 \/ H7 y8 c5 j- o (zbjs dzh)
* v, F* D. B* I, F p* c5 W ): u* n) [" Q- g# u3 A" J, V
(setq dzh (getreal "\n输入下一个桩号[放弃(-1)]:"))
0 n0 I3 p, A2 p3 r8 K/ m )$ m/ l2 w6 {8 \
(command "zoom" "e")
1 F: S U! x+ @0 ~$ F (setvar "cmdecho" 1)
2 Y8 \& ?; @- C) O3 s! I8 \" X Z (princ)) G5 X+ G8 K# n' c! P
)
/ _5 H$ `" w% z1 {) I9 N(defun zbjs(zh / l a i ac as p a_f x y x1 y1 xy zh0 zh1 zh2 a5 a6 a7 )* D0 e0 n X. r% r- @5 u% w
(setq l (- zh qs))
0 N2 {4 v# S3 d9 R2 H1 k (setq a (list 1 2 3 4))
! X4 t, Y/ C o" p; f7 w (setq i 1 ac 0 as 0)
/ r' c9 o- w1 n. `; v$ ~6 O (setq xy (list "" ""))
6 L9 u* u9 O/ p/ a% b (while (<= i 4)' [+ f: V) }8 a9 ?7 V
(setq p (+ qs_ql (* (/ (* (/ l 4) i) ls) (- qz_ql qs_ql))))
& W& ]5 B* O* [1 J7 ^. V$ C (setq a_f (+ qs_a (* k (/ (* (+ p qs_ql) (* (/ l 4) i)) 2))))6 s: W1 O/ i) Q4 J Z. ~/ Z# q
(if (= i 2) (setq ac (+ ac (* 2 (cos a_f))) as (+ as (* 2 (sin a_f)))))
# H& n5 S, S8 u+ `( e (if (= (rem i 2) 1) (setq ac (+ ac (* 4 (cos a_f))) as (+ as (* 4 (sin a_f))))), c0 E$ I5 |8 F+ G z$ w2 W
(setq i (1+ i))
) R. [) [) B) m- J- z0 o )
9 I. [3 y* e0 R8 ^4 e (setq ac (+ ac (cos qs_a) (cos a_f)) as (+ as (sin qs_a) (sin a_f)))1 `0 u% J1 M2 j$ C8 U
(setq x (+ (car qszb) (* (/ (abs l) 12) ac)))4 m+ | ]! h" ]2 c
(setq y (+ (cadr qszb) (* (/ (abs l) 12) as)))- |9 q$ g6 k5 q+ y3 {8 i: S
;(setq x1 (rtos x 2 5) y1 (rtos y 2 5))
: H6 u) W6 I7 f (setq xy (list x y))
! B% `5 L! m2 J3 R2 z (command "point" xy)" q; T }% y5 O/ B! G: p/ K9 x6 t
(setq zh0 (rtos (fix (/ zh 1000)) 2 0))( B0 Z3 i1 a% J- ~. W
(setq zh1 (rtos(- zh (* 1000 (fix (/ zh 1000)))) 2 3))
9 W) e1 \& Y7 C/ c/ g3 O4 }6 y (setq zh2 zh1); P: S" {. `2 n$ Q r8 {) P
(setq a5 a_f)
- ?7 p6 j. A {: X, o/ m (if (> qs qz) (setq a5 (- a5 pi))). {% S; n% y4 g4 Q4 V1 x
(if (> a5 (* 2 pi)) (setq a5 (- a5 (* 2 pi))))7 J1 x" W+ h1 I# U6 B; E; m8 V
(if (< a5 0) (setq a5 (+ a5 (* 2 pi))))8 B# ]2 x$ e3 k; w# C7 E
(setq a6 (rtos a5 2 6))
) c4 H" A' d% Y* m9 ` (setq zh1 (strcat " K" zh0 "+" zh1 " A=" a6 "r"))
7 a! b$ ?7 D. T! V$ v7 i) O (setq a7 (rtos (- (* a5 57.295779513) 90) 2 6))
: E, ]8 l0 z+ E (command "text" xy "0.25" a7 zh1)2 r7 c. r0 F: J/ g+ t( \
(setq x1 (rtos x 2 4) y1 (rtos y 2 4))
- w: J R& K7 |8 }' t. P( j (setq a5 (* a5 57.295779513))6 v( j6 m3 @- l" {+ }/ G2 A( o
(setq a5 (rtos a5 2 6))
0 i; L- t6 T6 N: ^ (princ (strcat "\n结果:" " K" zh0 "+" zh2 " X=" x1 " Y=" y1 " A=" a5" 度\n" ))
; ]" P$ @9 s: H7 ?& r2 t5 _0 G ) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|