明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4039|回复: 5

[基础] SSGET选取界址点,不改变属性,只更改界址点号(yshf 已帮忙解决)

[复制链接]
发表于 2011-6-8 01:18:16 | 显示全部楼层 |阅读模式
本帖最后由 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)
     )
   )
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2011-6-8 01:19:30 | 显示全部楼层
发表于 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 可能存在精度差异
发表于 2011-6-8 09:06:29 | 显示全部楼层
改为如下:

  1. (defun c:tt()
  2.     (command "_undo" "be")
  3.     (if (setq p1 (getpoint "\左上角:"))
  4.         (if (setq p2 (getcorner p1 "\n右下角:"))
  5.              (if (setq ss (ssget "w" p1 p2 '((0 . "TEXT")(8 . "JZP"))));;;这里在如何框选,一次没选够还可以再选
  6.                  (progn
  7.                      ;;取最小界址点号
  8.                      (setq i 0 slist nil)
  9.                      (repeat (sslength ss)
  10.                          (setq ssn (ssname ss i)
  11.                                endata (entget ssn)
  12.                                new_pp (atoi (cdr (assoc 1 endata)))
  13.                                slist  (cons (list new_pp ssn) slist)  ;构造包含界址点的表
  14.                                i      (1+ i)
  15.                          )
  16.                       )
  17.                       (setq tmp_slist (vl-sort slist '(lambda(x1 x2)(< (car x1) (car x2))))) ;表从小到大排序
  18.                       ;;更新组码最小的(1 ."15")-〉(1 ."1")
  19.                       (setq i 1)
  20.                       (foreach ssn slist
  21.                           (setq endata (entget (cadr ssn))
  22.                                 endata (subst (cons 1 (itoa i)) (assoc 1 endata) endata)
  23.                                 i      (1+ i)
  24.                           )
  25.                           (entmod endata)
  26.                        )
  27.                  )
  28.              )
  29.         )
  30.     )
  31.     (command "_undo" "e")               
  32.     (princ)
  33. )
 楼主| 发表于 2011-6-8 11:51:09 | 显示全部楼层
程序可以实现要求。谢谢yshf 。。。
 楼主| 发表于 2011-6-8 15:22:00 | 显示全部楼层
本帖最后由 zhb236623 于 2011-6-8 18:44 编辑
  1. (defun c:tt()
  2.     (command "_undo" "be")
  3.    
  4.               (if (setq ss (ssget  '((0 . "TEXT")(8 . "JZP"))));;;这里用这名话可以实现框选,一次没选够还可以再选,也可以不按顺序选,重复选择也可以
  5.                  (progn
  6.                      ;;取最小界址点号
  7.                      (setq i 0 slist nil)
  8.                      (repeat (sslength ss)
  9.                          (setq ssn (ssname ss i)
  10.                                endata (entget ssn)
  11.                                new_pp (atoi (cdr (assoc 1 endata)))
  12.                                slist  (cons (list new_pp ssn) slist)  ;构造包含界址点的表
  13.                                i      (1+ i)
  14.                          )
  15.                       )
  16.                       (setq tmp_slist (vl-sort slist '(lambda(x1 x2)(< (car x1) (car x2))))) ;表从小到大排序
  17.                       ;;更新组码最小的(1 ."15")-〉(1 ."1")
  18.                       (setq i 1)
  19.                       (foreach ssn tmp_slist     ;;;这里应该遍历tmp_slist这个表;用slist这个表就得按选择界址点顺序更改,而不是按大小顺序更改。这样选择时一不小心就会出错。
  20.                           (setq endata (entget (cadr ssn))
  21.                                 endata (subst (cons 1 (itoa i)) (assoc 1 endata) endata)
  22.                                 i      (1+ i)
  23.                           )
  24.                           (entmod endata)
  25.                        )
  26.                  )
  27.              )
  28.   
  29.     (command "_undo" "e")               
  30.     (princ)
  31. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-26 08:29 , Processed in 0.178420 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表