|
|
|
AutoLISP教程(五) |
14.9 List函数 List函数用于定义一个二维或三维点。若表达式中不包含任何变量及未定义项,则该函数还可以使用单引号(’)命名。 示例(setq x(List 2.5 3.56)) 返回 2.5,3.56 (setq x’(2.5 3.56)) 返回 2.5,3.56 14.10 car、cdr与cadr函数 1.car函数 car函数返回一个表中的第一个元素。若表中不包含任何元素,函数返回nil。 car函数格式为:(car List) 其中car…......返回第一个元素 list.........元素列表 示例:(car‘(2.5 3.56)) 返回 2.5 (car‘(x y z)) 返回 X (car‘((15 20) 56)返回(15 20) (car‘())返回 nil 其中的单引号表示~个表。 2.cdr函数 cdr函数返回一个移去了表的第一个元素后的列表,其格式为(cdr List) 其中cdr .........返回第一个元素被移去的列表 list.........元素列表 示例:(cdr‘(2.5 3.56)) 返回(3.56) (cdr‘(x,y,z) 返回(y,z) (cdr‘((15 20)56) 返回( 56) (cdr‘()) 返回nil 3.cadr函数 cadr函数执行两个操作,cdr和car,返回列表中第二个元素。cdr函数移去了第一个元素。car函数返回新表中的第一个元素。、cadr函数的格式为:(cadr List) 其中 cadr……...执行两个操作( car(cdr‘(x y z))) List………元素列表 示例:(cadr‘(2 3)) 返回3 (cadr‘(2 3 56)) 返回3 ( cadr‘(x y z)) 返回y (cadr‘((15 20) 56 24))返回56 这些例子中, cadr执行两个操作 (cadr‘(x y z))=(car(cdr‘(x y z)) =(car‘(y z)) 返回 y 注意 除car、cdr和cadr函数外,还有其他几个函数用于选取列表中的不同元素。下面是这些函数的列表,其中函数f由列表‘((x y f)z w)组成。 (setq f‘((x y)z w)) (caar f)=(car(car n) 返回x (cdar f)=(cdr(car f)) 返回(y) (cadar f)=(car(cdr(car f))) 返回y (cddr f)=(cdr(cdr f) 返回(w) (caddr f)=(car(cdr(cdr f))) 返回W 14.11 graphscr、textscr、princ与terpri函数 1.graphscr函数 若系统只有一个屏幕,graphscr函数将文本窗口转换为图形窗口,若系统有两个屏幕,该函数将被忽略。 2.textscr函数 若系统只有一个屏幕,textscr函数将图形窗口转换为文本窗口,若系统有两个屏幕,该函数将被忽略。 3.princ函数 Princ函数打印(或显示)变量的值。若变量位于双引号中,该函数打印(或显示)双引号内的表达式。 princ函数的格式为:(Princ[变量或表达式]) 示例:(princ)在屏幕上打印一个空行 (princa)在屏幕上打印出变量a的值 (princ“Welcome”)在屏幕上打印Welcome 4.terpri函数 terpri函数用于在屏幕上打印一个新行,与\n作用相同。该函数用于打印紧跟着terpri函数的一行。 示例:(setq p1(getPoint“Enter first Point:”))(terpri) (setq p2(getPoint“Enter second Point:”)) 第一行(Enter first Point:)将显示在屏幕的命令提示区中。 terpri函数产生了一个回车,因此第二行(Enter second Point:)将显示在新的一行中,也就是第一行下面的一行。若没有terpri函数,这两行将显示在同一行中(Enter first Point:Enter second Point:) 例3 编写一个程序,提示用户输入一个矩形的两个对角的坐标,然后在屏幕上画出该矩形,如图12-7所示。 输入 处理过程 P1点的坐标 1.计算PZ点和P4点的坐标 P3点的坐标 2.画出下列直线 P1到P2的直线 P2到P3的直线 P3到P4的直线 P4到P1的直线 P2和P4两点的X,Y坐标可以通过car及cadr函数算出。car函数从给定的列表中选取X坐标,cadr函数选取Y坐标。 P2点的X坐标: P2点的Y坐标: X2=X3 Y2=Y1 X2=car(X3 Y3) Y2=cadr(X1 Y1) X2=car P3 Y2=cadr P1 P4点的X坐标: P4点的Y坐标: X4=X1 Y4=Y3 X4=car(X1 Y1) Y4=cadr(X3 Y3) X4=car P1 Y4=cadr P3 故,P2点和P4点为: P2=(list(car P3)(cadr P1)) P4=(List(car P1)(cadr P3)) 下面的文件是例3的程序清单。 (defun c:rect1(/p1 p2 p3 p4) (graphscr) (setvar“cmdecho”0) (prompt“rect1 command draws a rectangle”)(terpri) (setq p1(getpoint "Enter first corner")(terpri) (setq p3(getpoint "Enter opposite corner")(terpri) (setq p2(list(car p3)(cadr p1))) (setq p4(list(car p1)(cadr p3))) (command "line"p1 p2 p3 p4 "c") (setval "cmdecho" 1) (Princ) ) 说明 第1行:(defun c:rect1(/p1 p2 p3 p4) defun函数定义了函数rect1。 第2行:(graphscr) 如果当前屏幕恰好是文本屏幕,该函数将文本屏幕转换为图形屏幕。否则,对显示屏幕无影响。 第3行:(setvar“cmdecho”0) 函数setvar将0赋予AutoCAD系统变量cmdecho,即关闭了回显。如果cmdecho被关闭,AutoCAD的命令提示就不会显示在屏幕的命令提示区中。 第4行:(prompt“rect1 command draws a rectangle”)(terpri) prompt函数将显示双引号中的信息(“rect1 command draws a rectangle”)。函数terpri产生一个回车,因此下一行文本会打印在单独一行上。 第5行:(setq p1(getpoint "Enter first corner")(terpri) getpoint函数暂停程序的运行,等候用户输入一个点(该矩形的第一个角),随后setq函数将该值赋予变量P1。 第6行:(setq p3(getpoint "Enter opposite corner")(terpri) getpoint函数暂停程序的运行,等候用户输入一个点(该短形的对角),随后setq函数将该值赋予变量P3。 第7行:(setq p2(list(car p3)(cadr p1))) cadr函数选取P1点的Y坐标,car函数选取P3点的X坐标。setq函数将这两个值组成的列表赋予变量P2。 第8行:(setq p4(list(car p1)(cadr p3))) cadr函数选取P3点的Y坐标,car函数选取P1点的X坐标。setq函数将这两个值组成的列表赋予变量P4。 第9行:(command "line"p1 p2 p3 p4 "c") Command函数使用AutoCAD的line命令在点P1,P2,P3和P4间画线。C(close)将最后一点P4与第一点P1连接起来。 第10行:(setval "cmdecho" 1) setvar函数将1赋予AutoCAD系统变量cmdecho,即打开了回显。 第11行:(princ) princ函数在屏幕上打印一个空行。若没有这一行, AutoCAD将打印出最后一个表达式的值。该值对程序毫无影响,但却可能令人费解。princ函数用来防止在命令提示区显示该表达式的值。 第12行:该右括号表明完成函数rect1的定义,并且程序结束。 注意 在这个程序中,定义一个矩形的两个角后,该矩形被生成。当移动屏幕光标输入第 二点时,该矩形不会被拖动。然而,可以使用getcorner函数来拖动该矩形,如以下程序清单所示: (defun c:rect2(/p1 p2 p3 p4) (graphscr) (setvar“cmdecho”0) (prompt“rect2 command draws a rectangle”)(terpri) (setq p1(getpoint "Enter first corner")(terpri) (setq p3(getcorner p1 "Enter opposite corner")(terpri) (setq p2(list(car p3)(cadr p1))) (setq p4(list(car p1)(cadr p3))) (command "line"p1 p2 p3 p4 "c") (setval "cmdecho" 1) (Princ) ) |
|
|
|
| |
|
|
|
|
|
|
|
|