网通访问 |电信访问 | 网络测速 | 联系管理员 |安全退出论坛,保护账号安全!
 27 12
发新话题
打印

[原创]想学AutoLISP开发的全部进来!

本主题由 cloud_ 于 2008-4-10 14:38 移动

[原创]想学AutoLISP开发的全部进来!

入门学习AutoLISP与VisualLISP的朋友全部进来!
本人刚在论坛上弄了个芝麻官当当,也当为论坛作点贡献!
即日起,教大家学习AutoLISP与VisualLISP,从最基本的入门开始到完成一个完整的程序。程序以步步深入的方式逐渐引入,使学习者能使用AutoLISP开发标准件,标准图符等参数化绘图工具,实现快速绘图的关键一步。

[此贴子已经被作者于2004-11-1 9:11:03编辑过]


附件: 您所在的用户组无法下载或查看附件
你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

第一个实例,参数化绘制螺纹孔符号,从基本入门,一步一步深入并完善程序。

第一步:学习要点(a)程序架构(b)用程序在坐标原点画一个直径为5.1的圆

;;分号开头的文字为说明文字 (defun c:luowen(/ ) ;;defun为标准函数用来定义新函数 (setvar "cmdecho" 0);;关闭命令回显 (command "circle" '(0 0) 2.55);;调用AutoCAD内部命令circle来画圆 (setvar "cmdecho" 1);;打开命令回显 (princ);;静默退出 ) ;;LISP是表语言,程序是由左右括号成对出现

[attach]198510[/attach]

[此贴子已经被作者于2004-11-6 11:28:10编辑过]

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

第二步:学习要点(a)局部变量(b)给变量赋值(c)由用户交互输入点(d)换行符号

(defun c:luowen(/ pt);;增加局部变量pt (setvar "cmdecho" 0) (setq pt (getpoint "\n拾取螺纹孔中心点:")) ;;setq是给变量赋值函数,getpoint是交互的由用户输入点函数,\n为换行符号 (command "circle" pt 2.55);;把用户拾取的点作为螺纹孔中心点 (setvar "cmdecho" 1) (princ) )

[attach]198511[/attach]

[此贴子已经被作者于2004-11-6 11:29:43编辑过]

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

第三步:增加变量dia,完成螺纹底孔圆的参数化绘制

(defun c:luowen(/ pt dia);;增加局部变量rad (setvar "cmdecho" 0) (setq pt (getpoint "\n拾取螺纹孔中心点:")) (setq dia (getdist "\n输入螺纹公称直径:")) ;;给公称径dia赋值 (command "circle" pt (* 0.425 dia)) ;;把直径除2作为半径输入画圆,不要用除法,除数为0会出错,用乘法代替除法会更好 ;;螺纹孔底孔与牙线的比例0.85,一半是0.425 (setvar "cmdecho" 1) (princ) )

[attach]198512[/attach]

[此贴子已经被作者于2004-11-6 11:30:55编辑过]

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第四步:以公称直径的值画出圆弧,作为牙线
(defun c:luowen(/ pt dia osm)
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"));;保存对象捕捉系统变量
  (setq pt (getpoint "\n拾取螺纹孔中心点:"))
  (setq dia (getdist "\n输入螺纹公称直径:"))
  (setvar "osmode" 0);;关闭对象捕捉,防止圆心与圆弧不按输入的点作图
  (command "circle" pt (* 0.425 dia))
  (command "arc" "c" pt (polar pt (* 1.44 pi) (* 0.5 dia)) "a" 290)
  ;;用圆心起点与包含角画圆弧,求起点polar用的是弧度,包含角用的是十进制度数
  (setvar "osmode" osm)
  (setvar "cmdecho" 1)
  (princ)
  )
[attach]198515[/attach]

[此贴子已经被作者于2004-11-6 11:32:11编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第五步:画十字中心线
(defun c:luowen(/ pt dia osm)
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setq pt (getpoint "\n拾取螺纹孔中心点:"))
  (setq dia (getdist "\n输入螺纹公称直径:"))
  (setvar "osmode" 0)
  (command "circle" pt (* 0.425 dia))
  (command "arc" "c" pt (polar pt (* 1.44 pi) (* 0.5 dia)) "a" 290)
  (command "line" (polar pt pi (* 0.6 dia)) (polar pt 0 (* 0.6 dia)) "")
  (command "line" (polar pt (* 0.5 pi) (* 0.6 dia)) (polar pt (* 1.5 pi) (* 0.6 dia)) "")
  (setvar "osmode" osm)
  (setvar "cmdecho" 1)
  (princ)
  )[attach]198518[/attach]

[此贴子已经被作者于2004-11-6 11:36:39编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;在图形中新建1、BOU粗实线 2、CON细实线 3、CEN中心线 三个图层
;;第六步:确定线型与线宽
(defun c:luowen(/ pt dia osm lay)
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setq lay (getvar "clayer"))
  (setq pt (getpoint "\n拾取螺纹孔中心点:"))
  (setq dia (getdist "\n输入螺纹公称直径:"))
  (setvar "osmode" 0)
  (setvar "clayer" "BOU");切换到粗实线图层
  (command "circle" pt (* 0.425 dia))
  (setvar "clayer" "CON");切换到细实线图层
  (command "arc" "c" pt (polar pt (* 1.44 pi) (* 0.5 dia)) "a" 290)
  (setvar "clayer" "CEN");切换到中心线图层
  (command "line" (polar pt pi (* 0.6 dia)) (polar pt 0 (* 0.6 dia)) "")
  (command "line" (polar pt (* 0.5 pi) (* 0.6 dia)) (polar pt (* 1.5 pi) (* 0.6 dia)) "")
  (setvar "osmode" osm)
  (setvar "clayer" lay)
  (setvar "cmdecho" 1)
  (princ)
  )[attach]198522[/attach]

[此贴子已经被作者于2004-11-6 11:40:39编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第七步:根据圆的大小调整中心线的线型比例以让点划线相交在“划”上
(defun c:luowen(/ pt dia osm lay clt)
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setq lay (getvar "clayer"))
  (setq clt (getvar "celtscale"))
  (setq pt (getpoint "\n拾取螺纹孔中心点:"))
  (setq dia (getdist "\n输入螺纹公称直径:"))
  (setvar "osmode" 0)
  (setvar "clayer" "BOU");切换到粗实线图层
  (command "circle" pt (* 0.425 dia))
  (setvar "clayer" "CON");切换到细实线图层
  (command "arc" "c" pt (polar pt (* 1.44 pi) (* 0.5 dia)) "a" 290)
  (setvar "clayer" "CEN");切换到中心线图层
  (setvar "celtscale" (* dia 0.5 0.1));线型比例等于半径的十分之一
  (command "line" (polar pt pi (* 0.6 dia)) (polar pt 0 (* 0.6 dia)) "")
  (command "line" (polar pt (* 0.5 pi) (* 0.6 dia)) (polar pt (* 1.5 pi) (* 0.6 dia)) "")
  (setvar "osmode" osm)
  (setvar "clayer" lay)
  (setvar "celtscale" clt)
  (setvar "cmdecho" 1)
  (princ)
  )[attach]198523[/attach]

[此贴子已经被作者于2004-11-6 11:41:34编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

装配图件号标注的程序,需要与上面的GB螺纹剖面图程序同时使用,上面的程序中包含创建标准绘图样板的程序。 同时一样要ap-api函数的支持,到楼上下载这两个程序。 本程序具有以下特点:

1、防止输入0件号与负件号 2、防止输入点时空输入 3、件号文字与引线保持相对位置 4、允许默认值,空回车响应输入<>里面的数值 5、引线自动更改圆点前头 6、自动判断标注方向 7、默认值自动递增 8、引线终止点位置据件号文字位数自动调整

希望多提意见,运行程序后会弹出作者的姓名与联系方式。 [attach]206687[/attach]

[此贴子已经被作者于2004-11-22 9:47:19编辑过]

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第一步先写出程序框架 (defun c:jh(/ p1 p2) ;;defun为标准函数用来定义新函数,执行命令jh可自行更改为想要的命令 (setvar "cmdecho" 0);;关闭命令回显 (setq p1 (getpoint "\n指定件号标注起点:"));;由用户交互输入两个点 (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"));;从p1往p2拉出一橡皮筋 (command "leader" p1 p2 "a" "" "n");;调用AutoCAD内部命令leader来画引线 (command "circle" p2 5);;调用AutoCAD内部命令circle来画圆 (setvar "cmdecho" 1);;打开命令回显 (princ);;静默退出 )

画出来如图所示图形

[此贴子已经被作者于2004-11-22 9:56:10编辑过]

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;关闭对象捕捉,修改引线箭头样式与大小
(defun c:jh(/ osm daz blk p1 p2)  ;;defun为标准函数用来定义新函数,执行命令jh可自行更改为想要的命令
  (setvar "cmdecho" 0);;关闭命令回显
  (setq osm (getvar "osmode"))
  (setq blk (getvar "dimldrblk"))
  (setq daz (getvar "dimasz"));储存对象捕捉与标注引线箭头大小与样式系统变量
  (setq p1 (getpoint "\n指定件号标注起点:"))
  (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"));;从p1往p2拉出一橡皮筋
  (setvar "osmode" 0);关闭对象捕捉
  (setvar "dimldrblk" "_dotsmall")
  (setvar "dimasz" 3);修改引线箭头小圆点大小为3
  (command "leader" p1 p2 "a" "" "n");;调用AutoCAD内部命令leader来画引线
  (command "circle" p2 5);;调用AutoCAD内部命令circle来画圆
  (setvar "osmode" osm)
  (setvar "dimldrblk" blk)
  (setvar "dimasz" daz);;回复三个系统变量
  (setvar "cmdecho" 1);;打开命令回显
  (princ);;静默退出
  )
  )

[此贴子已经被作者于2004-11-22 10:18:03编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第三步
;;修改引线长度即引线终点的位置
(defun c:jh(/ osm daz blk p1 p2 pend)  ;;defun为标准函数用来定义新函数,执行命令jh可自行更改为想要的命令
  (setvar "cmdecho" 0);;关闭命令回显
  (setq osm (getvar "osmode"))
  (setq blk (getvar "dimldrblk"))
  (setq daz (getvar "dimasz"));储存对象捕捉与标注引线箭头大小与样式系统变量
  (setq p1 (getpoint "\n指定件号标注起点:"))
  (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"));;从p1往p2拉出一橡皮筋
  (setvar "osmode" 0);关闭对象捕捉
  (setvar "dimldrblk" "_dotsmall")
  (setvar "dimasz" 3);修改引线箭头小圆点大小为3
  (setq pend (polar p2 (angle p2 p1) 5));;确定引线终点位置
  (command "leader" p1 pend "a" "" "n");;调用AutoCAD内部命令leader来画引线
  (command "circle" p2 5);;调用AutoCAD内部命令circle来画圆
  (setvar "osmode" osm)
  (setvar "dimldrblk" blk)
  (setvar "dimasz" daz);;回复三个系统变量
  (setvar "cmdecho" 1);;打开命令回显
  (princ);;静默退出
  )

[此贴子已经被作者于2004-11-22 10:17:14编辑过]


你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第四步
;;写出件号文字,并阻止用户输入小数,负数与0,只能输入正整数
(defun c:jh(/ osm daz blk p1 p2 pend nob)  ;;defun为标准函数用来定义新函数,执行命令jh可自行更改为想要的命令
  (setvar "cmdecho" 0);;关闭命令回显
  (setq osm (getvar "osmode"))
  (setq blk (getvar "dimldrblk"))
  (setq daz (getvar "dimasz"));储存对象捕捉与标注引线箭头大小与样式系统变量
  (setq p1 (getpoint "\n指定件号标注起点:"))
  (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"));;从p1往p2拉出一橡皮筋
  (initget 6);;防止用户输入0或负数
  (setq nob (getint "\n输入件号:"));;用户只能输入整数
  (setvar "osmode" 0);关闭对象捕捉
  (setvar "dimldrblk" "_dotsmall")
  (setvar "dimasz" 3);修改引线箭头小圆点大小为3
  (setq pend (polar p2 (angle p2 p1) 5));;确定引线终点位置
  (command "leader" p1 pend "a" "" "n");;调用AutoCAD内部命令leader来画引线
  (command "circle" p2 5);;调用AutoCAD内部命令circle来画圆
  (command "text" "m" p2 6 0 nob)
  (setvar "osmode" osm)
  (setvar "dimldrblk" blk)
  (setvar "dimasz" daz);;回复三个系统变量
  (setvar "cmdecho" 1);;打开命令回显
  (princ);;静默退出
  )

注意:你要求的文字高度为8,可能太大了,我把它改成6了,不然就超出直径10的圆了。
如图:

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第五步 ;;调用AutoCAD预留系统变量useri5,存取整数,以实现默认值,并自动增加1 (defun c:jh(/ osm daz blk p1 p2 pend nob) ;;defun为标准函数用来定义新函数,执行命令jh可自行更改为想要的命令 (setvar "cmdecho" 0);;关闭命令回显 (setq osm (getvar "osmode")) (setq blk (getvar "dimldrblk")) (setq daz (getvar "dimasz"));储存对象捕捉与标注引线箭头大小与样式系统变量 (setq p1 (getpoint "\n指定件号标注起点:")) (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"));;从p1往p2拉出一橡皮筋 (setvar "useri5" (+ 1 (getvar "useri5"))) (initget 6);;防止用户输入0或负数 (setq nob (getint (strcat "\n输入件号<" (rtos (getvar "useri5")2 0) ">:"))) (if (not nob)(setq nob (getvar "useri5"))(setvar "useri5" nob)) (setvar "osmode" 0);关闭对象捕捉 (setvar "dimldrblk" "_dotsmall") (setvar "dimasz" 3);修改引线箭头小圆点大小为3 (setq pend (polar p2 (angle p2 p1) 5));;确定引线终点位置 (command "leader" p1 pend "a" "" "n");;调用AutoCAD内部命令leader来画引线 (command "circle" p2 5);;调用AutoCAD内部命令circle来画圆 (command "text" "m" p2 6 0 nob) (setvar "osmode" osm) (setvar "dimldrblk" blk) (setvar "dimasz" daz);;回复三个系统变量 (setvar "cmdecho" 1);;打开命令回显 (princ);;静默退出 )

所画件号如图:

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第六步
;;防止用户空输入
(defun c:jh(/ osm daz blk p1 p2 pend nob)  
  (setvar "cmdecho" 0)
  (setq osm (getvar "osmode"))
  (setq blk (getvar "dimldrblk"))
  (setq daz (getvar "dimasz"))
  (initget 1);;禁止用户空输入(直接回车响应)
  (setq p1 (getpoint "\n指定件号标注起点:"))
  (initget 1);;禁止用户空输入(直接回车响应)
  (setq p2 (getpoint p1 "\n指定件号标注文字放置点:"))
  (setvar "useri5" (+ 1 (getvar "useri5")))
  (initget 6)
  (setq nob (getint (strcat "\n输入件号&lt;"
       (rtos (getvar "useri5")2 0)
       "&gt;:")))
  (if (not nob)(setq nob (getvar "useri5"))(setvar "useri5" nob))
  (setvar "osmode" 0)
  (setvar "dimldrblk" "_dotsmall")
  (setvar "dimasz" 3)
  (setq pend (polar p2 (angle p2 p1) 5))
  (command "leader" p1 pend "a" "" "n")
  (command "circle" p2 5)
  (command "text" "m" p2 6 0 nob)
  (setvar "osmode" osm)
  (setvar "dimldrblk" blk)
  (setvar "dimasz" daz)
  (setvar "cmdecho" 1)
  (princ)
  )
你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

;;第七步 ;;防止用户输入件号时超过两位数 (defun c:jh(/ osm daz blk p1 p2 pend nob) (setvar "cmdecho" 0) (setq osm (getvar "osmode")) (setq blk (getvar "dimldrblk")) (setq daz (getvar "dimasz")) (initget 1);;禁止用户空输入(直接回车响应) (setq p1 (getpoint "\n指定件号标注起点:")) (initget 1);;禁止用户空输入(直接回车响应) (setq p2 (getpoint p1 "\n指定件号标注文字放置点:")) (setvar "useri5" (+ 1 (getvar "useri5"))) (initget 6) (setq nob (getint (strcat "\n输入件号<" (rtos (getvar "useri5")2 0) ">:"))) (if (not nob)(setq nob (getvar "useri5"))(setvar "useri5" nob)) (if(>(strlen(rtos (getvar "useri5")2 0))2)(alert "\n输入错误,程序退出!") (progn (setvar "osmode" 0) (setvar "dimldrblk" "_dotsmall") (setvar "dimasz" 3) (setq pend (polar p2 (angle p2 p1) 5)) (command "leader" p1 pend "a" "" "n") (command "circle" p2 5) (command "text" "m" p2 6 0 nob) (setvar "osmode" osm) (setvar "dimldrblk" blk) (setvar "dimasz" daz) (setvar "cmdecho" 1) ) ) (princ) )

如输入件号125时出现错误提示并退出

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

LISP是最好学的语言了,你可以像本贴这样的思路进行学习,写一个你想要的功能程序,分解成多步骤进行学习和测试,等一个完整功能和程序完成了,你的LISP也已经入门了。

本贴的例子思想解释一下:

目的:批量绘制不同直径的圆的中心线。

步骤分解如下:

1)绘制起点终点都固定的直线

2)把绘制直线的起点与终点参数化(可变,由用户指定点)

3)增加直线的线型

4)增加直线的线型比例

5)考虑图层

6)开始与圆结合,指出圆的中心点,并利用圆的半径确定中心线的起点与终点(比如半径的1.1倍)

7)增加筛选框选到的图元,把圆单独挑选出来

8)排除已经绘制了中心线的圆

9)增加对同心圆的识别,同心圆只画最大直径的圆的中心线

10)增加防止程序意外终止造成的错误(如强行按ESC后把程序中更改和系统变量在强行按ESC后把程序退出后进行恢复)

需要考虑的还很多,看你考虑得有多周全程序就会有多好。

你的进步就是我的成绩! 紧急问题请发Email:xmltc@163.com

TOP

我想找VLX的相关资料!
集成的不如分立的,分立的不如电子管。

TOP

狂晕,明知道大家都是穷人,发这么多个包啥意思啊,欲哭无泪....
五金模具联盟 QQ群49965004,欢迎新老手的加入,中模因你加入而精彩^.^

TOP

怎么这么多啊 ,学习下 。。。。。

TOP

 27 12
发新话题