找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 782|回复: 1

[分享]:在Vlisp和VBA之间传递数据

[复制链接]
发表于 2003-4-27 14:46:29 | 显示全部楼层 |阅读模式

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

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

×
  1. 在Vlisp和VBA之间传递数据  

  2. 来源:  明经通道  作(译)者:  河伯  

  3. LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据。当vlax-ldata-put第一个参数为指定全局词典的字符串时,
  4. VBA可以通过命名词典“看到”数据,当第一个参数为图元对象时,VBA只能判断出实体具有扩展词典,但“看不到”
  5. 数据,所以目前还只能用vlax-ldata-**族函数处理LDATA,VBA存取不行。你是想要在Vlisp和VBA之间传递数据吧?可以
  6. 找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。
  7.     LDATA保存在DWG中是无疑的,只是地点没有“暴露”给VBA,所以VBA无法存取,这和其他一些第三方程序
  8. 自定对象数据不能存取是一个道理,类似的东西还有一些,这个LDATA对于使用VL和VBA混合编程并需要在两者之
  9. 间传递数据的人有些误导作用。
  10.     应该让Vlisp和VBA各做其擅长的事情而无需论其长短,二者需要传递数据时用Dictionary和Xrecord更为舒畅自然。
  11. Xrecord是一个任意数据的容器,它提供了比xdata更灵活的附加数据的办法,Xrecord能包含2GB的任意数据,特别
  12. 合不同开发语言之间传递数据,有用的保留在DWG,临时的完事就删除。
  13. 有时VBA和Excel交互大量数据,完成计算,生成图形时Vlisp又方便一些,VBa把数据传递过去,用Vlisp干干净净地写,
  14. 反之亦然。

  15. ** 1-VBA传出

  16. '
  17. '设置指定词典扩展记录
  18. '
  19. Public Function Dhvb_SetXrecord(objDict As AcadDictionary, _
  20.                                 XRecordName As String, _
  21.                                 XRecordData As Variant) _
  22.        As AcadXRecord

  23.     Dim objXRecord As AcadXRecord
  24.     Dim XRecordType As Variant
  25.     Dim i As Long

  26.     '检察对象词典是否有该名扩展记录,如果已经存在则删除
  27.     On Error Resume Next
  28.     Set objXRecord = objDict.GetObject(XRecordName)
  29.     If Not objXRecord Is Nothing Then
  30.         objDict.Remove XRecordName
  31.     End If
  32.     On Error GoTo 0

  33.     '建立扩展记录数据
  34.     ReDim XRecordType(0 To UBound(XRecordData)) As Integer
  35.     For i = 0 To UBound(XRecordData)

  36.         Select Case VarType(XRecordData(i))

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

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

  41.             Case vbString
  42.                 XRecordType(i) = 2    '字符组码=2

  43.         End Select

  44.     Next

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

  48.     '返回扩展记录对象
  49.     Set Dhvb_SetXrecord = objXRecord

  50. End Function


  51. ** 2-Vlisp读取


  52. ;;;
  53. ;;;读取指定词典扩展记录,返回数据表                                       ;
  54. ;;;
  55. (defun Dhvl_GetXrecord (objDict    XRedName   / objXRed
  56. XRedType   XRedData   TypeList DataList
  57. x
  58.        )
  59.   (setq objXRed (vla-GetObject objDict XRedName))
  60.   (vla-GetXRecordData objXRed 'XRedType 'XRedData)
  61.   (setq XRedType (vlax-safearray->list XRedType)
  62. XRedData (vlax-safearray->list XRedData)
  63.   )
  64.   (foreach x XRedType
  65.     (setq TypeList (append TypeList (list x)))
  66.   )
  67.   (foreach x XRedData
  68.     (setq DataList (append DataList (list (vlax-variant-value x))))
  69.   )
  70.   (list TypeList DataList)
  71. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-4-28 08:57:03 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 10:27 , Processed in 0.389545 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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