AutoCADlisp编写一个lsp程序,希望高手指点迷津
用AutoCADlisp编写一个lsp程序,要求加载lsp文件后,通过command命令自动将几个画好的CAD图块文件插入到当前窗口中。看一下我写的lsp代码:(defun c:sj (/ p1 p2 p3 p4 a b n mc)
(setq p1 (getpoint "\n p1:"))
(setq fp(open "d:/cs.txt" "r"))
(setq a 70)
(setq b -2)
(setq p2 (list (+ (car p1) a) (cadr p1)))
(setq p3 (list (- (car p1) 5) (+ (cadr p1) b)))
(setq p4 (list (+ (car p1) a) (+ (cadr p1) b)))
(setq mc(read-line fp))
(setq n(atoi(read-line fp)))
(command "text" p1 1.5 0 mc)
(command "line" p3 p4 "")
(command "style" "standard" "华文新魏" 10 20 0 "n" "n")
(setq mc(read-line fp))
(command "xref" "attach"mc P4 "1" "1" "0")
(setq mc(read-line fp))
(command "xref" "attach"mc P4 "1" "1" "0")
(command "zoom" "e")
)
以上的代码是一部分,没有插入图块的代码,希望高手指点迷津!谢谢!
[ 本帖最后由 truezx 于 2008-5-14 12:28 编辑 ] 哇,高层次的,不会。:P :P :kiss: 提示:1 循环处理插入几个图
2 在以上基础,实现图的位置 不重叠(对应图块的位置不重叠) 友情提示:这个问题由woaishuijia来回答你比较好,你可以发短信求教,呵呵 原帖由 truezx 于 2008-5-12 21:44 发表 http://www.askcad.com/bbs/images/common/back.gif
友情提示:这个问题由woaishuijia来回答你比较好,你可以发短信求教,呵呵
太好了!谢谢版主! (defun c:sj (/ p1 p2 p3 p4 a b n mc)
(setq p1 (getpoint "\n p1:"))
(setq fp(open "d:/cs.txt" "r"))
(setq a 70)
(setq b -2)
(setq p2 (list (+ (car p1) a) (cadr p1)))
(setq p3 (list (- (car p1) 5) (+ (cadr p1) b)))
(setq p4 (list (+ (car p1) a) (+ (cadr p1) b)))
(setq mc(read-line fp))
(setq n(atoi(read-line fp)))
(command "text" p1 1.5 0 mc)
(command "line" p3 p4 "")
(command "style" "standard" "华文新魏" 10 20 0 "n" "n")
(setq mc(read-line fp))
(command "-insert" mc P4 "1" "1" "0")
(setq mc(read-line fp))
(command "-insert" mc P4 "1" "1" "0")
(command "zoom" "e")
)
没看到你的“cs.txt”,不清楚你要干什么,猜测你是想在这里插入块。
[ 本帖最后由 woaishuijia 于 2008-5-13 23:37 编辑 ] 在你的程序上做了些修改和补充,看看这次是否合你的意?
(defun c:sj (/ p1 p2 p3 a b c d n mc)
(setq p1 (getpoint "\n p1:"))
(setq fp(open "e:\cs.txt" "r"))
(setq mc(read-line fp))
(command "style" "standard" "华文新魏" 10 1 0 "n" "n")
(command "text" "j" "bc" p1 0 mc)
(setq a(distof(read-line fp)))
(setq p2 (list (- (car p1) (/ a 2)) (- (cadr p1) 2)))
(setq p3 (list (+ (car p1) (/ a 2)) (- (cadr p1) 2)))
(command "line" p2 p3 "")
(setq p1 (list ((car p1) (- (cadr p1) 5))))
(setq n(atoi(read-line fp)))
(repeat n
(setq a(distof(read-line fp)))
(setq b(distof(read-line fp)))
(setq c(distof(read-line fp)))
(setq d(distof(read-line fp)))
(setq p2 (list (- (+ (car p1) a) (/ c 2)) (- (+ (cadr p1) b) 5)))
(setq mc(read-line fp))
(command "-insert" mc P2 "1" "1" "0")
(setq p1 (list ((car p1) (- (cadr p1) d 5))))
)
(close fp)
(command "zoom" "e")
)
为了方便其它网友学习,还是解释得清楚一点好。
第一行:定义函数
第二行:屏幕上取点赋值给P1
第三行:用只读模式打开文本文件,路径按你的需要改,文件内容如下:
第一行:试题名称字符串
第二行:试题名称下划线的长度
第三行:插入块的数量,与下面数据对应
第四行:以第一个块的图形界限左上角为坐标原点,块基点的X坐标
第五行:以第一个块的图形界限左上角为坐标原点,块基点的Y坐标
第六行:第一个块的图形宽度
第七行:第一个块的图形高度
第八行:第一个块的完整路径
如果插入多个块,下面重复四到八行的内容,给出其它块的尺寸数据和路径
注意:插入块的数量要与第三行相符
第四行:从文本文件中读取试题名称赋值给mc
第五行:定义文字样式
第六行:写单行文字。“j”是对正方式,“bc”是下中对正,P1是在第二行得到的点,0是旋转角度,mc是刚刚读取的试题名称
第七行:从文本文件读取下划线长度赋值给a
第八、九行:计算下划线左右端点的坐标,其中左端点的X坐标为P1点X坐标减去下划线长度的一半,右端点的X坐标为P1点X坐标加上下划线长度的一半,目的是中点对齐
第十行:调用CAD命令画下划线
第十一行:在P1点下面5个图形单位处定义一个参考点坐标并赋值给P1(原先的插入点已经完成它的历史使命了),用于参照此点插入块。
第十二行:从文本文件读取插入块的数量赋值给n
第十三行:开始按插入块的数量循环
第十四到十七行:读取文本文件四到七行数据,以便计算块的适当的插入点使图形与标题及下划线对正且不重叠,并给后面的块预留位置
第十八行:参照第十一行定义的P1点计算块的适当的插入点,使块的图形中心(不是基点)与试题名称及下划线中点水平对齐,垂直方向块的上边界比P1点低5个图形单位(下面块的上边界同样比本块的下边界低5个图形单位,适当留点空白:lol )
第十九行:从文本文件读取块文件的完整路径
第二十行:调用CAD命令插入块参照。insert命令前面的减号是为了避开对话框,mc是路径,P2是插入点,后面分别是X、Y比例和旋转角度
第二十一行:重新定义参考点坐标为本块下边界的中点,以便下面的块对正和防止重叠
第二十二行:如果块还没有按n的数量插完就回到第十四行继续循环插入块,如果插入完毕就执行下面的语句
第二十三行:关闭文本文件
第二十四行:屏幕缩放
第二十五行:OK
自己发现有个地方错了,已改正
[ 本帖最后由 woaishuijia 于 2008-5-14 15:12 编辑 ] 这个帖子我进来不知道几次了,因为标题不清,进来一看,看过的帖子,还是我不懂的。。。立马又退出。
如果楼主把标题改为《AutoCADlisp编写一个lsp程序,希望高手指点迷津》,我就不会进来这么多趟了。
总是有人这样发帖子,很浪费别人的时间。
希望版主能有相关规定,禁止发类似“请教”,“求助”,“高手指教”之类标题的帖子。 原帖由 woaishuijia 于 2008-5-14 11:45 发表 http://www.askcad.com/bbs/images/common/back.gif
在你的程序上做了些修改和补充,看看这次是否合你的意?
(defun c:sj (/ p1 p2 p3 a b c d n mc)
(setq p1 (getpoint "\n p1:"))
(setq fp(open "e:\cs.txt" "r"))
(setq mc(read-line fp))
(command " ...
我在学lisp
支持 :)
建议将求助改为已解决!
页:
[1]