本帖最后由 飞雪神光 于 2024-10-22 21:37 编辑
我的思路是
计算实体包围框
然后选择原图的块 undo m标记
分解块 获取分解后的选择集
筛选属性轴号
遍历轴号的X值与Y值 与实体包围框的 X范围与Y范围进行比对
不需要轴线的参与 也没有屏幕外ssget失灵的问题
完成后 undo b 还原块
因为用到了 nentsel 所以 "选择图块及轴号图层"是要点击块内轴号的文字 也可以改成分开获取图块图元和轴号图层
 - (defun c:tt (/ *error* clst getattvalue get-dxf getsolidbox isattrclock nent pt ptlst ss ss-enlst tkty ys yx zhkm zhtc zhx zhy zs zx)
- (defun *error* (s)
- (setq acadver (atof (getvar "acadver")))
- (if (> acadver 19.1)
- (command-s "undo" "b")
- )
- (if (<= acadver 19.1)
- (command "undo" "b")
- )
- )
- (defun GetSolidBox(ent / LB_pt RT_pt RB_pt LT_pt lst)
- (if ent
- (progn
- (if (= (type ent) 'LIST) (setq ent (car ent)))
- (setq ent (vlax-ename->vla-object ent))
- (vla-GetBoundingBox ent 'minpoint 'maxpoint)
- (setq LB_pt (vlax-safearray->list minpoint))
- (setq RT_pt (vlax-safearray->list maxpoint))
- (setq RB_pt (list (car RT_pt) (cadr LB_pt)))
- (setq LT_pt (list (car LB_pt) (cadr RT_pt)))
- (setq lst (list LB_pt RB_pt RT_pt LT_pt))
- )
- )
- lst
- )
- (defun ss-enlst (ss / enlst)
- (cond
- ((= (type ss) 'PICKSET)
- (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
- )
- ((= (type ss) 'LIST)
- (setq enlst (ssadd))
- (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
- )
- )
- )
- (defun get-dxf(en n)
- (if (not (listp en)) (setq en (entget en)))
- (cdr (assoc n en))
- )
-
- (defun isAttrClock(ClockName / isTrue)
- (if (= (type ClockName) 'LIST) (setq ClockName (car ClockName)))
- (setq is (vlax-get-property (vlax-ename->vla-object ClockName) "HasAttributes"))
- (if (= is :vlax-true)
- T
- nil
- )
- )
- (defun GetAttValue (en FenGe / i dxf EntName AttValu str)
- (if (= (type en) 'LIST) (setq en (car en)))
- (setq i 0 str "")
- (setq dxf (entget en))
- (setq EntName (entnext (cdr (assoc -1 dxf))))
- (while (= (cdr (assoc 0 (setq dxf (entget EntName)))) "ATTRIB")
- (setq AttValu (cdr (assoc 1 dxf)))
- (setq str (strcat str AttValu FenGe))
- (setq EntName (entnext (cdr (assoc -1 dxf))))
- (setq i (1+ i))
- )
- (setq str (substr str 1 (- (strlen str) (strlen FenGe))))
- )
- (setq
- ptlst (GetSolidBox (entsel "\n选择实体:"))
- zx (nth 0 ptlst)
- yx (nth 1 ptlst)
- zs (nth 3 ptlst)
- nent (nentsel "\n选择图块及轴号图层:")
- zhtc (get-dxf (car nent) 8)
- zhkm (get-dxf (car nent) 2)
- tkty (last (last nent))
- )
- (setvar "cmdecho" 0)
- (vl-cmdf "undo" "m")
- (vl-cmdf "explode" tkty)
- (setq ss (ssget "p" (list (cons 0 "INSERT")(cons 8 zhtc))))
- (foreach ty (ss-enlst ss)
- (setq
- pt (get-dxf ty 10)
- zhx (car pt)
- zhy (cadr pt)
- )
- (if(or
- (< (car zx) zhx (car yx))
- (< (cadr zx) zhy (cadr zs))
- )
- (if (isAttrClock ty)
- (setq clst (cons (GetAttValue ty " ") clst))
- )
- )
- )
- (princ clst)
- (vl-cmdf "undo" "b")
- (princ)
- )
|