明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11451|回复: 27

[原创]一个块替换程序

    [复制链接]
发表于 2011-3-23 00:36:01 | 显示全部楼层 |阅读模式
;;; =================================================================
;;; 块替换;选择源块A,然后选择需要替换成块A的块B,再选择一个区域,然后把这个区域里的块B换成块A
;;; 作者:langjs       命令:KTH        日期2011年3月22日
;;; =================================================================
(defun C:KTH (/ ent ent1 ent2 i kming1 kming2 lst name1 name2 pt ss)
  (setvar "cmdecho" 0)         ; 关闭命令响应
  (setq $orr *error*)
  (setq *error* #err2)         ; 当程序出错时就会执行#err函数
  (command ".UNDO" "BE")        ; 设置UNDO起点
  (setq t 1)
  (while (= t 1)
    (setq name1 (car (entsel "\n选择源块A:")))
    (setq ent1 (entget name1))
    (if (= (cdr (assoc 0 ent1)) "INSERT")
      (progn
(setq kming1 (cdr (assoc 2 ent1)))
(redraw name1 3)
(setq t 2)
      )
      (princ "\n选择源块A:")
    )
  )
  (while (= t 2)
    (setq name2 (car (entsel "\n选择替换块B:")))
    (setq ent2 (entget name2))
    (if (= (cdr (assoc 0 ent2)) "INSERT")
      (progn
(setq kming2 (cdr (assoc 2 ent2)))
(redraw name2 3)
(setq t 3)
      )
      (princ "\n选择替换块B:")
    )
  )
  (while (= t 3)
    (prompt "\n选择替换区域:")
    (setvar "nomutt" 1)
    (setq ss (ssget (list (cons 2 kming2))))
    (setvar "nomutt" 0)
    (if ss
      (setq t 4)
    )
  )
  (redraw name1 4)
  (redraw name2 4)
  (setq lst '())
  (repeat (setq i (sslength ss))
    (setq ent (ssname ss (setq i (1- i))))
    (setq ent (entget ent))
    (setq lst (cons (cdr (assoc 10 ent)) lst))
  )
  (command "erase" ss "")        ; 删除块
  (setq i 0)
  (while (< i (length lst))
    (setq PT (nth i lst))
    (command "INSERT" kming1 PT 1 1 0) ; 插入块,
    (nth i lst)
    (setq i (+ i 1))
  )
  (command ".UNDO" "E")         ; 设置UNDO终点
  (setq *error* $orr)
  (princ)
)
;;; 出错处理函数
(defun #err2 (s)
  (command ".UNDO" "E")         ; 设置UNDO终点
  (redraw name1 4)
  (redraw name2 4)
  (princ)
  (setq *error* $orr)
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-12-30 17:28:56 | 显示全部楼层
本帖最后由 lidaxiu 于 2011-12-30 17:41 编辑

楼主的程序有欠缺,没有计算替换后的块比例
回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-14 17:00:42 | 显示全部楼层
  1. ;; =================================================================
  2. ;;; 块替换;选择源块A,然后选择需要替换成块A的块B,再选择一个区域,然后把这个区域里的块B换成块A
  3. ;;; 作者:langjs       命令:KTH        日期2011年3月22日
  4. ;;; =================================================================
  5. (defun C:KTH (/ ent ent1 ent2 i kming1 kming2 lst name1 name2 pt ss t1)
  6.   (setvar "cmdecho" 0)         ; 关闭命令响应
  7.   (setq $orr *error*)
  8.   (setq *error* #err2)         ; 当程序出错时就会执行#err函数
  9.   (command ".UNDO" "BE")        ; 设置UNDO起点
  10.   (setq t1 1)
  11.   (while (= t1 1)
  12.     (setq name1 (car (entsel "\n选择源块A:")))
  13.     (setq ent1 (entget name1))
  14.     (if (= (cdr (assoc 0 ent1)) "INSERT")
  15.       (progn
  16. (setq kming1 (cdr (assoc 2 ent1)))
  17. (redraw name1 3)
  18. (setq t1 2)
  19.       )
  20.       (princ "\n选择源块A:")
  21.     )
  22.   )
  23.   (while (= t1 2)
  24.     (setq name2 (car (entsel "\n选择替换块B:")))
  25.     (setq ent2 (entget name2))
  26.     (if (= (cdr (assoc 0 ent2)) "INSERT")
  27.       (progn
  28. (setq kming2 (cdr (assoc 2 ent2)))
  29. (redraw name2 3)
  30. (setq t1 3)
  31.       )
  32.       (princ "\n选择替换块B:")
  33.     )
  34.   )
  35.   (while (= t1 3)
  36.     (prompt "\n选择替换区域:")
  37.     (setvar "nomutt" 1)
  38.     (setq ss (ssget (list (cons 2 kming2))))
  39.     (setvar "nomutt" 0)
  40.     (if ss
  41.       (setq t1 4)
  42.     )
  43.   )
  44.   (redraw name1 4)
  45.   (redraw name2 4)
  46.   (setq lst '())
  47.   (repeat (setq i (sslength ss))
  48.     (setq ent (ssname ss (setq i (1- i))))
  49.     (setq ent (entget ent))
  50.     (setq lst (cons (cdr (assoc 10 ent)) lst))
  51.   )
  52.   (command "erase" ss "")        ; 删除块
  53.   (setq i 0)
  54.   (while (< i (length lst))
  55.     (setq PT (nth i lst))
  56.     (command "INSERT" kming1 PT 1 1 0) ; 插入块,
  57.     (nth i lst)
  58.     (setq i (+ i 1))
  59.   )
  60.   (command ".UNDO" "E")         ; 设置UNDO终点
  61.   (setq *error* $orr)
  62.   (princ)
  63. )
  64. ;;; 出错处理函数
  65. (defun #err2 (s)
  66.   (command ".UNDO" "E")         ; 设置UNDO终点
  67.   (redraw name1 4)
  68.   (redraw name2 4)
  69.   (princ)
  70.   (setq *error* $orr)
  71. )

T  改T1 行吗 大神

发表于 2024-10-14 09:23:14 | 显示全部楼层
狼大哥    6666666666666666666666666666666666666666666666666666666666666666666666666
发表于 2011-3-27 18:54:35 | 显示全部楼层
正要找这个东东,谢谢楼主。
发表于 2011-3-27 19:11:48 | 显示全部楼层
能不能加上可能输入块名,这样可以加上不是图中有的块。哪位出下手改一改

点评

11楼的函数就是用块名来替换的。  发表于 2011-12-28 14:46
发表于 2011-4-16 06:24:02 | 显示全部楼层
感谢楼主分享源码程序 <谢谢!>
发表于 2011-4-16 07:59:35 | 显示全部楼层
@langjs :测试之后发现块B消失,块A依然还是原样...这是什么原因?


本帖子中包含更多资源

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

x
发表于 2011-4-16 10:30:04 | 显示全部楼层
本帖最后由 mandala 于 2011-4-16 10:36 编辑

这类程序编起来难度不大,但非常实用,可以用来替换符号等等。
我觉得选择区域这段可能利用率不高,会影响程序效率。不如直接改成选择整幅图纸。
另外除了替换块,可以考虑把替换形也加进去,反正只要加一句话就可以。很多符号都是形,而不是块。
最后替换的块,最好以输入块名实现。在实际操作中,恐怕图纸上未必会有要替换的块。

但这类程序真要编得完美也很难。比如,有的块已经被打散。
发表于 2011-4-16 10:40:11 | 显示全部楼层
本帖最后由 mandala 于 2011-4-16 10:47 编辑
CAD83 发表于 2011-3-27 19:11
能不能加上可能输入块名,这样可以加上不是图中有的块。哪位出下手改一改

这个lsp是我写来替换图纸中的符号的,采用的也是框选而非全局替换。程序思路跟楼主差不多,你可以参考一下。

;;将原有的由块或形构成的符号,替换成指定的符号
(defun c:fh (/ *error* lay os x ss i ents pt)
  (defun *error* (msg)
    (print msg)
    (setvar "clayer" lay)(setvar "osmode" os)
  (command "._undo" "_e")
  ) ;_ 结束defun
  (prompt "\n将原有的块或形符号替换成指定的符号:")
  (command "._undo" "_be")
  (setvar "cmdecho" 0)
  (setq lay (getvar "clayer"))
  ;(setvar "clayer" "fuhao")
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq x (getstring "\n请输入新的符号编码:"))
  (prompt "\n请选择你想替换的符号:")
  (setq ss (ssget '((0 . "insert,shape"))))
  (while ss
    (setq i 0)
    (repeat (sslength ss)
      (setq ents (entget (ssname ss i)))
  (setq pt (cdr(assoc 10 ents)))
(command "shape" x pt "1" "0")
(entdel (ssname ss i))
  (setq i (1+ i))
    ) ;_ 结束repeat
    (setq ss (ssget '((0 . "insert,shape"))))
  ) ;_ 结束while
  (setvar "clayer" lay)(setvar "osmode" os)
(command "._undo" "_e")
  (princ)
) ;_ 结束defun
发表于 2011-11-13 11:26:53 | 显示全部楼层
这个程序好,下下来备着
发表于 2011-11-20 17:26:18 | 显示全部楼层
备用
支持楼主
发表于 2011-12-28 14:28:06 | 显示全部楼层
学习了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-22 02:54 , Processed in 0.306657 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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