SSGET选取界址点,不改变属性,只更改界址点号(yshf 已帮忙解决)
本帖最后由 zhb236623 于 2011-6-8 12:01 编辑上传了个cad图纸,要把每个图块的点号从小到大更改为从1开始递增加
可以用(setq m1 (entget (car (entsel))))查看组码
(defun c:tt()
(setq ss(ssget "X" '((0 . "TEXT")(8 . "JZP")))) ;;;这里在如何框选,一次没选够还可以再选
;;取最小界址点号
(setq i 0)
(repeat (sslength ss)
(setq ssn (ssname ss i))
(setq endata (entget ssn))
(setq n 0)
(repeat (length endata)
(setq pp (nth n endata))
(setq key (car pp))
(if (= key 1)
(progn
(setq new_pp (cdr pp))
(setq slist (cons new_pp slist)) ;构造包含界址点的表
)
)
(setq n (1+ n))
)
(setq i (1+ i))
)
(setq tmp_slist(vl-sort slist '<)) ;表从小到大排序
(setq minumber (car tmp_slist)) ;取表内第一个值,即最小值
;;更新组码最小的(1 ."15")-〉(1 ."1")
(setq ii 0)
(repeat (sslength ss)
(setq ssnii (ssname ss ii))
(setq endataii (entget ssnii))
(setq n1 1)
;(setq wz (itoa n1))
(setq endataii
(subst (cons 1 n1) (cons 1 minumber) endataii);;这里可能有错误要怎么写(1 ."1")
)
(entmod endataii)
(setq
n1 (+ n1 1)
minumber (+ minumber 1)
ii (+ ii 1)
;wz (itoa n1)
)
)
)
之前是一个一个更改的http://bbs.mjtd.com/forum.php?mod=viewthread&tid=87346&page=1&extra=#pid467662 1.(setq ss(ssget "X" '((0 . "TEXT")(8 . "JZP"))))
->(setq ss(ssget'((0 . "TEXT")(8 . "JZP"))))
2.(cons 1 '(2 3 4)) ->(1 2 3 4)
表长度超过2就没有必要用点对了,cons组成的表结构主要是方便cdr函数读取
(cdr '(1 . 2))->2
(cdr '(10 1.12 5.56 6.78))->(1.12 5.56 6.78);;例如组码10储存的点
3.如果是实数要这样:
(subst (cons 1 n1) (assoc 1 endataii) endataii)
因为(cons 1 minumber)中的 minumber可能是实数,跟endataii 可能存在精度差异 改为如下:
(defun c:tt()
(command "_undo" "be")
(if (setq p1 (getpoint "\左上角:"))
(if (setq p2 (getcorner p1 "\n右下角:"))
(if (setq ss (ssget "w" p1 p2 '((0 . "TEXT")(8 . "JZP"))));;;这里在如何框选,一次没选够还可以再选
(progn
;;取最小界址点号
(setq i 0 slist nil)
(repeat (sslength ss)
(setq ssn (ssname ss i)
endata (entget ssn)
new_pp (atoi (cdr (assoc 1 endata)))
slist(cons (list new_pp ssn) slist);构造包含界址点的表
i (1+ i)
)
)
(setq tmp_slist (vl-sort slist '(lambda(x1 x2)(< (car x1) (car x2))))) ;表从小到大排序
;;更新组码最小的(1 ."15")-〉(1 ."1")
(setq i 1)
(foreach ssn slist
(setq endata (entget (cadr ssn))
endata (subst (cons 1 (itoa i)) (assoc 1 endata) endata)
i (1+ i)
)
(entmod endata)
)
)
)
)
)
(command "_undo" "e")
(princ)
)
程序可以实现要求。谢谢yshf 。。。 本帖最后由 zhb236623 于 2011-6-8 18:44 编辑
(defun c:tt()
(command "_undo" "be")
(if (setq ss (ssget'((0 . "TEXT")(8 . "JZP"))));;;这里用这名话可以实现框选,一次没选够还可以再选,也可以不按顺序选,重复选择也可以
(progn
;;取最小界址点号
(setq i 0 slist nil)
(repeat (sslength ss)
(setq ssn (ssname ss i)
endata (entget ssn)
new_pp (atoi (cdr (assoc 1 endata)))
slist(cons (list new_pp ssn) slist);构造包含界址点的表
i (1+ i)
)
)
(setq tmp_slist (vl-sort slist '(lambda(x1 x2)(< (car x1) (car x2))))) ;表从小到大排序
;;更新组码最小的(1 ."15")-〉(1 ."1")
(setq i 1)
(foreach ssn tmp_slist ;;;这里应该遍历tmp_slist这个表;用slist这个表就得按选择界址点顺序更改,而不是按大小顺序更改。这样选择时一不小心就会出错。
(setq endata (entget (cadr ssn))
endata (subst (cons 1 (itoa i)) (assoc 1 endata) endata)
i (1+ i)
)
(entmod endata)
)
)
)
(command "_undo" "e")
(princ)
)
页:
[1]