明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3963|回复: 13

[函数] 求通用函数,可以不打开图纸批量执行自定义函数

[复制链接]
发表于 2013-12-13 12:35:06 | 显示全部楼层 |阅读模式
300明经币
要求:通用函数,可批量不打开图纸的情况下,执行自定义函数,如查找替换字符串、获取导出字典、字体修改等,
其它同学有其它自定义函数要求的,可以参与回复。

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-12-13 14:57:25 | 显示全部楼层
前辈早就写过了
  1. ;| (xo-infdo fname vcol func) = dbx技术对文件内集合进行操作
  2. 参数: fname = cad文件(*.dwg格式)
  3.       vcol = 集合列表.如'(modelspace paperspace)
  4.       func = 操作函数名, 如: 'xx 或 '(lambda(x)....)
  5.              操作函数必须含一个变量(集合内实体). 如: (defun xx (x) ...)
  6. 返回: 分别操作的表(表内容根据函数来定义).
  7. 说明: vcol可以是如下集合:
  8. All Collection Objects(所有的集合实体:)
  9. Blocks   Dictionaries  DimStyles  funccuments  FileDependencies  Groups
  10. Hyperlinks  Layers  Linetypes  MenuBar  MenuGroups  ModelSpace  
  11. PaperSpace  PlotConfigurations  PopupMenu  PopupMenus  
  12. RegisteredApplications  SelectionSets  TextStyles  Toolbar
  13. Toolbars  UCSs  Viewports  Views
  14. |;
  15. (defun xo-infdo        (fname        vcol   func   /             doc    CNAME  RET
  16.                  VERKEY        DOC    E      ENT    I            REGKEY SS
  17.                  SSBLK        ATTS   BLKS   CDOC   CNAMES DOCS   llays
  18.                 )
  19.   (setq fname (strcase fname))
  20.   (print fname)
  21.   (setq cdoc (vla-get-activedocument (vlax-get-acad-object)))
  22.   (setq cname (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")))
  23.   ;; 当前文件名.
  24.   (vlax-for x (vlax-get (vlax-get-acad-object) 'documents)
  25.     (setq docs (cons x docs))
  26.   )
  27.   (setq        cnames
  28.          (mapcar
  29.            '(lambda (x)
  30.               (strcase (strcat (vla-get-path x) "\\" (vla-get-name x))
  31.               )
  32.             )
  33.            docs
  34.          )
  35.   )
  36.                                         ;(setq fname cname)
  37.   (if (member fname cnames)
  38.     (progn
  39.       ;; v1.5加入,锁定图层解锁.>>可放入为xo-infdo的参数.后补>>
  40.       (evaldo cdoc
  41.               (vla-get-layers cdoc)
  42.               '(lambda (x)
  43.                  (if (= :vlax-true (vla-get-lock x))
  44.                    (progn (setq llays (cons x llays))
  45.                           (vla-put-lock x :vlax-false)
  46.                    )
  47.                  )
  48.                )
  49.       )
  50.       (evalcur
  51.         (setq
  52.           doc (nth (- (length docs) (length (member fname cnames)))
  53.                    docs
  54.               )
  55.         )
  56.       )                                        ;处理当前文件,evalcur函数
  57.       (mapcar '(lambda (x) (vla-put-lock x :vlax-true)) llays)
  58.     )
  59.     ;; 处理非当前文件.
  60.     (progn
  61.       (setq verkey  (if        (> (atoi (getvar "AcadVer")) 15)
  62.                       ".16"
  63.                       ""
  64.                     )
  65.             *DBXDOC (vla-getinterfaceobject
  66.                       (vlax-get-acad-object)
  67.                       (strcat "ObjectDBX.AxDbDocument" verkey)
  68.                     )
  69.       )
  70.       (vla-open *dbxdoc fname :vlax-false) ;open
  71.       ;; v1.5加入,锁定图层解锁.>>可放入为xo-infdo的参数.后补>>
  72.       (evaldo *dbxdoc
  73.               (vla-get-layers *dbxdoc)
  74.               '(lambda (x)
  75.                  (if (= :vlax-true (vla-get-lock x))
  76.                    (progn (setq llays (cons x llays))
  77.                           (vla-put-lock x :vlax-false)
  78.                    )
  79.                  )
  80.                )
  81.       )
  82.       ;;
  83.       (setq
  84.         ret (mapcar '(lambda (x)
  85.                        (evaldo *dbxdoc (vlax-get *dbxdoc x) func)
  86.                                         ;evaldo 函数
  87.                      )
  88.                     vcol
  89.             )
  90.       )                                        ;(vlax-dump-object *dbxdoc T)
  91.       ;; v1.5加入,锁定图层解锁恢复>>
  92.       (mapcar '(lambda (x) (vla-put-lock x :vlax-true)) llays)
  93.       ;;
  94.       (vlax-invoke *dbxdoc 'saveas fname)
  95.       (vlax-release-object *dbxdoc)
  96.     )
  97.   )
  98.   ret
  99. )
回复

使用道具 举报

 楼主| 发表于 2013-12-13 15:17:25 | 显示全部楼层
阿然 发表于 2013-12-13 14:57
前辈早就写过了

能改写一下变成完整程序吗?就是不打开图纸,完成图纸内MTEXT和TEXT字体的转变
回复

使用道具 举报

 楼主| 发表于 2013-12-13 20:47:15 | 显示全部楼层
阿然 发表于 2013-12-13 14:57
前辈早就写过了

能否写个简单的例子,自定义是函数是在每个DWG文档中画条线(command "line" (list 0 0) (list 2 7) "")
func = 操作函数名, 如: 'xx 或 '(lambda(x)....)
             操作函数必须含一个变量(集合内实体). 如: (defun xx (x) ...)
这句话说必须含一个变量(集合内实体),这句不能理解。
回复

使用道具 举报

 楼主| 发表于 2013-12-14 22:11:15 | 显示全部楼层
有没有人点拨一下啊
回复

使用道具 举报

 楼主| 发表于 2013-12-16 21:18:00 | 显示全部楼层
悬赏贴掉的无影无踪
回复

使用道具 举报

发表于 2013-12-16 21:25:24 | 显示全部楼层
帮顶
回复

使用道具 举报

发表于 2013-12-16 23:28:28 | 显示全部楼层
革天明 发表于 2013-12-13 20:47
能否写个简单的例子,自定义是函数是在每个DWG文档中画条线(command "line" (list 0 0) (list 2 7) "")
...

自定义函数不能有Command命令,必须全部使用VLA函数来编辑objectdbx文档!
否则你可以参考猫老师的这个帖子:http://bbs.mjtd.com/thread-108697-1-1.html
回复

使用道具 举报

 楼主| 发表于 2013-12-17 08:56:32 | 显示全部楼层
Lisper 发表于 2013-12-16 23:28
自定义函数不能有Command命令,必须全部使用VLA函数来编辑objectdbx文档!
否则你可以参考猫老师的这个帖 ...

谢谢指点,去学习一下
回复

使用道具 举报

发表于 2015-7-23 20:22:35 来自手机 | 显示全部楼层
留名@_@^o^
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 05:53 , Processed in 0.170659 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表