Auto CAD自动画管线图的LISP程序_1
CAD二次开发lisp教程《第一章》
集成环境下可以便捷, 程序, 在VLISP集成环境下可以便捷,高效地开发 集成环境下可以便捷 高效地开发AutoLISP程序, 程序 可以经过编译得到运行效率更高,代码更加紧凑, 可以经过编译得到运行效率更高 ,ual LISP是新一代 是新一代AutoLISP语言,它对 语言, 是新一代 语言 它对AutoLISP语言进行 语言进行 了 扩 展 , 可 以 通 过 Microsoft ActiveX Automation 接 口 与 AutoCAD对象交互,可以通过反应器函数扩展 对象交互,可以通过反应器函数扩展AutoLISP响应事 对象交互 响应事 件的能力. 件的能力. 如果使用Visual LISP对AutoLISP扩展功能的部份,必须调用 扩展功能的部份, 如果使用 对 扩展功能的部份 vl-load-com 函 数 , 或 者 将 调 用 该 函 数 的 表 达 式 写 在 acad2006doc.lsp 文件内. 文件内.
第1章 章
AutoLISP和Visual LISP 和
1.1 关于 关于LISP
LISP是人工智能领域中广泛采用的一种程序设计语言.主要用于人工智 是人工智能领域中广泛采用的一种程序设计语言. 是人工智能领域中广泛采用的一种程序设计语言 机器人,专家系统,博奕,定理证明等领域. 能,机器人,专家系统,博奕,定理证明等领域. LISP也被称为符号式语言,因为它处理的对象是符号表达式.LISP语言 也被称为符号式语言,因为它处理的对象是符号表达式. 语言 也被称为符号式语言 的程序和数据都是以符号表达式的形式来表示,因此,一个LISP程序可以把 的程序和数据都是以符号表达式的形式来表示,因此,一个 程序可以把 另一个LISP程序作为它的数据来处理. 程序作为它的数据来处理. 另一个 程序作为它的数据来处理 LISP语言语法简单,编写程序便捷,灵活,数据类型丰富.利用 语言语法简单,编写程序便捷,灵活,数据类型丰富.利用LISP语 语言语法简单 语 言可以很容易地定义或调用新的函数.这就是Autodesk公司早在 公司早在1985年的 年的2.1 言可以很容易地定义或调用新的函数.这就是 公司早在 年的 版本就引用了LISP语言的宏操作, 在 1986年的 版本就推出了比较完整的 版本就引用了 语言的宏操作, 年的2.5版本就推出了比较完整的 语言的宏操作 年的 AutoLISP语言的原因. 语言的原因. 语言的原因 LISP在它几十年的发展过程中产生了多种版本,如MacLISP,InterLISP 在它几十年的发展过程中产生了多种版本, 在它几十年的发展过程中产生了多种版本 , ,ZetaLISP,和CommonLISP等.其中 , 等 其中CommonLISP是近几年美国的几所大 是近几年美国的几所大 如麻省理工,斯坦福等)和工业界( 实验室, 公司, 公司 学(如麻省理工,斯坦福等)和工业界(如Bell实验室,DEC公司,HP公司 实验室 公司 等 ) 的人工智能研究人员协同推出的 , 它概括了MacLISP, InterLISP, 它概括了 , , ZetaLISP等版本的特点,因而功能较强且拥有其它版本的一些优点,是目前 等版本的特点, 等版本的特点 因而功能较强且拥有其它版本的一些优点, LISP语言较完整的版本. 语言较完整的版本. 语言较完整的版本
CAD中加载lisp等应用程序的方法
CAD中加载lisp等应用程序的方法
时间:2011-07-26 15:51来源: 作者:懒人之家点击: 504 次
在CAD中加载lisp等应用程序的方法有下列几种方式:一、手动加载 1、依次点击菜单项的工具加载应用程序,打开加载/卸载应用程序对话框;或直接输入appload命令打开;见下图: 2、在打开的对话框中选择相应的lisp等应用程序后点击加载即可。
二、自动加载 1、
在CAD中加载lisp等应用程序的方法有下列几种方式:
一、手动加载
1、依次点击菜单项的“工具”→“加载应用程序”,打开加载/卸载应用程序对话框;或直接输入“appload”命令打
开;见下图:
2、在打开的对话框中选择相应的lisp等应用程序后点击“加载”即可。
二、自动加载
1、在上述手动加载的第1步打开的对话框中点击“内容”按钮;
2、在打开的启动组对话框中点击“添加”,从而将相应lisp等应用程序加入启动列表;
3、在每次打开CAD窗口时即可自动加载启动列表中的程序。
CAD中自动画管线图的LISP程序
(defun c:brel(/myosmode horv p p1 p2 p3)
(setq myosmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq p (getpoint "\nSelect point to break:"))
(initget 1P程序
画一些管路原理图时,当代表不同管路的直线在图中相交时,需将在交点处的某一直线断开,再用一半圆连接两断点,使用下面这个LISP编写的程序,只用键入"brel"的命令,其它的就由电脑去完成了。
程序中使用"break"命令截断需要被断开的管线,再用"arc"命令画一半圆连接两断点。变量p读取管线交点;p1、p2为点p的左右或上下两点;p3为连接p1、p2半圆的中点。由于使用"break"命令时若AUTOCAD环境处于对象捕捉方式(OSMODE≠0),则"break"命令截断的p1、p2两点可能为变为p1、p2附近的捕捉点。所以程序开始时用变量myosmode记录系统变量OSMODE,而后设置OSMODE为0,程序结束后再设置还原OSMODE。变量horn判断用户需要断开的是水平线还是垂直线。
(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)))
用AutoLISP自动绘制综合管线图
4 设 计 原 理
程 序设 计主要 是使 用 LS 言 提供 的函数 : 始 IP语 初
2 3 数据整 理 .
化 定义 函数 sta、 程 序 载 入 函数 la 、 取 文 件 名 e r子 v od 获 函数 gtr g文件 内容读 取 函数 ra ie 函数截 取 esi 、 tn ed—l 、 n
l 概
述
内 自动 成 图 , 包括 管线 、 管线 点符 号 、 线点 号注 记 、 管 管 线 注记 、 管线 流 向等 。
为 了城 市 建设能 够 更 加 迅 速 的开 展 , 正 掌 握 城 真 市 的地下命 脉 是一 项 重 要 的 任务 。建 立 具 有 权威 性 、 现势 性 的焦 作 市地 下 管线 综 合 数 据库 和专 业 数 据 库 , 以便 于为城 市 建设 提供 高 质 量 的地 下 管线 数 据 资 料 , 从而 满足城 市规 划和建 设 的需 要 。地下 管线 普查 采 用
探测 、 管线点 测量 、 管线 成 图 、 外业修 改 、 正式 图生 成 等 工序 。在探 测 中 , 合运 用 了地 球 物理 探 测 、 绘 、 综 测 计
算机 等专业 的先进 技术 。为 了将外 业物 探数 据 和测 量
数据 高 效 率 、 质 量 的 生 成 A tC D 图 形 , 门 用 高 uo A 专 LS IP语 言写 一段 程序来 实 现 这一 过 程 , 而保 证 工 程 从
“
一
3 设 计 思 路
分 析生成 的 :.x 文 件格式 , 程序 对 :.x 里 的 lt : t 用 lt : t
有 关 字段 进 行分 割 提 取 , 进行 整 理 、 并 、 合 分权 属 生 成
CADLISP程序
1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度)(d e f u n c:L L() (s e t v a r"c m d e c h o"1) (setq en (ssge t(list '(0 . "spline,a rc,line,ellipse,LW POLYLIN E")))) (s e t q i0) (s e t q l l0) (r e p e a t(s s l e n g t h e n) (s e t q s s(s s n a m e e n i)) (s e t q e n d a t a(e n t g e t s s))(c o m m a n d"l e n g t h e n"s s"")(s e t q d d(g e t v a r"p e r i m e t e r")) (s e t q l l(+d d l l)) (s e t q i(1+i)))(p r i n c"所选线条总长为:")(p r i n c l l)(p r i n c))2.标注所有线段(加载后只需框选所有线段便可得标注这些线段)(d e f u n c:L L L() (C O M M A N D"U C S""") (s e t v a r"c m d e c h o"1) (S E T V A R"O S M O D E"0) (s e t q A c a d O b j e c t(v l a x-g e t-a c a d-o b j e c t)A c a d D o c u m e n t(v l a-g e t-A c t i v e D o c u m e n t A c a d o b j e c t)m S p a c e(v l a-g e t-M o d e l S p a c e A c a d d o c u m e n t));;选取需要测量的样条曲线、圆弧、直线、椭圆(setq en (ssge t(list '(0 . "spline,a rc,line,ellipse,LW POLYLIN E")))) (s e t q i0) ;;获取系统参数t e x t s i z e (s e t q s h h(g e t v a r"t e x t s i z e")) (s e t q s t r_h h(s t r c a t"\n文字高度<"(r t o s s h h2)">:"))(s e t q h h(g e t d i s t s t r_h h)) (w h i l e h h (s e t v a r"t e x t s i z e"h h) (s e t q h h n i l)) ;;输入标注文字高度;;循环开始(r e p e a t(s s l e n g t h e n) (s e t q s s(s s n a m e e n i)) (s e t q e n d a t a(e n t g e t s s))(c o m m a n d"l e n g t h e n"s s"")(s e t q d d(g e t v a r"p e r i m e t e r")) (p r i n c(s t r c a t"\n长度="(r t o s d d2))) ;;寻找代表图层的字符串(s e t q a a(a s s o c0e n d a t a)) ;;获取图层名称(s e t q a a1(c d r a a));;判断线条种类(c o n d((=a a1"S P L I N E") ;;如果是s p l i n e(p r o g n (s e t q a r c O b j(V L A X-E N A M E->V L A-O B J E C T s s)) (s e t q s t a r t P n t1(v l a-g e t-C o n t r o l P o i n t s a r c O b j))(s e t q p 1 (v l a x-s a f e a r r a y->l i s t(v l a x-v a r i a n t-v a l u e s t a r t P n t1))) (s e t q x1(c a r p1))(s e t q y1(c a d r p1)) (s e t q z1(c a d d r p1)) (s e t q p p1(l i s t x1y1z1)) (r e p e a t(-(/(l e n g t h p1)3)1) ;;循环,寻找最后一个控制点(s e t q x2(c a r p1))(s e t q y2(c a d r p1))(s e t q z2(c a d d r p1))) (s e t q p p2(l i s t x2y2z2)))) ((=a a1"L W P O L Y L I N E") ;;如果是L W P O L Y L I N E(p r o g n (s e t q a r c O b j(V L A X-E N A M E->V L A-O B J E C T s s)) (s e t q s t a r t P n t1(v l a-g e t-C o o r d i n a t e s a r c O b j)) (s e t q p 1 (v l a x-s a f e a r r a y->l i s t(v l a x-v a r i a n t-v a l u e s t a r t P n t1)))(s e t q y1(c a d r p1)) (s e t q z1(c a d d r p1)) (s e t q p p1(l i s t x1y1z1)) (r e p e a t(-(/(l e n g t h p1)3)1) ;;循环,寻找最后一个控制点(s e t q p1(c d d d r p1))(s e t q x2(c a r p1))(s e t q y2(c a d r p1))(s e t q z2(c a d d r p1))) (s e t q p p2(l i s t x2y2z2))))(t ;;如果是其他种类线条(p r o g n (s e t q a r c O b j(V L A X-E N A M E->V L A-O B J E C T s s)) (s e t q s t a r t P n t1(v l a-g e t-S t a r t P o i n t a r c O b j));;获取起点(s e t q e n d P n t1(v l a-g e t-E n d P o i n t a r c O b j));;获取终点(s e t q p p 1 (v l a x-s a f e a r r a y->l i s t(v l a x-v a r i a n t-v a l u e s t a r t P n t1)))(s e t q p p2(v l a x-s a f e a r r a y->l i s t(v l a x-v a r i a n t-v a l u e e n d P n t1)))))) (s e t q x1(c a r p p1))(s e t q y1(c a d r p p1)) (s e t q z1(c a d d r p p1)) (s e t q x2(c a r p p2)) (s e t q y2(c a d r p p2)) (s e t q z2(c a d d r p p2)) (s e t q x(/(+x1x2)2)) (s e t q y(/(+y1y2)2)) (s e t q z(/(+z1z2)2)) (s e t q p t(l i s t x y z)) ;;取得线段两端的中点(s e t q a n g(a n g l e p p1p p2)) ;;获取角度(i f(>(*(/a n g p i)180)180)(s e t q a n g(+a n g p i)))(c o m m a n d"t e x t""j""b c"p t""(*(/a n g p i)180) (s t r c a t""(r t o s d d2))"") (s e t q i(1+i)))(p r i n1))(p r o m p t"\n<>在图中直接写出长度") (p r i n1)3.连续打断程序(d e f u n c:b r1()(c o m m a n d"b r e a k"p a u s e"f"p a u s e"@"))4.将C A D文字导入E x c e l表格(d e f u n c:Q2() (s e t q f f n(g e t f i l e d"写出文件""""x l s"1)) (p r i n c"\n选取文字...") (s e t q s s(s s g e t)) (s e t q f f(o p e n f f n"w")) (s e t q i0) (r e p e a t(s s l e n g t h s s) (s e t q s s n(s s n a m e s s i)) (s e t q s s d a t a(e n t g e t s s n)) (s e t q s s t y p(c d r(a s s o c0s s d a t a))) (i f(o r(=s s t y p"T E X T")(=s s t y p"M T E X T"))(p r o g n (s e t q t x t(c d r(a s s o c1s s d a t a))) (p r i n c t x t f f) (p r i n c"\n"f f)))(s e t q i(1+i)))(c l o s e f f) (p r i n c(s t r c a t"\n写出文件:"f f n)) (p r i n1) )5删除带颜色图元以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次.改颜色的LISP程序(defun c:c1()(ssget)(command "chprop" "p" "" "c" "1" "") (princ))(defun c:c2()(ssget)(command "chprop" "p" "" "c" "2" "") (princ)) (defun c:c3()(ssget)(command "chprop" "p" "" "c" "3" "") (princ)) (defun c:c4()(ssget)(command "chprop" "p" "" "c" "4" "") (princ)) (defun c:c5()(ssget)(command "chprop" "p" "" "c" "5" "") (princ)) (defun c:c6()(ssget)(command "chprop" "p" "" "c" "6" "") (princ)) (defun c:c7()(ssget)(command "chprop" "p" "" "c" "7" "") (princ)) (defun c:c8()(ssget)(command "chprop" "p" "" "c" "8" "") (princ))你用C1 命令就可以将图元改为红色了.其余类似.删除红色图元(defun C:D1 (/ m A M)(setq m:err *error* *error* *merr*)(setvar "cmdecho" 0)(command "UNDO" "G")(prompt "选择图形")(setq A (ssget '((62 . 1)) ))(if (/= A nil)(progn(setq M (sslength A))(command "erase" A "")(princ "\n共删除红色图元<")(princ M)(princ ">个")))(command "UNDO" "E")(princ) )这样,键入D1 命令,就可以删除红色的图元了.。
五个实用的AutoCAD的lisp程序
五个实用的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、删除带颜色图元以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次。
AUTOCAD中的几个LISP程序
AUTOCAD中的几个LISP程序李敬--------------------------------------------------------------------------------机械制图中,常常得做许多大量的重复工作。
下面这几个用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”,并求和。
实现CAD绘图与LISP编程的自动化技巧
实现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绘图操作。
CAD中LISP程序使用方法
CAD中LISP程序使用方法2007-08-06 19:13:32| 分类: 学习园地 |字号订阅1. 对于提供附件下载的,把附件下载就可以了2. 对于提供的源LISP代码,把代码拷贝、粘贴到一个文件,自己起个名或者若程序里面注释推荐了文件名,就用推荐的,然后保存成扩展名是LSP的文件即可了。
LISP程序使用方法:加载LISP1. 可以使用APPLOAD命令,然后去找到要加载的LISP文件,加载即可。
2. 可以自己从文件管理器把LISP文件拖动到ACAD的图形窗口,也可以加载3. 在命令行后用,(load "c:\\temp\\xxx.lsp")也可以加载,路径名请输入实际的路径。
另:对于一个LSP程序,(defun 后面的既是命令或者函数,一般程序应该有提示,若没有,标志符c:后面的单词是可以在ACAD下使用的命令,既可以在COMMAND:后面直接输入,即可执行。
CAD快速切换图层LISP代码(方法2)给楼主发一个图层更改的lisp程序,按对应数字键就可以切换到相应的图层。
很方便。
0————01————OBJ2————6t3————SCETR。
8————BORDER如果这些不是你想要的图层,将lisp用笔记本打开,把里边的OBJ,6t等图层名改为你想要的就可以了。
以后要切换图层时,按相应的数字键即可。
(defun YH_chlayer (YH_layer / YH_S)(if (null (tblsearch "LAYER" YH_layer))(entmake (list'(0 . "LAYER")'(100 . "AcDbSymbolTableRecord")'(100 . "AcDbLayerTableRecord")(cons 2 YH_layer) ;图层名称'(70 . 0) ;图层状态'(62 . 7) ;图层颜色'(6 . "bylayer") ;图层线型 )))(setq YH_S (cadr (ssgetfirst))) (if YH_S(command "CHPROP" YH_S "" "la" YH_layer "c" "bylayer" "")(setvar "clayer" YH_layer))(princ))(defun c:0 ()(YH_chlayer "0"))(defun c:1 ()(YH_chlayer "OBJ"))(defun c:2 ()(YH_chlayer "6t"))(defun c:3 ()(YH_chlayer "SCETR"))(defun c:4 ()(YH_chlayer "HIDD"))(defun c:5 ()(YH_chlayer "DIM"))(defun c:6 ()(YH_chlayer "DASH"))(defun c:7 ()(YH_chlayer "TEXT"))(defun c:8 ()(YH_chlayer "BORDER") ) #Cad到上面一行为址,保存为lsp格式。
AutoLISP在AutoCAD绘制管线规划中的应用
第39卷第4期Vol. 39, N o.4 2021年4月A p r.2021[文章编号]1009-7767 (2021 )04-0124-04D O I:10.19922/j.1009-7767.2021.04.124 AutoLISP在AutoCAD绘制管线规划中的应用吴捷(缜江市规划勘测设计集团有限公司,江苏镇江212001)[摘要]管线规划设计中,若不同类別的管线投影交叉,位于上方的管线可完整显示,但其下方的管线则要断开表示。
由于各类管线交叉众多,设计人员除了要完成管线设计绘制外,尚需花费大量时间进行管线断线,效率低下,采用A u t o C A D内置的A u t o L I S P编程语言进行二次开发,并分別测试了市政道路、居住小区管线规划中的管线断线耗时,结果表明采用AutoLISP 进行管线的自动断线,可大幅提高管线规划的绘图效率。
[关键词]管线规划;A u t o C A D;A u t o L I S P;管线断线;应用[中图分类号]U412.6 [文献标志码]BApplication of AutoLISP in Drawing Pipeline Planning by AutoCADW u j i e(Zhenjiang Planning Survey&Design Group Co.,Ltd.,Zhenjiang212001, China)Abstract:When different categories of pipelines cross in pipeline planning and design,the upper pipeline shall be displayed completely while the lower one shall be disconnected.In addition to drawing the pipeline design,designers have to spend a lot of time breaking the pipeline which is inefficient due to many kinds of pipeline cross with each other.The AutoCAD's built-in AutoLISP programming language is secondary developed to test the time consumption of pipeline disconnection in municipal road and residential district pipeline planning respectively.The results show that automatic pipeline disconnection by AutoLISP can greatly improve the drawing efficiency of pipeline planning. K eyw ords:pipeline planning;AutoCAD;AutoLISP;pipeline disconnection;application城市地下管线规划是城市地下管线建设和管理的依据。
CAD快捷键命令绘制水管
CAD快捷键命令绘制水管近年来,计算机辅助设计(CAD)已成为建筑工程师和设计师非常重要的工具之一。
在CAD软件中,快捷键命令可以帮助用户提高工作效率,减少重复操作,使绘图过程更加高效。
本文将介绍几个CAD快捷键命令,并演示如何使用它们来绘制水管。
1. "L"命令"L"命令在CAD中代表直线命令。
通过输入"L",然后按照提示在绘图区域内指定直线的起点和终点,即可绘制直线。
在绘制水管时,我们可以利用"L"命令绘制水管的路径。
2. "C"命令"C"命令在CAD中代表圆形命令。
通过输入"C",然后按照提示在绘图区域内指定圆心和半径,即可绘制圆形。
在绘制水管时,我们可以利用"C"命令绘制水管的曲线部分。
3. "PL"命令"PL"命令在CAD中代表多段线命令。
通过输入"PL",然后按照提示在绘图区域内逐个指定多段线的顶点,即可绘制多段线。
在绘制水管时,我们可以利用"PL"命令绘制水管的复杂路径。
4. "TR"命令"TR"命令在CAD中代表修剪命令。
通过输入"TR",然后按照提示选择要修剪的对象,再选择修剪的边界,即可修剪对象。
在绘制水管时,我们可以利用"TR"命令修剪多段线,使其符合水管的形状。
5. "E"命令"E"命令在CAD中代表偏移命令。
通过输入"E",然后按照提示选择要偏移的对象,再指定偏移距离和方向,即可创建与原始对象平行的偏移对象。
在绘制水管时,我们可以利用"E"命令创建水管的平行线,以表示其厚度或宽度。
AutoCAD-LISP实用程序
(setvar "plinetype" 0)
(setq pt0 (getpoint "\n 请输入视图的中心位置点:"))
(initget 7)
(setq loop T)
(while loop
(setq d (getreal "\n 请输入键槽处的轴径(12<d<130)(mm):"))
(if (= CTYPE "E") (setq INC INC1) (setq INC INC))
(if (= CTYPE "N") (setq INC INC3) (setq INC INC))
(setq TMS (FIX (+ 0.00001 (/ DIST INC))))
(setvar "OSMODE" 0)
多重复制
(defun C:CM ()
(setq A nil)
(setq OM (getvar "OSMODE"))
(setvar "OSMODE" 33)
(setq PNT1 (getpoint "\n拾取第一点: "))
(setq PNT2 (getpoint "\n拾取第二点: " PNT1))(terpri)
(setq A (ssget))
(setq INCR 0)
(repeat TMS
(setq INCR (+ INCR INC))
(setq NEWPT (polar PNT1 ANG INCR))
AUTOCADLISP操作数据库
AUTOCADLISP操作数据库AutoCAD Lisp操作数据库是指在AutoCAD环境下,使用Lisp语言与数据库进行交互,实现数据的读取、写入、更新等操作。
Lisp是一种程序设计语言,可以与AutoCAD软件进行集成,为用户提供更强大的功能。
在AutoCAD Lisp中,可以使用Open Database Connectivity(ODBC)接口实现与数据库的交互。
ODBC是一种标准的数据库访问接口,可以使Lisp程序与各种类型的数据库进行通信,包括MySQL、SQL Server、Oracle等。
首先,需要在Lisp程序中设置ODBC连接,连接到指定的数据库。
可以使用`setq`命令定义一个连接字符串,其中包括数据库的用户名、密码、主机地址等信息。
然后使用`odbc-connect`函数建立与数据库的连接。
连接数据库后,可以使用一系列的Lisp函数进行数据库操作。
例如,可以使用`odbc-query`函数执行SQL查询语句,并将查询结果保存为Lisp列表。
查询结果可以用于绘制AutoCAD图形,或者用于其他需要的操作。
另外,还可以使用`odbc-exec`函数执行SQL更新语句,实现对数据库进行增删改操作。
更新操作可以用于修改AutoCAD图纸中的对象属性,或者更新数据库中的记录。
除了使用ODBC接口,还可以使用其他库函数实现数据库操作。
例如,可以使用`sql-find`函数查询数据库中的记录,并将结果存储在Lisp变量中。
查询结果可以用于自动创建AutoCAD图形,或者进行其他处理。
此外,还可以使用Lisp的特性,如循环、条件判断等,将数据库操作与AutoCAD绘图功能结合起来。
例如,可以根据数据库中的记录生成不同的图形,或者根据图纸中的对象属性更新数据库中的数据。
总之,AutoCAD Lisp操作数据库是一种强大的功能,可以实现与数据库的无缝集成。
通过Lisp语言的灵活性和AutoCAD的绘图功能,可以实现自动化的数据库操作,提高工作效率。
cad画缓和曲线lisp程序(1)
CAD中画缓和曲线,首先复制本文☆后面的源程序保存至cad安装目录的SUPPORT文件夹,保存类型为.lsp 可以随便复制一个SUPPORT文件夹内的lsp文件,然后替换本文的程序。
打开CAD后,输入appload回车,找到你保存的缓和曲线lsp程序,点击加载,然后就可以画缓和曲线了。
首先,要画出缓和曲线的两条直线,然后输入HH回车,按提示完成缓和曲线。
注:本程序,缓和曲线段拟合长度为,如需更改拟合长度,将程序的第8行(repeat (FIX(/ Ls )及9行(setq l (+ l (/ Ls (FIX(/ Ls )))中的修改即可。
☆;;多义线摹拟缓和曲线。
;;输入起止直线、半径、缓和曲线长或设计车速。
;;命令:HH(defun com_p()(setq l 0)(command "ucs" "o" (list (- 0 x1) 0 0))(command "pline" (list 0 0 0) "w" "0" ""(repeat (FIX(/ Ls )(setq l (+ l (/ Ls (FIX(/ Ls )))x (+ (- l (/ (* l l l l l) 40 C C)) (/ (* l l l l l l l l l) 3456 C C C C))y (* id__ (+ (- (/ (* l l l) 6 C) (/ (* l l l l l l l) 336 C C C)) (/ (* l l l l l l l l l l l) 42240 C C C C C))));setq(command (list x y 0)));repaet);command(setq pt5 (trans (list x y 0) 1 0)));com_p(defun ll_v()(setq V (getreal "\nGive Velocity:")Ls1 (* VLs2 (/ (* V V V) R)Ls (max Ls1 Ls2 (/ R 9))Ls (* (fix (/ Ls 10)));setq(if (> Ls R) (setq Ls R))(ll_d));ll_v(defun ll_d()(setq os (getvar "osmode"))(setvar "osmode" 0)(setq C (* Ls R)q (- (+ (- (/ Ls 2) (/ (* Ls Ls Ls) 240 R R)) (/ (* Ls Ls Ls Ls Ls) 34560 R R R R)) (/ (* Ls Ls Ls Ls Ls Ls Ls) 8386560 R R R R R R)) pt1 (cdr (assoc 10 (entget (car p1))))pt2 (cdr (assoc 11 (entget (car p1))))pt10(polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2))pt3 (cdr (assoc 10 (entget (car p2))))pt4 (cdr (assoc 11 (entget (car p2))))pt20(polar pt3 (angle pt3 pt4) (/ (distance pt3 pt4) 2))p (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))jd (inters pt1 pt2 pt3 pt4 nil)alf1(angle pt10 jd)alf2(angle pt20 jd)alf (- (angle jd pt20) alf1));setq(if (or (> alf pi) (and (< alf 0) (> alf (- 0 pi))))(progn(setq id__ -1)(if (> alf pi) (setq alf (- (+ pi pi) alf)) (setq alf (abs alf))));progn(progn(setq id__ 1)(if (<= alf (- 0 pi)) (setq alf (+ pi pi alf))));progn);if(setq x0 (/ (* (+ p R) (sin(/ alf )) (cos(/ alf ))x1 (+ x0 q)Cl (+ (* alf R) Ls)E (- (/ (+ R p) (cos(/ alf 2))) R));setq(command "ucs" "o" jd)(command "ucs" "z" (/ (* 180 alf1) pi))(com_p) (setq pt6 pt5)(setq ppt1 (list x1 0 0))(command "ucs" "")(command "ucs" "o" jd)(command "ucs" "z" (/ (* 180 alf2) pi))(setq id__ (- 0 id__)) (com_p)(setq ppt2 (list x1 0 0))(command "ucs" "")(if (> (abs(distance jd pt1)) (abs(distance jd pt2)))(setq ptt1 pt1)(setq ptt1 pt2));if(setq ptt2 (polar jd alf1 (- 0 x1)))(thh p1 ptt1 10)(thh p1 ptt2 11)(if (> (abs(distance jd pt3)) (abs(distance jd pt4)))(setq ptt3 pt3)(setq ptt3 pt4));if(setq ptt4 (polar jd alf2 (- 0 x1)))(thh p2 ptt3 10)(thh p2 ptt4 11)(if (= id__ 1) (command "arc" pt5 "e" pt6 "r" R) (command "arc" pt6 "e" pt5 "r" R))(setq alfd (angf alf))(setvar "osmode" os)(command "cmdecho" "1")(command "text" pause pause "" (strcat "偏角=" alfd))(command "cmdecho" "0")(command "text" "" (strcat "半径=" (rtos R 2 2)))(command "text" "" (strcat "切线长=" (rtos x1 2 2)))(command "text" "" (strcat "曲线长=" (rtos Cl 2 2)))(command "text" "" (strcat "外距=" (rtos E 2 2)))(command "text" "" (strcat "缓曲长=" (rtos Ls 2 2))));ll_d(defun angf (alf)(setq alff (angtos alf 1 4)n 1kk (strlen alff))(repeat kk(setq alfn (substr alff n 1))(if (= alfn "d")(setq nn n));if(setq n (+ n 1)));repeat(strcat (substr alff 1 (- nn 1)) "%%" (substr alff nn)));angf(defun c:hh(/ p1 p2 pt1 pt2 pt3 pt4 pt5 pt6 pt10 pt20 id__ R V Ls E p3r1 x y l x0 x1 C jd alf alf1 alf2 q p Cl Ls1 Ls2)(command "ucs" "")(setq p1 nil p2 nil)(while (= p1 nil) (setq p1 (entsel "\n拾取第一条直线:")))(redraw (car p1) 3)(while (= p2 nil) (setq p2 (entsel "\n拾取第二条直线:")))(redraw (car p2) 3)(initget 1)(setq R (getdist "\n请输入圆曲线半径R: "))(initget 1 "Ls V")(setq p3 (getdist "\n输入缓和曲线长度(Ls)或[设计速度(V)]: ")) (if (= p3 "V") (ll_v) (progn (setq ls p3) (ll_d)))(princ));eline(defun thh(len pt h)(setq en_data (entget (car len))old_data (assoc h en_data)new_data (cons h pt)en (subst new_data old_data en_data));setq(entmod en));thh。
AutoCAD软件自动加载lisp程序
技术交流AutoCAD软件自动加载lisp程序AutoCAD绘图软件的出现,给我们的绘图工作带来了很大的便利,而随着工作的不断细化,对AutoCAD的要求也在不断的增强,有些工作中需要的功能,在AutoCAD软件中并没有提供,在这样的背景下,直接导致了lisp程序的产生。
下面笔者根据实际工作中的应用,总结了两种AutoCAD2004自动加载lisp程序的方法,与广大AutoCAD用户分享、交流。
方法一:工具菜单加载应用程序在命令行输入“appload”或者在“工具”—“加载应用程序”,调出加载应用程序的对话框,在添加里选择所要加载的lisp程序,然后加载即可;如果把lisp程序添加到“启动组”里面,则每次打开AutoCAD2004软件,都能够自动加载此lisp程序,不需要每次都手动添加。
只需要在命令行输入运行的命令即可。
此方法虽然很实用,但是也有一定的缺陷:需要用户记住所要加载lisp程序的命令名称。
例如图幅号查询程序,如上面操作完成以后,需要在命令行输入“tfh”,点击需要查询的点位位置,即可获得当前点位所属的1:500和1:2000所在的北京地方图幅号。
方法二:添加自定义栏以及图标在软件右上方空白区右键选择自定义——工具栏——新建——(修改名称)确定(以下操作均是在不关闭自定义前提下的操作)。
出现如下界面:分别编辑“名称、说明、按钮图像”;此步骤关键部位在“与此按钮关联的宏”,需要输入的文字是(load"d:/实用小程序/TFH.lsp") TFH,(英文输入不区分大小写) 其中引号内显示的程序所在路径,括号外输入一空格,然后输入lisp文件的运行命令。
点击应用并关闭,即可自动创建一个命令按钮,放到合适位置,每次只要点击按钮就可使用。
作者简介:郭振华,男,1983年5月出生,北京新兴华安测绘有限公司工程测量部,注册测绘师。
AutoCAD绘图中实用的AutoLisp程序共4页文档
AutoCAD绘图中实用的AutoLisp程序一、引言计算机辅助设计(CAD)[1]是指利用计算机及图形设备辅助设计人员完成设计工作。
作为设计人员,不仅需要对非标件自动化设备整体布局与规化,还要在规定的时间内完成总装图和零件图的输出。
因此,整个项目对时间进度的管控显得尤为重要。
基于这样的背景下,依托公司现有的一些资源,结合实际工作的需求,开发AutoCAD的二次开发命令尤其重要。
这样不仅可以有效减轻设计人员工作负荷,而且可以大大提高工作效率。
由简单快捷的AutoCAD二次开发命令就可以取代原来人工大量重复性的工作,使AutoCAD的二次开发必要性凸显出来。
图1 拆分组立图流程图二、AutoLisp语言AutoLISP[2]是专门为二次开发AutoCAD而设计的编程语言,它继承了LISP语言的特点,并内置在AutoCAD软体中,是LISP语言和AutoCAD 有机结合的产物。
使用AutoLISP语言可以完成各种工程分析与计算、绘制复杂的图形,还可以新增的AutoCAD快捷命令、驱动对话框和命令菜单。
同时能够使AutoCAD具有一定智能化、参数化的功能,还可以有助于设计人员将精力和时间用于产品的创新设计上,实现计算机辅助设计的目的。
三、AutoCAD二次命令开发在非标件自动化设备设计中,当完成设计总图后需要将每个零件图拆分出来,这就是重复性高,步骤繁琐,价值低的工作对于非标件自动化设备,我们通常是先完成组立图。
一般来说,组立图包含众多图层,每个图层上有一个零件的三视图。
下面我们的工作是将每一个零件提取、拆分出来。
这样可以逐一将零件图提取出来,但是这工作耗时耗力。
我们希望改进、完善程序,最终达到一键完成自动拆分目标。
下面我们通过流程图分析作业步骤,如图1所示。
Fig 1 Split Assembly Flowchart Of FIG.经流程图的规划后,我们有了明确的思路,并过程并复杂。
所需要注意的是同一图层中的实体集合,在复制移动后,还需要将它们从集合中逐一删除。
autocad lisp教程
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。
用LISP语言自定义AutoCAD命令
用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中加载lisp等应用程序的方法
CAD中加载lisp等应用程序的方法
时间:2011-07-26 15:51来源: 作者:懒人之家点击: 504 次
在CAD中加载lisp等应用程序的方法有下列几种方式:一、手动加载 1、依次点击菜单项的工具加载应用程序,打开加载/卸载应用程序对话框;或直接输入appload命令打开;见下图: 2、在打开的对话框中选择相应的lisp等应用程序后点击加载即可。
二、自动加载 1、
在CAD中加载lisp等应用程序的方法有下列几种方式:
一、手动加载
1、依次点击菜单项的“工具”→“加载应用程序”,打开加载/卸载应用程序对话框;或直接输入“appload”命令打
开;见下图:
2、在打开的对话框中选择相应的lisp等应用程序后点击“加载”即可。
二、自动加载
1、在上述手动加载的第1步打开的对话框中点击“内容”按钮;
2、在打开的启动组对话框中点击“添加”,从而将相应lisp等应用程序加入启动列表;
3、在每次打开CAD窗口时即可自动加载启动列表中的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Auto CAD自动画管线图的LISP程序- CAD基础教程
来源:不详作者:佚名更新时间:2010-6-5 点击: document.write('2');
在画管路原理图时,当代表不同管路的直线在图中相交时,需将在交点处的某一直线断开,再用一半圆连接两断点,使用下面这个LISP编写的程序,只用键入"brel"的命令,其它的就由电脑去完成了。
程序中使用"break"命令截断需要被断开的管线,再用"arc"命令画一半圆连接两断点。
变量p读取管线交点;p1、p2为点p的左右或上下两点;p3为连接p1、p2半圆的中点。
由于使用"break"命令时若AUTOCAD环境处于对象捕捉方式(OSMODE≠0),则"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 " Direction[H/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.")。