明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7196|回复: 19

[基础] 我的Autolisp学习笔记

  [复制链接]
发表于 2013-8-6 19:07:07 | 显示全部楼层 |阅读模式
本帖最后由 yeahyeah 于 2013-8-11 13:18 编辑

;***********************************************************************************
(defun c:mcir3()
   (setq pa (getpoint "第一点:"))
   (setq pb (getpoint "第二点:"))
   (setq mpt (mapcar '(lambda(x y) (* (+ x y) 0.5)) pa pb))
   (command "pasteclip" mpt)  
   (prin1)
)

;将作为本函数参数的一个或多个表的各个元素提供给指定函数进行求值,并将由求值结果构成的表返回
;(mapcar functionlist1... listn)

;定义无名函数
;(lambda arguments expr...)
;它常与 apply 和(或)mapcar 函数连用,以便对表中的元素执行某个操作。lambda 函数返回它最后一个 expr 的值。


;将参数表传给指定的函数
;(apply ’function list)

(apply '(lambda (x y z) (* x (- y z)) ) '(5 20 14) )
;30

(setq counter 0)      ;0
(mapcar '(lambda (x) (setq counter (1+ counter)) (* x 5) ) '(2 4 -6 10.2) )
;(10 20 -30 51.0)

;***********************************************************************************
;(setq cmdecho-bak (getvar "cmdecho"))
;(setvar "cmdecho" 0)                  ;关闭命令行信息提示
;(command "line" pause pause "")
;(setvar "cmdecho" cmdecho-bak)


;(getvar "cmdecho")                    ;得知捕捉特定代码
;(setq osmode-bak (getvar "osmode"))
;(setvar "cmdecho" 0)                  ;关闭捕捉。可以通过得知捕捉特定代码后,改变捕捉选项
;(setvar "osmode" cmdecho-bak)

;***********************************************************************************

;(list 3 4 5)   ;(3 4 5)     ;将任意数目的表达式组合成一个表

;(vl-list*  1 2(list 3 4 5)"123" "555")    ;构造并返回表
;(1 2 (3 4 5) "123" . "555")

;(setq s (list 1 2(list 3 4 5)"123" "555"))
;(1 2 (3 4 5) "123" "555")
;(nth 2 s)       ;(3 4 5)    ;返回表中的第n个元素

;(last s)        ;"555"      ;返回表的最后一个元素

;(setq s (list(list 1 2 3) (list 4 5 6) (list 7 8 9) "123" "555"))   
;((1 2 3) (4 5 6) (7 8 9) "123" "555")

;(caadr s)        ;4
;(car(cadr s))    ;4

;(cadr s)         ;(4 5 6)    ;第二个元素
;(car s)          ;(1 2 3)    ;第一个元素
;(caddr s)        ;(7 8 9)    ;第三个元素

;(cdr s)          ;((4 5 6) (7 8 9) "123" "555")    ;返回去掉了第一个元素的表

;(cddr s)         ;((7 8 9) "123" "555")
;(cdr(cdr s))     ;((7 8 9) "123" "555")

;前增加
;(cons "abcd" s)       ;向表的头部添加一个元素,或构造一个点对
;("abcd" (1 2 3) (4 5 6) (7 8 9) "123" "555")

;后增加
;(append s (list "abc"))   ;将任意多个表组合成一个表
;((1 2 3) (4 5 6) (7 8 9) "123" "555" "abc")

;插入和删除
;(append (list(car s) (cadr s) "abc" (cdddr s)))
;((1 2 3) (4 5 6) "abc" ("123" "555"))

;(vl-remove  "123" s)
;删除表中的元素,若表中有相同的,则一起删除
;((1 2 3) (4 5 6) (7 8 9) "555")

;(vl-remove-if  predicate-function list)
;返回由所提供表中的所有不满足测试函数的元素组成的表

;(vl-remove-if-not  predicate-function list)
;返回由所提供表中的所有能通过测试函数的元素组成的表

;替换
;(subst "aaa" (list 1 2 3) s)
;在表中搜索某旧项,并将表中出现的每一个旧项用新项代替,然后返回修改后所得的表
;("aaa" (4 5 6) (7 8 9) "123" "555")
; 若表中有相同的,则一起替换
;命令: !s
;((1 2 3) (4 5 6) (7 8 9) "123" "555")
;s没变

; 逆转
;(reverse s)    ;将表的元素顺序倒置后返回
;("555" "123" (7 8 9) (4 5 6) (1 2 3))
;!s     ;((1 2 3) (4 5 6) (7 8 9) "123" "555")   ;s没变

;取倒数第2个
;(cadr (reverse s))
;"123"

;***********************************************************************************

;(assoc 1 s)      ;(1 2 3)     ;从关联表中搜索一个元素,如果找到则返回该关联表条目

;(vl-list-length  s)    ;5    ;计算表的长度

;(vl-position "123" s)    ;3     ;返回指定表项目的“位置号”

;(listp s)  ;T    ;检查某个项是否是表

;***********************************************************************************

;(numberp 1)  ;T   ;检查某个项是否是实数或整数
;(numberp a)  ;nil   
;(numberp "123")  ;nil   

;(setq a 123 b "string" c nil) ;nil
;(null a)  ;nil        ;检查某项的值是否设置为 nil
;(null b)  ;nil
;(null c)  ;T

;(type 1)  ;INT    ;返回指定项的数据类型

;***********************************************************************************
;字符串(1个中文汉字=2个字符)
;(setq str1 "1234567")
;(setq str2 "890")
;-----------------------------------------------------------------------------------
;改大小写
;(strcase "Sample")
;"SAMPLE"

;(strcase "10-AB001-001" T)
;"10-ab001-001"

;将字符串中的所有字母转换成大写或小写后返回
;如果提供该参数且其值不为 nil,string 中的所有字符将被转换成小写,否则将字符转换为大写。

;-----------------------------------------------------------------------------------
;字符串合并
;将多个字符串拼接成一个长字符串后返回
;(strcat str1 str2)
;"1234567890"

;-----------------------------------------------------------------------------------
;字符串长度
;以整数形式返回一个字符串中字符的个数
;(strlen str1)
;7
;(strlen str1 str2)
;10

;-----------------------------------------------------------------------------------
;返回子串
;;;字符串中的第一个字符的位置为 1。
;返回字符串中的一个子字符串
;(substr str1 3 4)
;"3456"

;-----------------------------------------------------------------------------------
;从字符串的开始和结束删除指定字符

;(setq str1 "1234567")
;(vl-string-trim "123" str1)    ;"4567"

;从字符串的开始删除指定字符
;(vl-string-left-trim "12456789" "512463789CPO is not R2D2")
;"3789CPO is not R2D2"
;3把删除后面的789的过程阻断了。也就是说,只要在方向上有一个字符与要删除的字符串中的一个字符不相符,则命令终止。

;从字符串结尾删除指定字符
;(vl-string-right-trim "1356789" "3CPO is not R2D2672891")
;"3CPO is not R2D2672"

;-----------------------------------------------------------------------------------
;将代表字符 ASCII 码的整数转换成包含相应的单一字符的字符串
;(chr 65)    ;"A"

;将字符串中的第一个字符转换成其 ASCII 码(整数)后返回
;(ascii "A")   ;65

;-----------------------------------------------------------------------------------
;在字符串中进行字符串替换

;(vl-string-subst "abc" "5678" "5678123456789")
;"abc123456789"
;开始位置默认为0

;(vl-string-subst "abc" "5678" "5678123456789" 1)
;"56781234abc9"
;(vl-string-subst "abc" "5678" "55678123456789" 1)
;"5abc123456789"
;可见开头第一个字符位置认为是0

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

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 继续加油!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2022-12-24 12:12:27 | 显示全部楼层
全收藏了...慢慢看
发表于 2020-1-3 14:45:20 | 显示全部楼层

很多,很好,很全
发表于 2017-12-23 17:36:19 | 显示全部楼层
非常棒的资料
 楼主| 发表于 2013-8-6 21:17:43 | 显示全部楼层
注:这是从别的帖子看到的,我觉得挺好的,贴到这里,为了以后查找、学习方便。感谢善良的分享者!

《基本图形调用之法》
;直线
;方法 (command "LINE" 坐标 坐标 ...... "")
;|实例|;(command "LINE" getpoint getpoint "")
;多义线两种方式
;方法
;1、不闭合(command "Pline"  坐标 坐标 ....... "")
;2、闭合(command "Pline"  坐标 坐标 ....... "C")
;|实例|;(command "Pline" getpoint getpoint getpoint "C")
;射线
;方法 (command "xline"  坐标 坐标 ....... "")
;|实例|;(command "xline" getpoint getpoint getpoint "")
;多边形
;方法
;1、内接圆(command "polygon"  边数目  中心点 "i" 半径)
;2、外切圆(command "polygon"  边数目  中心点 ....... "")
;3、边长 (command "polygon"  边数目  "e" ;|[边长]|; 端点1 端点2)
;|实例|;(command "polygon" "5" getpoint "i" "5")
;矩形
;方法(command "rectang" 第一个角点  第二个角点)
;|实例|;(command "rectang" getpoint getpoint)
;圆弧
;方法
;1、(command "ARC" 圆弧起点  圆弧的第二个点  圆弧端点)
;2、(command "ARC" "C" 圆心点  圆弧起点  圆弧端点)
;3、(command "ARC" "C" 圆心点  圆弧起点 "A" 角度)
;4、(command "ARC" "C" 圆心点  圆弧起点 "L" 弦长)
;|实例|;(command "ARC" getpoint getpoint getpoint)
;圆
;方法
;1、(command "circle" "3P" "tan" 坐标 "tan" 坐标 "tan" 坐标)
;2、(command "circle" "2P"  坐标  坐标 )
;3、(command "circle" 圆心坐标 半径 )
;4、(command "circle" 圆心坐标 "D" 直径 )
;5、(command "circle" "T" 切点  切点 半径)
;|实例|;(command "circle" "3P" "tan" getpoint "tan" getpoint "tan" getpoint)
;样条曲线
;方法
;1、(command "spline" 坐标  坐标 ...............)
;2、(command "spline" "M"  "F"  坐标 坐标 ..... )
;3、(command "spline" "M"  "CV"  坐标 坐标 ..... )
;4、(command "spline" "D"  "4"  坐标 坐标 ..... )
;5、(command "spline" "O" 对象)  多段线转样条曲线
;|实例1|;(command "spline"  getpoint  getpoint ... getpoint "C")
;|实例2|;(command "Pline" getpoint getpoint ... getpoint "C")

;椭圆及椭圆弧
;方法
;1、(command "ellipse" 坐标  坐标 长度)
;2、(command "ellipse" 坐标  坐标 “r” 角度)
;3、(command "ellipse" "A"  坐标  坐标  长度  起点角度  终点角度)
;4、(command "ellipse" "A"  坐标  坐标  "r" 角度 起点角度  终点角度)
;5、(command "ellipse" "c" 坐标  坐标 长度)  多段线转样条曲线

;|实例1|;(command "ellipse"  getpoint  getpoint "45")
;|实例2|;(command "ellipse" "A" getpoint getpoint "45" "45" "135")

;块插入
;方法
;1、(command " _insert" "块名"  插入点 X比例 Y比例 旋转角度)  
;2、(command " _insert" "d:\\块名"  插入点 X比例 Y比例 旋转角度)
;|实例1|;  (command " _insert" "d:\\ABC.dwg" (list 2 2 0) "1" "1" "0")  先在路径目录下建立ABC.dwg 的图块

;块写入
;方法
;1、(command "wblock"  "C:\\中文Lisp\\新块.dwg"  "" 坐标  对象 "")
;|实例1|;  (command " wblock" "C:\\中文Lisp\\新块.dwg" (list 2 2 0) "1" "1" "0")  
;填充
;方法
;1、(command "hatch" ""    "" "n" 坐标1 坐标 坐标 ..... 坐标1  "" "")
;2、(command "hatch" "s" "angle" "1" "90" 对象 "" )
;|实例1|;  (command "hatch" "s" "angle" "1" "90" (car(entsel)) "" )

;面域
;方法
;1、(command "region" 对象 ) 需要选择封闭区域      
;|实例1|;  (setq 点1 = (getpoint "请选择一点:"))
           (setq 点2 = (getpoint 点1 "请选择一点:"))
                          (setq 点3 = (getpoint 点2 "请选择一点:"))
                          (setq 点4 = (getpoint 点3 "请选择一点:"))
           (command "pline" 点1 点2 点3 点4 "C")
           (setq 图元 = (entlast))
           (command "region" 图元 "")

;文字
;方法
;1、(command "text" 坐标 文字高度 文字角度 文字内容 "" "" "")
;2、(command "text" "对正" "对正模式" 坐标 文字高度 文字角度 文字内容 "" "" )
;3、(command "text" "样式" "字体" "对正" "对正模式" 坐标 文字高度 文字角度 文字内容 "" "" )  
;|实例1|;  (command "text" (getpoint) 2.5 0 "1111" "" "" "")

;删除
;方法
;1、(command "erase" 对象 "")
;|实例1|;  (command "erase" (car(entsel)) "")

;复制
;方法
;1、(command "copy" 对象 "" 坐标 坐标 "" "")
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请选择一点:"))
          (setq 点2 = (getpoint 点1 "请选择一点:"))
          (command "copy"  对象 "" 点1 点2 "" "")

;复制
;方法
;1、(command "mirror" 对象 ....  "" 坐标 坐标 "Y") 删除源对象
;2、(command "mirror" 对象 ....  "" 坐标 坐标 "N") 不删除源对象
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请选择一点:"))
          (setq 点2 = (getpoint 点1 "请选择一点:"))
          (command "mirror"  对象 "" 点1 点2 "n")

;偏移
;方法
;1、(command "offset" 偏距 对象 坐标 "") 不删除源对象
;2、(command "offset" "E" "Y" 偏距 对象 坐标 "") 删除源对象
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请选择一点:"))
          (command "offset" 5.5 对象  点1 "")

;阵列
;方法
;1、(command "array" 对象 "" "p" 坐标 数量 "" "") 环形阵列
;2、(command "array" 对象 "" "r" 行数 列数 行偏距 列偏距 角度) 矩形阵列
;|实例1|; (setq 对象 =  (car(entsel)))
          (command "array" 对象 "" "r" 5 5 10 10 0)

;移动
;方法
;1、(command "move" 对象 "" 坐标  坐标) 移动
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请指定基准点:"))
                         (setq 点2 = (getpoint   点1 "请指定移动位置:"))
          (command "move" 对象 "" (getpoint ""))
;旋转
;方法
;1、(command "rotate" 对象 "" 坐标  45)
;2、(command "rotate" 对象 "" 坐标  "c" 45)
;3、(command "rotate" 对象 "" 坐标  "r" 45)  
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请指定基准点:"))
          (command "rotate" 对象 "" 点1 45)

;缩放
;方法
;1、(command "_scale" 对象 "" 坐标  2)
;2、(command  "_scale" 对象 "" 坐标  "r" 参照长度 新长度)  
;3、(command "_scale" 对象 "" 坐标  "r" 坐标 坐标 坐标)
;|实例1|; (setq 对象 =  (car(entsel)))
          (setq 点1 = (getpoint "请指定基准点:"))
          (command "_scale" 对象 "" 点1 0.5)

;修剪
;方法
;1、(command "trim" 边界对象 边界对象 ....... "" (表 被修剪对象 修剪方向点) ....  "")
;|实例1|; (setq 对象1 =  (car(entsel)))
          (setq 对象2 =  (car(entsel)))
          (setq 点1 = (getpoint "请指定基准点:"))
          (command "trim" 对象1 "" (表 对象2 点1)  "")

;延伸
;方法
;1、(command "_extend" 对象1 "" (表 对象1 延伸方向点) .... "")
;|实例1|; (setq 对象1 =  (car(entsel) "边界对象"))
                         (setq 点1 = (getpoint ""))
          (setq 对象2 =  (car(entsel) "延伸对象"))
          (command "_extend" 对象1 "" (表 对象2 点1 ) "")

;打断于点
;方法
;1、(command "_break" 对象1 对象上坐标 "")
;|实例1|; (setq 对象1 =  (car(entsel) "对象"))
                         (setq 点1 = (getpoint ""))
          (command "_break" 对象1 点1 "")

;打断
;方法
;1、(command "_break" 对象1 对象上坐标 对象上坐标 "")
;|实例1|; (setq 对象1 =  (car(entsel) "对象"))
                         (setq 点1 = (getpoint ""))
                         (setq 点2 = (getpoint ""))
          (command "_break" "f" 对象1 点1 点2)

;倒直角
;方法
;1、(command "_chamfer" "d" 对象1修剪长度 对象2修剪长度) 设置参数
;   (command "_chamfer" 对象1 对象2)                     执行倒直角
;2、(command "_chamfer" "a" 对象1修剪角度 对象2修剪角度)
;   (command "_chamfer" 对象1 对象2)
;|实例1|; (setq 对象1 =  (car(entsel) "对象"))
          (setq 对象2 =  (car(entsel) "对象"))
                         (command "_chamfer" "d" "45" "45")
                         (command "_chamfer" 对象1 对象2 )

;倒圆角
;方法
;1、(command "fillet" "R" 4.5 ) 设置参数
;   (command "_chamfer" 对象1 对象2)  执行倒圆角
;|实例1|; (setq 对象1 =  (car(entsel) "对象"))
          (setq 对象2 =  (car(entsel) "对象"))
                         (command "fillet" "r" "45")
                         (command "fillet" 对象1 对象2 )

;分解
;方法
;1、(command "_explode" 对象 .....) 设置参数         
;|实例1|;(setq 对象1 =  (car(entsel) "对象"))
         (command "_explode" 对象1 )

;交换
;方法
;模式 [颜色(C)/标高(E)/图层(LA)/线型(LT)/线型比例(S)/线宽(LW)/厚度(T)/透明度(TR)/材质(M)/注释性(A)]
;1、(command "change" 对象 ""  "P" "C" "1"  "") 修改对象颜色
;2、(command "change" 对象 ""  坐标) 修改对象
;3、(command "change"  pause  "" "" "" "" "" "" "修改文字内容" )) 选择的文字需要为单行文字
;|实例1|;(setq 对象1 =  (car(entsel) "对象"))
         (command "change" 对象1 "" "p" "c" "2" "")
;|实例2|;(setq 对象1 =  (car(entsel) "选择文字:"))
         (command "change" 对象1 "" "" "" "" "" "" "修改文字内容")
;同样也可以调用CAD内部commandchprop来修改图元对象的属性

;对象匹配
;方法
;1、(command "MATCHPROP" 源对象 修改对象)
;|实例1|;(setq 对象1 =  (car(entsel) "源对象"))
         (setq 对象2 =  (car(entsel) "修改对象"))
         (command "MATCHPROP" 对象1 对象2 "")

;文字样式
;方法
;1、(command "STYLE" "文字样式名称" "字体名或字体文件名")
;|实例1|;(command "STYLE" "FF" "TTF")

;图层管理
;模式
;[?/生成(M)/设置(S)/新建(N)/重命名(R)/开(ON)/关(OFF)/颜色(C)/线型(L)/线宽(LW)/透明度(TR)/材质(MAT)/打印(P)/冻结(F)/解冻(T)/锁定(LO)/解锁(U)/状态(A)/说明(D)/协调(E)]
;方法
;1、(command "layer" "m" "lastr" "")
;|实例1|;(command "layer" "m" "LISP" "S" "LISP" "")
 楼主| 发表于 2013-8-7 20:41:26 | 显示全部楼层
今天我在微博上看到有人想设计个lisp程序画两圆的切线,还有在群里讨论什么四点不能画圆的,可见编程序之前,多AutoCAD最起码的命令的使用要熟练,不可急于编写程序。

所以,上面的《基本图形调用之法》就显得很重要。我这两天打算在工作间隙把这些内容都过一遍,然后再重新发个更加完整的。

另外,我感觉好像上面的有些错了。我今天没试出来。以后会一起发上来,以便大家讨论。
 楼主| 发表于 2013-8-7 22:27:26 | 显示全部楼层
CAD操作基础我用的参考书是《中文版AutoCAD2012快捷制图速查通》,个人觉得不错,那是我去年在同类书籍中精挑细选后才买的。
发表于 2013-8-7 22:43:18 | 显示全部楼层
加油楼主!!
 楼主| 发表于 2013-8-7 22:47:42 | 显示全部楼层
ucuc2003 发表于 2013-8-7 22:43
加油楼主!!

嗯,会的,嘿嘿。有些问题还需要大家指教。感谢支持。
发表于 2013-10-30 22:43:02 | 显示全部楼层
加油楼主!!
发表于 2013-11-1 10:30:09 | 显示全部楼层
学习弄懂LSP的好资料,收下了。
发表于 2013-11-22 12:09:44 | 显示全部楼层

总结的太好了
等你新的内容出来
明经上的好人就是真的好
发表于 2013-11-23 21:51:48 | 显示全部楼层
很多,很好,很全
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 06:44 , Processed in 0.195052 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表