zhb236623 发表于 2011-6-8 01:18:16

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)
   )
   )
)

zhb236623 发表于 2011-6-8 01:19:30

之前是一个一个更改的http://bbs.mjtd.com/forum.php?mod=viewthread&tid=87346&page=1&extra=#pid467662

if 发表于 2011-6-8 02:44:50

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 可能存在精度差异

yshf 发表于 2011-6-8 09:06:29

改为如下:
(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)
)

zhb236623 发表于 2011-6-8 11:51:09

程序可以实现要求。谢谢yshf 。。。

zhb236623 发表于 2011-6-8 15:22:00

本帖最后由 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]
查看完整版本: SSGET选取界址点,不改变属性,只更改界址点号(yshf 已帮忙解决)