(vl-load-com)
;;; Gets the ODBX object for use on external DWGs
(defun DBX:GetODBX-Object(/ classname Register)
(defun Register(classname filename / server acver)
(cond
((not (and classname filename))
(Register (strcat "ObjectDBX.AxDbDocument." (itoa (setq acver (atoi (getvar 'ACadVer)))))
(strcat "AxDb" (itoa acver) ".dll")))
((vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" classname "\\CLSID")) classname)
((and (setq server (findfile filename))
(startapp "regsvr32.exe" (strcat "/s \"" dll "\""))
(vl-registry-read (strcat "HKEY_CLASSES_ROOT\\" classname "\\CLSID")))
classname)))
(if (setq classname (Register nil nil))
(vla-getinterfaceobject (vlax-get-acad-object) classname)))
;;; Asks user to choose a folder and returns the paths to all DWGs in that folder
(defun BLC:GetDWGs(/ path)
(if (setq path (getfiled "\nSelect File from Directory to Read: " "" "dwg" 0))
(mapcar (function (lambda (filename) (strcat path "\\" filename)))
(vl-directory-files (setq path (vl-filename-directory path)) "*.dwg" 1))))
;;; Runs a function on each DWG in the list, passing a Document object to the function
(defun BLC:RunDWGs(dwgList code / odbx result)
(setq result
(cond ((vl-catch-all-error-p (setq odbx (vl-catch-all-apply 'DBX:GetODBX-Object))) nil)
(t (mapcar
(function
(lambda (path / result)
(cond ((vl-catch-all-error-p (vl-catch-all-apply 'vla-Open (list odbx path))) nil)
(t (setq result (vl-catch-all-apply code (list odbx)))
(vl-catch-all-apply 'vla-Close (list odbx))
(cons path result)))))
dwgList))))
(cond (odbx (vl-catch-all-apply 'vlax-release-object (list odbx))))
result)
;;; Asks user to pick an object & a folder of DWG's to set all their corresponding layers
;;; to the same colour as the object's layer
(defun c:BatchLayCol (/ ent lay col files DoChange)
(if (and (setq ent (entsel))
(setq files (BLC:GetDWGs))
(setq ent (vlax-ename->vla-object (car ent)))
(setq lay (vla-Item (vla-get-Layers (vla-get-Document ent)) (vla-get-Layer ent)))
(setq col (vla-get-Color lay)))
(progn (defun DoChange (doc / )
(vla-put-Color (vla-Item (vla-get-Layers doc) (vla-get-Name lay)) col)
(vla-SaveAs doc (vla-get-Name doc))
"done")
(foreach result (BLC:RunDWGs files 'DoChange)
(princ "\n")
(princ (car result))
(princ "\t")
(princ (cond ((vl-catch-all-error-p (cdr result))
(cond ((wcmatch (strcase (setq result (vl-catch-all-error-message (cdr result)))) "*DESCRIPTION WAS NOT PROVIDED*")
"File read-only or opened by someone else.")
(result)))
(t (cdr result)))))))
(command "_TextScr")
(princ))
很抱歉,我知道Batch Standards Checker实用程序存在,但作为一名程序员而不是绘图员,我承认我很少使用它。
谢谢葛库塞,你这么说真是太好了。
批属性编辑器程序是我最新开发的通用属性编辑程序版本;在前一个版本:我的全局属性编辑器中,我使用ObjectDBX(正如Irnéb在本线程中所建议的)修改多个图形中的属性值,但是,由于GUI设计不佳,该程序只允许修改单个块的所有引用中的属性值,而不允许修改图形中的多个块。此外,用户只能处理整个图形目录,而不是选择要处理的单个图形,这是我最近的程序允许的。
在这一点上,您可能会觉得奇怪,对于最近开发的程序,我会选择使用脚本作为批处理引擎,而不是表面上更先进的ObjectDBX技术,然而,尽管ObjectDBX在从一组图形中提取数据时功能强大,但这种未开发的技术在用于编辑时有几个缺点。
不幸的是,Autodesk从未完全开发ObjectDBX(或具有ActiveX的Visual LISP),因为他们的工作已经转移到功能更强大的领域。NET框架;因此,ObjectDBX接口有几个已知错误(可能还有更多未知错误有待发现)。
提供一些示例:当通过ObjectDBX保存图形时,不能为ActiveX saveas方法指定版本参数,所有图形随后必须保存为本机版本(即主机应用程序中可用的最高版本)[例如,在AutoCAD 2013中运行全局属性编辑器程序将导致将所有处理过的图形保存为2013格式,这通常不适用于大多数公司,因为公司政策通常涉及保存到较低版本以实现兼容性];相反,请注意,脚本引擎将遵循“选项”菜单中指定的保存版本。
此外,使用ObjectDBX保存图形会导致图形缩略图丢失,直到下一次手动保存;这通常不会对大多数用户造成太大危害,但是,这是一个小麻烦,可以通过使用脚本处理引擎再次避免。
然而,更重要的是,在使用ObjectDBX处理的图形中编辑文本或属性对象时,会出现更突出的错误:如果文本或属性对象具有非左对齐,则文本或属性位置不会更新以反映内容修改后的对齐设置。在我的全局属性编辑器程序中,我试图通过包含一个单独的子函数来解释这个已知的错误,该子函数根据所讨论对象的内容、文本大小和文本样式计算位移来移动文本位置——然而,这远不理想。同样,当使用脚本处理引擎时,这个问题不会出现。
总之,ObjectDBX仍然是一个非常强大的工具,可以实现非常快速的图形批处理,我继续使用该技术进行数据提取,但我认为该界面在批处理图形编辑领域的用途有限。
对不起,这篇文章!
不客气,如果你还有什么问题,尽管问。
页:
1
[2]