模具论坛

 找回密码
 注册

扫一扫,微信登录

QQ登录

只需一步,快速开始

搜索
热搜: 冲压 注塑 求助
    回车查看更多
    论坛可能已存在您要发布的主题帖 关闭
      查看: 22205|回复: 61

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

        [复制链接]
      发表于 2004-10-30 11:14:00 | 显示全部楼层 |阅读模式
      入门学习AutoLISP与VisualLISP的朋友全部进来!
      本人刚在论坛上弄了个芝麻官当当,也当为论坛作点贡献!
      即日起,教大家学习AutoLISP与VisualLISP,从最基本的入门开始到完成一个完整的程序。程序以步步深入的方式逐渐引入,使学习者能使用AutoLISP开发标准件,标准图符等参数化绘图工具,实现快速绘图的关键一步。
      [此贴子已经被作者于2004-11-1 9:11:03编辑过]

      本帖子中包含更多资源

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

      x
       楼主| 发表于 2004-10-30 12:21:00 | 显示全部楼层

      <P>第一个实例,参数化绘制螺纹孔符号,从基本入门,一步一步深入并完善程序。</P>
      <P>第一步:学习要点(a)程序架构(b)用程序在坐标原点画一个直径为5.1的圆</P>
      <P>;;分号开头的文字为说明文字
      (defun c:luowen(/ )  ;;defun为标准函数用来定义新函数
        (setvar "cmdecho" 0);;关闭命令回显
        (command "circle" '(0 0) 2.55);;调用AutoCAD内部命令circle来画圆
        (setvar "cmdecho" 1);;打开命令回显
        (princ);;静默退出
        )
      ;;LISP是表语言,程序是由左右括号成对出现
      </P>


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

       楼主| 发表于 2004-10-30 12:26:00 | 显示全部楼层
      <P>第二步:学习要点(a)局部变量(b)给变量赋值(c)由用户交互输入点(d)换行符号</P>
      <P>(defun c:luowen(/ pt);;增加局部变量pt
        (setvar "cmdecho" 0)
        (setq pt (getpoint "\n拾取螺纹孔中心点:"))
        ;;setq是给变量赋值函数,getpoint是交互的由用户输入点函数,\n为换行符号
        (command "circle" pt 2.55);;把用户拾取的点作为螺纹孔中心点
        (setvar "cmdecho" 1)
        (princ)
        )
      </P>

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

       楼主| 发表于 2004-10-30 12:35:00 | 显示全部楼层
      <P>第三步:增加变量dia,完成螺纹底孔圆的参数化绘制</P>
      <P>(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)
        )
      </P>

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

       楼主| 发表于 2004-10-30 14:17:00 | 显示全部楼层
      ;;第四步:以公称直径的值画出圆弧,作为牙线
      (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)
        )


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

       楼主| 发表于 2004-10-30 15:36:00 | 显示全部楼层
      ;;第五步:画十字中心线
      (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)
        )

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

       楼主| 发表于 2004-11-6 11:38:00 | 显示全部楼层
      ;;在图形中新建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)
        )

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

       楼主| 发表于 2004-11-6 11:39:00 | 显示全部楼层
      ;;第七步:根据圆的大小调整中心线的线型比例以让点划线相交在“划”上
      (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)
        )

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

       楼主| 发表于 2004-11-18 11:15:00 | 显示全部楼层
      <P>装配图件号标注的程序,需要与上面的GB螺纹剖面图程序同时使用,上面的程序中包含创建标准绘图样板的程序。
      同时一样要ap-api函数的支持,到楼上下载这两个程序。
      本程序具有以下特点:</P>
      <P>1、防止输入0件号与负件号
      2、防止输入点时空输入
      3、件号文字与引线保持相对位置
      4、允许默认值,空回车响应输入<>里面的数值
      5、引线自动更改圆点前头
      6、自动判断标注方向
      7、默认值自动递增
      8、引线终止点位置据件号文字位数自动调整</P>
      <P>希望多提意见,运行程序后会弹出作者的姓名与联系方式。





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

       楼主| 发表于 2004-11-22 09:50:00 | 显示全部楼层
      <P>;;第一步先写出程序框架
      (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);;静默退出
        )</P>
      <P>画出来如图所示图形</P>


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

       楼主| 发表于 2004-11-22 10:08:00 | 显示全部楼层
      ;;关闭对象捕捉,修改引线箭头样式与大小
      (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编辑过]

       楼主| 发表于 2004-11-22 10:15:00 | 显示全部楼层
      ;;第三步
      ;;修改引线长度即引线终点的位置
      (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编辑过]

       楼主| 发表于 2004-11-22 10:40:00 | 显示全部楼层
      ;;第四步
      ;;写出件号文字,并阻止用户输入小数,负数与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的圆了。
      如图:

       楼主| 发表于 2004-11-22 10:59:00 | 显示全部楼层
      <P>;;第五步
      ;;调用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输入件号&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);修改引线箭头小圆点大小为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);;静默退出
        )</P>
      <P>所画件号如图:</P>
       楼主| 发表于 2004-11-22 11:12:00 | 显示全部楼层
      ;;第六步
      ;;防止用户空输入
      (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)
        )
       楼主| 发表于 2004-11-22 11:24:00 | 显示全部楼层
      <P>
      ;;第七步
      ;;防止用户输入件号时超过两位数
      (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))
        (if(&gt;(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)
        )</P>
      <P>如输入件号125时出现错误提示并退出</P>

       楼主| 发表于 2006-11-8 10:51:00 | 显示全部楼层
      <p>LISP是最好学的语言了,你可以像本贴这样的思路进行学习,写一个你想要的功能程序,分解成多步骤进行学习和测试,等一个完整功能和程序完成了,你的LISP也已经入门了。</p><p>本贴的例子思想解释一下:</p><p>目的:批量绘制不同直径的圆的中心线。</p><p>步骤分解如下:</p><p>1)绘制起点终点都固定的直线</p><p>2)把绘制直线的起点与终点参数化(可变,由用户指定点)</p><p>3)增加直线的线型</p><p>4)增加直线的线型比例</p><p>5)考虑图层</p><p>6)开始与圆结合,指出圆的中心点,并利用圆的半径确定中心线的起点与终点(比如半径的1.1倍)</p><p>7)增加筛选框选到的图元,把圆单独挑选出来</p><p>8)排除已经绘制了中心线的圆</p><p>9)增加对同心圆的识别,同心圆只画最大直径的圆的中心线</p><p>10)增加防止程序意外终止造成的错误(如强行按ESC后把程序中更改和系统变量在强行按ESC后把程序退出后进行恢复)</p><p>需要考虑的还很多,看你考虑得有多周全程序就会有多好。</p>
      发表于 2008-7-18 18:51:07 | 显示全部楼层
      我想找VLX的相关资料!
      发表于 2008-7-25 15:21:42 | 显示全部楼层
      狂晕,明知道大家都是穷人,发这么多个包啥意思啊,欲哭无泪....
      发表于 2008-7-28 18:21:42 | 显示全部楼层
      怎么这么多啊 ,学习下 。。。。。
      您需要登录后才可以回帖 登录 | 注册

      本版积分规则

      关闭

      招聘信息 上一条 /5 下一条

      关闭

      求职信息 上一条 /5 下一条

      关闭

      技术求助 上一条 /5 下一条

      QQ|小黑屋|手机版|模具论坛 ( 浙ICP备15037217号 )

      GMT+8, 2025-6-3 12:02

      Powered by Discuz! X3.4

      © 2001-2013 Comsenz Inc.

      快速回复
      返回顶部
      返回列表
       
      客服电话:0577-61318188
      模具论坛交流群:
      模具论坛交流群
      工作时间:
      08:30-17:30