找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6241|回复: 23

[求助]:请教efan2000,如何在VBA里面存取LDATA数据?

[复制链接]
发表于 2002-11-11 15:41:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
请教efan2000,如何在VBA里面存取LDATA数据?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-12 09:44:27 | 显示全部楼层
不知你指的是不是XDATA数据。

  1.   [FONT=courier new]

  2. Sub Test()
  3.     ' 创建直线
  4.     Dim lineObj As AcadLine
  5.     Dim startPt(0 To 2) As Double, endPt(0 To 2) As Double
  6.     startPt(0) = 1#: startPt(1) = 1#: startPt(2) = 0#
  7.     endPt(0) = 5#: endPt(1) = 5#: endPt(2) = 0#
  8.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt)
  9.     ' 创建扩展数据
  10.     Dim DataType(0 To 1) As Integer
  11.     Dim Data(0 To 1) As Variant
  12.     Dim reals3(0 To 2) As Double
  13.     Dim worldPos(0 To 2) As Double
  14.     DataType(0) = 1001: Data(0) = "Test_Application" '应用程序名
  15.     DataType(1) = 1000: Data(1) = "This is a test for xdata" '字符串类型
  16.     lineObj.SetXData DataType, Data '设置扩展数据
  17.     ' 返回直线的扩展数据
  18.     Dim xdataOut As Variant
  19.     Dim xtypeOut As Variant
  20.     lineObj.GetXData "Test_Application", xtypeOut, xdataOut
  21. End Sub
  22.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 21:48:46 | 显示全部楼层
LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据。当vlax-ldata-put第一个参数为指定全局词典的字符串时,VBA可以通过命名词典“看到”数据,当第一个参数为图元对象时,VBA只能判断出实体具有扩展词典,但“看不到”数据,所以目前还只能用vlax-ldata-**族函数处理LDATA,VBA存取不行。你是想要在Vlisp和VBA之间传递数据吧?可以找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 21:50:23 | 显示全部楼层
最初由 灯火 发布
[B]LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据,即没有保存在命名词典,也没有保存在实体的扩展词典中,目前还只能用vlax-ldata-**族函数处理,VBA存取没门。你是想要在Vlisp和VBA之间传递数据吧?可以?.. [/B]


哥哥,那你说保存在哪里了呢?:c :c
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 22:04:29 | 显示全部楼层
XD老弟,LDATA保存在DWG中是无疑的,只是地点没有“暴露”给VBA,所以VBA无法存取,这和其他一些第三方程序自定对象数据不能存取是一个道理。类似的东西还有一些,实际上这是因为AutoCAD对象模型还不够完善。如果有朝一日AutoCAD能像Office一样录制宏,则对象模型才算确定。这个LDATA对于使用VL和VBA混合编程并需要在两者之间传递数据的人有些误导作用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 22:16:13 | 显示全部楼层
:)拿试验来说话


下载地址:http://www.xdcad.net/tech/dev/ldata-1.swf

<embed src=http://www.xdcad.net/tech/dev/ldata-1.swf quality=high width=512 height=482 loop=true type="application/x-shockwave-flash">
</embed>

所以,既然保存在命名词典根下,就有办法得到它,用VLISP,VBA,ARX
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 22:21:24 | 显示全部楼层
最初由 XDSoft 发布
[B]:)拿试验来说话
[/B]


晓东把它们之间的联系方法说清楚点嘛,我想。。。

最初由 灯火 发布
[B]:)你是想要在Vlisp和VBA之间传递数据吧?可以找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。
[/B]


灯火:你能告诉我传递的方法吗?我好想知道!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 22:44:12 | 显示全部楼层
最初由 黄卫文 发布
[B]

晓东把它们之间的联系方法说清楚点嘛,我想。。。

[QUOTE]最初由 灯火 发布
[B]:)你是想要在Vlisp和VBA之间传递数据吧?可?.. [/B]


大家注意了上面图中的XDTB_TEST项最后的vlo_VL了吗?

VLISP的LDATA数据附着在一个名字为vlo_VL的类的定制对象,并和这个对象一起添加到命名对象词典中。但是,这个自定义对象不能单独的借助用VBA的对象模型存取,不能用VBA创建自定义对象、实体。只能通过ObjectARX创建一个ActiveX接口,才能让VBA使用它。目前并没有直接的接口或者Automation server直接使用。

但是,AutoCAD 2000 Visual LISP Automation server 有一个未公开支持的接口,可以作为VBA宏和LISP环境的搭桥,进行相互间数据的存取。

下面代码演示了如何用VBA读VLISP的LDATA数据。

卫文、灯火哥哥和大家再继续讨论讨论吧。

游客,如果您要查看本帖隐藏内容请回复
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 23:31:41 | 显示全部楼层
To XD:演示做得好快!旁边那个东西是ARX写的吧?当然不会有问题,试一下把LDATA附加给实体,它也也显示得很好,但VBA却不容易识别。

To 黄卫文:VL.Application的方法虽然可行,和vla-Eval调用VBA函数一样,不是十分“正经”。应该让Vlisp和VBA各做其擅长的事情而无需论其长短,二者需要传递数据时用Dictionary和Xrecord更为舒畅自然。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 23:34:46 | 显示全部楼层
最初由 灯火 发布
[B]To XD:演示做得好快!旁边那个东西是ARX写的吧?当然不会有问题,试一下把LDATA附加给实体,它也也显示得很好,但VBA却不容易识别。

To 黄卫文:VL.Application的方法虽然可行,和vla-Eval调用VBA函数一样,不是... [/B]


教你,你也不学:),演示就是捕捉下输入,几分钟的事情。

旁边那个东西,是INSPECTOR工具,论坛提供给大家了,可以看到ACAD数据库内部的秘密。不是因为是ARX写的,就能看到,而是通过它,知道LDATA准确的存放位置(在词典中),不读,LDATA也是放在那里:),只是LDATA是和一个自定义对象捆绑,就如非实体数据通过“扩展记录XRecord捆绑,才能放入词典中一样,因为词典中的对象,必须是AcDbObject类派生的。

不管什么,能通讯就可以了,不行的话,就用ARX吧。

灯火,你说可以传递2GB数据,能说说吗,给大家?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-12 23:54:56 | 显示全部楼层
Xrecord是一个任意数据的容器,它提供了比xdata更灵活的附加数据的办法,Xrecord能包含2GB的任意数据,特别适合不同开发语言之间传递数据,有用的保留在DWG,临时的完事就删除。有时VBA和Excel交互大量数据,完成计算,生成图形时Vlisp又方便一些,如果双方代码都比较长就不适合VL.Application方法,那种方法让人眼花缭乱,不如把数据传递过去,用Vlisp干干净净地写。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 23:57:15 | 显示全部楼层
最初由 灯火 发布
[B]Xrecord是一个任意数据的容器,它提供了比xdata更灵活的附加数据的办法,Xrecord能包含2GB的任意数据,特别适合不同开发语言之间传递数据,有用的保留在DWG,临时的完事就删除。有时VBA和Excel交互大量数据,完成计?.. [/B]


不谋而合,灯火,能给大家贴个实例,讲讲VBA如何把数据写到XRecord,LISP又是如何提取处理的代码吗?先谢谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-13 00:05:26 | 显示全部楼层
** 1-VBA传出

  1. [FONT=courier new]
  2. '
  3. '设置指定词典扩展记录
  4. '
  5. Public Function Dhvb_SetXrecord(objDict As AcadDictionary, _
  6.                                 XRecordName As String, _
  7.                                 XRecordData As Variant) _
  8.        As AcadXRecord

  9.     Dim objXRecord As AcadXRecord
  10.     Dim XRecordType As Variant
  11.     Dim i As Long

  12.     '检察对象词典是否有该名扩展记录,如果已经存在则删除
  13.     On Error Resume Next
  14.     Set objXRecord = objDict.GetObject(XRecordName)
  15.     If Not objXRecord Is Nothing Then
  16.         objDict.Remove XRecordName
  17.     End If
  18.     On Error GoTo 0

  19.     '建立扩展记录数据
  20.     ReDim XRecordType(0 To UBound(XRecordData)) As Integer
  21.     For i = 0 To UBound(XRecordData)

  22.         Select Case VarType(XRecordData(i))

  23.             Case vbInteger, vbLong
  24.                 XRecordType(i) = 90    '整数组码=90

  25.             Case vbSingle, vbDouble
  26.                 XRecordType(i) = 40    '实数组码=40

  27.             Case vbString
  28.                 XRecordType(i) = 2    '字符组码=2

  29.         End Select

  30.     Next

  31.     '添加扩展记录到对象词典
  32.     Set objXRecord = objDict.AddXRecord(XRecordName)
  33.     objXRecord.SetXRecordData XRecordType, XRecordData

  34.     '返回扩展记录对象
  35.     Set Dhvb_SetXrecord = objXRecord

  36. End Function


** 2-Vlisp读取


  1. ;;;======================================================================;
  2. ;;;读取指定词典扩展记录,返回数据表                                       ;
  3. ;;;======================================================================;
  4. (defun Dhvl_GetXrecord (objDict           XRedName   /                 objXRed
  5.                         XRedType   XRedData   TypeList         DataList
  6.                         x
  7.                        )
  8.   (setq objXRed (vla-GetObject objDict XRedName))
  9.   (vla-GetXRecordData objXRed 'XRedType 'XRedData)
  10.   (setq        XRedType (vlax-safearray->list XRedType)
  11.         XRedData (vlax-safearray->list XRedData)
  12.   )
  13.   (foreach x XRedType
  14.     (setq TypeList (append TypeList (list x)))
  15.   )
  16.   (foreach x XRedData
  17.     (setq DataList (append DataList (list (vlax-variant-value x))))
  18.   )
  19.   (list TypeList DataList)
  20. )
  21. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-13 00:10:50 | 显示全部楼层
最初由 灯火 发布
[B]** 1-VBA传出
[code]

'
'设置指定词典扩展记录
'
Public Function Dhvb_SetXrecord(objDict As AcadDictionary, _
                                XRecordName As String, _
         ... [/B]


灯火,那你在VLISP里面,很少用LDATA了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-13 13:44:03 | 显示全部楼层
LData称为私有数据,那么能不能保护自己的数据,而不被其它程序读取,即使用被人知道了字典(Dict)和关键字(Key)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 00:04 , Processed in 0.504911 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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