rarmstrong 发表于 2022-7-6 12:00:40

用chan重新定义块

我想重新定义一个块。旧块没有单独定义标记名,因此我正在重新定义标记名;问题是我丢失了输入的值。是否有lisp例程可以保存和刷新这些输入的值。有数百个图纸与这个旧块,所以重新打字一切都是过度。
 
到目前为止,我所做的是:
 
(1) 创建了新块,所有标记分别命名为
(2) 使用与旧块相同的名称保存块
(3) 插入新块并同意重新定义旧块
(4) 执行“attsync”以加快所有新属性标记名称的速度。
(5) *********这就是我丢失之前所有值的地方******
 
 
有人知道lisp会先存储这些值,然后在“attsync”完成后重新恢复它们吗。提示从旧块到新块保持不变,因此这可能是可以在存储过程中使用的共同点。
 
谢谢大家。。。喜欢这个网站

Lee Mac 发表于 2022-7-6 12:08:42

不确定这是否有帮助?
 

(defun c:BlkRep (/ *error* nlk doc spc blk i ss uflag ent nObj aLst att tag)
(vl-load-com)

(setq nblk "C:\\...dwg")   ;; Filepath of New Block to Insert

(defun *error* (msg)
   (and uFlag (vla-EndUndoMark doc))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))   

(setq doc (vla-get-ActiveDocument
             (vlax-get-Acad-Object))
      
       spc (if (zerop (vla-get-activespace doc))            
             (if (= (vla-get-mspace doc) :vlax-true)
               (vla-get-modelspace doc)
               (vla-get-paperspace doc))
             (vla-get-modelspace doc)))


(while
   (progn
   (setq blk (getstring t "\nSpecify Block Name to Replace: "))

   (cond ((eq "" blk) nil)

         ((not (setq i -1 ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blk)))))

            (princ "\n** Block not Found in Drawing **")))))

(if ss
   (progn
   (setq uflag (not (vla-StartUndomark doc)))
   
   (while (setq ent (ssname ss (setq i (1+ i))))

       (setq nObj
         (vla-Insertblock spc
         (vla-get-InsertionPoint
             (setq Obj (vlax-ename->vla-object ent))) nblk
         (vla-get-Xscalefactor obj)
             (vla-get-yScalefactor obj)
               (vla-get-zscalefactor obj)
               (vla-get-Rotation obj)))

       (setq aLst
         (mapcar
         (function
             (lambda (x)
               (cons (strcase (vla-get-TagString x)) (vla-get-TextString x))))
         (vlax-invoke Obj 'GetAttributes)))

       (foreach att (vlax-invoke nObj 'GetAttributes)
         (if (setq tag (assoc (strcase (vla-get-TagString att)) aLst))
         (vla-put-TextString att (cdr tag))))

       (entdel ent))

   (setq uflag (vla-EndUndoMark doc))))

(princ))


 
在顶部用双反斜杠指定新块的文件路径。

stevesfr 发表于 2022-7-6 12:09:44

 
麦克,它比鼻涕还滑!!

Lee Mac 发表于 2022-7-6 12:16:47

 
哈哈,这是一种说法。。。

rarmstrong 发表于 2022-7-6 12:19:05

谢谢李的快速回复。。好吧,这对我来说还不起作用。有两件事正在发生。首先,我得到一个错误,说块的定义重复。。。忽略,其次,如果我将传入的块更改为新的块名,它似乎不会出错,但该块会消失或在完成后从页面中删除。
 
谢谢

rarmstrong 发表于 2022-7-6 12:25:57

好啊不确定是否有人仍在阅读这篇文章或需要解决此问题的方法,但在进一步研究后,我似乎需要使用VBA搜索PromptString,并将其引用到标记字符串名称的更改:因此,我向所有VBA编写者发出挑战,要求他们提供帮助,因为我只使用lisp,而不是VBA。
 
属性标记示例(1):
标签:-
提示:REV 1绘制人
违约:
 
属性标记示例(2):
标签:-
提示:版本1日期
违约:
 
示例(1)和示例(2)是在称为“title\u block”的同一块中显示的标记
 
VBA需要搜索提示:REV 1 DATE,并将与该提示相关联的标记名从-更改为REV-1-DATE
 
VBA需要搜索提示:REV 1 Draw BY,并将与该提示关联的标记名从-更改为REV-1-Draw-BY
 
 
谢谢大家

fixo 发表于 2022-7-6 12:27:44

 
我有一本是很多月前写的,刚刚换了
提示列表
当然,没有你的坏积木,我无法测试它
试试看
 

(defun C:CTP(/)
(defun change-tags-by-prompts (/ adoc att bname ent find obj prompts)

(setq        adoc (vla-get-activedocument
       (vlax-get-acad-object)
   )

)
(setq prompts '("REV 1 DRAWN BY"
          "REV 1 DATE")
)

(setq ent (car (entsel "\n        ***        Select block to change tags: ")))
(if ent
   (progn
   (setq obj (vlax-ename->vla-object ent))

   (if (eq :vlax-false (vla-get-isdynamicblock obj))
   (setq bname (vla-get-name obj))
(setq bname (vla-get-effectivename obj))
)

   (vlax-for        att (vla-item (vla-get-blocks adoc) bname)
(if (eq (vla-get-objectname att) "AcDbAttributeDefinition")
(if (setq find (member (vla-get-promptstring att) prompts))
      (vla-put-tagstring att (strcase (car find)))
    )
)
   )
   (setvar "cmdecho" 0)
   (command "._attsync" "_N" bname)
   (setvar "cmdecho" 1)
   (vlax-release-object obj)
   )
)
(princ)
)
(change-tags-by-prompts)
(princ)
)
(vl-load-com)
(princ "\n   ***   Type CTP to execute   **")
(prin1)

 
~'J'~

rarmstrong 发表于 2022-7-6 12:33:06

谢谢你的回复。。。。。它几乎起作用了。
 
我附上了标题栏文件以供参考。当我运行CTP时,它会更改其他两个标记的标记名,而不是指定的标记名,并且所有输入的值都正好移动了2个空格。
 
我会尝试修改你给我的,因为这是一个很好的开始!!!!谢谢如果我有什么想法,我会发布。如果你有机会,可以试着在我附上的文件上运行它吗。思想???
 
非常感谢。
标题栏。图纸

fixo 发表于 2022-7-6 12:37:51

 
这个版本怎么样
 

(defun change-tags-by-prompts (/ acsp adoc att atts att_info blockname
                        block_info bname cur_lst ent find ipt layer
                        new_block obj prompts rot xscale yscale zscale)

(setq        adoc (vla-get-activedocument
       (vlax-get-acad-object)
       )
acsp (vla-get-block
       (vla-get-activelayout adoc)
       )
)

(setq ent (car (entsel "\n        ***        Select block to change tags tags: ")))
(if ent
   (progn
   (setq obj (vlax-ename->vla-object ent))

   (if (eq :vlax-false (vla-get-isdynamicblock obj))
(setq bname (vla-get-name obj))
(setq bname (vla-get-effectivename obj))
)

   (vlax-for        att(vla-item (vla-get-blocks adoc) bname)

(if (eq (vla-get-objectname att) "AcDbAttributeDefinition")
(progn (setq prompts (cons (vla-get-promptstring att) prompts))
    (vla-put-tagstring att (strcase (vla-get-promptstring att)))
)
)

)
   (setq prompts (reverse prompts))

   (vlax-release-object obj)
   (vlax-for        layout        (vla-get-layouts adoc)
(vlax-for blk(vla-get-block layout)
(if (eq (vla-get-objectname blk) "AcDbBlockReference")
    (progn
    (if        (eq :vlax-false (vla-get-isdynamicblock blk))
      (setq blockname (vla-get-name blk))
      (setq blockname (vla-get-effectivename blk))
      )
    (if        (eq bname blockname)
      (progn
        (setq block_info nil)
        (setq ipt    (vla-get-insertionpoint blk)
              layer(vla-get-layer blk)
              rot    (vla-get-rotation blk)
              xscale (vla-get-xscalefactor blk)
              yscale (vla-get-yscalefactor blk)
              zscale (vla-get-zscalefactor blk)
              )
        (foreach att(vlax-invoke blk 'Getattributes)
          (setq        att_info (cons (car prompts)
                             (vla-get-textstring att)
                             )
                )
          (setq prompts (cdr prompts))
          (setq block_info (cons att_info block_info))
          )
        (setq block_info (reverse block_info))

        (setq new_block (vla-insertblock acsp ipt bname xscale yscale zscale rot))
        (vla-put-layer new_block layer)
        (setq atts (vlax-invoke new_block 'Getattributes))
        (foreach attatts
          (if (setq find (assoc (vla-get-tagstring att) block_info))
          (vla-put-textstring att (cdr find)))
          )
          )
        )
      )
    )
)
)
   )
   )
(princ)
)


(defun C:CTP(/)
(change-tags-by-prompts)
(princ)
)


(vl-load-com)
(princ "\n   ***   Type CTP to execute   **")
(prin1)

 
~'J'~

rarmstrong 发表于 2022-7-6 12:42:05

太棒了!!!!!非常感谢菲索。还有一件事要补充。。。创建的标记名与提示完全相同,并且包含标记名不喜欢的属性空格。有没有办法指定标签名。。。。。。。因此,带有“REV 1 DATE”提示的标签现在变成了“REV_1_DATE”,甚至更具体地说是“R1DATE”
 
干杯
页: [1] 2
查看完整版本: 用chan重新定义块