明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2272|回复: 3

[原创]导入DBX文档中的图层组过滤器

  [复制链接]
发表于 2007-5-10 12:40 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-5-10 12:44:18 编辑

图层组过滤器很适合在项目中使用。
但插入已经定义好过滤器的DWG文件时,不能插入组过滤器。
在网上只有删除组过滤器的,找不到创建组过滤器的代码。
So,写了下面的代码。
  1. ;;;==============================================================================
  2. ;;; 函数名: ImportDbxAclyDictionary
  3. ;;; 功  能: 导入DBX文档中的图层组过滤器。
  4. ;;; 作  者: 陈Q
  5. ;;; 日  期: 2007-05-05
  6. ;;; 版  本: 1.00
  7. ;;; 参数     类型
  8. ;;;  DbxDoc DBX文档对象。
  9. ;;; 返回值:
  10. ;;;  无
  11. ;;; 调  试:
  12. ;;; (setq DbxDoc (OpenDbxDocument (findfile (LuGetDefine "模板文件"))))
  13. ;;; (ImportDbxLayers DbxDoc)
  14. ;;; (ImportDbxAclyDictionary DbxDoc)
  15. ;;; (CloseDbxDocFromument DbxDoc)
  16. ;;; 修改历史纪录
  17. ;;; 版本 修改时间 修改人 修改内容
  18. ;;;==============================================================================
  19. (defun ImportDbxAclyDictionary (DbxDoc / AssocLst ColFrom ColTo DbxDocTo DictName Edata ExDictFrom ExDictTo LayerLst Layers Types Values XrecName)
  20.   (setq DictName   "ACLYDICTIONARY"
  21. DbxDocTo   (vla-get-activedocument (vlax-get-acad-object))
  22. ExDictFrom (vla-getextensiondictionary (vla-get-layers DbxDoc))
  23. ExDictTo   (vla-getextensiondictionary (vla-get-layers DbxDocTo))
  24. ColFrom    (vl-catch-all-apply 'vla-item (list ExDictFrom DictName))
  25. ColTo    (vl-catch-all-apply 'vla-item (list ExDictTo DictName))
  26.   ) ;_ End setq
  27.   ;; DBX文档中含在对象时才处理。
  28.   (if (not (vl-catch-all-error-p ColFrom))
  29.     (progn
  30.       ;; 读取图层数据。
  31.       (setq LayerLst nil)
  32.       (vlax-for ObjLayer (vla-get-layers DbxDocTo)
  33. (setq LayerLst (cons (list (vla-get-name ObjLayer) (vlax-vla-object->ename ObjLayer)) LayerLst))
  34.       ) ;_ End vlax-for
  35.       ;; 当前文档没有该对象时,先创建。
  36.       (if (vl-catch-all-error-p ColTo)
  37. (setq ColTo (vla-addobject ExDictTo DictName "AcDbDictionary"))
  38.       ) ;_ End if
  39.       ;; 复制过滤器
  40.       ;; 调试 (setq FilterFrom (vla-item ColFrom 1))
  41.       (vlax-for FilterFrom ColFrom
  42. (vla-getxrecorddata FilterFrom 'Types 'Values)
  43. (setq Types    (vlax-safearray->list Types)
  44.        Values   (vlax-safearray->list Values)
  45.        AssocLst (mapcar 'cons Types Values)
  46.        XrecName (vlax-variant-value (cdr (assoc 300 AssocLst)))
  47.        Layers   (vl-remove-if-not (function (lambda (_x) (= 330 (car _x)))) AssocLst)
  48.        Layers   (mapcar (function
  49.      (lambda (_x)
  50.        (vla-get-name
  51.          (vla-objectidtoobject DbxDocTo (car (vlax-safearray->list (vlax-variant-value (cdr _x)))))
  52.        ) ;_ End vla-get-name
  53.      ) ;_ End lambda
  54.           ) ;_ End function
  55.           Layers
  56.          ) ;_ End mapcar
  57.        ;; 创建对象。
  58.        Edata    (entget (vlax-vla-object->ename (vla-addxrecord ColTo XrecName)))
  59.        Edata    (append Edata
  60.           (list '(1 . "AcLyLayerGroup") '(90 . 1) (cons 300 XrecName))
  61.           (mapcar (function (lambda (_x)
  62.          (if (setq _x (cadr (assoc _x LayerLst)))
  63.            (cons 330 _x)
  64.            (*break* (strcat "缺省图层【" _x "】。"))
  65.          ) ;_ End if
  66.        ) ;_ End lambda
  67.            ) ;_ End function
  68.            Layers
  69.           ) ;_ End mapcar
  70.          ) ;_ End append
  71. ) ;_ End setq
  72. ;; 更新对象。
  73. (if (not (entmod Edata))
  74.    (*break* (strcat "不能更新对象数据【" (vl-princ-to-string Edata) "】。"))
  75. ) ;_ End if
  76.       ) ;_ End vlax-for
  77.     ) ;_ End progn
  78.   ) ;_ End if
  79. ) ;_ End defun
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-5-10 17:06 | 显示全部楼层
把所有要用到的函數貼上,並寫完整點好嗎?謝謝!
 楼主| 发表于 2007-5-10 18:26 | 显示全部楼层
本帖最后由 作者 于 2007-5-11 11:56:18 编辑

全扔出来,呵呵。
可能还涉及到其它的一些函数,发现再添加吧。

添加了对下一级组过滤器的处理。 


更新一下,处理了子过滤器,并提供了过滤器查询函数。[2007-05-11]

;;; 函数列表[CommonDictionary.lsp]
;;; GetAclyLayers  得到指定图层组过滤器中的层。
;;; DeleteAllLayerFilters 删除所有图层特性过滤器。
;;; DeleteAllAclyDictionary 删除所有图层组过滤器。

;;; 函数列表[CommonObjectDBX.LSP]
;;; DbxRegister   注册ObjectDBX
;;; DllRegister   以静默方式注册一个DLL文件
;;; DllUnRegister  以静默方式卸载一个DLL文件
;;; ProgId->ClassId  返回注册表中指定的ProgId项
;;; DbxGetTable   得到ObjectDBX打开文档中指定的符号表对象
;;; DbxGetTableList  得到ObjectDBX打开文档中指定的符号名称列表
;;; OpenDbxDocument  以DBX方式打开Dwg文件。
;;; CloseDbxDocument  关闭DBX文档。
;;; DbxCopyObjects   复制DBX中的对象到当前图形。
;;; ImportDbxLayers  导入DBX文档中的图层。
;;; ImportDbxBlocks  导入DBX文档中的图块。
;;; ImportDbxTextStyles  导入DBX文档中的文字样式。
;;; ImportDbxLayerFilters 导入DBX文档中的图层特性过滤器。
;;; ImportDbxAclyDictionary 导入DBX文档中的图层组过滤器。

;;; 函数列表[CommonFuntion.lsp]
;;; EdataUpdate 更新对象数据
;;; *break* 中断程序。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +1 金钱 +5 贡献 +5 激情 +5 收起 理由
龙龙仔 + 1 + 1 + 5 + 5 + 5 【好评】好程序

查看全部评分

发表于 2018-4-15 11:25 | 显示全部楼层
感谢版主程序,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-26 23:14 , Processed in 0.163364 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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