明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1365|回复: 10

[源码] 自己写的图块替换插件,有没有大侠们帮忙找一下错误

[复制链接]
发表于 2023-6-27 10:40:21 | 显示全部楼层 |阅读模式
  1. (defun c:blkreplace (/ oldblk newblk ss cnt)
  2.   (setq oldblk (car (entsel "
  3. 选择要替换的原图块:")))
  4.   (if oldblk
  5.     (progn
  6.       (setq newblk (car (entsel "
  7. 选择新图块:")))
  8.       (if newblk
  9.         (progn
  10.           (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 (cdr (assoc 2 (entget oldblk)))))))
  11.           (setq cnt 0)
  12.           (if ss
  13.             (progn
  14.               (repeat (sslength ss)
  15.                 (setq ent (ssname ss (setq i (1+ i))))
  16.                 (if (= oldblk (cdr (assoc 2 (entget ent))))
  17.                   (progn
  18.                     (entmod (subst (cons 2 (cdr (assoc 2 (entget newblk)))) (assoc 2 (entget ent)) (entget ent)))
  19.                     (setq cnt (1+ cnt))
  20.                   )
  21.                 )
  22.               )
  23.               (princ (strcat "
  24. 共替换了 " (itoa cnt) " 个图块。"))
  25.             )
  26.             (princ "
  27. 未找到任何符合条件的图块。"))
  28.         )
  29.         (princ "
  30. 未选择新图块。"))
  31.     )
  32.     (princ "
  33. 未选择原图块。"))
  34.   (princ)
  35. )
我是新手,求大神指点,提示参数类型错误,Numberp:nil

发表于 2023-6-27 16:32:41 | 显示全部楼层
wutao8282 发表于 2023-6-27 15:06
谢谢,但是似乎旁边会有漏替换几个图块,我自己再研究一下,感谢
  1. (defun c:blkreplace (/ ENT I NEWBLK OLDBLK SS)
  2.   (setq oldblk (car (entsel "\n选择要替换的原图块:")))
  3.   (if oldblk
  4.     (progn
  5.       (setq newblk (car (entsel "\n选择新图块:")))
  6.       (if newblk
  7.         (progn
  8.           (setq
  9.             ss (ssget "X"
  10.                       (list (cons 0 "INSERT")
  11.                             (cons 2 (cdr (assoc 2 (entget oldblk))))
  12.                       )
  13.                )
  14.           )
  15.           (setq i 0)
  16.           (if ss
  17.             (progn
  18.               (repeat (sslength ss)
  19.                 (setq ent (ssname ss i))
  20.                 (setq
  21.                   subss        (subst
  22.                           (assoc 2 (entget newblk))
  23.                           (assoc 2 (entget ent))
  24.                           (entget ent)
  25.                         )
  26.                 )
  27.                 (entmod subss)
  28.                 (entupd (cdr (assoc -1 subss)))
  29.                 (setq i (1+ i))
  30.               )
  31.               (princ (strcat "\n共替换了 " (itoa i) " 个图块。"))
  32.             )
  33.             (princ "\n未找到任何符合条件的图块。")
  34.           )
  35.         )
  36.         (princ "\n未选择新图块。")
  37.       )
  38.     )
  39.     (princ "\n未选择原图块。")
  40.   )
  41.   (princ)
  42. )
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-28 09:10:43 | 显示全部楼层

已经完美解决,谢谢大佬!
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-27 10:54:10 | 显示全部楼层
i 还没有设定?
发表于 2023-6-27 11:38:06 | 显示全部楼层
本帖最后由 springwillow 于 2023-6-27 11:50 编辑
  1. ;图块替换
  2. (defun C:tkth ( / ss BlkName ents i)
  3.    (setvar "osmode" 0)
  4.    (princ "\n请选择作为源块的图块:")
  5.    (setq ss (ssget ":S"(list (cons 0 "INSERT"))))
  6.    (setq ent (entget (ssname ss 0)))
  7.    (setq BlkName (cdr (assoc 2 ent)))
  8.    (princ "\n请选择将替换的图块:")
  9.    (setq ss (ssget (list (cons 0 "INSERT"))))
  10.    (if ss
  11.        (progn
  12.            (setq i 0)
  13.            (repeat (sslength ss)
  14.   (setq ents (entget (ssname ss i)))
  15.   (setq ents (subst (cons 2 BlkName) (assoc 2 ents) ents))
  16.   (entmod ents)
  17.   (setq i (1+ i))
  18.            )
  19.        )
  20.    )
  21.    (princ)
  22. )

 楼主| 发表于 2023-6-27 13:09:21 | 显示全部楼层

和我这个的要求不一样。我是要选择被替换的图块后,自动将当前布局空间中所有被替换图块都全部替换,不需要选择对象替换区域
发表于 2023-6-27 13:42:39 | 显示全部楼层
第15行 (setq i (1+ i)) 那个i 没有初始值,(1+ i) 出错。

btw:这种重复造轮子的事为啥要干啊,expresstools 不是有 BlockReplace 的功能么?
那个是把所有指定图块都进行替换(一般很少有这种需求,都是替换某一两个图块),正好合你意,你还去自己写一个干啥?
发表于 2023-6-27 13:56:04 | 显示全部楼层
(defun c:blkreplace (/ CNT ENT I NEWBLK OLDBLK SS)
  (setq oldblk (car (entsel "\n选择要替换的原图块:")))
  (if oldblk
    (progn
      (setq newblk (car (entsel "\n选择新图块:")))
      (if newblk
        (progn
          (setq
            ss (ssget "X"
                      (list (cons 0 "INSERT")
                            (cons 2 (cdr (assoc 2 (entget oldblk))))
                      )
               )
          )
          (setq        cnt 0
                i -1
          )
          (if ss
            (progn
              (repeat (sslength ss)
                (setq ent (ssname ss (setq i (1+ i))))
                (if (= (cdr (assoc 2 (entget oldblk)))
                       (cdr (assoc 2 (entget ent)))
                    )
                  (progn
                    (entmod
                      (subst (cons 2 (cdr (assoc 2 (entget newblk))))
                             (assoc 2 (entget ent))
                             (entget ent)
                      )
                    )
                    (setq cnt (1+ cnt))
                  )
                )
              )
              (princ (strcat "\n共替换了 " (itoa cnt) " 个图块。"))
            )
            (princ "\n未找到任何符合条件的图块。")
          )
        )
        (princ "\n未选择新图块。")
      )
    )
    (princ "\n未选择原图块。")
  )
  (princ)
)
 楼主| 发表于 2023-6-27 14:54:11 | 显示全部楼层
vormittag 发表于 2023-6-27 13:42
第15行 (setq i (1+ i)) 那个i 没有初始值,(1+ i) 出错。

btw:这种重复造轮子的事为啥要干啊,express ...

我就是要一次将全部图块替换,
 楼主| 发表于 2023-6-27 15:06:50 | 显示全部楼层
andyding 发表于 2023-6-27 13:56
(defun c:blkreplace (/ CNT ENT I NEWBLK OLDBLK SS)
  (setq oldblk (car (entsel "\n选择要替换的原图 ...

谢谢,但是似乎旁边会有漏替换几个图块,我自己再研究一下,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 22:52 , Processed in 0.169355 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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