明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 955|回复: 7

[讨论] 如何将CAD中全局变量保存到VLX的全局词典当中,并方便管理?

[复制链接]
发表于 2019-6-2 17:34:29 | 显示全部楼层 |阅读模式
本帖最后由 bietianshen 于 2019-6-2 21:35 编辑

如何将CAD中全局变量保存到VLX的全局词典当中?
我使用vlax-ldata-put函数在保存了若干个私有数据,其中有未知数目的dict,每个dict下有若干个key值对应的数据。
在我想取出对应数据的时候,如何获知当前所有的私有数据的个数,如何遍历所有私有数据?
向各位大神求助!!!!有劳大家

发表于 2019-6-4 09:27:39 | 显示全部楼层
bietianshen 发表于 2019-6-3 23:35
真地十分感谢第一位光顾这条帖子的satan421大佬。从你的回答中,我觉得有所收获;
首先我重新解释一下为 ...

;;一点个人看法,并没有大佬。。。

;;是我没完全理解你的意思,我以为数目未知,但dick和key都是已知的(可能创建了,也可能没创建),那你就可以把所有dict和key分别组成表,用lambda处理dict和key组成的表得到你想要的组合,再用mapcar结合vlax-ldata-get依次去检测每个组合是否能得到数据

;;现在我的理解是,你想在每个文档加载DCL的时候,将这个文档的词典数据读取并显示到DCL

;;我不太明白的是:
;;词典的dict和key都是不确定的话,这个词典是怎么创建的啊,循环赋值?那应该也有规律吧
;;貌似不能不指定dict和key就创建词典吧

;;为什么要用嵌套的多级表,跟DCL有关?

;;如果非要遍历的话,那就先(entget(namedobjdict)),得到一个表
;;将表中的非目标项剔除,比如没有自定义词典时候的项是(不同版本等情况是否一样需要检验):
  1. ((-1 . <图元名: 7ff48ac218c0>) (0 . "DICTIONARY") (330 . <图元名: 0>) (5 . "C") (100 . "AcDbDictionary") (280 . 0) (281 . 1) (3 . "ACAD_CIP_PREVIOUS_PRODUCT_INFO") (350 . <图元名: 7ff48ac239e0>) (3 . "ACAD_COLOR") (350 . <图元名: 7ff48ac21bb0>) (3 . "ACAD_DETAILVIEWSTYLE") (350 . <图元名: 7ff48ac23a30>) (3 . "ACAD_GROUP") (350 . <图元名: 7ff48ac218d0>) (3 . "ACAD_IMAGE_DICT") (350 . <图元名: 7ff48ac27760>) (3 . "ACAD_IMAGE_VARS") (350 . <图元名: 7ff48ac27770>) (3 . "ACAD_LAYOUT") (350 . <图元名: 7ff48ac219a0>) (3 . "ACAD_MATERIAL") (350 . <图元名: 7ff48ac21ba0>) (3 . "ACAD_MLEADERSTYLE") (350 . <图元名: 7ff48ac23150>) (3 . "ACAD_MLINESTYLE") (350 . <图元名: 7ff48ac21970>) (3 . "ACAD_PLOTSETTINGS") (350 . <图元名: 7ff48ac21990>) (3 . "ACAD_PLOTSTYLENAME") (350 . <图元名: 7ff48ac218e0>) (3 . "ACAD_SCALELIST") (350 . <图元名: 7ff48ac230c0>) (3 . "ACAD_SECTIONVIEWSTYLE") (350 . <图元名: 7ff48ac23a10>) (3 . "ACAD_TABLESTYLE") (350 . <图元名: 7ff48ac21c60>) (3 . "ACAD_VISUALSTYLE") (350 . <图元名: 7ff48ac21ef0>) (3 . "AcDbVariableDictionary") (350 . <图元名: 7ff48ac21ae0>))


;;比如我随便定义两个
  1. (mapcar 'vlax-ldata-put '("A" "B") '("a" "b") '(0 1))


;;再(entget(namedobjdict)),剔除之前(entget(namedobjdict))得到的,就剩下((3 "A") (350 <图元名: 7ff48ac71550>) (3 "B") (350 <图元名: 7ff48ac71570>)) (此前将点对处理成表了)
;;(3 "A") (3 "B")就是你要的了
;;想起来还有vlax-ldata-list这个函数,(mapcar 'vlax-ldata-list '("A" "B"))->((("a" . 0)) (("b" . 1)))
回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-3 13:00:23 | 显示全部楼层
;;你存了多少私有数据,应该记录一下,可以也存到词典里,然后先读取这个记录,再根据记录去找
;;(entget(namedobjdict))可以得到一些你想要的,但是包含很多系统的东西,也可以根据条件把系统的剔除,剩下的应该就是用户定义的(当然,可能不止你一个人定义的)
;;最简单就是把所有的dict都vlax-ldata-get一下,先看有没有,再看是不是你的(当然,仍然有不是你的的可能)
 楼主| 发表于 2019-6-3 23:35:30 | 显示全部楼层
satan421 发表于 2019-6-3 13:00
;;你存了多少私有数据,应该记录一下,可以也存到词典里,然后先读取这个记录,再根据记录去找
;;(entget( ...

真地十分感谢第一位光顾这条帖子的satan421大佬。从你的回答中,我觉得有所收获;
首先我重新解释一下为什么我会想到存储若干个未知数目的私有数据到词典。
1.因为我在DCL中用户输入的数据整理到了一个单独的表变量当中,这个表是个多级的套表,表里面的元素可能是数字、字符串、子表;
2.我想要将这整个大表内的所有数据都存储到一个外部相对方便安全的位置(可以让下一次登录CAD程序且加载了LISP之后,在DCL中直接再次展示我所记录的数据);
3.由于这个历史数据的表内部元素众多,据我所知(我是个小白,疯狂查资料也仅此而已),一个字典dict可被视为一个单纯的表(表内仅存储字符串),那么我想要存储大量的套表将需要运用到非常多的dict,使其完成多级表的功能。
      最后,多谢satan421大佬的提醒,我才理解到了第3点(之前脑袋已经抛锚了)。通过这点我相信问题已经得以解决。
      不过大佬在后面所提到的,使用vlax-ldata-get把所有dict都找一遍,这点我还是没有弄懂如何完成,因为在我不知道所有dict的名称的条件下,要如何才能把所有的dict都找一遍呢?是否有类似与对list使用foreach功能的函数,来对dict进行查询呢?对于遍历的问题我还是很感兴趣,感谢大佬不吝赐教!
 楼主| 发表于 2019-6-5 04:45:11 | 显示全部楼层
本帖最后由 bietianshen 于 2019-6-5 05:09 编辑
satan421 发表于 2019-6-4 09:27
;;一点个人看法,并没有大佬。。。

;;是我没完全理解你的意思,我以为数目未知,但dick和key都是已知 ...

谢谢前辈认真辛苦的回复,我基本明白了应该如何处理现在的问题了。
;;首先我想说,前辈现在的理解已经基本跟我的意图差不多了;
;;然后,我之前之所以说词典的名称不确定是因为,词典太多我想利用循环n的方式去给词典定义新名称,至于n的个数取决于历史数据的数目,所以我无法得知。现在通过你的方式我明白了解决方案,专门做一个词典来保存那些不确定的词典名称就好了。
;;!!再者,保存数据之所以使用嵌套的多级表,可能是因为我是小白的关系,暂且只想到了通过多级表的方式,将每组历史数据成套保存。因为我的DCL当中有几个输入窗口其数据是具有关联性的。如果前辈有更好的数据存储方式,希望前辈能指点迷津。
;;再补充一条,我之所以想要遍历词典数据,是因为之前担忧盲目地构建词典的话,如果没有及时删除自己在创建词典过程中的每一个词典,好像会导致数据量不断膨胀,所以没有弄清楚之前不敢轻易尝试,望理解。
;;番外,我今天在查找如何删除自己创建词典的方法,只找到了vlax-ldata-delete这个来删除词典中数据。从概念上来看,好像并不是删除词典本身。然后我看到了、来自https://blog.csdn.net/yxp_xa/article/details/72228819的一个关于字典的介绍,对于其中创建的字典,我不知道是否与vlax-ldata-put方式创造的词典是否相同,能否通过该网站上介绍的方式去创建和毁灭。在这点上希望前辈能稍作指导。
;;最后,通过前辈的举例,我基本了解了想要获取自己创建词典数据的方法。十分感谢!!


发表于 2019-6-5 09:53:11 | 显示全部楼层
Alisp与Vlisp方法所创建的词典貌似是不一样的(具体我不了解,也不确定),你可以测试一下
我个人觉得词典比较灵活,至于是采用多个词典存储数据还是采用少数词典存储嵌套的数据,也应该是视具体情况而定
发表于 2019-6-5 10:24:29 | 显示全部楼层
想起来一个函数 dictsearch,用这个函数会方便一些
eg: (dictsearch (namedobjdict) "A")
 楼主| 发表于 2019-6-5 11:10:28 | 显示全部楼层
satan421 发表于 2019-6-5 10:24
想起来一个函数 dictsearch,用这个函数会方便一些
eg: (dictsearch (namedobjdict) "A")

感谢前辈的解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 00:51 , Processed in 0.151425 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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