CAD设计论坛

 找回密码
 立即注册
论坛新手常用操作帮助系统等待验证的用户请看获取社区币方法的说明新注册会员必读(必修)
查看: 1518|回复: 2

[求助] AutoCADLISP使用中的问题

[复制链接]
发表于 2010-5-13 18:22 | 显示全部楼层 |阅读模式
本人制作一路桥专业使用的lisp函数,功能:依据输入的路线交点参数算要求点的坐标,并在绘图区绘出图形。
+ Q( s% h6 Q  w) B$ ?4 g, _4 f: j1 K' T但是在使用中发现多次发现,适合一次调用,多次调用时就出现计算坐标结果正确,但是就是部分点绘到一块去了(如图):
. o( r+ g2 c3 G; J% P( I问题出在使用自动序列时,第一次计算,计算的X、Y、方位角值均正确,绘出的图形也没有错误,可若是不重新启动CAD的话,再调用dqx命令就可能出现计算的坐标及方位角均正确,绘出的图形重叠显示。我试验三次的桩号间距分别为5、2.5、1,到桩号为1的时候就出现重叠了,再继续下去也是结果正确绘图重叠。特点好似桩号间距递增(如5、10、15、20……)不出现问题,但桩号间距递减(如10、5、2.5、1)就出现问题了。不能像CAD命令那样在不重启CAD的情况下多次使用。* E+ H  P* r$ X8 K9 x0 x0 B, ?
% B/ V& R7 z5 T6 z$ z

9 }0 r- T+ z) @: t/ s7 h, S+ r; B函数代码如下:(参数区我已经赋值)+ J5 e# ]  u( A9 ~$ \# I
(defun c:dqx( / qs qz qszb qs_a qsr qzr k ls ma mi dzh dzh1 jl j n )
* y( [* ~4 _# [+ a+ u! h/ {" Y  (setvar "cmdecho" 0)
/ u, P, e, \, w5 U7 Y, V  (princ "\n-------------------------------------------------------------")! _& G  C# O% j% w! P  N
  (princ "\n    (^_^) 于森制作,欢迎使用。[email protected] (^_^) ")
- y, P7 V- Y" L, @( ^9 y5 \9 B  (princ "\n-------------------------------------------------------------")* H8 D5 n. e9 ?  o% Q' P
  ;(setq qs (getreal "\n输入曲线始点桩号:"))$ `" t+ K, i) E3 M0 K: j& I7 s0 D
  (setq qs 25650.926)
% j( W, w" R9 q! U, k% G  ;(setq qz (getreal "\n输入曲线终点桩号:"))1 r! `0 ]' I! @6 ^
  (setq qz 25900.926)
/ R: s5 C# S" v2 H: G6 _+ v6 V1 W  ;(setq qszb (getpoint "\n输入或拾取曲线始点坐标:"))
4 z9 }/ m" K" O  (setq qszb '( 3252647.051 381399.471))
5 ^/ l" }; n) \$ @. f  ;(setq qs_a (getreal "\n输入曲线始点顺曲线桩号递增方向的计算方位角(弧度):"))2 M5 s& Q7 }% T" A2 j; X; l
  (setq qs_a 2.907134)
4 S  W; z0 x. L  (if (> qs qz) (setq qs_a (+ qs_a pi)))
4 F  Q6 y  a, R/ \* S  ;(setq qsr (getreal "\n输入曲线始点半径(半径=∞时为0):"))
, m& e. K& z" ]; o  g  (setq qsr 3650)$ H4 M' p# @7 p# ]3 {) x
  (if (= qsr 0) (setq qs_ql (/ 1 10000000)) (setq qs_ql (/ 1 qsr)))
/ {& b4 E" B6 }; X/ {  ;(setq qzr (getreal "\n输入曲线终点半径(半径=∞时为0):")), Y9 b- w. o7 v) L' |7 v
  (setq qzr 1295.3)
& Z9 Z: G  c0 d+ u; q- u  (if (= qzr 0) (setq qz_ql (/ 1 10000000)) (setq qz_ql (/ 1 qzr))), I* w, q& o2 {! j! a0 K$ B6 Z
  ;(setq k (getreal "\n选择顺曲线桩号递增方向的转向[左(-1)\\右(1)]:"))- u; w$ d, @* U* a
  (setq k -1)1 O. ^8 Z9 c/ e! I; ~, U7 u4 ^
  (setq ls (- qz qs))
/ o0 i* _' n/ W$ W9 x* ?6 e  (setq dzh qs)
" q  m5 ]# o9 p7 [4 U  (setq ma (max qs qz) mi (min qs qz))
! y% _( K4 ^' ~% Y' J- W7 d  (princ "\n-------------------------------------------------------------")
/ I) a6 O1 g  x, P6 i" r$ |  (princ "\n       开始桩号坐标计算,请输入曲线始点至终点间的桩号!  ")
5 m, ~- J( }; J, B% F  (princ "\n-------------------------------------------------------------")0 l* s, A# Y. F- K% }+ r3 w) N
  (setq dzh (getreal "\n输入桩号[自动序列(-2)]:"))1 c5 p+ }" z1 K0 g$ X
  (if (= dzh -2)
4 y3 N% ]; W/ c5 z( s( @    (progn
$ r3 [+ G6 R2 N; P. M, ]! q% t! l      (setq jl (getreal "\n输入自动序列的桩号间距:"))
! G- t9 Y4 k" v9 h      (setq j 0)
- m/ J$ v3 L  |% w% l      (setq dzh (+ 10 (* 10 (fix (/ mi 10)))))8 c7 }; d/ R9 f/ r$ B8 e& O! z
      (zbjs dzh)
# Q; B3 H2 S" Q: v, E      (setq n (- (fix (/ (- (fix ma) dzh) jl)) 1))6 q- J/ @% K, @$ g7 m* D
      (while (<= j n)
2 _5 a' W1 U) h' M# M (setq dzh1 (+ dzh (* j jl)))# W0 s% E& a9 ?9 l8 Z; `
(setq j (+ 1 j))
5 N) F8 w( a' A3 U (zbjs dzh1)# l, z% u2 v2 P. a+ |) r" L
)
$ c7 d4 p% B' Z      )
3 e' u) u8 H: E1 w# @0 x/ N7 v    (setq dzh ma)8 C( L) x! g1 V. D2 q
    )' o! o; h. f* }9 L. Y
  (while (/= dzh -1)" S: Q3 T2 n  c0 @- b9 g: H% z$ r
    (if (or (> dzh ma) (< dzh mi)). j4 g+ T8 [+ t, A7 _4 M/ m! l
      (princ "\n提示:输入桩号不在曲线始点至终点间,请重新输入!")
% n2 {( d  m6 U+ |7 E      (zbjs dzh)% V5 x7 Z# }/ ]: h) L& ~( l
      )
; G/ s; m( r- E% d4 E- x    (setq dzh (getreal "\n输入下一个桩号[放弃(-1)]:"))" n2 A7 U+ V3 L7 ^" d# H3 \
  )# s. e, ~* H5 ]$ Q1 S7 _" Y, d% N
  (command "zoom" "e")  `2 E% r" S- S( i) o  y& x. A
  (setvar "cmdecho" 1)
, Y7 O! ?: k& T  (princ). G" l) n; K, @9 E7 g- p
  )/ j/ x& A4 z: R) b
(defun zbjs(zh / l a i ac as p a_f x y x1 y1 xy zh0 zh1 zh2 a5 a6 a7 )
. `7 f" ^3 w+ h: g  (setq l (- zh qs))% S, ]8 ~; ^( [. ?0 r/ h
  (setq a (list 1 2 3 4))
  ^& E: {1 T8 C4 T# T  (setq i 1 ac 0 as 0)4 ^: f) K1 `; p+ W9 U8 a; }% E% `
  (setq xy (list "" ""))" }1 w$ i$ v9 ~! k- @' U* N9 o
  (while (<= i 4)  r5 [" C. F$ a$ \, }! e
    (setq p (+ qs_ql (* (/ (* (/ l 4) i) ls) (- qz_ql qs_ql))))
0 f! t& p+ T% T1 j, B    (setq a_f (+ qs_a (* k (/ (* (+ p qs_ql) (* (/ l 4) i)) 2))))
+ K- G3 `1 E7 V1 z5 x    (if (= i 2) (setq ac (+ ac (* 2 (cos a_f))) as (+ as (* 2 (sin a_f)))))! H2 f+ g0 e& |
    (if (= (rem i 2) 1) (setq ac (+ ac (* 4 (cos a_f))) as (+ as (* 4 (sin a_f)))))  G0 g3 E+ ~/ X  i  K, N4 H$ J
    (setq i (1+ i))
3 c" @7 p5 Q$ b0 M" B    )
  |3 ?+ f. o( q) b. H! Y  (setq ac (+ ac (cos qs_a) (cos a_f)) as (+ as (sin qs_a) (sin a_f)))  g  |  b& V6 R3 @, R+ o
  (setq x  (+ (car qszb) (* (/ (abs l) 12) ac)))
: |9 H$ r. p7 _" [/ v! j; I' I  (setq y (+ (cadr qszb) (* (/ (abs l) 12) as)))
% T$ T+ M0 l- U7 x& K  ;(setq x1 (rtos x 2 5) y1 (rtos y 2 5))! |+ m* W+ X& ?- d$ s* Z: `
  (setq xy (list x y)), G5 z$ A, q% w& b: c+ c. U4 @
  (command "point" xy)/ d9 [6 X& u, |5 d7 X
  (setq zh0 (rtos (fix (/ zh 1000)) 2 0))6 L$ x9 Z! Z. V' J" ~$ n
  (setq zh1 (rtos(- zh (* 1000 (fix (/ zh 1000)))) 2 3))
! s/ y% l! I0 \5 \7 q% y0 ?: b: o  (setq zh2 zh1)1 u/ `+ s2 y" e: M  H' l# n5 z% _3 ]
  (setq a5 a_f)
! {! |' q( i3 b* {4 F  (if (> qs qz) (setq a5 (- a5 pi))), t% N- H+ r1 x, v) {3 w" t
  (if (> a5 (* 2 pi)) (setq a5 (- a5 (* 2 pi))))
. b/ V4 }9 H: ], r1 a" c  (if (< a5 0) (setq a5 (+ a5 (* 2 pi))))
  f! ]& i. l, k" g  (setq a6 (rtos a5 2 6))
* U6 P6 I- I6 ]. M; L  (setq zh1 (strcat " K" zh0 "+" zh1 " A=" a6 "r"))
$ z6 h# g4 ~  x! `4 j' L  (setq a7 (rtos (- (* a5 57.295779513) 90) 2 6))
% N5 `) x* ]5 K0 m  (command "text" xy "0.25" a7 zh1)
+ N& \! m  {/ b* x. H) ~, ~7 i; n  (setq x1 (rtos x 2 4) y1 (rtos y 2 4))
: E, Q9 \8 B- }7 o" ^! }  (setq a5 (* a5 57.295779513)); p$ m2 K% t  f. [: Q+ S
  (setq a5 (rtos a5 2 6))
  l3 O" d/ H; a  (princ (strcat "\n结果:" " K" zh0 "+" zh2 "  X=" x1 "  Y=" y1 "  A=" a5" 度\n" )). q  u: _" _2 w3 P3 X
  )

本帖子中包含更多资源

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

x
发表于 2010-5-13 18:28 | 显示全部楼层
您先关闭捕捉再试
 楼主| 发表于 2010-5-13 18:45 | 显示全部楼层

回复 #2 Camello 的帖子

谢谢,我将对象捕捉关掉就可以了。但是不明白这个和捕捉怎么有关系了,我绘图可指定的绝对坐标,怎么还能绘到一块去了?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于|免责|隐私|版权|广告|联系|手机版|CAD设计论坛

GMT+8, 2024-11-26 01:35

CAD设计论坛,为工程师增加动力。

© 2005-2024 askcad.com. All rights reserved.

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