CAD设计论坛

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

[求助] AutoCADlisp编写一个lsp程序,希望高手指点迷津

[复制链接]
发表于 2008-5-11 21:36 | 显示全部楼层 |阅读模式
用AutoCADlisp编写一个lsp程序,要求加载lsp文件后,通过command命令自动将几个画好的CAD图块文件插入到当前窗口中。看一下我写的lsp代码:: ?( w$ s) V& H
  1. (defun c:sj (/ p1 p2 p3 p4 a b n mc)   7 @. S, n* n* C) Q) u
  2.    (setq p1 (getpoint "\n p1:"))
    9 N: s0 n4 l! D$ D2 ^3 C
  3.    (setq fp(open "d:/cs.txt" "r"))% Q9 T2 ^; @' T1 f1 i8 n
  4.    (setq a 70)) r- }4 v, O  n. f: g4 a
  5.    (setq b -2)" e5 H3 Q% @* f
  6.    (setq p2 (list (+ (car p1) a) (cadr p1)))
    , L2 k) q1 e4 H6 h
  7.    (setq p3 (list (- (car p1) 5) (+ (cadr p1) b)))$ ^9 }$ }+ }, g
  8.    (setq p4 (list (+ (car p1) a) (+ (cadr p1) b)))
    9 _+ {- l( p& P
  9.    (setq mc(read-line fp))
    & b) q7 ?- d  o/ A; c
  10.    (setq n(atoi(read-line fp)))
    . R& m9 V0 s7 z( s! p
  11.    (command "text" p1 1.5 0 mc)5 P  U( G3 V0 }2 t9 {0 P* B  Z9 g
  12.    (command "line" p3 p4 "")
    3 K: P- L6 p' e
  13.    (command "style" "standard" "华文新魏" 10 20 0 "n" "n")
    - G6 O, J$ k6 |" @! [
  14.    (setq mc(read-line fp))
    7 \9 y+ T) `4 n8 A& ]; G1 w
  15.    (command "xref" "attach"  mc P4 "1" "1" "0")
    $ y5 x. X9 y9 P% n
  16.    (setq mc(read-line fp))6 N. _; O9 O" Y# \1 ~
  17.    (command "xref" "attach"  mc P4 "1" "1" "0")
    0 v3 S; W2 [3 L, L
  18.    (command "zoom" "e")
    . q# C" z$ o% e- u' D, I+ j- K4 p5 D8 ~8 p
  19. )
复制代码

# N: R5 U$ i1 I# p2 r& V以上的代码是一部分,没有插入图块的代码,希望高手指点迷津!谢谢!) O$ H2 @& P3 u  E, @
0 ]) a! {& D8 y( r0 ?3 Y
[ 本帖最后由 truezx 于 2008-5-14 12:28 编辑 ]
发表于 2008-5-11 21:44 | 显示全部楼层
哇,高层次的,不会。
 楼主| 发表于 2008-5-12 21:20 | 显示全部楼层
提示:1 循环处理插入几个图
5 K! d* g: S/ n, w0 _) g
, e: S8 ]# _1 `7 K2 在以上基础,实现图的位置 不重叠(对应图块的位置不重叠)
发表于 2008-5-12 21:44 | 显示全部楼层
友情提示:这个问题由woaishuijia  来回答你比较好,你可以发短信求教,呵呵
 楼主| 发表于 2008-5-13 13:48 | 显示全部楼层
原帖由 truezx 于 2008-5-12 21:44 发表
& ~, p( J! J, R$ r$ G- ^友情提示:这个问题由woaishuijia  来回答你比较好,你可以发短信求教,呵呵
% I. W) t( x& A% f# s  Z
太好了!谢谢版主!
发表于 2008-5-13 23:31 | 显示全部楼层
(defun c:sj (/ p1 p2 p3 p4 a b n mc)
/ Y  y' c$ h/ ^( w/ M9 [* {(setq p1 (getpoint "\n p1:"))
7 _' t2 `0 d! G) z. s  N" T(setq fp(open "d:/cs.txt" "r"))
: y) J  k1 c  A6 @1 c4 ?# D/ W(setq a 70)
6 R9 G, w5 r+ h# x) t" S(setq b -2)
- \7 J' T  {' O6 V2 h(setq p2 (list (+ (car p1) a) (cadr p1))). U9 q/ e/ Y7 g& ~4 a* Q7 k
(setq p3 (list (- (car p1) 5) (+ (cadr p1) b)))' ?7 P" N) A8 S  _0 C' \
(setq p4 (list (+ (car p1) a) (+ (cadr p1) b)))! u( U+ @( a. `8 ^! F7 I
(setq mc(read-line fp))
# f) J$ ]9 w7 f(setq n(atoi(read-line fp)))& T3 M, t  L0 |( q. j/ E7 X! f
(command "text" p1 1.5 0 mc)
5 \& v" V4 o! V(command "line" p3 p4 "")
% Q- u& V0 U' W* H; y(command "style" "standard" "华文新魏" 10 20 0 "n" "n")# A! H; C! h& e' }6 i% r% q0 D
(setq mc(read-line fp))
7 \4 L7 L9 e* _- M2 G* J(command "-insert" mc P4 "1" "1" "0")
2 i$ n9 `& o/ M% p* s! ]+ M, F; c(setq mc(read-line fp))
( ^# V0 ~; I# T(command "-insert" mc P4 "1" "1" "0")5 ^0 N& ~3 {1 Z9 l
(command "zoom" "e")
5 q4 R4 Q7 t3 ]$ {! k0 _)
/ K2 L. Z  L* G1 ^4 C, }: E
% X, V) N! J. o- K没看到你的“cs.txt”,不清楚你要干什么,猜测你是想在这里插入块。
7 Y& [1 H* y6 u, C
8 V; K5 X  G1 P) D[ 本帖最后由 woaishuijia 于 2008-5-13 23:37 编辑 ]
发表于 2008-5-14 11:45 | 显示全部楼层
在你的程序上做了些修改和补充,看看这次是否合你的意?
- C: g$ b" N8 {( c$ B! {* j4 ~6 B
(defun c:sj (/ p1 p2 p3 a b c d n mc)
8 l) v2 t3 P4 q2 {(setq p1 (getpoint "\n p1:"))
( Z, R1 Y* O# N(setq fp(open "e:\cs.txt" "r"))
, \# r' ?3 }6 ]1 S(setq mc(read-line fp))
+ n2 g( ?7 _5 n8 [( O4 M& H% g(command "style" "standard" "华文新魏" 10 1 0 "n" "n")
$ o3 l% M* K- X5 s3 V(command "text" "j" "bc" p1 0 mc)
8 V$ U' ~0 |2 V' y0 i; g' Q(setq a(distof(read-line fp)))3 Y6 d5 B$ ?$ m6 H9 K6 C
(setq p2 (list (- (car p1) (/ a 2)) (- (cadr p1) 2)))& z  Q0 w) c1 K+ G3 ]
(setq p3 (list (+ (car p1) (/ a 2)) (- (cadr p1) 2)))! ^" p& V/ ~' p" P* n1 Q) Y
(command "line" p2 p3 "")8 m' e( n& c  p* v* Z
(setq p1 (list ((car p1) (- (cadr p1) 5))))0 t$ @# B" {  T5 o, h- g6 Q" H
(setq n(atoi(read-line fp)))
! Z/ N+ L, e* l7 ?3 O# C( S8 t+ t(repeat n( Q7 M! ~1 {/ C
  (setq a(distof(read-line fp)))
1 V$ ]& _- @. n+ N4 s& g( H1 A8 x0 i  (setq b(distof(read-line fp)))
, x) T( K! U8 y1 H6 I2 d7 N  (setq c(distof(read-line fp))), p+ U, q: P7 {( u
  (setq d(distof(read-line fp)))
9 h6 K9 x: t! T" T0 C9 Z  (setq p2 (list (- (+ (car p1) a) (/ c 2)) (- (+ (cadr p1) b) 5)))
# q8 s( \  @5 g, {: w7 C3 F& ~6 Q+ l. s  (setq mc(read-line fp))
; r* ]. }/ j! o$ b. h  (command "-insert" mc P2 "1" "1" "0")3 v+ F- I6 P% {: i7 p% H
  (setq p1 (list ((car p1) (- (cadr p1) d 5))))
6 y3 d& b+ E0 I# T2 H)
* K: q; q6 E' x6 H5 _(close fp). I: ^# q+ ?7 Q4 i
(command "zoom" "e"); W" |9 C) M4 e+ N/ ^! J
)' h0 ^; b; Z& @* O8 I, c

0 F' K! W4 @* @( y! T- t% D为了方便其它网友学习,还是解释得清楚一点好。3 J7 n9 w6 ^5 M- T
第一行:定义函数
7 P/ `0 y8 `8 {( Q& r7 Y/ e第二行:屏幕上取点赋值给P1& l: N$ q* G* q4 ]4 Y2 X' `3 d, u6 r
第三行:用只读模式打开文本文件,路径按你的需要改,文件内容如下:
* C# c3 u$ K" }7 H/ T  第一行:试题名称字符串
1 b4 Z  b0 T$ w$ \" h% i) j  第二行:试题名称下划线的长度3 r/ t+ S4 S' q, U; M6 A
  第三行:插入块的数量,与下面数据对应4 u9 _. r6 I3 O/ p' o2 m
  第四行:以第一个块的图形界限左上角为坐标原点,块基点的X坐标! U- m- o7 q/ j3 E7 A
  第五行:以第一个块的图形界限左上角为坐标原点,块基点的Y坐标# F' V+ ]7 v" H: N  y* I$ p3 F
  第六行:第一个块的图形宽度, X; P. |( u7 h
  第七行:第一个块的图形高度
' f' ^" |; L* {' J  T  第八行:第一个块的完整路径. {* Y. x2 b2 i# l. T
  如果插入多个块,下面重复四到八行的内容,给出其它块的尺寸数据和路径5 E3 q% a8 s9 i( n6 s5 [" T- t
  注意:插入块的数量要与第三行相符" }  y9 e# w+ n' u
第四行:从文本文件中读取试题名称赋值给mc% J' J& p) h5 v9 |6 v3 R2 B
第五行:定义文字样式. h8 N* a9 M* c, T  D; j* [
第六行:写单行文字。“j”是对正方式,“bc”是下中对正,P1是在第二行得到的点,0是旋转角度,mc是刚刚读取的试题名称; O* a& |7 b: ^4 e( f% l7 ]: j
第七行:从文本文件读取下划线长度赋值给a
: }9 r  t  M( i  P第八、九行:计算下划线左右端点的坐标,其中左端点的X坐标为P1点X坐标减去下划线长度的一半,右端点的X坐标为P1点X坐标加上下划线长度的一半,目的是中点对齐
. D5 }: B* ]" \+ ^4 C第十行:调用CAD命令画下划线
) I$ m1 f6 |( g  ?, X  u& y第十一行:在P1点下面5个图形单位处定义一个参考点坐标并赋值给P1(原先的插入点已经完成它的历史使命了),用于参照此点插入块。
! v, Y% W  ?, ^0 {第十二行:从文本文件读取插入块的数量赋值给n5 S: L$ P" r# I7 G4 B
第十三行:开始按插入块的数量循环1 w0 W- y7 b3 b; ~' f) R$ v3 C1 G" Z  \
第十四到十七行:读取文本文件四到七行数据,以便计算块的适当的插入点使图形与标题及下划线对正且不重叠,并给后面的块预留位置
1 k. w1 l% m& \; S第十八行:参照第十一行定义的P1点计算块的适当的插入点,使块的图形中心(不是基点)与试题名称及下划线中点水平对齐,垂直方向块的上边界比P1点低5个图形单位(下面块的上边界同样比本块的下边界低5个图形单位,适当留点空白5 q, R* E: T: @" |) V4 I4 s/ I
第十九行:从文本文件读取块文件的完整路径
# E  }' {5 f# q第二十行:调用CAD命令插入块参照。insert命令前面的减号是为了避开对话框,mc是路径,P2是插入点,后面分别是X、Y比例和旋转角度0 h. @3 B3 g- e+ @$ V
第二十一行:重新定义参考点坐标为本块下边界的中点,以便下面的块对正和防止重叠
. T4 ~4 a& l4 q0 h0 s3 J$ [( M第二十二行:如果块还没有按n的数量插完就回到第十四行继续循环插入块,如果插入完毕就执行下面的语句0 i) t6 C) P+ q
第二十三行:关闭文本文件5 ]. J" t* l  E
第二十四行:屏幕缩放
8 ~* }& }2 ~1 F  Q8 g第二十五行:OK0 G# M' e% n  }% h8 _6 B

2 g' ]0 w6 E! m1 w5 y" _( B4 g自己发现有个地方错了,已改正
4 {% z9 ~8 \( \0 J1 \
6 b/ P7 S+ y( E' m- ?" ][ 本帖最后由 woaishuijia 于 2008-5-14 15:12 编辑 ]
发表于 2008-5-14 11:53 | 显示全部楼层
这个帖子我进来不知道几次了,因为标题不清,进来一看,看过的帖子,还是我不懂的。。。立马又退出。/ t8 y7 |$ D# l+ l
' K" V3 B' A0 e! N) ^  R" r! p
4 b6 n( \) G+ D: [
如果楼主把标题改为《AutoCADlisp编写一个lsp程序,希望高手指点迷津》,我就不会进来这么多趟了。
$ ?. E5 y+ ]0 m5 f. T% E6 ^- V5 g# v8 t' b4 @% g# c* p5 p. x0 \
1 F; H! r5 ^$ S
总是有人这样发帖子,很浪费别人的时间。) C2 h% `' c/ Q  \( I5 k( _: I6 p6 n

- z0 g! r4 e3 d- j& G5 n  t
* u" E+ E4 K/ i0 v  }% k3 P. {) T+ ]" L. I
希望版主能有相关规定,禁止发类似“请教”,“求助”,“高手指教”之类标题的帖子。
发表于 2008-5-15 15:27 | 显示全部楼层
原帖由 woaishuijia 于 2008-5-14 11:45 发表
5 w7 V+ O4 S+ r3 J在你的程序上做了些修改和补充,看看这次是否合你的意?
; ~9 x6 w% z. r: _9 k0 |+ Y8 X: R; F# F9 ?+ Z7 c* N3 B
(defun c:sj (/ p1 p2 p3 a b c d n mc)
* \& P. B0 Q9 }! o  M* K(setq p1 (getpoint "\n p1:"))3 l( F( i# o& A% c; r0 M
(setq fp(open "e:\cs.txt" "r"))
: S1 H1 i  s1 z1 P) B(setq mc(read-line fp))
6 S  v5 U; p. b0 b(command " ...

: @1 z8 ?  w2 V: {& g8 Q( l我在学lisp  H. D5 S* G  [2 Z6 ]& ~# W
支持
发表于 2008-5-15 15:54 | 显示全部楼层
; j/ @5 p* X3 N6 u$ X

4 y5 F5 ?3 _- `  y( B) ]建议将求助改为已解决!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-5-23 19:22

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

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

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