lisp编程实例

lisp编程实例
lisp编程实例

lisp编程实例

Visual LISP 编程应用实例集

一、计算类程序

1.计算阶剩值n! (注意:采用了递归方式)

(defun jsen (n)

(if (= n 0) 1 (* n (jsen (1- n)))));

3) 2.迭代计算(x,x,1,0

(defun ddai (x)

(setq x1 0 x2 x e 1.0e-5 i 0)

(while (> (abs (- x2 x1)) e) (setq x1 x2) (setq x2 (expt (+ x1 1) (/ 1 3.0))) (setq i (1+ i)));while

(print "x=") (princ x2) (print "i=") (princ i)

(princ));end

23.一元二次方程求解() ax,bx,c,0

(defun px2 (a b c)

(setq d (- (expt b 2.0) (* 4 a c)))

(cond ((< d 0) (prompt "\nNo root!"))

((= d 0) (progn (setq x (/ b (* -2.0 a))) (prompt "\nOne root! x=") (princ x)))

((> d 0) (progn (setq x1 (/ (- (sqrt d) b) (* 2.0 a)) x2 (/ (+ (sqrt d) b) (* -2.0 a)))

(prompt "\nTwo root! x1=") (princ x1) (prompt " x2=") (princ

x2))));cond (princ));end

4.成绩分析统计

注意:使用该程序前须将全班成绩输入一个数据文件中保存,格式为(78 89

67 ….)

(defun sjfx (fname)

(setq f (open fname "r")) (setq lb nil) (while (setq sd (read-line f)) (setq lb (append lb (read sd))))

(close f) (setq xsum 0) (foreach x lb (setq xsum (+ x xsum))) (setq

n (length lb) xb 0) (setq xbar (/ xsum (* 1.0 n))) (foreach x lb (setq

xb (+ xb (* (- x xbar) (- x xbar))))) (setq xbzc (sqrt (/ xb (* 1.0 n)))) (repeat 18 (terpri))

(prompt "************ 统计结果 ******************") (terpri)

(prompt (strcat " 全班总平均分数 X=" (rtos xbar 2 3))) (terpri)

(prompt (strcat " 标准差δ=" (rtos xbzc 2 3))) (terpri)

(prompt (strcat " Total number: N=" (rtos n 2 0))) (terpri) (prompt "****************************************") (terpri) (princ));end

二、数据检索类

1.根据计算模数检索标准模数值(假定mc为1~10之间的任意值,以实参代入)

(defun jsm (mc)

(setq ml '(1 1.25 1.5 2 2.5 3 4 5 6 8 10)) (setq m 0 n 0)

(while (< m mc) (setq m (nth n ml) n (1+ n)));while

(prompt (strcat "\nm=" (rtos m 2 1)))

(princ));end

2.检索一类数据文件(一类数据文件必须存在,且数据格式必须统一)

(defun js1 (fname kd / ft nt j x)

1

(setq f (open fname "r")) (setq ft (read (read-line f)) nt (read (read-line f)))

(while (/= kd (car nt)) (setq nt (read (read-line f)))) ;while (setq j -1) (repeat (length nt) (setq j (1+ j) x (nth j ft)) (set x (nth j nt)));reapeat

(close f) nt);end

3.检索二类数据文件(二类数据文件必须存在,且数据格式必须统一)

(defun js2 (fname kd / ft nt j x)

(setq f (open fname "r")) (setq ft (read (read-line f)) nt (read (read-line f)))

(while (or (<= kd (car nt)) (> kd (cadr nt))) (setq nt (read (read-line f))));while

(setq j -1) (repeat (length nt) (setq j (1+ j) x (nth j ft)) (set x (nth j nt)));repeat

(close f) nt);end

三、参数化绘图类

1.绘制正弦曲线函数y=sinx (注意:计算数据存放在表变量lpt中)

(Defun C:Dsin(/ x n z s dx cm bl x0 y0)

(SetQ x 0

P (GetPoint "\n基点:") x0 (Car p) y0 (Cadr p)

n (GetInt "\n精度(全线上直线片段数):")

z (GetReal "\n周期数:")

s (GetReal "\n波高系数:")

dx (/ (* z 2 Pi) n)

)

(SetQ cm (GetVar "cmdecho") bl (GetVar "blipmode")

os (GetVar "osmode")

)

(SetVar "cmdecho" 0) (SetVar "blipmode" 0) (SetVar "osmode" 0)

(Command "pline" p)

(Repeat n

(SetQ x (+ x dx))

(Command (List (+ x0 x) (+ y0 (* s (Sin x)))))

)

(Command "")

(SetVar "cmdecho" cm)

(setvar "blipmode" bl)

(setvar "osmode" os)

(PrinC)

)

2.装有键的轴或孔的图形绘制(注:平键数据存于二类数据文件jc.dat中)

(defun jcz (d flag / x1 x2 x cp pt1 pt2 pt3 pt4 t1)

(if (not js2) (load "d:/cad_1/js2")) (js2 "d:/cad_1/jc.dat" d) (initget 6) (setq cp (getpoint "\nCenter point:")) (command "ucs" "o" cp) (setq x1 (expt (* 0.5 d) 2.0) x2 (expt (* 0.5 b) 2.0)) (setq x (sqrt (- x1 x2)))

(if (= flag 1) (setq t1 tz) (setq t1 (* -1 tk)))

(setq pt1 (list x (* 0.5 b)) pt2 (list (- (* 0.5 d) t1) (* 0.5 b)) pt3 (polar pt2 (* 1.5 pi) b) pt4 (polar pt1 (* 1.5 pi) b))

2

(command "pline" pt1 "a" "ce" "0,0" pt4 "l" pt3 pt2 pt1 "")

(if (= flag 1) (command "hatch" "u" 45 4 "" "l" "")) (command "layer" "s" "center" "" "" "") (command "line" (polar '(0 0) pi (+ 3 (* 0.5 d))) (polar '(0 0) 0 (+ 3 (* 0.5 d))) "") (command "line" (polar '(0 0) (* 0.5 pi) (+ 3 (* 0.5 d))) (polar '(0 0) (* 1.5 pi) (+ 3 (* 0.5 d))) "")

(command "layer" "s" 0 "" "" "") (princ));end

3.绘制阴阳图形

(defun yinyang (r)

(setq bp (getpoint "\nEnter center point:")) (command "color" 2) (command "circle" bp r)

(command "pline" (polar bp (* 0.5 pi) r) "a" bp (polar bp (* 1.5 pi) r) "")

(command "bhatch" "p" "s" (polar bp (* 0.5 pi) (* 0.5 r)) "") (command "color" 1)

(command "bhatch" "p" "s" (polar bp (* 1.5 pi) (* 0.5 r)) "")

);end

4.绘制一个五角星图案

(defun star_5 (r)

(command "color" 1) (setq cp (getpoint "\nCenter point:"))

(setq pt1 (polar cp (* 0.017453 18) r) pt2 (polar cp (* 0.017453 54) r) p2 (polar cp (* 0.5 pi) r)) (setq p1 (inters cp pt2 pt1 (polar pt1 pi r)) p3 (polar cp (* 0.017453 126) (distance cp p1))) (command "pline" cp

p1 p2 p3 cp p2 "") (setq s (ssadd (entlast)))

(command "bhatch" "p" "s" (polar cp (* 0.017453 70) (* 0.2 r)) "") (setq s (ssadd (entlast) s)) (command "color" 2) (command "bhatch" "p" "s" (polar cp (* 0.017453 95) (* 0.2 r)) "") (setq s (ssadd (entlast) s)) (command "array" s "" "p" cp 5 "" "")

(princ));end

5.绘制图框(n=0,1~5)

(defun tk (n)

(setq lpt '(1189 841 594 420 297 210 148))

(setq l (nth n lpt) b (nth (+ n 1) lpt))

(if (< n 3) (setq c 10) (setq c 5))

(command "rectangle" '(0 0) (list l b))

(command "rectangle" (list 25 c) (list (- l c) (- b c)))

);end

6.绘制参数曲线x=sin2a, y=sin5a [0~2pi](注意:采用了递归方式)

(defun draw_xy ()

(setq bp (getpoint "\nEnter base point:"))

(command "ucs" "o" bp)

(command "pline" (draw_xy_aux 0)));main

;--------------------------------------------------

(defun draw_xy_aux (a)

(cond ((> a (* 2 pi)) (command "0,0" "" "ucs" "w"))

(t (command (list (sin (* 2.0 a)) (sin (* 5.0 a))))

(draw_xy_aux (+ a 0.05))));cond

);end

3

7.绘制参数曲线x=sin5a.cosa, y=sin5a.sin4a(注意:采用了数据文件读、写

方式) (defun qx_xy ()

(setq f (open "qx.dat" "w")) (setq a 0) (while (< a (* 2 pi)) (setq

x (* (sin (* 5 a)) (cos a)) y (* (sin (* 5 a)) (sin (* 4 a)))) (princ x f) (princ "," f) (princ y f) (princ "\n" f) (setq a (+ a

0.05)));while

(princ "0,0" f) (close f)

(draw_qx) (princ));main

;------------------------------------------------- (defun draw_qx () (setq bp (getpoint "\nEnter base point:")) (command "ucs" "o" bp "pline")

(setq f (open "qx.dat" "r"))

(while (setq pt (read-line f)) (command pt)) (close f)

(command "" "ucs" "w")

(princ)

);end

8.绘制由方程y=cos(0.9x)产生的图形(注:计算数据存放于表变量lpt中) (defun c:spr (/ cp lpt x)

(setq cp (getpoint "\nCenter point:")) (setq x 0 lpt nil)

(repeat (fix (1+ (/ (* 20 pi) 0.2))) (setq lpt (append lpt (list (polar cp x (cos (* 0.9 x))))))

(setq x (+ x 0.2)));repeat

(setq lpt (append lpt (list (polar cp (* 20 pi) 1) "")))

(command "pline")

(foreach pt lpt (command pt))

(princ)

);end

四、对话框编程实例

1(定制对话框

zdbx:dialog{label="带圆正多边形";

:row{:boxed_column{

:edit_box{label="边数";key="number";value=6;}

:edit_box{label="半径";key="rad";value=20;}}

:boxed_column{

4

:radio_button{label="内接圆";key="nq";}

:radio_button{label="外切圆";key="wq";value=1;}}

}

ok_cancel;}

2(程序驱动

(defun dbx ()

(setq id (load_dialog "e:/jscad/zdbx")) (if (< id 0) (exit))

(if (not (new_dialog "zdbx" id)) (exit))

(action_tile "number" "(set_tile $key $value)")

(action_tile "rad" "(set_tile $key $value)")

(action_tile "nq" "(setq fg 1)")

(action_tile "wq" "(setq fg 0)")

(action_tile "accept" "(qsj) (done_dialog)")

(action_tile "cancel" "(setq what -1) (done_dialog)") (start_dialog) (unload_dialog id)

(if (> what 0) (draw_zdbx n r flag)) );end

;----------------------------

(defun draw_zdbx (n r flag)

(setq bp (getpoint "\nBase point:"))

(command "circle" bp r)

(command "polygon" n bp flag r)

)

;---------------------------

(defun qsj ()

(setq n (atoi (get_tile "number")))

(setq r (atof (get_tile "rad")))

(if (= fg 1) (setq flag "i") (setq flag "c")) (setq what 1)

);end

五(局部菜单设计编程实例

//***MENUGROUP=用户菜单

***POP1

[用户菜单]

[--]

[->平键联接]

[圆头平键]^c^c(if (not aj) (load "d:/cad_1/aj")) (aj) [半圆头

键]^c^c(if (not bj) (load "d:/cad_1/bj")) (bj) [方型平键]^c^c(if (not cj) (load "d:/cad_1/cj")) (cj) [键槽轴面]^c^c(if (not jcz) (load

"d:/cad_1/jcz")) (jcz 1) [<-键槽孔面]^c^c(if (not jcz) (load

"d:/cad_1/jcz")) (jcz 0)

5

[~--]

[->图纸幅面]

[A0幅面]^c^crectangle 0,0 1189,841 rectangle 25,10 1179,831 [A1幅

面]^c^crectangle 0,0 841,594 rectangle 25,10 831,584 [A2幅

面]^c^crectangle 0,0 594,420 rectangle 25,10 584,410 [A3幅

面]^c^crectangle 0,0 420,297 rectangle 25,10 410,287 [A4幅

面]^c^crectangle 0,0 297,210 rectangle 25,5 287,205 [<-A5幅

面]^c^crectangle 0,0 210,147 rectangle 25,5 200,142 [~--] [标题栏]^C^C(command "insert" "d:/cad_1/btl" pause "" "" pause) [粗

糙度]^C^C(command "insert" "d:/cad_1/czd1" pause "" "" pause) [基准符

号]^c^c(command "insert" "d:/cad_1/jzfh" pause "" "" pause) [清屏

幕]^c^c(if (not cls) (load "d:/cad_1/cls")) cls; [--]

[圆多边形]^C^C(if (not dbx) (load "e:/jscad/zdbx")) (dbx) [--] ----------------------------------------------------------------------------------------------------------------

(说明:该程序仅用于《CAD软件二次开发》课程学习参考和上机训练,不得随意传抄)

梯形

, (defun dytx (sd xd gd)

, (setq bp (getpoint "\nEnter base point:"))

, (command "ucs" "o" bp)

, (setq p1 (list (* 0.5 (- xd sd)) gd)

, p2 (polar p1 0 sd)

, p3 (list xd 0))

, (command "pline" "0,0" p1 p2 p3 "c")

, (command "ucs" "w"));end

W

五角星

(defun wjx (r)

(setq cp (getpoint "\n指定中心点:"))

(setq p1 (polar cp (* 0.5 pi) r)

p2 (polar cp (* 0.017453 162) r)

p3 (polar cp (* 0.017453 234) r)

p4 (polar cp (* 0.017453 306) r)

p5 (polar cp (* 0.017453 18) r))

(setq p12 (inters p1 p3 p2 p5)

p23 (inters p1 p3 p2 p4)

p34 (inters p2 p4 p3 p5)

p45 (inters p1 p4 p3 p5)

p15 (inters p1 p4 p2 p5))

6

(command "pline" p1 p12 p2 p23 p3 p34 p4 p45 p5 p15 "c")

(command "circle" cp r)

)

鼓形

(defun c:gx ()

(setq c (getpoint "input a point:")) (command "ucs" "o" c)

(setq h (getreal "input h"))

(setq r (getreal "input r"))

(setq p1 (list (sqrt (- (* r r) (* h h)) )h)) (setq p2 (list (- 0 (sqrt (- (* r r) (* h h)) ))h))

(setq p3 (list (- 0 (sqrt (- (* r r) (* h h)) ))(- 0 h)))

(setq p4 (list (sqrt (- (* r r) (* h h)) )(- 0 h)))

(command "arc" p4 "en" p1 "r" r)

(command "arc" p2 "en" p3 "r" r)

(command "line" p1 p2"")

(command "line" p4 p3"")

)例子

编程如下:

4F (defun bolt (F b) d,1,[,] (setq d1min (sqrt (/ (* 4 f) (* pi b))))

(princ “\n松螺栓最小直径d1=”) (princ d1min) (princ)

);end

Command:(bolt 5800 180)

返回:松螺栓最小直径d1=6.4052

, 复选框:(Toggle/CheckBox)

, 单选按钮(Radio_Button)

, 选择按钮(Button)

, 编辑框(Edit_Box)

, 列表框(List_Box)

, 下拉式列表框(Popup_List)

, 滑块(Slider)

, 图像(Image)或图像按钮(image_button)

, 说明文字(Text)

:retirement_button{

7

label = "设计计算";

key = "accept";

is_default = true;

}

, dxan:dialog{

, label="确定图纸幅面";

, :boxed_radio_row{label="幅面规格";

, :radio_button{label="A0"; key="a0"; }

, :radio_button{label="A1"; key="a1"; }

, :radio_button{label="A2"; key="a2"; }

, :radio_button{label="A3"; key="a3"; }

, :radio_button{label="A4"; key="a4"; }

, :radio_button{label="A5"; key="a5"; value=1;} , }

, ok_cancel;

, }

zcl:dialog{label="渐开线直齿圆柱齿轮设计";

:row{

:list_box{label = "模数(mm)";key="m_number";

list="1.25\n1.5\n2\n2.5\n3\n4\n5\n6\n8\n10\n12

\n16\n20\n25\n32\n40\n50"; value=2;height=5;

}

:spacer{width=2;}

:boxed_column{

:edit_box{label=" 齿数&z";key="z_number";}

8

:edit_box{label="变位系数

x";key="x_number";value=0;} :edit_box{label="顶高系数

ha*";key="ha*";value=1.0;} :edit_box{label="顶隙系数

c*";key="c*";value=0.25;}

}

}

ok_cancel;}

9

绘制操场

本文列举一个简单的AutoLISP程序,每行附解释,让大家看看AutoLISP程序的样子。程序定义了一个命令:mslot,用多段线绘制如图所示的封闭图形,用户需要输入参数:a、b点坐标和宽度d。运行方法,讲代码复制到一文本文件中,另存为lsp格式的纯文本文件,在AutoCAD中加载该文件,然后输入命令mslot。

;| MSLOT, short for Milled SLOT

Copyright ? 1998 Ronald W. Leigh

Requests width and two center points.

Draws a polyline with two straight and two arc segments.

Variables:

a/b Centers

a1/a2 Endpoints of arc around a

b1/b2 Endpoints of arc around b

ang Angle of slot centerline

obm Old blipmode setting, 0 or 1

r Radius of arcs

w Width of slot |;

;以上为注释

(defun c:mslot (/ a a1 a2 ang b b1 b2 obm r w) ;line 1开始定义命令mslot (setq obm (getvar "blipmode")) ;line 2保存系统变量(控制点标记)设置 (initget 7) ;line 3,设置输入格式,后面的getreal只能且必须输入实数(setq w (getreal "\nWidth of slot: ")) ;line 4从命令行提示用户输入宽度参数,保存到变量w

(setq r (/ w 2)) ;line 5

(setvar "blipmode" 1) ;line 6设置系统变量,打开点标记 (initget

1) ;line 7设置输入格式

(setq a (getpoint "\nLocate first center: ")) ;line 8提示用户输入点a(命令行输入或屏幕选取)

(initget 1) ;line 9 设置输入格式

10

(setq b (getpoint a "\nLocate second center: ")) ;line 10提示用户输入点b (setvar "blipmode" 0) ;line 11设置系统变量,关闭点标记 (setq ang (angle a b)) ;line 12以下至line16计算点坐标

(setq a1 (polar a (- ang (/ pi 2)) r)) ;line 13

(setq a2 (polar a (+ ang (/ pi 2)) r)) ;line 14

(setq b1 (polar b (- ang (/ pi 2)) r)) ;line 15

(setq b2 (polar b (+ ang (/ pi 2)) r)) ;line 16

(setvar "cmdecho" 0) ;line 17设置系统变量,关闭回显 (command

".pline" a1 b1 "A" b2 "L" a2 "A" "CL") ;line 18绘制

(setvar "cmdecho" 1) ;line 19设置系统变量,打开回显 (setvar "blipmode" obm) ;line 20回复系统变量设置

有这行,mslot命令结束时会在命令行显示0,自定义的命令都(princ) ;line 21没

应以此函数结束

) ;line 22结束行,括号和第1行的第一个括号匹配。

该程序可分为五个部分:

注释部分:为程序作注释是个良好的习惯,程序第一部分为注释,内容为程序目的、变量说明等,单行注释以“;”开始,多行注释以“;|”开始,“|;”结束。函数头(行1):程序行1为函数头,定义函数的名称及局部变量保存系统设置(行2):程序行2保存系统变量设置,为后面恢复设置用输入参数(行3-11) 计算(行12-16)

绘图(行17-19)

恢复系统设置(行20-22)

11

AutoLISP-程序创建过程

AutoCAD开发VisualLISP程序 本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。 首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD2002中加载并运行该程序,将会在命令行出现-“Hello,VisualLISP!”。 VisualLISP与AutoCAD的通信 用户可以直接在AutoCAD命令行中键入AutoLISP表达式。AutoCAD通过括号来确认AutoLISP表达式。AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。 注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。 此外,在AutoCAD中调用并执行AutoLISP程序。在AutoLISP程序中采用COMMAND函数来与AutoCAD命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。 实例:最简单的LISP程序——“Hello.lsp” Step1创建新文件 (1)运行AutoCAD2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入VisualLISP环境。

(2)单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。Step2输入代码并保存文件 (1)在编辑窗口中输入源文件“Hello.lsp”的代码。程序清单如下:;;;* Hello.lsp – Visual LISP文件实例 (prompt "Pick point:") ;指定运行时的提示信息 (setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt” (setq hgt 15) ;给变量“hgt”赋值 (Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!"); 调用“Commnad”函数与AutoCAD进行通信 (2)单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。 Step3运行LISP程序 (1)确认编辑窗口处于前台状态,选择菜单【Tools(工具)】→【LoadTextinEditor(加载编辑器中的文字)】,则该程序被加载并运行。系统将返回AutoCAD窗口,并提示用户选择一点,并以指定点为基点来绘制文字。结果如图36-4所示。 (2)如果用户退出VisualLISP环境并返回AutoCAD系统窗口,则需要对该程序进行加载后,才能运行。选择菜单【Tools(工具)】→【LoadAppcation…(加载应用程序)】,弹出“Load/UnloadApplications(加载/卸载应用程序)”对话框,如图

超经典CAD lisp程序集锦、CAD快捷键大全

超经典CAD lisp程序集锦 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp --- 将文本文件内容写入图中,字符是单个的 wf.lsp --- 将图中字符写入磁盘 exstr.lsp --- 将字符串分解成单字 pgtxt.lsp --- 将字符合成字符串 pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为左下角) chst.lsp --- 直接修改文字字体 txt.shx --- 修改后的标准txt.shx文件。(kuozhan.sld为增强的内容幻灯片) tiao.lsp --- 配合修改过的标准字体文件,将中文字符调大 tiao1.lsp --- 配合修改过的标准字体文件,将英文字符调小 untiao.lsp --- 上两个程序的复原 sht.lsp --- 在图中查找字符串 zhuang.lsp --- 桩点及钎探号绘制(勘测图) dim.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:1) dimm.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:100)

di1.lsp~di8.lsp --- 直接连续标注尺寸(用于1:1的图) di100.lsp~di800.lsp --- 直接连续标注尺寸(用于1:100的图) 详细内容及附件下载请浏览北纬服务论坛 https://www.360docs.net/doc/7c1135359.html,/thread-2724-1-1.html

CAD lisp 实用小程序(源代码)

CAD lisp实用小程序(源代码) 一、圆自动同心 (defun c:TX(/qi aa ec center v_c) (vl-load-com) (princ"圆自动同心:") (setq aa(ssget));;获取圆的图元名 (setq center(getpoint"选取点位置:")); (setq center(vlax-3D-point center)); (setq qi0);初始序号 (repeat(sslength aa);对象个数 (setq ec(ssname aa qi));选择第一个图元 (setq v_c(vlax-ename->vla-object ec));将圆的图元名转换为VLA对象 (vla-put-center v_c center);更新圆中心点 (setq qi(+qi1)) );repeat (princ"修改成功:") );defun 二、图层快速修改 (princ"快速修改图层编程-TC") (defun C:TC(/) (vl-load-com) (setq SET_ZJTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择基准图层:"))))) (WHILE(NOT SET_ZJTC)(setq SET_ZJTC(vla-get-Layer(vlax-ename->vla-object(car(entsel "\n基准图层为空,重新选择!:")))))) (setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择修改图层:"))))) (WHILE(NOT SET_XGTC)(setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car (entsel"\n修改图层为空,重新选择!:")))))) (vlax-for VLA_MSP(vla-get-ModelSpace(vla-get-ActiveDocument(vlax-get-Acad-Object))) (IF(=(vla-get-Layer VLA_MSP)SET_XGTC)(vla-put-Layer VLA_MSP SET_ZJTC))) (princ"\n快速修改图层编程-TC:") (princ) );DEFUN 三、字高自动修改 (princ"快速修改字高编程-ZG") (defun C:ZG(/) (vl-load-com) (setq SET_ZTGD(vla-get-Height(vlax-ename->vla-object(car(entsel"\n选择基准字高:"))))) (WHILE(NOT SET_ZJTC)(setq SET_ZJTC(vla-get-Height(vlax-ename->vla-object(car (entsel"\n基准字高为空,重新选择!:")))))) (setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择修改图层:"))))) (WHILE(NOT SET_XGTC)(setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car (entsel"\n修改图层为空,重新选择!:"))))))

CADLISP程序

1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度) (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.标注所有线段(加载后只需框选所有线段便可得标注这些线段) (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)

坐标提取lisp程序

坐标提取lisp程序 2010-05-17 20:50:07| 分类:工程| 标签:|字号大中小订阅 ;该程序主要用于CAD点(point)三维坐标提取,并将数据输出为CASS软件中使用的数据格式;输出格式:点号,,测量Y值,测量X值,测量Z值例:1,,100.3244,1232,433,25 ;2010-05-17 ;命令:plzbsc (defun c:plzbsc() (princ "\n选择所需输出的点(point):") (setq ss (ssget ));;选取坐标点 (setq n (sslength ss ));计算坐标点数量 (setq ff (open (getfiled "文件保存为" "f:/" "dat" 1) "w"));保存路径 (setq i 0) (repeat n (setq spt (ssname ss i )) (setq ept (entget spt)) (if (= (cdr (assoc 0 ept)) "POINT") (progn (setq lxyz (cdr (assoc 10 ept))) (setq sx (rtos (nth 1 lxyz)));将坐标值实数转换成字符 (setq sy (rtos (nth 0 lxyz))) (setq sz (rtos (nth 2 lxyz))) (setq i1 (+ i 1));计算点序号 (setq sn (rtos i1 2 0));将序号实数转换成字符 (setq sxyz (strcat sn",," sy "," sx "," sz)) (write-line sxyz ff) ) ) (setq i (+ i 1)) );repeat ) (prompt "* << 命令:plzbsc >> *输出格式(点号,, Y,X,Z)**") (prin1) 地形图上提取碎步点(高程点)坐标并输出到文本 2010-05-18 08:50:38| 分类:工程| 标签:|字号大中小订阅 利用程序提取地形图上碎步点的三维坐标。并输出到记事本中,

LISP函数大全

AutoLisp函数 一、数学运算功能函数 1.l(十数值数值…)返回:累计实数或整数数值 1.2(一数值数值…)返回:差值 1.3(* 数值数值…)返回:所有数值乘积 1.4(/ 数值数值…)返回:第一个数值除以第二个以后数值的商 1.5(l十数值)返回:数值十l l、 6(1—数值)返回:数值一l l.7(abs 数值)返回:数值的绝对值 1.8(atan 数值)返回:反正切值 1.9(cos 角度)返回:角度的余弦值,角度值为弧度 1.10(exp 数值)返回:数值的指数 1.11(expt 底数指数)返回:底数的指数值 1.12(fix 数值)返回:将数值转换为整数值 1.14(gcd 数值1 数值2)返回:两数值的最大公因数 1.15(log 数值)返回:数值的自然对数值 1.16(max 数值数值…)返回:数值中的最大值 1.17(min 数值数值…)返回:数值中的最小值 1.18 pi 常数∏,其值约为3.1415926 1.19(rem 数值 1数值 2)返回:M数值的相除的余数 l.20(sin 角度)返回:角度的正旋值,角度值为弧度 1.21(sqrt 数值)返回:数值的平方根 二、检验与逻辑运算功能函数 2.l(= 表达式1 表达式2)比较表达式1就是否等于式2,适用数值及字符串 2.2 (/= 表达式1 表达式2)比较表达式1就是否大于等于表达式2 2.3(<表达式1 表达式2) 比较表达式1就是否<小于表达式2 2.4(<= 表达式1 表达式2)比较表达式1就是否<一小于等于表达式2 2.5(>表达式1 表达式2) 比较表达式1就是否>大于表达式2 2.6(>= 表达式1 表达式2) 比较表达式1就是否大于等于表达式2 2.7 (~数值)返回:数值的位 not值,(1的补码) 2.8 (and 表达式1 表达式2…)返回:逻辑and的结果 2.9(boole 函数整数整数…)返回:位式布尔运算AutoLisp函数2/8 2.10(eq 表达式1 表达式2)比较表达式1与表达式2就是否相同,适用列表比较(实际 相同) 2.11(equal 表达式 1表达式 2[差量])比较表达式 1与表达式 2就是否相同,差量可省 略(内容相同) 三、转换运算功能函数 3.l(angtof 字符串[模式])返回:角度值的字符串转成实数 3.2(angtos 角度[模式[精度]])返回:角度转成的字符串值 3.3(atof 字符串)返回:字符串转成实数值 3.4 (atoi 字符串)返回:字符串转成整数值

lisp功能函数

一、数学运算功能函数 1.l(十数值数值…)返回:累计实数或整数数值 1.2(一数值数值…)返回:差值 1.3(* 数值数值…)返回:所有数值乘积 1.4(/ 数值数值…)返回:第一个数值除以第二个以后数值的商 1.5(l十数值)返回:数值十l l. 6(1—数值)返回:数值一l l.7(abs 数值)返回:数值的绝对值 1.8(atan 数值)返回:反正切值 1.9(cos 角度)返回:角度的余弦值,角度值为弧度 1.10(exp 数值)返回:数值的指数 1.11(expt 底数指数)返回:底数的指数值 1.12(fix 数值)返回:将数值转换为整数值 1.14(gcd 数值1 数值2)返回:两数值的最大公因数 1.15(log 数值)返回:数值的自然对数值 1.16(max 数值数值…)返回:数值中的最大值 1.17(min 数值数值…)返回:数值中的最小值 1.18 pi 常数∏,其值约为3.1415926 1.19(rem 数值1数值2)返回:M数值的相除的余数 l.20(sin 角度)返回:角度的正旋值,角度值为弧度 1.21(sqrt 数值)返回:数值的平方根 二、检验与逻辑运算功能函数 2.l(= 表达式1 表达式2)比较表达式1是否等于式2,适用数值及字符串2.2 (/= 表达式1 表达式2)比较表达式1是否大于等于表达式2 2.3(<表达式1 表达式2) 比较表达式1是否<小于表达式2

2.4(<= 表达式1 表达式2)比较表达式1是否<一小于等于表达式2 2.5(>表达式1 表达式2)比较表达式1是否>大于表达式2 2.6(>= 表达式1 表达式2)比较表达式1是否大于等于表达式2 2.7 (~数值)返回:数值的位not值,(1的补码) 2.8 (and 表达式1 表达式2…)返回:逻辑and的结果 2.9(boole 函数整数整数…)返回:位式布尔运算 2.10(eq 表达式1 表达式2)比较表达式1与表达式2是否相同,适用列表比较(实际相同) 2.11(equal 表达式1表达式2[差量])比较表达式1与表达式2是否相同,差量可省略(内容相同) 三、转换运算功能函数 3.l(angtof 字符串[模式])返回:角度值的字符串转成实数 3.2(angtos 角度[模式[精度]])返回:角度转成的字符串值 3.3(atof 字符串)返回:字符串转成实数值 3.4 (atoi 字符串)返回:字符串转成整数值 3.5 (cvunit 数值原始单位转换单位)返回:数值转换单位后的值转换根据acad.nut文件 3.6(distof 字符串[模式])返回:根据模式将字符串转成实数值 3.7(itoa 整数)返回:整数转成字符串 3.8(rtos 数值模式[精度])返回:实数转成字符串 3.9 (trans 点原位置新位置[位移])返回:转换坐标系统值 四、列表处理功能函数 4.1 (append 列表列表……)结合所有列表成一个列表 4.2(assoc 关键元素联合列表)根据关键元素找寻联合列表中关系信息 4.3 (car 列表)返回列表中的第一个元素,通常用来求X坐标

在AutoCAD中基于LISP程序简易标注粗糙度

在AutoCAD中基于AutoLISP程序简易标注粗糙度 陕西关中工具制造有限公司(陕西凤翔 721400)张科岐王建卫 对经常使用AutoCAD绘制二维机械图的用户来说,标注表面粗糙度是一件烦琐的事情。常用的方法是先画好粗糙度的符号,再将粗糙度值定义为属性,最后将符号和粗糙度定义为块。标注时插入这个块,按提示输入粗糙度值完成。笔者结合自己在工作中的实际经验,利用AutoCAD提供的AutoLISP程序二次开发功能编写了一个粗糙度标注程序。使用该程序标注粗糙度,操作简单、快捷、准确、美观。现将程序内容及使用方法介绍如下,供大家参考。 程序全文如下: (defun rad->deg(rad) (/ (* rad 180.0) pi) ) (defun Deg->Rad(Deg) (* pi (/ Deg 180.0)) ) (defun rgh() (setvar "CMDECHO" 1) (setq svar_old (getvar "osmode" )) (setq svar_new 0) (setvar "osmode" svar_new) (setq pos_pt (getpoint"\n标注位置:")) (setq sym_dir (getpoint"\n符号方向:")) (setq sym_hgt (getreal"\n符号高度<5>:")) (setq txt (getstring"\n数值大小<3.2>:")) (if (= txt "") (setq txt "3.2") ) (setq txt_hgt(getreal"\n字符高度<2.5>:")) (if (= txt_hgt nil) (setq txt_hgt 2.5) ) (if (= sym_hgt nil) (setq sym_hgt 5.0) ) (setq sym_lgt (/ sym_hgt (cos (/ pi 6.0)))) (setq sym_angle (angle pos_pt sym_dir)) (setq sym_pt1 (polar pos_pt (+ (/ pi 3.0) sym_angle) (* 0.5 sym_lgt)))

AUTOLISP详细讲解

AutoLISP详细讲解 关于AutoLISP AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy在1960年4月的《ACM通讯》中发表的。 除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCADR2.18及更高版本才可以使用AutoLISP语言。 AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。 现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。 在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk 公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。 数学运算 任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。 1.加法 格式(+num1num2num3…) 此函数(+)计算加号(+)右边所有数字的和(+num1num2num3…)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是

用AutoLISP程序提高绘图效率的几个实例

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

lisp函数

函数大全 一、数学运算功能函数 1.l(十 数值 数值…)返回:累计实数或整数数值 1.2(一 数值 数值…)返回:差值 1.3(* 数值 数值…)返回:所有数值乘积 1.4(/ 数值 数值…)返回:第一个数值除以第二个以后数值的商 1.5(l十 数值)返回:数值十l l. 6(1— 数值)返回:数值一l l.7(abs 数值)返回:数值的绝对值 1.8(atan 数值)返回:反正切值 1.9(cos 角度)返回:角度的余弦值,角度值为弧度 1.10(exp 数值)返回:数值的指数 1.11(expt 底数指数)返回:底数的指数值 1.12(fix 数值)返回:将数值转换为整数值 1.14(gcd 数值1 数值2)返回:两数值的最大公因数 1.15(log 数值)返回:数值的自然对数值 1.16(max 数值 数值…)返回:数值中的最大值 1.17(min 数值 数值…)返回:数值中的最小值 1.18 pi 常数∏,其值约为3.1415926 1.19(rem 数值 1数值 2)返回:M数值的相除的余数 l.20(sin 角度)返回:角度的正旋值,角度值为弧度 1.21(sqrt 数值)返回:数值的平方根 二、检验与逻辑运算功能函数 2.l(= 表达式1 表达式2)比较表达式1是否等于式2,适用数值及字符串 2.2 (/= 表达式1 表达式2)比较表达式1是否大于等于表达式2 2.3(< 表达式1 表达式2) 比较表达式1是否<小于表达式2 2.4(<= 表达式1 表达式2)比较表达式1是否<一小于等于表达式2 2.5(> 表达式1 表达式2) 比较表达式1是否>大于表达式2 2.6(>= 表达式1 表达式2) 比较表达式1是否大于等于表达式2 2.7 (~ 数值)返回:数值的位 not值,(1的补码) 2.8 (and 表达式1 表达式2…)返回:逻辑and的结果 2.9(boole 函数 整数 整数…)返回:位式布尔运算

AUTOLISP 程序命令(精校版本)

1.+ (加)返回所有数的和 2.– (减)将第一个数减去其他数的和并返回差值 3.* (乘)返回所有数的乘积 4./ (除)将第一个数除以其他数的乘积并返回商 5.= (等于)比较参数是否相等 6./= (不等于)比较参数是否值不相等 7.< (小于)如果每个参数值都小于它右边的参数则返回 T,否则返回 nil 8.<= (小于或等于)如果每个参数值都小于或等于它右边的参数则返回 T, 否则返回 nil 9.> (大于)如果每个参数值都大于它右边的参数则返回 T,否则返回 nil 10.>= (大于或等于)如果每个参数值都大于或等于它右边的参数则返回 T, 否则返回 nil 11.~ (按位非)返回参数的按位非(即 1 的补码) 12.1+ (增1)将参数加 1 13.1– (减1)将参数减 1 14.abs返回参数的绝对值 15.acad_colordlg显示标准的 AutoCAD 颜色选择对话框 16.acad_helpdlg启动帮助工具(已废弃) 17.acad-pop-dbmod恢复 DBMOD 系统变量的值到最近用 acad-push-dbmod 保存的值 18.acad-push-dbmod储存 DBMOD 系统变量的当前值 19.acad_strlsort以ASCII码字母顺序对字符串表进行排序 20.acad_truecolorcli从命令行中选择 AutoCAD 真彩色 21.acad_truecolordlg显示 AutoCAD 真彩色选择对话框 22.acdimenableupdate控制关联标注的自动更新 23.acet-layerp-mode查询和设置 LAYERPMODE 配置 24.acet-layerp-mark放置图层先前记录的开始和结束标记 25.acet-laytrans转换图形中的图层为其它图形或标准文件中所定义的标 准 26.acet-ms-to-ps从模型空间单位转换实数值到图纸空间单位 27.acet-ps-to-ms从图纸空间单位转换实数值到模型空间单位 28.action_tile为某一对话框控件指定一个动作表达式,用户在对话框中选 中这个控件时,就会执行该动作表达式 29.add_list在当前激活的对话框的列表框中增加一个字符串或修改其中的 一个字符串 30.alert显示一个警告框,其中显示一条出错或警告信息 31.alloc设置段长度以供 expand 函数使用 32.and返回表达式的逻辑与 (AND) 运算结果 33.angle以弧度为单位返回两点之间连线与当前 UCS 下 X 轴之间的夹角 34.angtof将表示角度的字符串转换为实数(浮点数)形式的弧度值 35.angtos将一个以弧度为单位的角度值转换成字符串 36.append将任意多个表组合成一个表 37.apply将参数表传给指定的函数

AUTOLISP实用编程四例

autolisp实用编程四例 江苏崔华明 autocad是一个功能强大的通用图形设计软件,其内嵌的autolisp语言为用户进行二次开发提供了方便。下面就介绍几则用autolisp编写的实用程序,这些程序相当于新增的autocad命令,可以弥补autocad本身的一些不足,为日常使用带来方便。 1.快速更改文本的大小 在标准的autocad中,要更改已有文本的大小,需要使用change命令。该命令的缺陷是:即使只更改文本的大小,也要重新确认文本的插入点、字型、倾斜角等一系列参数。也就是说,除输入文本的新高度值外,还需要按5次回车键才能完成一个文本的更改!而且每次只能修改一个文本。这对于同时更改多个文本的大小非常不便。本文的autolisp程序使这一工作变得十分方便和快捷。使用方法如下: 在autocad的command提示下,打入命令: cth autocad将提示“selectobjects:”,这时可以使用autocad允许的任意方式选择目标。对于有多个文本需要更改的情况,使用窗口选择比较方便,而且你不用担心选择窗口中包含了非文本目标,程序能够自动在选择的目标中查找出文本实体,并只对文本进行更改。 选择目标后,autocad提示“newtextheight:”,这时输入一个新的文本高度值然后回车,则所有选中的文本被更改成新设定的高度。 2.延伸直线的长度 在实际使用中,常常要将一条直线延伸指定的长度。通常的做法是:在需要延伸的直线的端点画一个辅助圆,圆的半径等于直线要延伸的长度,然后使用extend命令将直线延伸到与圆相交,最后删除辅助圆。 本文的autolisp程序将使你非常容易地实现这一点。你只需选择要延伸的直线并输入要延伸的长度即可,其余的工作由程序自动完成。使用方法如下: 在autocad的command提示下,打入命令: stl 然后根据提示选择要延伸的直线(选择点要靠近直线需要延伸的端点),并输入延伸的长度。该程序将自动在离选择点较近的直线端点,按指定的长度延伸直线。 3.快速画直线 在画给定坐标点的直线时,需要通过键盘输入坐标值。这样的情况下当然是利用右边的数字键盘输入

CAD创建Lisp程序步骤

使用Visual LISP创建简单的LISP应用程序 作者:佚名点击数:1523 更新:2007-2-2 7:08:10 热★★★ 【字体:小大】 a> 本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCA D中的加载和运行的方法。首先来创建一个最简单的LISP程序—-―Hello.lsp‖,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-―Hello, Visual LISP!‖。 36.2.1 Visual LISP与AutoCAD的通信 用户可以直接在AutoCAD命令行中键入AutoLISP表达式。AutoCAD通过括号来确认AutoLISP表达式。AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。 注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。 此外,在AutoCAD中调用并执行AutoLISP程序。在AutoLISP程序中采用COMMAND函数来与AutoCAD命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。 36.2.2 实例1 最简单的LISP程序——―Hello.lsp‖ Step 1 创建新文件 (1) 运行AutoCAD 2002系统,以―acadiso.dwt‖为样板创建图形文件,并调用―vlisp‖命令进入Visual LISP环境。 (2) 单击―Standard(标准)‖工具栏中的按钮,新建一个LISP文件。 Step 2 输入代码并保存文件 (1) 在编辑窗口中输入源文件―Hello.lsp‖的代码,如图36-3所示。程序清单如下: ;;;* Hello.lsp –Visual LISP文件实例 (prompt "Pick point:") ;指定运行时的提示信息 (setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量―ipt‖ (setq hgt 15) ;给变量―hgt‖赋值 (Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!") ;调用―Commnad‖函数与AutoCAD进行通信

Lisp常用函数

Lisp常用函数 Lisp 语法及变量皆不分大小写(case insensitive)。 NIL 空串行,相当于'() 。另外真伪值表示时,T 表真,NIL 表伪。只要是任何不是NIL (空串行) 的值,真伪值都表示真。 QUOTE CODE: (QUOTE 参数) 将参数直接传回,不做任何评估动作。可用' (单引号)取代 SETQ, SETF, LET CODE: (SETQ 参数1 参数2) (SETF 参数1 参数2) (LET ((变量1名称变量1的值) (变量2名称变量2的值) ........ ) 变数1,2...的作用范围,既程序执行叙述 ) SETQ, SETF 将参数1的值连结至参数2。LET 只有在作用范围内有效。 注:SetQ => set quote; SetF => set form 注:全域变数习惯用两个* 把变量名称包起来,例如*globe-variable* CAR, CDR CODE: (CAR 串行参数) (CDR 串行参数) CAR 取得参数串行的第一个元素;CDR 取得扣掉第一个元素之后的新串行。

CONS CODE: (CONS 参数1 参数串行2) 把参数1 加到参数串行2 的第一个元素,产生出新的串行。 对任一串行A 而言,(CONS (CAR A) (CDR A)) 即为 A 。 注:如果第二个参数不是串行,则会产生出点对,故少用。 APPEND CODE: (APPEND 参数串行1 参数串行2 ........ ) 合并若干参数串行,形成新的串行。 注:如果最后一个参数不是串行,也会形成尾巴是带点的串行,故少用。LIST CODE: (LIST 参数1 ........ ) 将若干参数,当作是新串行的元素,形成新串行。 注:APPEND 除了最后一个之外的参数皆需为串行,而LIST 不用。NULL CODE: (NULL 参数) 判断参数是否为空串行(NIL)。 ATOM, LISTP, NUMBERP, ZEROP CODE: (ATOM 参数) (LISTP 参数) (NUMBERP 参数) (ZEROP 参数)

CAD-LISP-程序

CAD-LISP-程序

1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度) (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.标注所有线段(加载后只需框选所有线段便可得标注这些线段) (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)

CADLISP函数

CADLISP语言 数据类型 1.表 2.文件描述符 3.实体名 4.选择集 5.内部函数(Auto LISP子程序) 赋值与数值计算函数 1.(1+ 数) 加1函数 2.(1- 数) 减1函数 3.(abs 数)求绝对值 4.(max数数……)求最大数 5.(min数数……)求最小数 6.(sqrt数)求平方根 7.(expt数幂)乘方 8.(exp 幂)e的任意次方 9.(log数)对数 10.(sin 角)正弦函数 11.(cos角)余弦 12.(atan数1[数2])反正切函数 13.(rem数1 数2)求余数 14.(gcd数数……)最大公约数 15.(~ 整数)求补注:用pi表示圆周率π 16.(logand数数……)按位逻辑”与”函数 17.(logior数数……)按位逻辑”或”函数 18.(~ 数)按位逻辑”非”函数 19.(and 表达式……)逻辑”与”函数 20.(or 表达式……)逻辑”或”函数 21.(not 表达式)逻辑”非”函数 22.(lsh 数位数)位移函数 23.(boole 方式数1 数2……)布尔运算。方式有16种,如1为and,6为xor(异或),7为or,8为not等。 24.(= 原子原子……)等于函数 25.(/= 原子原子)不等于函数 26.(< 原子原子)小于函数 27.(<= 原子原子)小于等于函数 28.(> 原子原子)大于函数 29.(>= 原子原子)大于等于函数 30.(atom 项)原子测试

31.(listp 项)表测试 32.(boundp 原子)原子值测试 33.(null 项)空测试 34.(numberp 项)数值测试 35.(minusp 项)负值测试 36.(zerop 项)零测试 37.(eq 式1 式2)相同表达式测试 38.(equal式1 式2)相等测试 39.(wcmatch 字符串模式)字符匹配测试 分支与循环 1.(if 条件式1[式2])若条件为真,则执行式1;否则执行式2。 2.(cond(条件1 式1……)(条件2 式2……)……)分支函数。如:(cond((minusp a)(- a))(T a))求a的 绝对值。注:cond是AutoLISP中最基本的条件函数,由它为核心构成的自定义函数可以实现循环和递归等功能。 3.(repeat 次数式1 式2 ……)重复函数。将多个表达式重复执行多次。 4.(while 条件式1 式2 ……)循环函数。条件为真,执行表达式。否则结束循环。如:(setq s 0 a 1)(while(< a 101)(setq s(+ s a))(setq a(1+ a)))(print s) 计算0~100之间所有整数的和。 5.(progn 式1 式2 ……)求多个表达式值函数。在只能用一个表达式的地方,使用他可完成多个表达式的计算。 如if 语句中 字符串与类型转换函数 1.(ascii 字符串)ASCII码转换 2.(chr 整数)字符转换 3.(strcat 字符串……)字符串连接 4.(strlen 字符串……)字符串长度测试 5.(substr 字符串起点 [长度])取子字符串。如果不设置长度,则取到最后一个字符。 6.(strcase 字符串 [方式])字符串大小写转换。若指定了方式且非空(NIL),则把所有的字母转换为小写; 否则转换为大写。 7.(float 数)整型变实型 8.(fix 数)实型变整型 9.(itoa 整型数)整型变字符串 10.(atoi 字符串)字符串变整型 11.(atof 字符串)字符串变实型 12.(angtos 角方式精度)角度单位转换。“角”是以弧度为单位的实数,转换为其它单位,返回一个字符串。 该字符串是以“方式”和“精度”的要求,按AutoCAD的系统变量UNITMODE(单位模式)对“角”进行处理得到的,“精度”为小数点后的位数。“方式”有:0为度,1为度/分/秒,2为梯度,3为弧度等。 13.(rtos 数方式精度)实数计数制转换。方式:1为科学计数法,2为十进制,3为工程制(英寸与小数英寸), 4为建筑制(英寸与分数英寸) 14.(cvunit 值旧单位新单位)单位制转换。单位名称可以是acad.unt文件中给出的任意单位格式,否则返回 NIL (trans 点旧坐标系新坐标系)坐标转换。坐标:0为WCS(世界坐标系),1为UCS(用户坐标系),2为DCS(显示坐标系) 表处理函数 1.(quote 表达式)引用函数。作用:告诉程序不要对后面的表达式求值。如:(quote(x y z))可简写为’ (x y z) 2.(car 表)取表中的第一个元素 3.(cdr 表)取子表函数。返回除第一个元素以外的所有元素组成的新表 4.由car与cdr组合而成的函数

相关文档
最新文档