LISP中 remove-if-not 及 remove-if



CL-USER> (remove-if-not #'evenp '(1 2 3 4 ))
(2 4)



CL-USER> (remove-if #'evenp '(1 2 3 4 ))
(1 3)

(defun c:OrthoDim ( / *error* ss plObj closedPts refPt dir dimLayer dimStyle upperPts lowerPts leftPts rightPts) (vl-load-com) ;; 错误处理函数 (defun *error* (msg) (if (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")) (princ (strcat "\n错误: " msg)) ) (setvar "CMDECHO" 1) (princ) ) ;; 选择闭合多段线 (princ "\n选择闭合多段线: ") (setq ss (ssget ":S" '((0 . "LWPOLYLINE")))) (if (null ss) (progn (alert "未选择对象或选择无效!") (exit)) ) (setq plObj (vlax-ename->vla-object (ssname ss 0))) ;; 检查是否闭合 (if (not (vlax-get-property plObj 'Closed)) (progn (alert "所选多段线未闭合!") (exit)) ) ;; 获取顶点坐标 (setq closedPts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (vlax-vla-object->ename plObj)) ) ) ) ;; 移除重复的闭合点 (if (equal (car closedPts) (last closedPts) 1e-6) (setq closedPts (reverse (cdr (reverse closedPts)))) ) ;; 获取参照点 (setq refPt (getpoint "\n在轮廓线上拾取参照点: ")) (if (null refPt) (exit)) ;; 选择标注方向 (initget "H V") (setq dir (getkword "\n选择标注方向 [H水平/V垂直]: ")) (if (not dir) (setq dir "H")) ;; 获取当前标注样式和图层 (setq dimLayer (getvar "CLAYER")) (setq dimStyle (getvar "DIMSTYLE")) (setvar "CMDECHO" 0) (cond ((= dir "H") ; 水平方向标注 ;; 分组点集: 上方点(Y ≥ refPt Y) 和 下方点(Y ≤ refPt Y) (setq upperPts (vl-sort (vl-remove-if-not '(lambda (pt) (>= (cadr pt) (cadr refPt))) closedPts ) '(lambda (a b) (< (car a) (car b))) ) ) (setq lowerPts (vl-sort (vl-remove-if-not '(lambda (pt) (<= (cadr pt) (cadr refPt))) closedPts ) '(lambda (a b) (< (car a) (car b))) ) ) ;; 去重处理 (setq upperPts (LM:Unique upperPts)) (setq lowerPts (LM:Unique lowerPts)) ;; 计算标注位置 (setq upperY (apply 'max (mapcar 'cadr upperPts))) (setq lowerY (apply 'min (mapcar 'cadr lowerPts))) (setq upperDimLineY (+ upperY 30)) (setq lowerDimLineY (- lowerY 30)) ;; 创建上方标注 (if (> (length upperPts) 1) (progn (command "_.DIMLINEAR" (car upperPts) (cadr upperPts) (list (car (car upperPts)) upperDimLineY) ) (command "_.DIMCONTINUE") (foreach pt (cddr upperPts) (command pt) ) (command "") ) ) ;; 创建下方标注 (if (> (length lowerPts) 1) (progn (command "_.DIMLINEAR" (car lowerPts) (cadr lowerPts) (list (car (car lowerPts)) lowerDimLineY) ) (command "_.DIMCONTINUE") (foreach pt (cddr lowerPts) (command pt) ) (command "") ) ) ) ((= dir "V") ; 垂直方向标注 ;; 分组点集: 右侧点(X ≥ refPt X) 和 左侧点(X ≤ refPt X) (setq rightPts (vl-sort (vl-remove-if-not '(lambda (pt) (>= (car pt) (car refPt))) closedPts ) '(lambda (a b) (< (cadr a) (cadr b))) ) ) (setq leftPts (vl-sort (vl-remove-if-not '(lambda (pt) (<= (car pt) (car refPt))) closedPts ) '(lambda (a b) (< (cadr a) (cadr b))) ) ) ;; 去重处理 (setq rightPts (LM:Unique rightPts)) (setq leftPts (LM:Unique leftPts)) ;; 计算标注位置 (setq rightX (apply 'max (mapcar 'car rightPts))) (setq leftX (apply 'min (mapcar 'car leftPts))) (setq rightDimLineX (+ rightX 30)) (setq leftDimLineX (- leftX 30)) ;; 创建右侧标注 (if (> (length rightPts) 1) (progn (command "_.DIMLINEAR" (car rightPts) (cadr rightPts) (list rightDimLineX (cadr (car rightPts))) ) (command "_.DIMCONTINUE") (foreach pt (cddr rightPts) (command pt) ) (command "") ) ) ;; 创建左侧标注 (if (> (length leftPts) 1) (progn (command "_.DIMLINEAR" (car leftPts) (cadr leftPts) (list leftDimLineX (cadr (car leftPts))) ) (command "_.DIMCONTINUE") (foreach pt (cddr leftPts) (command pt) ) (command "") ) ) ) ) (setvar "CMDECHO" 1) (princ "\n正交标注创建完成!") (princ) ) ;; 辅助函数: 列表去重 (defun LM:Unique (l / x r) (while l (setq x (car l) l (vl-remove x (cdr l)) r (cons x r) ) ) (reverse r) )
最新发布
06-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值