本帖最后由 vormittag 于 2011-10-14 18:14 编辑
我的解决方法说明:
1、用(ssget "x" [filterlist])可以不用手动选择干预,选择图形数据库中所有对象。
2、我不认为标注内容带"<>"的就不是伪标,如果是标注内容是"1<>2"呢?所以只要标注图元组码1不为空字符串,就认为是伪标。
3、新建不同颜色的图层不一定合适,很难保证和正确的标注有强烈的反差。如果加上红色的文字背景,则二者的反差就大了,几乎不会有人设置标注样式的时候会添加标注文字背景。
所以我的解决方案是这样的:- (defun c:wbxs( / ss i ename)
- (setq ss (ssget "X" '((0 . "DIMENSION")(-4 . "<NOT") (1 . "")(-4 . "NOT>")))
- i 0
- );setq
- (if (/= nil ss)
- (repeat (sslength ss)
- (setq ename (ssname ss i)
- i (1+ i)
- );setq
- (set_pseudodim ename)
- );repeat
- );if
- (princ)
- )
- ;;;设置伪标显示扩展数据
- (defun set_pseudodim (ename / nel l ll)
- (setq ll (list (cons 1002 "}"))
- l (cons 1070 2)
- ll (cons l ll)
- l (cons 1070 69)
- ll (cons l ll)
- l (cons 1070 1)
- ll (cons l ll)
- l (cons 1070 70)
- ll (cons l ll)
- l (cons 1002 "{")
- ll (cons l ll)
- l (cons 1000 "DSTYLE")
- ll (cons l ll)
- ll (list -3 (cons "ACAD" ll))
- el (entget ename)
- nel (cons ll el)
- );setq
- (regapp "ACAD")
- (entmod nel)
- )
如果要恢复标注的样式,去掉文字背景,用下面的代码:- ;;;恢复样式的方法
- (defun c:bzyshf ( / ss i ename ell)
- (setq ss (ssget "X" '((0 . "DIMENSION") (-3 ("ACAD"))))
- i 0
- );setq
- (if (/= nil ss)
- (repeat (sslength ss)
- (setq ename (ssname ss i)
- i (1+ i)
- );setq
- (removexdata ename "ACAD")
- );repeat
- );if
- (princ)
- )
- ;;; 删除指定扩展数据
- (defun removexdata(ename appid / id idlist ell1 ell2)
- (setq id (tblnext "APPID" 'T)
- idlist nil
- );setq
- (while id
- (setq idlist (cons (cdr (assoc 2 id)) idlist)
- id (tblnext "APPID")
- );setq
- );while
- (if idlist
- (progn
- (setq ell1 (entget ename idlist)
- ell2 (assoc -3 ell1)
- );setq
- (if (assoc appid (cdr ell2))
- (progn
- (setq ell2 (cdr ell2)
- ell2 (append (list -3)
- (reverse (cdr (member (assoc appid ell2) (reverse ell2))))
- (cdr (member (assoc appid ell2) ell2))
- );append
- ell1 (subst ell2 (assoc -3 ell1) ell1)
- );setq
- (entdel ename)
- (entmake ell1)
- );progn
- );if
- );progn
- );if
- )
|