乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: gekusei88

[编程交流] 跨多个

[复制链接]

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 07:16:25 | 显示全部楼层
作为示例,这是您的代码的ODBX版本
  1. (vl-load-com)
  2. ;;; Gets the ODBX object for use on external DWGs
  3. (defun DBX:GetODBX-Object  (/ classname Register)
  4. (defun Register  (classname filename / server acver)
  5.    (cond
  6.      ((not (and classname filename))
  7.       (Register (strcat "ObjectDBX.AxDbDocument." (itoa (setq acver (atoi (getvar 'ACadVer)))))
  8.                 (strcat "AxDb" (itoa acver) ".dll")))
  9.      ((vl-registry-read (strcat "HKEY_CLASSES_ROOT\" classname "\\CLSID")) classname)
  10.      ((and (setq server (findfile filename))
  11.            (startapp "regsvr32.exe" (strcat "/s "" dll """))
  12.            (vl-registry-read (strcat "HKEY_CLASSES_ROOT\" classname "\\CLSID")))
  13.       classname)))
  14. (if (setq classname (Register nil nil))
  15.    (vla-getinterfaceobject (vlax-get-acad-object) classname)))
  16. ;;; Asks user to choose a folder and returns the paths to all DWGs in that folder
  17. (defun BLC:GetDWGs  (/ path)
  18. (if (setq path (getfiled "\nSelect File from Directory to Read: " "" "dwg" 0))
  19.    (mapcar (function (lambda (filename) (strcat path "\" filename)))
  20.            (vl-directory-files (setq path (vl-filename-directory path)) "*.dwg" 1))))
  21. ;;; Runs a function on each DWG in the list, passing a Document object to the function
  22. (defun BLC:RunDWGs  (dwgList code / odbx result)
  23. (setq result
  24.         (cond ((vl-catch-all-error-p (setq odbx (vl-catch-all-apply 'DBX:GetODBX-Object))) nil)
  25.               (t (mapcar
  26.                    (function
  27.                      (lambda (path / result)
  28.                        (cond ((vl-catch-all-error-p (vl-catch-all-apply 'vla-Open (list odbx path))) nil)
  29.                              (t (setq result (vl-catch-all-apply code (list odbx)))
  30.                                 (vl-catch-all-apply 'vla-Close (list odbx))
  31.                                 (cons path result)))))
  32.                    dwgList))))
  33. (cond (odbx (vl-catch-all-apply 'vlax-release-object (list odbx))))
  34. result)
  35. ;;; Asks user to pick an object & a folder of DWG's to set all their corresponding layers
  36. ;;; to the same colour as the object's layer
  37. (defun c:BatchLayCol (/ ent lay col files DoChange)
  38. (if (and (setq ent (entsel))
  39.           (setq files (BLC:GetDWGs))
  40.           (setq ent (vlax-ename->vla-object (car ent)))
  41.           (setq lay (vla-Item (vla-get-Layers (vla-get-Document ent)) (vla-get-Layer ent)))
  42.           (setq col (vla-get-Color lay)))
  43.    (progn (defun DoChange (doc / )
  44.             (vla-put-Color (vla-Item (vla-get-Layers doc) (vla-get-Name lay)) col)
  45.             (vla-SaveAs doc (vla-get-Name doc))
  46.             "done")
  47.           (foreach result (BLC:RunDWGs files 'DoChange)
  48.             (princ "\n")
  49.             (princ (car result))
  50.             (princ "\t")
  51.             (princ (cond ((vl-catch-all-error-p (cdr result))
  52.                           (cond ((wcmatch (strcase (setq result (vl-catch-all-error-message (cdr result)))) "*DESCRIPTION WAS NOT PROVIDED*")
  53.                                  "File read-only or opened by someone else.")
  54.                                 (result)))
  55.                          (t (cdr result)))))))
  56. (command "_TextScr")
  57. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 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仍然是一个非常强大的工具,可以实现非常快速的图形批处理,我继续使用该技术进行数据提取,但我认为该界面在批处理图形编辑领域的用途有限。
 
对不起,这篇文章!
 
 
不客气,如果你还有什么问题,尽管问。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 18:48 , Processed in 0.574161 second(s), 54 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表