好久之前就想开个专栏好好记录自己这四五年在cad二次开发过程中的一些心得体会啦,一直忙于考证,现在闲下来慢慢持续更新。
市面上由很多关于a/vlisp的入门教材了,我这里直接实战。以市面上插件中最常见的一个统计线段长度为例:
(defun count_length (/ ss n obj ss sumlen avelen len lenlst)
(setq ss (ssget (list '(0 . "CIRCLE,ARC,ELLIPSE,LINE,*POLYLINE,SPLINE"))))
;ssget是用来在cad中选取对象的用法形如(ssget '((0 . "图元类型"))),还有很多高级用法以后再说啦
;CIRCLE圆,ARC圆弧,ELLIPSE椭圆,LINE直线,*POLYLINE多段线,SPLINE样条曲线
(setq n 0
sumlen 0
maxlen 0
minlen 0
lenlst nil
)
;(repeat 重复次数 重复操作的内容)
(repeat (sslength ss)
(setq obj (vlax-ename->vla-object (ssname ss n)))
;ssget函数返回值需要转换成图元名列表后才方便调用,常用vlax-ename->vla-object转换
(setq len (vlax-curve-getdistatparam obj (vlax-curve-getEndParam obj)))
;(vlax-curve-getdistatparam 图元名 param)
(setq lenlst (append lenlst (list len)))
;(append 列表 列表)返回列表。示例: (append '(1 2 3) '(1)) -> (1 2 3 1)
(setq sumlen (+ sumlen len))
(setq n (+ 1 n))
)
(setq avelen (/ sumlen n))
;(vl-sort 列表 排序函数)返回排序后列表 示例(vl-sort '(2 1 3) '<) -> (1 2 3)
(setq lenlst (vl-sort lenlst
'(lambda (e1 e2)
(< e1 e2)
)
)
)
;(car 列表)列表首位元素 实例 (car '(1 2 3)) -> 1 (car (list '(1) 2 3)) -> (1)
;car可以组合最大四次 (caar (list '(1) 2 3)) -> 1
(setq minlen (car lenlst)
maxlen (last lenlst)
)
;(princ "需要在命令行输出的文字信息")
;(strcat 文本1 文本2 ...)返回组合文本 示例:(strcat "你" "hao" " 0") -> "你hao 0"
;(rtos 数字 模式 精度)返回文本 示例:(rtos 2.675893839 2 3) -> "2.676"
(princ (strcat "n共有"
(itoa (sslength ss))
"条线段,总长:"
(rtos sumlen 2 3)
"均值"
(rtos avelen 2 3)
"最大值"
(rtos maxlen 2 3)
"最小值"
(rtos minlen 2 3)
)
)
(princ)
)
是不是特别简单呀,这个程序范式自己改改还能用来统计图块数量等等。