富康人生活网

 找回密码
 立即注册

团队旅游,就选趣之旅旅游定制-企业团建-公司旅游
富康人生活网用户必读
《《广告位招商...》》
查看: 4741|回复: 9
收起左侧

想学AutoLISP开发的全部进来!

[复制链接]

37

主题

84

回帖

1737

积分

康人师三

普通的我

Rank: 7Rank: 7Rank: 7

性别
威望
3
注册时间
06-5-3
QQ
发表于 08-8-12 03:22:45 | 显示全部楼层 |阅读模式
入门学习AutoLISP与VisualLISP的朋友全部进来!
本人刚在论坛上弄了个芝麻官当当,也当为论坛作点贡献!
即日起,教大家学习AutoLISP与VisualLISP,从最基本的入门开始到完成一个完整的程序。程序以步步深入的方式逐渐引入,使学习者能使用AutoLISP开发标准件,标准图符等参数化绘图工具,实现快速绘图的关键一步。

第一步:学习要点(a)程序架构(b)用程序在坐标原点画一个直径为5.1的圆
;;分号开头的文字为说明文字 (defun c:luowen(/ ) ;;defun为标准函数用来定义新函数 (setvar "cmdecho" 0);;关闭命令回显 (command "circle" '(0 0) 2.55);;调用AutoCAD内部命令circle来画圆 (setvar "cmdecho" 1);;打开命令回显 (princ);;静默退出 ) ;;LISP是表语言,程序是由左右括号成对出现


第二步:学习要点(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) )

第三步:增加变量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) )

;;第四步:以公称直径的值画出圆弧,作为牙线
(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) )


;;第五步:画十字中心线
(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)
  )

;;在图形中新建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)
  )

;;第七步:根据圆的大小调整中心线的线型比例以让点划线相交在“划”上
(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)
  )
3.JPG

龙华富士康旅游

37

主题

84

回帖

1737

积分

康人师三

普通的我

Rank: 7Rank: 7Rank: 7

性别
威望
3
注册时间
06-5-3
QQ
 楼主| 发表于 08-8-12 03:23:24 | 显示全部楼层
装配图件号标注的程序,需要与上面的GB螺纹剖面图程序同时使用,上面的程序中包含创建标准绘图样板的程序。同时一样要ap-api函数的支持,到楼上下载这两个程序。本程序具有以下特点:
1、防止输入0件号与负件号 2、防止输入点时空输入 3、件号文字与引线保持相对位置 4、允许默认值,空回车响应输入<>里面的数值 5、引线自动更改圆点前头 6、自动判断标注方向 7、默认值自动递增 8、引线终止点位置据件号文字位数自动调整

37

主题

84

回帖

1737

积分

康人师三

普通的我

Rank: 7Rank: 7Rank: 7

性别
威望
3
注册时间
06-5-3
QQ
 楼主| 发表于 08-8-12 03:25:09 | 显示全部楼层
;;第一步先写出程序框架 (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);;静默退出 )


;;关闭对象捕捉,修改引线箭头样式与大小
(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);;静默退出
  )

;;第三步
;;修改引线长度即引线终点的位置
(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);;静默退出
  )

;;第四步
;;写出件号文字,并阻止用户输入小数,负数与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);;静默退出
  )

37

主题

84

回帖

1737

积分

康人师三

普通的我

Rank: 7Rank: 7Rank: 7

性别
威望
3
注册时间
06-5-3
QQ
 楼主| 发表于 08-8-12 03:26:53 | 显示全部楼层
;;第五步 ;;调用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);;静默退出 )

;;第六步
;;防止用户空输入
(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))
  (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)
  )

;;第七步 ;;防止用户输入件号时超过两位数 (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) )

一个完整功能和程序完成了,你的LISP也已经入门了。
本贴的例子思想解释一下:
目的:批量绘制不同直径的圆的中心线。
步骤分解如下:
1)绘制起点终点都固定的直线
2)把绘制直线的起点与终点参数化(可变,由用户指定点)
3)增加直线的线型
4)增加直线的线型比例
5)考虑图层
6)开始与圆结合,指出圆的中心点,并利用圆的半径确定中心线的起点与终点(比如半径的1.1倍)
7)增加筛选框选到的图元,把圆单独挑选出来
8)排除已经绘制了中心线的圆
9)增加对同心圆的识别,同心圆只画最大直径的圆的中心线
10)增加防止程序意外终止造成的错误(如强行按ESC后把程序中更改和系统变量在强行按ESC后把程序退出后进行恢复)
需要考虑的还很多,看你考虑得有多周全程序就会有多好。

5

主题

70

回帖

824

积分

康人师一

草草

Rank: 5Rank: 5

性别
威望
0
注册时间
06-7-16
QQ
发表于 08-8-12 06:13:36 | 显示全部楼层
辛苦了,打了这样多的字

10

主题

18

回帖

453

积分

论坛员二

Rank: 3Rank: 3

性别
保密
威望
0
注册时间
08-7-26
QQ
发表于 08-8-12 21:35:06 | 显示全部楼层
多谢分享!

37

主题

84

回帖

1737

积分

康人师三

普通的我

Rank: 7Rank: 7Rank: 7

性别
威望
3
注册时间
06-5-3
QQ
 楼主| 发表于 08-8-13 01:59:07 | 显示全部楼层
大家要学习啊!今天你学习了吗 ?

52

主题

169

回帖

925

积分

康人师二

Rank: 6Rank: 6

性别
保密
威望
0
注册时间
09-6-7
发表于 09-11-13 18:53:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

52

主题

169

回帖

925

积分

康人师二

Rank: 6Rank: 6

性别
保密
威望
0
注册时间
09-6-7
发表于 09-11-13 18:54:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

65

主题

360

回帖

4004

积分

专理

Rank: 10Rank: 10Rank: 10

性别
保密
威望
0
注册时间
09-10-24
发表于 10-2-19 21:02:11 | 显示全部楼层
强烈向大家推荐一个好网站,[我要自学网] (www.51zxw.net),教程由在校老师录制,,有办公类、平 面设计类,室内设计类,机械设计类教程.....让你足不出门,都可以体现学校的专业教育!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

深圳户外

关注微信|Archiver|手机版|小黑屋|富康人生活网 ( 粤ICP备2020122794号-3 )

GMT+8, 24-12-27 21:16 , Processed in 0.085770 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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