关于autoulisp在用cad机械制图二次开发中的应用.doc_第1页
关于autoulisp在用cad机械制图二次开发中的应用.doc_第2页
关于autoulisp在用cad机械制图二次开发中的应用.doc_第3页
关于autoulisp在用cad机械制图二次开发中的应用.doc_第4页
关于autoulisp在用cad机械制图二次开发中的应用.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

autolisp在autocad机械制图中的应用在2005年8月7日8月12日期间我们在第一汽车集团公司工艺装配有限公司的工艺装配研究所进了为期一周的三下乡的实习学习活动,我们本着科学严谨的态度象王俊伟副所长学习autolisp在autocad在二次开发中的应用。现在对autolisp语言以有了初步的了解。还在王副所长的指导下独自编写了几个有用的小程序,在这次活动中我们收益非浅不但过了一个有益的假期还提高了自己的就业竞争力。在众多的autocad开发工具中,autolisp是使用最简单、应用最广泛、使用者最多的一种开发工具。但是,autolisp只是一种解释型语言,且不能加密。为了解决这个问题,autodesk公司在autocad r14中推出了visual lisp的测试版,随后在autocad 2000中推出了visual lisp的正式版本。visual lisp完全兼容以前的autolisp,同时应用了autocad的另一个开发工具-objectarx面向对象技术和activex技术,使visual lisp开发的应用程序功能更强大,运行速度更快,从而真正成为一个能开发商业软件的开发平台.autolisp是由autodesk公司开发的一种lisp程序语言(lisp是list processor的缩写)。第一篇关于lisp的参考文献是由john mccarthy 在1960年4月的acm通讯中发表的。除了fortran和cobol,大多数在六十年代早期开发出来的语言都过时了,可是lisp却生下来,并且已经成为人工智能(ai)的首选程序序言。autolisp解释程序位于autocad软件包中,然而autocad r2.17及更低版本中并不包含autolisp解释程序,这样,只有通过autocad 2.18及更高版本才可以使用autolisp语言。autocad软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,autocad中没有在图形文本对象内绘制矩形及作全局改变的命令。通过autolisp,你可以使用autolisp程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用autolisp编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。现在,已经有数以百计的第三方软件开发人员使用autolisp语言编制各种应用程序软件包,例如,象smlayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要autolisp程序员为应用软件及客户菜单的开发提供顾问。任何编程语言都提供数学函数。在autolisp中,同样提供了编程以及数学计算所需的大部分数学函数,可以使用autolisp对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用autolisp还可以进行许多其他计算。由于我们学习过c语言所以autolisp语言对我们学习起来难度不大,autolisp语言具有计算机语言的一般性所以不难理解。机械制图中,常常得做许多大量的重复工作。下面这几个用lisp编写得程序,是我画图时经常使用的,节省了我的不少时间,希望也能帮助广大使用autocad的工程师们。 1.自动求和 机械制图中材料表的填写是毕不可少的,填写完后还需根据材料表求出总重量。一般一幅图中常有几十个物体,将这些重量一项一项相加个繁琐的过程,而且容易出错。使用下面这个程序,只需用鼠标选定需要相加的数,其和就会自动的显示在命令行中。 因为在autocad中没有“数”这种实体,所有的数都以实体“text”存在,所以程序中使用了“atof”函数,将以字符串形式表示的数转换为实数。 (defun c:total( / cmdmode sset ssl nsset temp ssl1 total) (if *error* quit) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) (prompt nselect numbers to add: ) (setq sset (ssget) (if (null sset) (princ nerror: nothing selected!n) ;过滤出选中的“text”实体,并报告有多少“text”实体被选中。 (progn (setq ssl (sslength sset) (setq nsset (ssadd) (while ( ssl 0) (setq temp (ssname sset (setq ssl(1- ssl) (if (= (cdr (assoc 0 (entget temp) text) (ssadd temp nsset) ) ) (setq ssl (sslength nsset) (print ssl) (princ text entities are found.) ;选出所有可转化为数的“text”,并求和。 (setq total 0) (setq ssl1 ssl) (while ( ssl 0) (setq temp (ssname nsset (setq ssl (1- ssl) (setq number (atof(cdr(assoc 1 (entget temp) (if (= 0 number) (setq ssl1 (1- ssl1) (setq total (+ total number) ) ) ;显示和及加数的个数,便于用户检查是否多选或漏选。 (princ nthe total is ) (princ total) (princ of the ) (princ ssl1) (princ numbersn) ) ) (setvar cmdecho cmdmode) ) (princ ntc:total loaded. start command with total.) 2.自动生成递增数 用cad作图时,常需画一些距离一定、数值递增的数。如填写材料表时,“序号”一栏就需填写由下至上的递增数。通常,我们先用“text”命令写一个数,再用“array”命令将其按一定方向阵列,最后用“edit”命令一个一个的改正。下面这个程序可将你从这单调重复的动作中解放出来。 (defun c:arn( / ent temp d a number yorn) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) ;选择一个实体,并判断能否作为生成递增数的初始数。 (setq ent (entsel nselect number to arn: ) (if (null ent) (progn (princ nerror: nothing selected!n) (exit) ) ) (setq temp (entget (car ent) (if (= (cdr (assoc 0 temp) text) ;输入生成递增数的个数、数间距及其方向。 (progn (setq number(getint number of texts:) (setq d(getdist dist between texts:) (setq a (atoi(cdr(assoc 1 temp) (initget 1 v h) (setq yorn (getkword direction(v/h)?) (if (= yorn v) (setq p (list 0 d) ) (if (= yorn h) (setq p (list d 0) ) ;重复拷贝前一个数,并将拷贝数加1。 (while (/= number 1) (command copy ent p ) (setq ent (entlast) (setq temp (entget ent) (setq a (+ a 1) (entmod (subst (cons 1 (itoa a) (assoc 1 temp) temp) (setq number (1- number) ) ) ) (setvar cmdecho cmdmode) ) (princ ntc:arn loaded. start command with arn.) 3.修改编号 作图时,常常需要对图中的物体进行编号,有时会在已编好号的物体中插入几个物体,那么在这之后的编号都需作相应的增加。对于比较多的编号,一个个的寻找再修改就很麻烦,下面这个程序可以自动完成对编号的寻找及修改过程。 为了能够清楚的看清要改变的数字及及其所处的位置,用变量“h”记录数字的高度,变量“viewctr”及“viewsize”记录了使用命令前的视窗中心及其大小。 (defun c:chn( / cmdmode viewctr viewsize sset i j k ssl nsset temp ent number x1 y1 x y h yorn) (defun *error*(s) (exit) ) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) (setq viewctr (getvar viewctr) (setq viewsize (getvar viewsize) (prompt nselect numbers to add: ) (setq sset (ssget) (if (null sset) (progn (princ nerror: nothing selected!n) (exit) ) ) ;根据用户指定范围过滤出需要改变的编号,并报告找到多少编号。 (setq i(getintnthe number from which to change:) (setq j(getintnthe number to which to add:) (setq k(getintnhow much you want to add:) (setq ssl (sslength sset) (setq nsset (ssadd) (while ( ssl 0) (setq temp (ssname sset (setq ssl(1- ssl) (if (= (cdr (assoc 0 (entget temp) text) (progn (setq number (atoi(cdr(assoc 1 (entget temp) (if(and (= j number) (ssadd temp nsset) ) ) ) (setq ssl (sslength nsset) (if (= ssl 0) (progn princ(nno numbers selected!) (exit) (print ssl) (princ numbers are found.) ;使被改变编号以一定大小处于屏幕中心位置并被高亮度显示, ;改变每个编号前先询问用户,以免改变了不想改变的编号。 (setq x1 (car viewctr) (setq y1 (cadr viewctr) (setq ent (entget (ssname nsset (- ssl 1) (setq h (cdr(assoc 40 ent) (while ( ssl 0) (setq ent(entget (ssname nsset (setq ssl (1- ssl) (setq x (cadr(assoc 10 ent) (setq y (caddr(assoc 10 ent) (if (or ( (abs (- x x1) (* h 10) ( (abs (- y y1) (* h 6) (progn (command zoom c (list x y ) (* h 20) ) (setq x1 x) (setq y1 y) ) ) (redraw (cdr(assoc -1 ent) 3) (initget 1 yes no) (setq number (atoi(cdr(assoc 1 ent) (princ nthe number ) (princ number) (setq yorn (getkword to be changed?(y/n) (if (= yorn yes) (entmod (subst (cons 1 (itoa(+ number k) (assoc 1 ent) ent) ) (redraw (cdr(assoc -1 ent) 1) ) ;所有编号改变完成后,恢复使用本命令前的视窗。 (command zoom c viewctr viewsize) (setvar cmdecho cmdmode) ) (princ ntc:chnumber loaded. start command with chn.) 4.自动画管线图的小程序 画一些管路原理图时,常常有许多管路在图中相交,而这些管路实际并不相连。我们常把在相交点处次要的管路断开,在用一半圆连接两断点,下面的程序可以帮助大家完成做这一繁琐的工作。 程序中使用“break”命令截断需要被断开的管线,再用“arc”命令画一半圆连接两断点。变量p读取管线交点;p1、p2为点p的左右或上下两点;p3为连接p1、p2半圆的中点。由于使用“break”命令时若autocad环境处于对象捕捉方式(osmode0),则“break”命令截断的p1、p2两点可能为变为p1、p2附近的捕捉点。所以程序开始时用变量myosmode记录系统变量osmode,而后设置osmode为0,程序结束后再设置还原osmode。变量horn判断用户需要断开的是水平线还是垂直线。 (defun c:brel(/myosmode horv p p1 p2 p3) (setq myosmode (getvar osmode) (setvar osmode 0) (setq p (getpoint nselect point to break:) (initget 1 h v) (setq horv (getkword directionh/v?) (if (= horv h) (progn (setq p1 (list (- (car p) 1.5) (cadr p) (setq p2 (list (+ (car p) 1.5) (cadr p) (setq p3 (list (car p) (+ (cadr p) 1.5) ) (progn (setq p1 (list (car p) (- (cadr p) 1.5) (setq p2 (list (car p) (+ (cadr p) 1.5) (setq p3 (list (+ (car p) 1.5) (cadr p) ) ) (command break p1 p2) (command arc p1 p3 p2) (setvar osmode myosmode) (princ) ) (princ nstart command with brel which will break a line and join it with an arc.) autocad 2000 中的visual lisp开发工具开发三维圆柱螺旋线程序,给出了开发程序代码和运行结果,以及三维弹簧、螺纹绘制实例。在用autocad 2000绘制三维工程图时,经常遇到绘制螺纹、弹簧这类三维圆柱螺旋线的问题。在autocad中,绘制三维线的命令有很多,如line、3dpoly、spline等命令,而可以作为三维拉伸路径的线只有3dpoly命令绘出的线可以胜任,而且不能使用其中的拟合项。因此,为了保证绘制的三维圆柱螺旋线尺寸精确,就必须输入大量精确数据,才能一点一点地画出所需的螺旋线,这样做起来非常麻烦。有关资料介绍采用圆弧近似构成螺旋线1,但是这样画出的螺纹不能通过装配干涉检查。由于在autocad中不方便绘制螺旋线,为了解决这个问题,笔者采用编制一个lisp程序来实现。该程序可以实现圆柱螺旋线自动绘图,不仅可以用于绘制弹簧螺旋线和螺纹的螺纹线。还可以进行参数化绘图。3、 圆柱螺旋线的绘制3.1 圆柱螺旋线数学模型* 圆柱螺旋线的形成圆柱螺旋线是技术上应用最广的空间曲线,其形成如图1所示。一动点m沿圆柱的母线ab作等速直线运动,而该母线又绕圆柱的轴线作等角速旋转时,点m的运动轨迹即为圆柱螺旋线。* 数学模型 当圆柱螺旋线的轴线与坐标系的z轴重合时,圆柱螺旋线上动点m(x,y,z)的参数方程如下:x=rcos y=rsinz=t1*/(2)在参数方程中:r为圆柱面的半径,为螺旋线升角,t1为导程(即母线ab旋转一周时,动点m沿轴线方向上升的距离),右旋取正号,左旋取负号。开始 参数r、t1、k赋值 给出基点坐标计算x, y, z各点坐标绘制螺旋线结束打开autocad2000进入visual lisp开发环境,新建一个文件,在visual lisp文本编辑器窗口进行程序代码编制。 绘制圆柱螺旋线的autolisp程序代码如下:; this program is using for drawing a helix(setqb1(getpoint请输入基点:)(setqr(getreal半径 r=:)(setqt1(getreal节距 t1=:)(setqk(getint段数 k=:)(setqn(getint圈数 n=:)(setqta(/(*23.14159)k)(setqj1(/t1k)(setqa0)(setqjj0)(setqii0)(commanducsob1)(command3dpoly(listr00)(repeatn(repeatk(setqjj(+jj1)(setqa(+taa)(setqx(*r(cosa)(setqy(*r(sina)(setqz(*j1jj)(setqp2(listxyz)(commandp2)(setqii(+ii1)(setqz(*t1ii)(command )段数k 最好为36或36的倍数(72)。绘弹簧时,n为弹簧的总圈数;绘螺纹时,若螺纹的长度为l,则n=l / t1。将这个lisp程序保存为“helix.lsp。在编写lisp程序时,应注意输入一定要正确,括号和空格都必不可少,否则会影响到螺旋线的轨迹。自动生成明细表巧门在利用计算机进行机械绘图的领域里,autocad是国内公认的功能强大的绘图软件。但其在文字、表格处理上却显得很薄弱,尤其是在制作表格上,甚至没有提供此项功能。而人工绘制表格和文字输入不但花费的时间长,而且严重地影响了绘图速度。因此,如何自动而有效地生成明细表便显得很有意义。本文通过实例介绍如何在autocad系统下自动生明细表的方法。 图1 明细表 序号规格名称数量材料备注135.1汽缸透盖1zg35235.2汽缸体135335.3螺塞2a3f4gb6170-86螺母m1012a3f535.4压盖1th200实现方法1. 建立明细表数据文件首先,把明细表的数据信息,用文字编辑器按如下格式写入磁盘文件mxb.txt中,作为明细表数据文件。“1”“35.1”“气缸透盖”“1”“zg35”“”“”“”“2”“35.2”“气缸体”“1”“35”“”“”“”“3”“35.3”“螺塞”“2”“a3f”“”“”“”“4”“gb617086”“螺母m10”“12”“a3f”“”“”“”“5”“35.4”“压盖”“1”“th200”“”“”“”然后用autolisp的readline函数提取有关数据信息,并把该数据信息赋给表格图块属性。注意:各字符串要加双引号,空字符串引号“”不可省略,以便autolisp识别。2.建立明细表格式图块通常,一个明细表是由表头和表体两部分组成。表头是固定的,因此可以用autocad命令生成一个固定的表头,并把它作为一个图块存入磁盘。假设要得到如图1所示的明细表,则先做一个明细表表头。 表头 表头实际上是一个图形文件,本文设定该文件名为mxb.dwg,然后用autocad命令建立一个。 图块 当用户向表中插入该块时,系统会向用户询问属性值,此时用autolisp程序将上面建立的明细表数据文件中的数据分别赋给各个属性。属性的定义是用autocad命令attdef完成的。编制程序首先,用autolisp的i/o函数readline读入数据文件mxb.txt,再用字符串连接函数strcat给文件的每一行加上括号,此时数据类型为字符串(str)。然后,再利用read函数把字符串转换成一个表(list),以方便autolisp对表中的每一项进行各种操作。最后,用autolisp的command函数调用insert命令,先将图块mxb.dwg插入表中,再将mxb1.dwg插入表中,用nth函数将前面autolisp读入的数据中各项信息分别赋给mxb1.dwg中的各个属性。下面给出实现上述功能的程序清单: (defun c:mxb(/scmde p f1 bk a m1 m2 m3 m4 m5 m6 m7 m8 p1)(setq scmde (getvar “cmdecho)(setvar “cmdecho 0)(setq p (getpoint “n please input a point:)(setq f1 (getstring “n please input file name:)(setq f (open f1 “r)(print “n please wait .)(setq bk “mxb)(command “insert bk p 1 1 0)(setq bk “mxb1)(setq p1 (list (car p) ( (cadr p) 8)(while (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论