第2讲 利用AutoLisp语言绘图
基于AutoLISP的AutoCAD参数化绘图
![基于AutoLISP的AutoCAD参数化绘图](https://img.taocdn.com/s3/m/056aa9db7f1922791688e871.png)
2) 根据绘图参数 ,设计交流界面 (对话框) 。对于参数化 绘图程序来说 ,对话框主要考虑绘图参数的输入和相关控件 的布局 ,为了增加程序的可读性 ,对话框中还要配有图像按 钮 ,用幻灯片来显示各绘图参数的含义 。
Key words :Auto L ISP ;AutoCAD ;paramet ric drawing ;redevelop ment s
1 引言
AutoCAD 是美国 AutoDesk 公司推出的一种通用的计算 机辅助设计和图形处理软件 ,具有易于掌握 、使用方便 、绘图 精确和体系结构开放等优点 。因此 ,自 1982 年问世以来深受 广大设计人员的青睐 ,是 CAD 族群中使用最普遍的软件之 一 。如今 ,AutoCAD 已广泛应用于机械 、建筑 、电子 、航天 、造 船 、冶金 、纺织 、轻工等领域 ,可见 AutoCAD 是一个通用的 CAD 软件 。但要使一个通用的 CAD 系统适合自己的专业工 作需要 ,达到使用方便的要求 ,就必须进行二次开发 。在 Au2 toCAD 为用户提供的 Auto L ISP 、A RX、VBA 等开发工具中 , Auto L ISP 是一种简便易学的解释性语言 ,具有很强的数据 表格处理功能 ,是开发 AutoCAD 的一种重要手段[1] 。
2 Auto L ISP 语言的特点简介
Auto L ISP 语言是嵌套于 AutoCAD 内部 ,将 L ISP (List Processing Language) 语言和 AutoCAD 有机结合的产物 ,它 是 AutoCAD 开放式体系结构的具体表现 。使用 Auto L ISP 可直接调用几乎全部 AutoCAD 命令 ,Auto L ISP 语言既具有 一般高级语言的基本结构和功能 ,又具有一般高级语言所没 有的强大的图形处理功能 ,是当今世界上 CAD 软件广泛采用 的语言之一[2 ] 。
第2讲利用AutoLisp语言绘图
![第2讲利用AutoLisp语言绘图](https://img.taocdn.com/s3/m/e4243dd559f5f61fb7360b4c2e3f5727a5e924b0.png)
第2讲利⽤AutoLisp语⾔绘图第2讲利⽤AutoLisp语⾔绘图在AuotCAD绘制简单图形时,有三种主要⽅式:(1)图标菜单(2)下拉式菜单(3)命令⾏。
事实上还有另外⼀种绘图⽅式,即通过lisp语⾔实现绘制图形。
利⽤Lisp语⾔绘图的最⼤优点是可以实现批处理,降低劳动强度。
⼩知识:Lisp语⾔最⼤优势是和AutoCAD绘图结合的很好,这也是该语⾔⾄今仍未被淘汰的最主要原因。
1、简单的绘图语句⼏乎AuotCAD中所有的绘图及环境设置命令都可以通过程序调⽤!,利⽤Lisp语⾔编写绘图命令的窍门是⾸先在命令⾏下把绘图命令和对应的参数记住,然后⽤Lisp语⾔的格式书写出即可。
1.1 绘制直线(command "line" "0,0" "1,1" "")1.2 绘制圆(command "circle" "0,0" 5)1.3 绘制正多边形(command "polygon" 5 "0,0" "i" 5)(command "polygon" "5" "0,0" "i" "5")都正确1.4 新建图层(command "la yer" "m" "道路" "c" 2 "" "")请同学⾃⼰编写⾼度为2,起点位置在“0,0”,⽂字内容是“理⼯⼤”的程序2、⽤多条绘图语句表⽰复杂图形正常情况下图形都⽐较复杂,需要⽤多条语句编写,例如测绘中的下⽔井、路灯等符号。
例1、下⽔井的绘制(defun c:xsj()(command "circle" "0,0" 0.5)(command "line" "-0.5,0" "0.5,0" "")(command "line" "0,-0.5" "0,0.5" ""))3、循环控制语句例2、绘制同⼼圆例3、绘制可多次插⼊的下⽔井符号例4、绘制y=sinx 曲线4、课后练习题4.1 编写lisp 程序,绘制路灯图案,参照下⽔井程序,改写成可以多次插⼊的程序。
第二讲 AutoLISP语言基础
![第二讲 AutoLISP语言基础](https://img.taocdn.com/s3/m/3ef5ff8b680203d8ce2f2411.png)
《2.4基本函数》
2.4 AutoLISP基本函数(六类)
(一)数学运算函数(17种)
+、-、*、/、1-、1+、abs、sin、cos、atan、 sqrt、min、max、expt、log、gcd、rem
1) (+ 〈数〉〈数〉… ) 功能 : 求表中所有整数或实数的和。例如 : Command:(+ 1.2 3.1 3.8) 返回:8.1 2)(- 〈数〉〈数〉… ) 功能 :求表中第1个数减去后面所有数的差 ,例如 : Command:(- 8.1 5) 返回:3.1
《2.3程序结构》
在程序中使用内部函数的规则:
1)内部函数必须放在表中第一个元素的位 置,且所有括号都必须左右配对; 2)函数与参数之间至少用一个空格来分开, 多个空格和一个空格作用相同; 3)一个表可分成多行书写,一行也可以书 写多个表; 4)字符不分大小写,分号后的字符为注释。
《2.3程序结构》
《2.3程序结构》
AutoLISP程序结构实例:
;*********************************************** ;** 这个程序计算 a 和 b 平方和的平方根 ** ;** 用法:交互输入两个实型数 a ,b的值 ** ;** 该程序计算并输出结果在屏幕上。 ** ;*********************************************** (defun sqtab (/ a b) ;定义函数 (setq a (getreal “\n a=:”)) ;等待输入a的值 (setq b (getreal “\n b=:”)) ;等待输入b的值 (setq c (sqrt (+ (* a a) (* b b)))) ;计算平方根 (print “c=“) (princ c) (princ) );end
CAD二次开发教程AUTOLISP
![CAD二次开发教程AUTOLISP](https://img.taocdn.com/s3/m/dc3ad4ed31b765ce050814ba.png)
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把 这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下 一行中。
第9行:(Command“line” P1 P2 P3“C”)
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到 P2,P2到P3各画一条直线。“C”(表示“close”选项)把最 后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在 AutoLISP程序中使用时都必须置于双引号内。变量P1、P2.
示例:
(setq Pt1(getpoint))
(setq Pt1(getPoint“选择第一点”))
有上面几个函数就可以开始编程了:
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过 它们绘出如三角形。
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以 生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一 条直线。弄清这三部分就会使编程过程更清晰。
该函数(/=)检查两个元素是否不相等。若不相等,条件为真,
函数返回T。同样,若指定的元素相等,条件为假,函数返回nil。
3.小于
格式(<atom1 atom2…)
该函数(<)检查第一个元素(atoml)是否小于第H个元素
(atomZ)。若为真,函数返回T,否则返回nil。
4.小于等于
格式(<= atom1 atom2...)
(defun ADNUM(/a
b),定义了一个含有两个局部变量a和b的函数ADNUM。局部 变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通 过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有
用LISP语言自定义AutoCAD命令
![用LISP语言自定义AutoCAD命令](https://img.taocdn.com/s3/m/0cd7cd065901020207409c3c.png)
用LISP语言自定义AutoCAD命令AutoLISP语言作为AutoCAD的二次开发工具,虽然在功能、运行速度和保密性等方面比起ARX等工具要逊色一些,但由于它易学易用,交互性好,灵活性强,对于那些经常使用AutoCAD进行绘图的普通用户来说,不失为一种理想的开发工具。
下面就介绍用AutoLISP 语言自定义的几个AutoCAD绘图命令,可以起到简化操作、提高作图效率的作用。
一、键槽尺寸视图的绘制命令“jct”在绘制轴、齿轮或带轮等零件图时,经常需要画轴上键槽处的剖视图或轮毂键槽的端面视图,比较麻烦;由于键槽的尺寸随轴径的变化而变化,所以我们可以用LISP程序来实现自动绘图。
加载下面的程序,在命令行中键入”jct”并回车,通过人机交互的形式输入有关参数,可自动完成轴上键槽的剖视图和轮毂键槽的端面视图的绘制。
代码示例如下所示。
(defun C:jct ()(setq pt0 (getpoint "\n 请输入视图的中心位置点:"))(initget 7)(setq loop T)(while loop(setq d (getreal "\n请输入键槽处的轴径(12<d<130)(mm):"))(if(or (< d 12) (> d 130))(alert "轴径数据输入错误!\n\n请重新输入!")(setq loop nil));if);while(cond;根据轴径检索键槽尺寸((and (> d 12) (<= d 17)) (setq b 5 t1 3.0 t2 2.3));b表示键槽的宽度((and (> d 17) (<= d 22)) (setq b 6 t1 3.5 t2 2.8));t1表示轴上键槽的深度((and (> d 22) (<= d 30)) (setq b 8 t1 4.0 t2 3.3));t2表示轮毂上键槽的高度((and (> d 30) (<= d 38)) (setq b 10 t1 5.0 t2 3.3))((and (> d 38) (<= d 44)) (setq b 12 t1 5.0 t2 3.3))((and (> d 44) (<= d 50)) (setq b 14 t1 5.5 t2 3.8))((and (> d 50) (<= d 58)) (setq b 16 t1 6.0 t2 4.3))((and (> d 58) (<= d 65)) (setq b 18 t1 7.0 t2 4.4))((and (> d 65) (<= d 75)) (setq b 20 t1 7.5 t2 4.9))((and (> d 75) (<= d 85)) (setq b 22 t1 9.0 t2 5.4))((and (> d 85) (<= d 95)) (setq b 25 t1 9.0 t2 5.4))((and (> d 95) (<= d 110)) (setq b 28 t1 10.0 t2 6.4))((and (> d 110) (<= d 130)) (setq b 32 t1 11.0 t2 7.4)))(command "circle" pt0 "d" d)(command "zoom" "a")(setq s1 (ssget "l" ))(setq di (-(* (/ d 2.0) (/ d 2.0)) (* (/ b 2.0) (/ b 2.0)))dx (sqrt di)dy (/ b 2.0)pt1 (list (+ (car pt0) dx) (+ (cadr pt0) dy)))(initget "Zc Lc");Zc表示画轴键槽的剖视图,Lc表示画轮毂键槽的端面视图(setq zrl (getkword "\n 画轴键槽的剖视图还是轮毂键槽的端面视图(Z/L)?"))(if (= zrl "Zc")(progn;计算轴键槽上点的坐标(setq pt2 (list (+ (car pt0) (-(/ d 2.0) t1)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 0 (- dx (- (/ d 2.0) t1)))));progn);if(if (= zrl "Lc")(progn;计算轮毂键槽上点的坐标(setq pt2 (list (+ (car pt0) (+(/ d 2.0) t2)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 (- pi) (- (+ (/ d 2.0) t2) dx))));progn);if(command "pline" pt1 pt2 pt3 pt4 "");画键槽(setq s2 (ssget "l"))(command "layer" "m" 5 "l" "center" 5 "c" 1 5 "")(command "ltscale" 8)(command "line" (polar pt0 (- pi) (+ (/ d 2.0) 10));画中心线(polar pt0 0 (+ (/ d 2.0) 10)) "")(command "line" (polar pt0(-(/ pi 2.0)) (+ (/ d 2.0) 10))(polar pt0 (/ pi 2.0) (+ (/ d 2.0) 10)) "")(command "layer" "s" 0 "")(if (= zrl "Zc")(progn(setq s3 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s3 "");修剪形成键槽(command "hatch" "U" "45" "2" "n" s1 s2 ""));画轴上键槽处剖视图的剖面线);if(if (= zrl "Lc")(progn(setq s4 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s4 "");修剪形成键槽(command "rotate" s1 s2 "" pt0 90));将轮毂键槽的端面视图旋转90度);if);end defun二、螺纹孔剖视图的绘制命令“lwk”在绘制机械零件图时,经常要画螺纹孔的剖视图,同样由于螺纹孔的有关尺寸都随螺纹的公称直径而变化,我们可以用下面的程序自动完成其剖视图的绘制。
使用CAD进行程序化绘图的方法与示例
![使用CAD进行程序化绘图的方法与示例](https://img.taocdn.com/s3/m/a2c84aa3534de518964bcf84b9d528ea81c72f02.png)
使用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`,然后按照提示,输入圆心和半径,即可绘制一个圆形。
用AutoLISP语言编程实现参数化绘图
![用AutoLISP语言编程实现参数化绘图](https://img.taocdn.com/s3/m/ac4e9a0016fc700abb68fc72.png)
文章编号:100926825(2002)0420159202用Auto LISP 语言编程实现参数化绘图收稿日期:2002201222作者简介:康保成(19552),男,1987年毕业于广东教育学院工程图学专业,高级讲师,太原理工大学轻纺工程与美术学院,山西晋中 030600康保成摘 要:简要介绍Auto LISP 语言在Auto C AD 环境下实现参数绘图的应用状况。
对建筑制图中绘制楼梯台阶进行分析,并结合Auto LISP 语言编程特点,编制了Auto LISP 程序,顺利完成楼梯台阶的绘制过程,达到利用参数输入形式,严格、准确、快捷地完成绘图工作目的,还为在Auto C AD 环境下绘制形状相同、尺寸不同的系列图形提供了方便。
关键词:Auto LISP ,Auto C AD ,楼梯台阶中图分类号:T U20114文献标识码:A引言随着时代的进步,计算机辅助设计发展迅猛,全面取代传统的丁字尺加图板的手工绘图方式已成必然。
这种势头给各行各业都带来了冲击,从早年间颁布的红头文件可见一斑。
可以毫不夸张地说,对于作为衡量素质标准的计算机辅助设计,不能等闲视之。
Auto C AD 作为C AD 的工具,是一个功能极强的计算机辅助设计、绘图的通用软件包。
如今Auto C AD 在各部门得到广泛应用。
Auto C AD 实际上已经成为一种微机C AD 系统的标准,工程设计人员之间交流设计思想的公共语言。
Auto C AD 之所以得到如此广泛的应用,除了它功能强大,易学易用外,还在于它是一个开放的、交互式的软件。
用户可以编写Auto LISP 、ADS 或ARX 应用程序,作为新的命令,实现特定用户的特殊需要,或对AutoC AD 做一些二次开发和应用,以使用户更方便、快捷地满足工作要求。
1 问题的提出正如前面所述,Auto C AD 在各个领域都得到了广泛的应用,可见其通用性是很强的;但它在一些领域的某些方面还有不尽人意的地方。
LISP语言在CAD方面的运用
![LISP语言在CAD方面的运用](https://img.taocdn.com/s3/m/728f4768561252d380eb6e6c.png)
(8 . " DLSS" )表 说 明 所 选 则 的 实 体 在 DLSS 层 。 (6 . " X2 " )则 表 示 此 线 条 的 线 型 为 X2 , X2 为 用 户 定 义 的 线 型 。 (90 . 4 )说 明 此 线 有 4 个 端 点 。 (70 . 128 )表 明 此 线 没 有 封 闭 。 如 为 129 则 表 示 多 义 线 首 尾 相 连, 是严格闭合。 (43 . 0 .1 )显 示 此 线 的 宽 度 为 0 .1 米 。 (10 41 .3308 23 .3799 )则 给 出 了 端 点 的 坐 标 值 。依 次 下 去 分 别 为 各端点的坐标。 (- 3 (" SOUTH" (1000 . " 164100 " ))))表 示 此 实 体 的 扩 展 特 性 , 一 般为编程者的意图。 针对所提的第一个问题, 对比下面的等外公路特性。
(SETQ XR1 (RTOS(FIX(* (getvar " tdusrtimer" ) 10000000000)))) 用 getvar 函 数 读 取 内 部 数 字 变 量 tdusrtimer 的 值 , 扩 大 后 用 数 字 计 算 函 数 FIX 取 整 , 用 数 据 类 型 转 换 函 数 RTOS 把 数 字 常 量 转 换 为 字 符 常 量 , 再 赋 予 给 变 量 XR1 。
(0 . " LWPOLYLINE" )表 说 明 所 选 则 的 实 体 为 LWPOLYLINE 线 。 (下 转 63 页 )
- 57 -
科技论坛
中国高新技术企业
立数学模型, 有时即使建立了数学模型, 也难于获得数值解。这时, 模拟法则成为一种有效的工具。模拟法十分灵活, 且不受系统规模 限 制 , 它 可 以 详 细 模 拟 事 故 前 的 备 件 、发 电 和 输 电 停 运 及 运 行 中 的 实 际 问 题 , 但 耗 时 多 而 且 精 度 不 高 , 这 种 方 法 主 要 用 于 发 、输 电 组 合 系统及变电站的可靠性评估中。
利用AutoLISP提高机械设计CAD绘图效率
![利用AutoLISP提高机械设计CAD绘图效率](https://img.taocdn.com/s3/m/9993904fe518964bcf847c71.png)
利用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(二)](https://img.taocdn.com/s3/m/d11841b3c77da26925c5b0ee.png)
一步步学AutoLisp(二)在第一步中我们是在CAD命令行中进行一些练习,这显然无法满足我们正常的使用要求,所以我们一般将程序写成文件,LISP程序文件的扩展名为“.lsp”。
在AutoCAD2004及以后的CAD中有专门的软件编写程序Visual Lisp,也可以用普通的文本编写软件如记事本进行编写,但文件的扩展名一定要是“.lsp”。
为使大家能对lsp文件的使用有更好的理解,本文一律按使用普通文本编辑器编写的方式进行描述。
打开文本编辑器编写一个文件,文件名为“key.lsp”,将文件保存到C盘根目录下。
键入如下一行程序:(defun c:cm() (command "COPY" pause "" "m"))保存后,在CAD命令行键入:(load"c:/key"),即可将key.lsp调入CAD,返回c:cm。
如下图:在命令行键入“cm”可以执行对一个图元进行多次拷贝的命令,在lisp程序中函数及参数不区分大小写,但参数的返回值有大小之分。
先对程序进行解读:defun 定义函数的函数,后面的c:cm是一个函数的名称。
c:cm 自我定义的函数名称,带“c:”的函数是可以作为操作命令的函数,我们姑且将这类函数称为命令函数。
如果没有“c:”,只有“cm”,则得到的返回值是“cm”,在命令行键入“cm”则不会执行前面的多重拷贝操作。
键入“(cm)”就会执行该操作,我们就称之为一般函数。
() 这个空括弧是用来填写参数的,由于我们的这段程序没有用到任何其他参数,所以括弧内是空的。
command 调用CAD原有命令的函数,这是lsp程序中应用非常多的一个函数,许多操作可以直接调用CAD自己的命令,不许再重新编写。
"copy" 调用的CAD命令名称,名称与前面的command之间有没有空格都可以,而且要用命令全名,不能用简化命令,而且要用引号。
实现CAD绘图与LISP编程的自动化技巧
![实现CAD绘图与LISP编程的自动化技巧](https://img.taocdn.com/s3/m/daff7316cec789eb172ded630b1c59eef9c79a6d.png)
实现CAD绘图与LISP编程的自动化技巧CAD(计算机辅助设计)是一种广泛应用于工程和建筑行业的软件工具,而LISP(LISt Processing)则是一种编程语言,经常用于CAD 软件中进行自动化任务和定制。
在CAD绘图中,使用LISP编程可以极大提高工作效率,加快绘图速度并减少出错概率。
下面,我们将介绍一些实现CAD绘图与LISP编程的自动化技巧。
1. 使用LISP编写简单命令LISP语言在CAD软件中被广泛应用,因其简洁、灵活和强大的功能而备受赞誉。
可以利用LISP编写一些简单的命令,以自动完成一些常见的绘图任务。
例如,我们可以编写一段LISP代码,用于创建一个特定大小和形状的矩形或圆形,并将其放置在指定位置。
2. 利用LISP实现参数化绘图参数化绘图是CAD绘图中常见的需求,它可以根据一组参数值自动生成特定形状和尺寸的图形。
利用LISP编程可以方便地实现参数化绘图。
通过定义参数,并使用LISP代码控制参数值,可以在绘图过程中灵活地调整形状和尺寸,提高工作效率。
3. 利用LISP编写循环和逻辑语句LISP编程强大之处在于其循环和逻辑语句的灵活性。
通过编写循环和逻辑语句,可以实现复杂的绘图任务,如图形的重复、数组的生成等。
例如,我们可以使用循环语句自动生成一系列具有相同属性但位置不同的图形。
4. 利用LISP批处理CAD命令CAD软件中的批处理命令可以用于自动执行一系列CAD操作,如创建图层、更改对象属性等。
利用LISP编程可以轻松地实现批处理CAD命令。
通过编写LISP代码,将多个CAD命令组合在一起,可以以一次性的方式自动执行这些命令,从而减少人为干预。
5. 利用LISP创建自定义CAD函数和命令除了使用CAD软件中已有的命令,我们还可以通过LISP编程自定义CAD函数和命令,以满足特定的需求。
通过编写LISP代码,可以根据自己的需要定义函数和命令,从而实现更高级和复杂的CAD绘图操作。
利用AUTOLISP自动绘制等高线的尝试
![利用AUTOLISP自动绘制等高线的尝试](https://img.taocdn.com/s3/m/ca004a47cbaedd3383c4bb4cf7ec4afe04a1b1fd.png)
利用AUTOLISP自动绘制等高线的尝试利用A U T O L ISP自动绘制等高线的尝试吕坚明(金华市测绘院,浙江金华321000)摘要:本文简述了在A U T O CAD中自动绘制等高线的方法,并给出了简易的数据格式和相应A U T O L ISP处理程序。
关键词:等高线数据格式 A U T O L ISP1 序言AUT O CAD是微机上广泛应用的绘图软件,其绘图功能十分强劲,尤其是从R13版后增加了绘制非均匀B样条曲线的命令(SPLINE),这为我们在测绘应用中的曲线绘制提供了有力的手段,在等高线的绘制中使曲线光滑也便于局部点的修理。
由于实际测量中数据量较大,单靠交互方式输入点是不现实的。
幸好AUT O CAD内嵌了编程功能——AUT O LISP语言,利用该功能可自动处理重复性的操作,等高线的自动绘制便是一例。
2 数据文件格式等高线实际上是在相互平行的水平面上的曲线簇,为编程处理方便,假定每条等高线都是封闭曲线,则可建立以下数据文件格式: 等高线条数m第1条等高线的点数n1第1条等高线的高度坐标z1第1点的平面坐标(x11,y11)第2点的平面坐标(x12,y12)......第n1点的平面坐标(x1n1,y1n1)第2条等高线的点数n2第2条等高线的高度坐标z2第1点的平面坐标(x21,y21)第2点的平面坐标(x22,y22)......第n2点的平面坐标(x2n2,y2n2)............第m条等高线的点数nm第m条等高线的高度坐标zm第1点的平面坐标(x m1,ym1)第2点的平面坐标(x m2,ym2)......第nm点的平面坐标(xm nm,ym nm)3 A U T O LISP程序针对上述数据文件,绘制等高线的程序可编制如下:程序文件名:dgx.lsp(defun C:DGX(/f x y z str tem crvnum i pntnum j pnt2d pnt3d) ;打开数据文件(setq f(open"c:/dg x.tx t""r"));读取等高线条数(setq strtem(read-line f))(setq cr vnum(read strtem));循环读取各条曲线的数据并绘制(setq i0)收稿日期:2001-08-0840 城市勘测 2002年(w hile(;读取某条等高线的点数(setq strtem(read-line f))(setq pntnum(read strtem));读取某条等高线的高度坐标(setq strtem(read-line f))(setq z(read strtem));准备绘制某条等高线(command"spline");循环读取坐标点并绘制曲线(setq j0)(w hile(<="">;读取二维点(setq strtem(read-line f))(setq pnt2d(read strtem));与高度值一起构成三维点(setq pnt3d(append pnt2d(list z)));使成曲线上的一点(command pnt3d);为读取下一点作准备(setq j(+1j)));使用曲线以闭合方式结束(command"c""");为绘制下一条曲线作准备(setq i(+1i)));关闭数据文件(close f))4 实例运行1:现有一文件名为dgx.tx t的等高线数据文件内容如下; 450.0(80.089.0)(-98.0106.0)(-107.0-59.0)(116.0-96.0)(138.0-17.0)510.0(71.880.0)(-88.595.6)(-96.4-53.6)(104.7-86.5)(124.5-15.7)520.0(59.966.8)(-73.779.7)(-80.3-44.6)(87.3-72.1)(103.7-13.1)530.0(47.953.4)(-59.063.7)(-64.2-35.7)(69.8-57.7)(83.0-10.5)2:用记事本在C盘的根目录下创建上述dgx.txt 和前述dgx.lsp文件。
AutoLISP语言简介
![AutoLISP语言简介](https://img.taocdn.com/s3/m/eea8138371fe910ef12df8c7.png)
1.2.2 表和点对
表—放在一对相匹配的左右括号中的一个或多个元素的有
序集合。有两种基本类型的表: 1.标准表-用于函数调用,如:(setq x 15) (* 4 6 3) … 2.引用表-用于数据处理,如:‘(3 4 7) „(“cad” 56 y)…
点对-由圆点将左右元素分隔开的表,常用于构造
1.2 AutoLISP的数据类型
整型数(INT) 实型数(REAL) 符号(SYM) 字符串(STR) 表(LIST) 文件描述符(FILE) AutoLISP的内部函数(SUBR) 选择集(PICKSET) 图元名(ENAME) 函数分页表(PAGETB)
1.2.1 原子
整型数 如:0,1,2,-25,68,3678 … 2. 实型数 如: 4.3, -2.36, 47.542, 2.5E-6, 1.8E12 … 3. 字符串 如:“ABC” “234” “BDe56” “这是字符串” … “ ” “\nPress Any Key!” 4. 符号原子 如:x1,a24,ab,B*,r-2,u_1 … 注意: ( ) . „ “ ; 这些符号不能作为符号原子!
例如:(+ 4 8 3 1)
(defun addx5 (x) (+ x 5) );end
返回:16
command:(addx5 8)
4) 5)
返回:13
6)
如果标准表是多层嵌套的,其求值结果总是从最里层的表开始,并依次向 外层求值,最后返回顶层表的结果。 若求值器读入的既不是数字、字符串、文件指针、系统内部函数、符号原 子,也不是一个有效的函数调用的表,则求值器将给出相应的出错提示。 例如:command: (satq a 15) 返回: 错误:空函数。 在任何时候按下Ctrl-C键,都将中断AutoLISP 的求值。
AutoCAD Autolisp语言
![AutoCAD Autolisp语言](https://img.taocdn.com/s3/m/0058921d0b4e767f5acfce24.png)
(getint<提示>) (getreal<提示>) (getstring<提示>) (getpoint<提示>)
(getcorner<点><提示>) (getangle<提示>)
局部变量
如果不想计算结果保留下来,可以申明 局部变量 (defun x3(x/yy) (setq yy (* x x x)) ) 执行之后会出现yy这个全局变量,一直 存在于内存之中。可以用!yy查询
自定义一个绘制圆的函数
(defun c:My-circle()
(setq pt (list 100 100)) ;;; 得到圆心坐标
(setq ans (/ 3 2)) )
建立一个小程序用于计算平方 X2.lsp (defun x2(x)
(* x x) ) X是一个参数
全局变量
如果想要计算结果保留下来,可以将上 面这个程序改一下 (defun x2(x) (setq yy (* x x)) ) 执行之后会出现yy这个全局变量,一直 存在于内存之中。可以用!yy查询
(and<表达式>…) (or<表达式>…) (not<项>)
(itoa <整型数>) (atoi <字符串>)
(atof <字符串>) (fix <数>) (float<数>)
(itoa <整型数>) (atoi <字符串>)
AutoLISP语言编制AutoCAD实用程序
![AutoLISP语言编制AutoCAD实用程序](https://img.taocdn.com/s3/m/8abc4f1d55270722192ef7c1.png)
些 小 程 序 段 串 联 起 来 实 现 界 面 化 与 系 统
p
化
P C
P l
p 3
/
f
中 国科教创新 导刊
C i d c t n In v t n H r l h a E u a i no a i ead n o o
19 6
( e q P8 ( Ol P7 4 1 6) st P a r . )
(o c mma d ” l e n p i ”p ” n 3 h” 0 2 0 2 P1 . .
行 修 改 和扩 充 。 A t CAD 台上 进 行应 言 编 制 基 准 标 注 的 参 数 化 绘 图 的 程 序 。 在 uo 平 通 根据 基准 点给 P 参 数 赋 值 5 过 实例 来 分析 Au o I P 序 语言 的 程序 结 tL S 程
标 注应 用 的要 求 。 用 L SP语 言 可 以 方 便 利 I 地调 用 Au o t CAD的 绘 图命 令 , 使设 计 和 绘 接 访 问 、 改 , 现 对 屏 幕 图 形 的 实 时 修 修 实
( m n ” r e p ) c ma d c c ” 7 3 o il
圆命 令 绘 制 圆弧 半 径 为 3 心 为P7 圆
( e q P3 ( 1 P1 a 3 ) St P0 ar )
最基 本 的数 据类 型是 符 号表 达 式 (y oi S mb l 根 据 基 准 点 给 P 参 数 赋 值 c 3
(e q 4 ( o a P1 ( a i 3 ) st p p lr + p ) ) 参 户编 写 的 函 数 , 实现 命 令 的 扩 展 与 增加 。 下 根据 基 准 点 给P4 数 赋值
autocad-lisp教程
![autocad-lisp教程](https://img.taocdn.com/s3/m/ba30a476ddccda38376baf2f.png)
Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行(List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数(Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.第3节--------------------------------------------------------------------------------数据型态(Data Type)整数(INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数(REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6字符串(STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD"像素名称(ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化(V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号' 双引号" 分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示第4节--------------------------------------------------------------------------------变数(Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(A TAN 弧度参数)e.g. (ATAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)e.g. (SQRT 30) Result : 5.47723(ABS 数值参数)e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数)e.g. (FLOAT 12) Result : 12.0整数转字符串(ITOA 数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(RTOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数)e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP 数值参数)e.g. (ZEROP 0) Result : Te.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下:(DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜线\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nil e.g. (= 2 2.0) Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回nil 值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习(Exercises)COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下= Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "Very high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "Very High") (PRINC DISP)))注意: 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断多重条件(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "Very High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环(Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEAT 重复次数[表达式....] )e.g. (REPEAT 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式....] )若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意: 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为T,令循环不断重复而无法结束;在上例中:---- 若WHILE函数的条件表达式设定为(T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习(Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0。
Autolisp(2)
![Autolisp(2)](https://img.taocdn.com/s3/m/f0ee05e8524de518964b7d3b.png)
;逆时针方向为正
AutoLisp
9
二、设置图层、颜色、线型和线宽
10 11 9
1
12
2 4 8
2d
3 7
0.8d 0 d
2d
0
5 6
0.7d
ld
AutoLisp
10
二、设置图层、颜色、线型和线宽
1 创建一个当前图层 1. 创建 个当前图层
假定图层的名字是“zhongxin”、颜色为红色、线型为center、线宽为 0 2,通过 0.2 通过command函数创建一个当前图层表达式如下: ( (command "layer" y "Make" "zhongxin" g "Color" 1 "zhongxin" g "Ltype" "Center" "zhongxin" "LWeight" 0.2 "zhongxin" "") 因为 Make 、 Color 、 Ltype 、 LWeight 等选项可以简写为 等 简 M 、 C 、 L 、 LW ,所以上式可改为: (command "layer" "M" "zhongxin" "C" 1 "zhongxin" "L" "Center" "zhongxin" "LW" 0.2 "zhongxin" "")
(setvar "lunits" 2) (setvar "luprec" luprec 3) (setvar "aunits" 1) (setvar "auprec" 2) ;长度单位为十进制 ;长度单位3位小数 ;角度单位为十进制的度 ;角度单位为长2位小数 ;X轴正方向为0
应用AutoLISP 实现AutoCAD 参数化绘图
![应用AutoLISP 实现AutoCAD 参数化绘图](https://img.taocdn.com/s3/m/23024c260c22590102029ded.png)
应用AutoLISP 实现AutoCAD 参数化绘图作者:王伯黎,等来源:《中小企业管理与科技·上中下旬刊》 2015年第7期王伯黎张兴蓉宜宾职业技术学院四川宜宾644003摘要:通过对AutoLISP 语言特点的研究,探讨了基于AutoLisp 的AutoCAD 参数化绘图程序设计的基本步骤。
以底板参数化绘图为例,详细阐述了应用DCL 创建人机交流对话框,应用AutoLISP 编写参数化绘图程序的具体过程。
实践证明,AutoLISP 语言功能强大,易学易用,是重要的AutoCAD 二次开发工具。
关键词:AutoLISP;DCL;AutoCAD;参数化绘图1 概述AutoCAD 是美国AutoDesk 公司开发的一个交互式绘图软件,它不仅具有强大的绘图、编辑功能,还具有开放的体系结构,允许用户通过内置的AutoLISP 语言实现二次开发。
在CAD的二次开发中,参数化绘图是其中的一项,它可以让设计者自己通过修改设计参数来制作产品零件的模型图形。
参数化绘图已经从传统的模式中摆脱出来,全面的简化了使用者对零件模型的修改过程,从而提高了效率。
2 AutoLISP 语言特点AutoLISP 是一种内嵌式表处理语言,是CAD 开放式体系结构的一种体现,同时也是LISP (List Processor)语言和CAD 相结合的产物。
AutoLISP 语言不仅拥有普通的高级语言所具备的功能,而且还有普通的高级语言所不具备的强大的处理图形的功能。
它最大的好处在于语法简单易懂,易于掌握,可直接调用几乎全部AutoCAD 命令,因此被广泛应用于AutoCAD 二次开发上。
AutoLISP 语言最典型的应用之一就是实现参数化绘图程序设计。
3 参数化绘图设计方案3.1 绘图对象的选择任何机器或部件都是由若干零件按一定的技术要求装配而成。
零件分为标准件和非标准件两大类。
标准件的结构和尺寸都由标准系列确定,通常由专业厂家生产;而非标准件的结构、形状、大小等需要根据它们在机器或部件中的作用进行设计确定,据此画出每个零件的零件图,以便加工制造。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2讲利用AutoLisp语言绘图
在AuotCAD绘制简单图形时,有三种主要方式:(1)图标菜单(2)下拉式菜单(3)命令行。
事实上还有另外一种绘图方式,即通过lisp语言实现绘制图形。
利用Lisp语言绘图的最大优点是可以实现批处理,降低劳动强度。
小知识:
Lisp语言最大优势是和AutoCAD绘图结合的很好,这也
是该语言至今仍未被淘汰的最主要原因。
1、简单的绘图语句
几乎AuotCAD中所有的绘图及环境设置命令都可以通过程序调用!,利用Lisp语言编写绘图命令的窍门是首先在命令行下把绘图命令和对应的参数记住,然后用Lisp语言的格式书写出即可。
1.1 绘制直线
(command "line" "0,0" "1,1" "")
1.2 绘制圆
(command "circle" "0,0" 5)
1.3 绘制正多边形
(command "polygon" 5 "0,0" "i" 5)
(command "polygon" "5" "0,0" "i" "5")都正确
1.4 新建图层
(command "la yer" "m" "道路" "c" 2 "" "")
请同学自己编写高度为2,起点位置在“0,0”,文字内容是“理工大”的程序2、用多条绘图语句表示复杂图形
正常情况下图形都比较复杂,需要用多条语句编写,例如测绘中的下水井、路灯等符号。
例1、下水井的绘制
(defun c:xsj()
(command "circle" "0,0" 0.5)
(command "line" "-0.5,0" "0.5,0" "")
(command "line" "0,-0.5" "0,0.5" "")
)
3、循环控制语句
例2、绘制同心圆
例3、绘制可多次插入的下水井符号
例4、绘制y=sinx 曲线
4、课后练习题
4.1 编写lisp 程序,绘制路灯图案,参照下水井程序,改写成可以多次插入的程序。
4.2 编写lisp 程序,绘制(1) y =sinx
x (2) y =1
√2πexp(−x 2
2) 的图形,并用matlab 程序编写,比较两种语言的各自特点。
(defun c:tx y() (setq r 1.0) (while (< r 10) (command "circle " "0,0" r) (setq r (+ r 1)) ) ) (defun c:xsj() (setq r 0.5) (setq pt (getpoint "\请确定点位: ")) (while pt (setq x (nth 0 pt) y (nth 1 pt)) (setq x1 (- x 0.5) x2 (+ x 0.5) y1 (- y 0.5) y2 (+ y 0.5) ) (command "circle " pt r) (command "line" (list x1 y) (list x2 y) "") (command "line" (list x y1) (list x y2) "") (setq pt (getpoint "\请确定点位: ")) ) ) (defun c:sinx() (setq x (* pi -2)) (command "pline") (while (< x (* pi 2)) (command (list x (sin x))) (setq x (+ x 0.1)) ) (command "") ) matlab 程序: x=-pi:0.1:pi; plot(x,sin(x)); axis equal
5、过三点的外接圆参考程序。