文章目录
- 一、概述
- 1.1 简介
- 1.2 打开编辑器
- 1.3 调试页面
- 二、数据类型
- 三、函数
- 3.1 用户函数
- 四、语句
- 4.1 常规语句
- 4.2 流程控制语句
- 五、图元操作
- 5.1 定义
- 5.2 图元选择
- 5.3 图元属性列表
一、概述
1.1 简介
- 简介:cad 二次开发语言,后缀名
*.lsp
适用于编写小工具,不适用大量数据或者需要大量计算的场景,编译后后缀名为*.vlx
- 优点:所有cad版本均通用,不像arx或者其他只针对固定版本
- 缺点:不适合处理大量计算或图元场景,超过1000个单元即有轻微等待卡顿,软件加密困难
1.2 打开编辑器
- cad命令行输入:
vlisp
- cad菜单:管理–>visual lisp 编辑器
- cad菜单:工具–> auto lisp–>visual lisp 编辑器
1.3 调试页面
二、数据类型
- 常量:数字、nil、t、null
- 变量
数据类型 意义 数据类型 意义 浮点型 REAL 整型 INT 字符串 STR 表 LIST 文件描述符 FILE 符号 SYM 选择集 PICKSET 图元名 ENAME 内部LISP函数 SUBR 外部ads函数 EXSUBR - 查看类型语句:
(type item)
三、函数
- 地位:lisp中万物皆函数,函数均用括号括起来
- 返回值:默认返回函数内
最后
一个表达式的结果
3.1 用户函数
- 代码示例
;不传参函数,cad命令行输入(demo1)运行 (defun demo1 () ;此处可以写语句 ) ;传参函数,cad命令行输入(demo2 3)运行 (defun demo2 (a) ;此处可以写语句 ) ;传参函数,cad命令行输入demo3运行 (defun c:demo3 () ;可以直接调用当前源码文件中其他函数 (demo1) ) ;定义了参数a和局部变量r(作用域仅函数内,用完即释放内存) (defun c:demo4 (a \ r) (demo2 3) )
四、语句
4.1 常规语句
-
赋值语句
;赋值,必须以括号括起来每一个语句 (setq a 1) (setq a 1.0) (setq a "1") ;连续赋值 (setq a 1 b 2) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;赋值表,通常用于点坐标赋值,以下两个相同 (setq a (list 1 2 0)) ;英文单引号 (setq a '(1 2 0)) ;获取表元素:(car a)返回1,(cadr a)返回2,(caddr a)返回0 ;删除表首元素: (cdr a)返回(2 0),不修改a元素 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;交互式赋值:getreal、getint、getpoint (setq a (getreal "\n请输入一个实实数:")) ;获取系统变量,设置系统变量,这里是获取设置对象捕捉 (setq osm (getvar "osmode")) (setvar "osmode" 15359)
cad命令行获取变量值:cad命令行输入
!a
,即可返回a的值 -
命令行打印语句
;cad命令行输出:不分辨转义字符,先换行再打印,最后加一个空格 ;常用于打印非字符串元素 ;命令: DEMO1 ;"\na" ;"\na" (defun c:demo1 () (print "\na") (print "\na") (setq a "test") ;函数会返回最后一个表达式的返回值, ;此句让函数最后返回空 (print) ) ;cad命令行输出:分辨转义字符,常用于打印字符串 ;命令: DEMO2 ;a ;a (defun c:demo2 () (princ "\na") (princ "\na") (setq a "test") ;函数会返回最后一个表达式的返回值, ;此句让函数最后返回空 (princ) ) ;cad命令行输出:常用于跟文件打印连用 ;命令: DEMO3 ;"\na""\na" (defun c:demo3 () (prin1 "\na") (prin1 "\na") (setq a "test") ;函数会返回最后一个表达式的返回值, ;此句让函数最后返回空 (prin1) )
多语句拼接:
(princ "\na的值是:") (princ a)
-
运算语句
;代表1>0,返回T,假的话返回nil ;还有< <= >= > = /= (> 1 0) ;代表1+0,返回1,还有+ - * / (+ 1 0) ;特例,相当于(+ i 1),和(- i 1) (1+ i) (1- i)
-
逻辑语句
;逻辑与语句 (and (> a b) (< c d)) ;逻辑或语句 (or (> a b) (< c d))
-
直接调用cad原生命令
(defun c:demo4 () ;最后一个""是命令最后输入的enter (command "line" '(0 0) '(100 100) "") ;两点画圆 (command "circle" "2p" '(0 0) '(100 100)) ;屏幕点选画圆 (setq center (getpoint "\n请输入或选择圆心:")) (setq radius (getdist center "\n请输入或选择半径:")) (command "circle" center radius) ;command函数正常执行返回值是nil (print) )
4.2 流程控制语句
- 判断语句
;单语句判断,若第二个语句不写,则默认为nil (if (> a 1) ;常量可直接写 "如果为真,返回这句话" "如果为假,返回这句话" ) (if (> a 1) ;如果真返回第一个表达式,如果假返回第二个 (setq a 1) (setq a 2) ) ;多语句判断 (setq a (getint "请输入一个整型:")) (if (> a 1) (progn (princ "a") (princ "b")) (progn (princ "c") (princ "d")) )
- 循环语句·
(defun c:demo1 () (setq a 0) (while (< a 500) ;循环打印0~499 (print a) (setq a (1+ a)) ) (print) )
五、图元操作
5.1 定义
- 定义:每个可视cad元素均为一个图元,图元之间以链表形式互相连接,可以用
(entsel “提示文字,选填”)
命令选择,返回:(图元名,点选处的坐标) - 示例如下图
5.2 图元选择
- 代码示例
;以下命令在命令栏测试 ;图中点选图形元素 (setq e1 (entsel "请在途中选择图元:\n")) ;选择刚刚点选的下一个元素:因为是链表存储,所以按 ;绘图顺序依次选取下一个 (setq e2 (entnext (car e1))) ;选择第一个图元 (setq e3 (entnext)) ;选择最后一个(还未删除的)元素 (setq e4 (entlast))
命令栏返回:(<图元名:>(鼠标点选图元时的坐标,注意不是图元的夹点))
5.3 图元属性列表
- 获取列表
;以下命令在命令栏测试 ;图中点选圆这个元素 (setq e1 (entsel "请在图中选择图元")) ;获取图元名 (setq e1_name (car e1)) ;显示图元属性列表:元素为圆
- 获取列表中的某一项
;获取属性列表的所有项,以下是圆的属性列表 (setq e1_list (entget e1_name)) ;!e1_list返回:((-1 . <图元名: 7ff425c06280>) (0 . "CIRCLE") ;(330 . <图元名: 7ff425c039f0>) (5 . "2D8") (100 . "AcDbEntity") ;(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") ;(10 0.0 0.0 0.0) (40 . 1000.0) (210 0.0 0.0 1.0)) ;获取属性列表的某一项:此处返回:(40 . 1000.0) (setq old_r (assoc 40 e1_list))
- 生成新的点对列表(注意跟表list的区别)
;new_r为:(40 . 500.0) (setq new_r (cons 40 500.0)) ;点对列表中含列表的构建,返回:(10 . (11 12)) (cons 10 '(11 12))
- 替换原属性列表的一项
;半径已变,e1_new_list返回:...(40 . 500)... (setq e1_new_list (subst new_r old_r e1_list)) ;如果是随层的、随块的,如颜色线性等,属性列表中是不显示的,需要新增 ;生成(62 . 1),然后打开e2_list,并将之前点对列表加进并替换e2_list (setq e2_list (cons (cons 62 1) e2_list))
- 刷新更新模型区图像
;e1_new_data中有<图元名: 7ff425c039f0>,可以精准更新图中圆半径 (entmod e1_new_data)