irneb 发表于 2022-7-6 07:16:25

作为示例,这是您的代码的ODBX版本
(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))

Lee Mac 发表于 2022-7-6 07:23:44

 
 
很抱歉,我知道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]
查看完整版本: 跨多个