本帖最后由 stgpmin 于 2019-12-3 16:16 编辑
最近爬文寻找插入图块并更新块中块的方法,感谢Gu_xl大大的于2013年的源码提供。不过也许是CAD版本替换,导致程序运行失败
经过反覆debug,确认是标注的图块问题,因本人水平不高,只能先通过由标注的图块命名原则为字首“ _”,在图块名称中选择增加一行程序码,将标注图块筛选掉。若使用上有问题,可能是因为我使用繁体的关系,网友们可以自行修改掉这一行。
(=“ _”(substr(vla-get-name blk)1 1))
改善的,平时作业时图块命名就要避开以“ _”为字首。
另外因为本人使用上习惯将图块W出去,修改后再insert回来,所以增加了这个功能,能将欲插入的档案本身视为图块更新。
使用上要先拾取图档内欲更新的图块,此动作是为了快速获取图块名称,用substr指令应该也可以达成。
接着就是选择要插入的档案,若图块很多,会停止重新插入,然后就是插入图块,可以在选择插入点时按esc取消它,就完成更新图块的工作
再次感谢Gu_xl大大,解决我长久以来困扰的问题。这方式可以做为在多人协作时,不使用外部参考的解决方案。
- ;;插入圖塊,同時更新圖塊 By Gu_xl 2013.04.02
- (defun c:ibb (/ DWGNAME DBXDOC ACVER
- DBXMODELSPACE BLOCKS
- DOC DBXBLOCKNAMES
- OBJS
- )
- ;;獲取圖塊名稱
- (setq bss (entsel))
- (setq eN1 (car bss))
- (setq EN1_data (entget EN1))
- (setq b_name (cdr (assoc 2 EN1_data)))
-
- ;;結束
- (setq DwgName (GETFILED "選擇要插入的圖塊文件" "" "dwg" 4))
- (setq dwgname2 (strcat b_name "=" dwgname))
- (if (and
- DwgName
- (not
- (equal
- (strcase DwgName)
- (strcase (strcat (getvar "dwgprefix") (getvar "dwgname")))
- )
- )
- )
- (progn
- (setq
- DBXDOC (vla-GetInterfaceObject
- (vlax-get-acad-object)
- (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
- "ObjectDBX.AxDbDocument"
- (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
- )
- )
- )
- (vla-open DBXDOC DWGNAME)
- (setq DBXModelSpace (vla-get-ModelSpace DBXDOC))
- (setq blocks (vla-get-blocks
- (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
- )
- )
- (vlax-for blk (vla-get-blocks DBXDOC)
- (if (not (or (eq :vlax-true (vla-get-isXRef blk))
- (eq :vlax-true (vla-get-isLayout blk))
- (= "*U" (substr (vla-get-name blk) 1 2))
- (= "*D" (substr (vla-get-name blk) 1 2))
- (= "*T" (substr (vla-get-name blk) 1 2))
- (= "_" (substr (vla-get-name blk) 1 1))
- )
- )
- (setq dbxblocknames (cons (vla-get-name blk) dbxblocknames))
- )
- )
- (setq dbxblocknames
- (vl-remove-if-not '(lambda (x) (TBLSEARCH "BLOCK" x)) dbxblocknames)
- )
- (if dbxblocknames
- (progn
- (foreach block dbxblocknames
- (vlax-for obj (vla-item blocks block)
- (vla-delete obj)
- )
- (setq objs nil)
- (vlax-invoke
- dbxDoc
- 'CopyObjects
- (vlax-for a
- (vla-item (vla-get-blocks DBXDOC) block)
- (setq objs (cons a objs))
- )
- (vla-item blocks block)
- )
- )
- (vla-regen doc :vlax-true)
- (prompt (strcat "\n更新了" (itoa (length dbxblocknames)) "個圖塊!"))
- )
- (prompt "\n沒有可更新的圖塊!")
- )
- (vlax-release-object DBXDOC)
- (command "insert" DwgName2)
- (while (= 1 (logand (getvar 'cmdactive) 1))
- (command pause)
- )
- )
- )
- (princ)
- )
|