明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2052|回复: 5

如何实现块参照的替换?

[复制链接]
发表于 2006-5-19 09:22:00 | 显示全部楼层 |阅读模式

图中有两个块参照 a 和 b,现在我想把b替换成a如何实现?

以前我都是先选择块(insert)对象,自对insert使用(vla-put-name)方法改变块的样式。现

在想知道能不能通过改变块参照达到改变块样式?

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2006-5-19 11:05:00 | 显示全部楼层
;;A. Lin 05/2004
(defun C:RPB  (/ en obj obj1 ss cnt idx blknom)
  (setq en (car (entsel "\nSelect a source block: ")))
  (if en
    (progn
      (setq obj (vlax-ename->vla-object en))
      (VLA-HIGHLIGHT OBJ :VLAX-TRUE)
      (if (and (= (vla-get-objectname obj) "AcDbBlockReference")
               (not (vlax-property-available-p obj 'path)))
        (progn
          (setq blknom (vla-get-name obj))
          (princ "\nSelect the target blocks: ")
          (setq cnt 0)
          (while (setq ss (ssget))
            (VLA-HIGHLIGHT OBJ :VLAX-FALSE)
            (setq idx 0)
            (repeat (sslength ss)
              (setq obj1 (vlax-ename->vla-object (ssname ss idx)))
              (if (and (= (vla-get-objectname obj1) "AcDbBlockReference")
                       (not (vlax-property-available-p obj1 'path)))
                (progn
                  (vla-put-name obj1 blknom)
                  (setq cnt (1+ cnt))
                  ) ;progn
                ) ;endif
              (setq idx (1+ idx))
              ) ;repeat
            ) ;while
          (if (> cnt 0)
            (princ
              (strcat "\n" (itoa cnt) " blocks have been replaced!"))
            (princ "\nNo block found!")
            ) ;endif
          ) ;progn
        (princ "\nThat's NOT a block!")
        ) ;endif
      (vlax-release-object obj)
      (if obj1
        (vlax-release-object obj1))
      ) ;progn
    (princ "\nFunction has been cancelled!")
    ) ;endif
  (princ)
  )
 楼主| 发表于 2006-5-19 11:22:00 | 显示全部楼层

alin版主可能误会我的意思了,我的意思是象2006的块编辑器那样直接修改块定义

达到修改insert样式的目的,不是通过选择insert对象,修改其名称方式。

发表于 2006-5-19 11:36:00 | 显示全部楼层

下边程序可以实现选择范围块的替换,直接修改图块定义的方式可以实现图快的修改,但是这种修改是修改途中所有的图块.以下程序可以随意修改.

;------------------------------------------------------------------------------------
(defun c:ReInsert()
    (setq old_insert (selName "\nOld Bolck:"))
    (setq new_insert (selName "\nNew Bolck:"))
    (if (or (= old_insert nil) (= new_insert nil)) (exit))
    (if (= (tblsearch "block" new_insert) nil) (exit))
    (prompt "\n选择替换范围")
    (setq ss (ssget (list (cons 0 "insert") (cons 2 old_insert))))
    (if (= ss nil) (exit))
    (setq len (sslength ss))
    (setq i 0)
    (setq m 0)
    (while (< i len)
      (progn
        (setq ent (ssname ss i))
         (setq ent_list (entget ent))
         (if (= (cdr (assoc 2 ent_list)) old_insert)
            (progn
              (setq ent_list (subst (cons 2 new_insert) (assoc 2 ent_list) ent_list))
              (entmod ent_list)
              (setq m (1+ m))
            )
           ) 
         (setq i (1+ i))
    )
   )
  (princ "\n")
  (print  (strcat (itoa m) " Replace!"))
  (setq ss nil)
  (princ)
)
;-----------------------------------------------------------------------
(defun selName(prompt1)
   (prompt prompt1)
   (initget 1 "Name")
   (setq ent (entsel (strcat "\nName/<Select:>" )))
   (cond
     ((= ent nil)  nil)
     ((= ent "Name") (getstring 1 "\nName:"))
     (t
       (progn
           (setq ent (car ent))
           (setq ent_list (entget ent))
           (if (= (cdr (assoc 0 ent_list)) "INSERT") 
              (cdr (assoc 2 ent_List))
               nil
           );end if
         );end progn
      ); end t;
    );end cond
 ); end def

;------------------------------------------------------------------------
(alert "Replace Block !\nPlease type Reinsert to Run!\nCopyright by weizhenzhong")

 楼主| 发表于 2006-5-19 11:57:00 | 显示全部楼层

谢谢。

我要替换就是图中一组名称相同的图块。因为觉得用选择insert对象并修改名称方式

速度有点慢,所以想到看能不能修改块定义以实现。

发表于 2013-3-27 17:47:17 | 显示全部楼层
沙发和地板的代码,只能替换普通块,如果是动态块怎么办呢?
因为动态块的 vla对象 有effectivename 和 name 两个属性,
而dxf群码的  (2 . "块名") 对应的是 name  不是effectivename,
而动态块的name又可能是 "*U89" 不是真正的块名!

例如某动态块 vla对象 effectivename 为"桌子"  name 为 "*U89"
dxf群码为  (2 . "*U89")

CAD 里CTRL+1  特性面板显示该块名为"桌子"

想替换这个动态块就出问题了
哪位大侠解救一下吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-31 15:15 , Processed in 0.184472 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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