用AutoLISP程序提高绘图效率的几个实例
- 格式:pdf
- 大小:84.83 KB
- 文档页数:3
AutoLISP实用编程四例-------------------------------------------------- 江苏崔华明AutoCAD是一个功能强大的通用图形设计软件,其内嵌的AutoLISP语言为用户进行二次开发提供了方便。
下面就介绍几则用AutoLISP编写的实用程序,这些程序相当于新增的AutoCAD命令,可以弥补AutoCAD本身的一些不足,为日常使用带来方便。
1(快速更改文本的大小在标准的AutoCAD中,要更改已有文本的大小,需要使用Change命令。
该命令的缺陷是:即使只更改文本的大小,也要重新确认文本的插入点、字型、倾斜角等一系列参数。
也就是说,除输入文本的新高度值外,还需要按5次回车键才能完成一个文本的更改~而且每次只能修改一个文本。
这对于同时更改多个文本的大小非常不便。
本文的AutoLISP程序使这一工作变得十分方便和快捷。
使用方法如下:在AutoCAD的Command提示下,打入命令:cthAutoCAD将提示“Selectobjects:”,这时可以使用AutoCAD允许的任意方式选择目标。
对于有多个文本需要更改的情况,使用窗口选择比较方便,而且你不用担心选择窗口中包含了非文本目标,程序能够自动在选择的目标中查找出文本实体,并只对文本进行更改。
选择目标后,AutoCAD提示“Newtextheight:”,这时输入一个新的文本高度值然后回车,则所有选中的文本被更改成新设定的高度。
2(延伸直线的长度在实际使用中,常常要将一条直线延伸指定的长度。
通常的做法是:在需要延伸的直线的端点画一个辅助圆,圆的半径等于直线要延伸的长度,然后使用Extend命令将直线延伸到与圆相交,最后删除辅助圆。
本文的AutoLISP程序将使你非常容易地实现这一点。
你只需选择要延伸的直线并输入要延伸的长度即可,其余的工作由程序自动完成。
使用方法如下:在AutoCAD的Command提示下,打入命令:stl然后根据提示选择要延伸的直线(选择点要靠近直线需要延伸的端点),并输入延伸的长度。
基于Auto LISP的参数化绘图技术与实例分析摘要:AutoCAD 是一款通用的绘图软件,Auto LISP是嵌入AutoCAD的二次开发工具,参数化绘图是其典型的应用。
文章探讨了参数化绘图设计原理及步骤,并以轴承参数化绘图为例,介绍了Auto LISP的参数化绘图技术。
关键词:参数化;AutoCAD;Auto LISPAutoCAD是由Autodesk公司发行的一款应用于多领域的设计辅助和图形处理软件。
在机械行业得到了广泛应用。
AutoCAD虽然功能强大,但在专业应用上还是有不足之处,如何让通用的CAD系统更适合行业需要,必须对其要进行二次开发。
AutoCAD在30多年时间里相继推出了Auto LISP、ADS、Visual LISP、VBA、Object ARX、几种不同层次的二次开发工具。
“其中Auto LISP是唯一的一种以解释方式运行于AutoCAD内部的解释性程序设计语言,Auto LISP把数据和程序统一表达为表结构,所以它既可以把程序当作数据来处理,还可以把数据当作程序来执行”。
其语言规则简单,直接针对AutoCAD,易学易用,AutoCAD的绝大多数命令可直接调用,参数化绘图是其典型的应用之一。
1 参数化绘图设计原理及步骤所谓参数化就是将图形的有关几何关系、约束关系有机地结合起来,从而构成一个完整的参数化模型。
当设计人员改变图形的某一参数时,模型能根据尺寸及几何约束等自动计算出满足约束关系的工程图形。
参数化编程方法的实质,就是将图形信息记录在程序中。
它用一组变量记录图形的几何参数,用一些约束条件或者赋值语句来表达几何参数与结构参数之间的关系,再用一些绘图语句来表述图形的拓扑关系。
参数化方法快捷、高效,参数化绘图程序编写步骤是:①先进行图形结构特征分析,一般绘制一个零件的图样,需要很多尺寸,这就需要我们分析这个零件,确定图形中的关健几何尺寸及图形对象之间的依赖关系。
②从设计角度具体分析,确立不仅能体现零件的结构特征,又可以推导出其它尺寸的基本尺寸作为图形参数,并明确尺寸与图形参数之间的关系。
使用CAD进行程序化绘图的方法与示例CAD(计算机辅助设计)软件是现代工程设计中不可或缺的工具之一。
它可以大幅提高工作效率,提供精确的设计模型和绘图输出。
在CAD中,程序化绘图技术可以进一步提高设计工作的效率和准确性。
本文将介绍使用CAD进行程序化绘图的方法与示例。
在CAD中,我们可以通过编写脚本或使用宏来实现程序化绘图。
常见的CAD软件如AutoCAD、SolidWorks和CATIA等都提供了编程接口和相关的编程语言,如AutoLISP、VBA和C#等。
下面我们将以AutoCAD为例,介绍使用AutoLISP进行程序化绘图的方法与示例。
AutoLISP是AutoCAD的内置编程语言,它与AutoCAD的各种功能紧密结合,可以实现从基本绘图操作到自定义功能的自动化。
以下是使用AutoLISP进行程序化绘图的几个示例:1. 绘制矩形:我们可以使用AutoLISP编写一个简单的程序来绘制矩形。
下面是一个示例程序:```(defun c:draw-rectangle (/ p1 p2)(setq p1 (getpoint "\nEnter the first corner point: "))(setq p2 (getcorner p1 "\nEnter the opposite corner point: "))(command "RECTANG" p1 p2)```在AutoCAD中,我们可以运行该程序的命令`draw-rectangle`,然后按照提示,输入第一个和第二个角点,即可绘制一个矩形。
2. 绘制圆形:类似地,我们可以使用AutoLISP编写一个程序来绘制圆形。
下面是一个示例程序:```(defun c:draw-circle (/ center radius)(setq center (getpoint "\nEnter the center point: "))(setq radius (getdist "\nEnter the radius: "))(command "CIRCLE" center radius))```在AutoCAD中,我们可以运行该程序的命令`draw-circle`,然后按照提示,输入圆心和半径,即可绘制一个圆形。
五个实用的AutoCAD的lisp程序1、计算CAD图形中所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度)(defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(setq ll (+ dd ll))(setq i (1+ i)))(princ "所选线条总长为:")(princ ll)(princ))2、标注CAD图形中所有线段(加载后只需框选所有线段便可得标注这些线段)(defun c:LLL ()(COMMAND "UCS" "")(setvar "cmdecho" 1)(SETVAR "OSMODE" 0)(setq AcadObject (vlax-get-acad-object)AcadDocument (vla-get-ActiveDocument Acadobject)mSpace (vla-get-ModelSpace Acaddocument));;选取需要测量的样条曲线、圆弧、直线、椭圆(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0);;获取系统参数textsize(setq shh (getvar "textsize"))(setq str_hh (strcat "\n文字高度 <" (rtos shh 2) ">: "))(setq hh (getdist str_hh))(while hh(setvar "textsize" hh)(setq hh nil));;输入标注文字高度;;循环开始(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(princ (strcat "\n长度=" (rtos dd 2)));;寻找代表图层的字符串(setq aa (assoc 0 endata));;获取图层名称(setq aa1 (cdr aa));;判断线条种类(cond((= aa1 "SPLINE");;如果是spline(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss))(setq startPnt1 (vla-get-ControlPoints arcObj))(setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(setq pp1 (list x1 y1 z1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))(setq pp2 (list x2 y2 z2))))((= aa1 "LWPOLYLINE");;如果是LWPOLYLINE(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss)) (setq startPnt1 (vla-get-Coordinates arcObj)) (setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(setq pp1 (list x1 y1 z1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))(setq pp2 (list x2 y2 z2))))(t;;如果是其他种类线条(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss)) (setq startPnt1 (vla-get-StartPoint arcObj));;获取起点(setq endPnt1 (vla-get-EndPoint arcObj));;获取终点(setq pp1(vlax-safearray->list (vlax-variant-value startPnt1)))(setqpp2 (vlax-safearray->list (vlax-variant-value endPnt1)) ))))(setq x1 (car pp1))(setq y1 (cadr pp1))(setq z1 (caddr pp1))(setq x2 (car pp2))(setq y2 (cadr pp2))(setq z2 (caddr pp2))(setq x (/ (+ x1 x2) 2))(setq y (/ (+ y1 y2) 2))(setq z (/ (+ z1 z2) 2))(setq pt (list x y z));;取得线段两端的中点(setq ang (angle pp1 pp2));;获取角度(if (> (* (/ ang pi) 180) 180)(setq ang (+ ang pi)))(command "text""j""bc"pt""(* (/ ang pi) 180)(strcat "" (rtos dd 2))"")(setq i (1+ i)))(prin1))(prompt "\n <>在图中直接写出长度") (prin1)3、连续打断程序(defun c:br1 ()(command "break" pause "f" pause "@"))4、将CAD文字导入Excel表格(defun c:Q2()(setq ffn (getfiled "写出文件" "" "xls" 1))(princ "\n选取文字...")(setq ss (ssget))(setq ff (open ffn "w"))(setq i 0)(repeat (sslength ss)(setq ssn (ssname ss i))(setq ssdata (entget ssn))(setq sstyp (cdr (assoc 0 ssdata)))(if (or (= sstyp "TEXT") (= sstyp "MTEXT"))(progn(setq txt (cdr (assoc 1 ssdata)))(princ txt ff)(princ "\n" ff)))(setq i (1+ i)))(close ff)(princ (strcat "\n写出文件: " ffn))(prin1))5、删除带颜色图元以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次。
文章编号:100926825(2007)1220362203AutoL ISP 在测绘图形处理中的应用收稿日期:2006211214作者简介:李朝阳(19742),男,工程师,郑州市水利建筑勘测设计院,河南郑州 450006苏振辉(19822),男,助理工程师,郑州市水利建筑勘测设计院,河南郑州 450006李朝阳 苏振辉摘 要:介绍了AutoL ISP 语言的特点和优点,阐述了AutoL ISP 语言在测绘图形处理中的应用,说明了该语言对于批量处理图形和数据方面的几种典型应用,并分析了相应的思路和方法,从而为测绘事业做出更多的贡献。
关键词:AutoL ISP 语言,应用,测绘图形,图纸资料中图分类号:TP391.3文献标识码:A 近年来,测绘领域内机助制图的研究取得了飞速发展,通过绘图机输出的图形从过去简单的工程制图到现在的各种比例尺的地形图、地藉图、宗地图,以及非常复杂的小比例尺土地利用现状图等。
在众多的绘图系统中,人们普遍采用的基础绘图软件是美国Autodesk 公司的AutoCAD ,因为该软件不仅具有丰富的绘图命令,还具有强大的图形编辑功能,而且软件运行相当稳定。
但是熟悉AutoCAD 的人都知道,要用好AutoCAD ,不但要熟练掌握其各项命令,而且要熟练掌握AutoCAD 提供的数据交换文件SCR ,DXF 和嵌入AutoCAD 内部的高级语言———AutoL ISP 语言,这样使您对各种图形,尤其对复杂的图形更加得心应手。
AutoL ISP 是一种人工智能语言,是嵌入AutoCAD 内部的COMMON L ISP 的一个子集。
在AutoCAD 的二次开发工具中,它是唯一的一种解释型语言,使用AutoL ISP 可直接调用几乎所有的AutoCAD 命令。
AutoL ISP 具有以下优点:1)语言规则十分简单,易学易用;2)直接针对AutoCAD ,易于交互;3)解释执行,立竿见影。
利用Auto LISP提高机械设计CAD绘图效率闵旭光1,熊中侃2(1.南昌高等专科学校机电系,江西南昌 330008;2.南昌高等专科学校计算机系,江西南昌 330008)摘 要:介绍了一种利用Auto LISP语言编程,提高机械设计C AD绘图效率的方法。
关键词:Auto LISP;C AD绘图;机械设计;制图中图分类号:TP391.72 文献标识码:A 文章编号:1008-7354(2005)01-0079-02 在零部件较多(有时达到上百个零件)的机械装置(例如发电机组、级进模、自动装配机等)设计中,一般都要给零部件分层。
比如:部件1、2、3……;零件101、102、103……或201、202、203……;等等。
在装配图设计中相邻零件(图层)颜色也要设置成不同,以便于零件间的区别。
并且在设计中需要经常打开或关闭某些图层,改变线型等等。
虽然利用AutoC AD的CH(Change)等某些命令可以达到这些目的,但在执行过程中,都需要操作两步以上,较繁琐。
为此,我们利用Auto LISP,编制了一个程序,经使用验证,能较好地提高机械设计,特别是零部件较多时的C AD绘图效率,该程序如下:;TF33333turn on previous turn off(defun c:TF()(command″layer″″f″″3″″″));AN33333thaw a layer(defun c:AN(/x)(setvar″cmdecho″0)(setq x(getstring″\n input thaw layer name:″))(command″layer″″thaw″x″″)(setvar″cmdecho″1));AF33333freeze a layer(defun c:AF(/x)(setq x(entsel″\n select freeze layer:″))(com mand″layer″″freeze″(cdr(ass oc8(entget(car x))))″″));T N33333all of layer turn on(defun c:T N()(command″layer″″t″″3″″on″″3″″u″″3″″″)(command″layer″″off″″opaper f″″″)(princ));C N33333change selected layer to a new layer(defun c:C N()(graphscr)(setvar″cmdecho″0)(prom pt″\nEntities to be changed:″)(setq e1(ssget))(setq mylayer(getstring″input new layer name:″))(setq oldla(getvar″clayer″))(command″layer″″make″mylayer″″)(setq e2(cons8mylayer))(setq i0)(repeat(sslength e1)(setq e4(entget(ssname e1i)))(setq e5(ass oc8e4))(setq e4(subst e2e5e4))(entm od e4)(setq i(l+i)))(princ″\nAll selected entities change to layer″)(princ(cdr e2))(princ));C A33333change current layer to match an enti2 ty’s layer3333(defun c:C A(/x)(setq x(entsel″\n select object which layer is to be matched:″))(command″layer″″s″(cdr(ass oc8(entget(car x))))″″)(command″layer″″u″(cdr(ass oc8(entget(car x))))″″));CC33333change layer’s color3333(defun c:CC(/x)(setvar″cmdecho″0)(setq x(entsel″\n select a layer to be changing col2 or:″))(command″layer″″c″(acad-colordlg7)(cdr(ass oc8 (entget(car x))))″″)(setvar″cmdecho″1));LC33333change properties to be center line33 33南昌高专学报 2005年第1期(总第56期) 2005年2月出版Journal o f Nanchang Junior College No.1(Sum56)Feb.200579 收稿日期:2004-08-28(defun c:LC()(ssget)(command″chprop″″p″″″″c″6″lt″″center″″″)(princ));LP33333change properties to be divide line33 33(defun c:LP()(ssget)(command″chprop″″p″″″″c″2″lt″″phantom″″″));LD33333change properties to be dashed line33 33(defun c:LD()(ssget)(command″chprop″″p″″″″c″4″lt″″dashed″″″));LG33333change properties to be color=3(defun c:LG()(ssget)(command″chprop″″p″″″″c″3″″));LR33333change properties to be color=1(defun c:LR()(ssget)(command″chprop″″p″″″″c″1″″));LY33333change properties to be color=2(defun c:LY()(ssget)(command″chprop″″p″″″″c″2″″));LB33333change properties to be color=5(defun c:LB()(ssget)(command″chprop″″p″″″″c″5″″));LC O33333change properties to be bylayer&line2 type=continue3333(defun c:LC O()(ssget)(command″chprop″″p″″″″c″″bylayer″″lt″″bylayer″″″))以上程序先写在记事本文档中,取个名如:min.lsp,再存到AutoC AD2002或AutoC AD2004的目录S UPPORT 下,并打开acadr2002.lsp或acad2004.lsp,在该程序最后增加:(load″min.lsp″)(princ)存盘后,退出,重新启动计算机即可使用该Auto LISP 程序了。
单元一:AutoLISP主角潇洒登场一. AutoLISP 是何方神圣?1.AutoLISP是AutoCAD的最佳拍檔!2.AutoLISP内含于AutoCAD软件内,不用另外花钱买!3.AutoLISP是强化AutoCAD最好、最直接的『程序语言』!4.AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能!5.若说AutoLISP的出现,是替AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张!6.AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷!二. AutoLISP 程序语言的特质分析:学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序!三.撰写AutoLISP 的动机?1.欲强化AutoCAD 原有指令时.2.欲创造更有用的AutoCAD 新指令.3.欲简化繁琐的环境设定或绘图步骤时.4.欲处理参数式绘图时.5.欲做图面资料读文件、写文件.6.欲做AutoCAD 简报展示时.7.欲达到真正灵活掌控AutoCAD 时.8.欲提升自己跨上AutoCAD 高手列车时.四.AutoLISP 的效益评估?1. 对公司负责人或设计主管而言:A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沈思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』!B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?!C. 千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关AutoCAD 支持软件。
2007.12
科技广场
254
工程中经常要绘制各种弹簧和螺纹连接件,在AutoCAD中没有专门绘制弹簧和螺纹的命令,弹簧和螺纹在AutoCAD中都可用平面图形通过相应螺旋线拉伸而成,所以绘制螺旋线就是解决问题的关键。
如果用常规的3dpoly命令绘制三维螺旋线,需要输入大量精确数据,才能一点一点地画出螺旋线,做法非常麻烦。
现在提供AutoLISP程序,即可解决绘制螺旋线的问题。
然后通过相应平面图形的拉伸,就可以完成弹簧、螺纹等零件的绘制。
根据圆台螺旋线的形成原理(一动点M绕圆台的母线AB作等速直线运动,而该母线AB又绕圆台的轴线O1O2作等角速旋转时,点M的运动轨迹即为圆台的螺旋线,如图二所示。
圆柱螺旋线是圆台螺旋线的特例,故可通过圆台螺旋线程序做相应的变动,即可得到),动点M(x,y,z)的参数方程如下:
图二园台螺旋线
X=[r0+hg *α/(2π)]*cosα
Y=[r0+hg *α/(2π)] *sinα
Z=±vg *α/(2π)
其中,r0为圆台下面的半径,α为螺旋线角,vg为导程(单线螺旋线螺距(弹簧的节距)等于导程),hg为点M沿水平半径方向上增加的距离(hg=|(r1-r0)m|求得,m为螺旋线的圈数)。
下面提供圆台螺旋线的AutoLISP程序清单:
(defun c:luoxc(/)
(setq b1 (getpoint" 指定基点:"))
(setq r1 (getreal "指定初始半径:"))
(setq disp (getreal "指定节距:"))
(setq angtg (getreal "输入锥形角:"))
(setq m (getint"输入圈数:"))
(setq n (getint"输入每圈细化段数<36>:"))
(cond ((null n )(setq n 36)))
(setq delta (/ (* 2.0 pi ) n))
(setq j (/ disp n))
(setq bb (caddr b1))
(setq tg (*(/ angtg 180) pi))
(setq ang 0)
(setq k 0)
(command "ucs" "o" b1)
(command "3dpoly" (list r1 0 0))
(repeat (* m n)
(setq k(+ k 1))
(setq ang(+ delta ang))
(setq r (- r1 (* (+ 0(* j k))(/ (sin tg )(costg)))))
(setq pt2 (list (* r(cos ang))(* r(sin ang))(+ 0(* j k))))
(command pt2)
)
(command "")
)
根据圆台螺旋线的形成原理,如果圆锥角为0度时,即可形成圆柱螺旋线。
圆柱螺旋线程序清单如下:
(defun c:luoxc(/)
(setq b1 (getpoint" 指定基点:"))
(setq r (getreal "指定初始半径:"))
(setq vg (getreal "指定节距:"))
(setq m (getint"输入圈数:"))
(setq n (getint"输入每圈细化段数<36>:"))
(cond ((null n )(setq n 36)))
(setq delta (/ (* 2.0 pi ) n))
(setq j (/ disp n))
(setq bb (caddr b1))
(setq ang 0)
(setq k 0)
(command "ucs" "o" b1)
(command "3dpoly" (list r 0 0))
255
2007.12
科技广场
256。