Freerefill 发表于 2022-7-6 11:59:12

更改块名称

我似乎总是想解决最晦涩和毫无意义的问题。
 
有没有办法使用LISP更改块的名称?我尝试了两种方法,vla-put-name和entmod/entupd方法。这是我的代码,没什么特别的:
 
你会注意到我在这里有两种方法,一种简单地注释掉了。
 
vla方法返回一个键错误,entmod/entupd方法没有错误,但不会更新块。关键的错误似乎是一个线索。。。块不包括在某种块参考表中。。?我从来没有遇到过这样的事情,所以我迷路了。我需要将块添加到表中吗?如果需要,如何添加?还是根本不可能?
 
我也在想,如果有必要的话,我可以用entmake重新创建它,但不确定这会如何工作。
 
有什么想法吗?

Lee Mac 发表于 2022-7-6 12:05:15

我试过这个,但我也得到了同样的结果:
 

(defun c:test(/ blk tStr)
(if (and (setq blk (car (entsel "\nSelect Block: ")))
          (eq "AcDbBlockReference"
            (vla-get-ObjectName
                (setq blk
                  (vlax-ename->vla-object blk))))
          (setq tStr (getstring t "\nSpecify New Name: "))
          (snvalid tStr))
   (if (vlax-property-available-p blk 'Name T)
   (vla-put-Name blk tStr)
   (princ "\nCannot Do that!")))
(princ))

Lee Mac 发表于 2022-7-6 12:06:35

实际上,这是可行的:
 

(defun c:test(/ blk tStr)
(if (and (setq blk (car (entsel "\nSelect Block: ")))
          (eq "AcDbBlockReference"
            (vla-get-ObjectName
                (setq blk
                  (vlax-ename->vla-object blk))))
          (setq tStr (getstring t "\nSpecify New Name: "))
          (tblsearch "BLOCK" tStr))
   (if (vl-catch-all-error-p
         (vl-catch-all-apply
         (function
             (lambda (x)
               (vla-put-Name x tStr))) (list blk)))            
   (princ "\nCannot Do that!")))
(princ))

Freerefill 发表于 2022-7-6 12:10:06

 
这对我没用,李。它不会出错,但似乎不会更改块的名称。

Lee Mac 发表于 2022-7-6 12:13:30

 
新块名称也必须在图形中。
 
从ACAD帮助:

Freerefill 发表于 2022-7-6 12:17:44

但是,如果块名称存在,则意味着-块存在,并且将块名称更改为现有块也会更改定义。。将边框的名称更改为标题栏的名称会将边框更改为标题栏。
 
这是有道理的,但它告诉我,如果我想保持一个块的原样,只是简单地更改名称,我必须从头开始重新创建它,可能是通过获取其中的所有实体。。。
 
我希望有更简单的方法

Lee Mac 发表于 2022-7-6 12:18:37

 
不可能所有事情都这么简单

Lee Mac 发表于 2022-7-6 12:21:54

创建新块并不太困难,这里有一个LISP,它是我编写的旧LISP的修改:
 
3

Commandobill 发表于 2022-7-6 12:24:52

 
我相信你不知道那么好。。。英雄联盟

Lee Mac 发表于 2022-7-6 12:29:58

 
你们认识吗*只是好奇*
页: [1] 2
查看完整版本: 更改块名称