马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
- 在Vlisp和VBA之间传递数据
- 来源: 明经通道 作(译)者: 河伯
-
- LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据。当vlax-ldata-put第一个参数为指定全局词典的字符串时,
- VBA可以通过命名词典“看到”数据,当第一个参数为图元对象时,VBA只能判断出实体具有扩展词典,但“看不到”
- 数据,所以目前还只能用vlax-ldata-**族函数处理LDATA,VBA存取不行。你是想要在Vlisp和VBA之间传递数据吧?可以
- 找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。
- LDATA保存在DWG中是无疑的,只是地点没有“暴露”给VBA,所以VBA无法存取,这和其他一些第三方程序
- 自定对象数据不能存取是一个道理,类似的东西还有一些,这个LDATA对于使用VL和VBA混合编程并需要在两者之
- 间传递数据的人有些误导作用。
- 应该让Vlisp和VBA各做其擅长的事情而无需论其长短,二者需要传递数据时用Dictionary和Xrecord更为舒畅自然。
- Xrecord是一个任意数据的容器,它提供了比xdata更灵活的附加数据的办法,Xrecord能包含2GB的任意数据,特别
- 合不同开发语言之间传递数据,有用的保留在DWG,临时的完事就删除。
- 有时VBA和Excel交互大量数据,完成计算,生成图形时Vlisp又方便一些,VBa把数据传递过去,用Vlisp干干净净地写,
- 反之亦然。
- ** 1-VBA传出
- '
- '设置指定词典扩展记录
- '
- Public Function Dhvb_SetXrecord(objDict As AcadDictionary, _
- XRecordName As String, _
- XRecordData As Variant) _
- As AcadXRecord
- Dim objXRecord As AcadXRecord
- Dim XRecordType As Variant
- Dim i As Long
- '检察对象词典是否有该名扩展记录,如果已经存在则删除
- On Error Resume Next
- Set objXRecord = objDict.GetObject(XRecordName)
- If Not objXRecord Is Nothing Then
- objDict.Remove XRecordName
- End If
- On Error GoTo 0
- '建立扩展记录数据
- ReDim XRecordType(0 To UBound(XRecordData)) As Integer
- For i = 0 To UBound(XRecordData)
- Select Case VarType(XRecordData(i))
- Case vbInteger, vbLong
- XRecordType(i) = 90 '整数组码=90
- Case vbSingle, vbDouble
- XRecordType(i) = 40 '实数组码=40
- Case vbString
- XRecordType(i) = 2 '字符组码=2
- End Select
- Next
- '添加扩展记录到对象词典
- Set objXRecord = objDict.AddXRecord(XRecordName)
- objXRecord.SetXRecordData XRecordType, XRecordData
- '返回扩展记录对象
- Set Dhvb_SetXrecord = objXRecord
- End Function
- ** 2-Vlisp读取
- ;;;
- ;;;读取指定词典扩展记录,返回数据表 ;
- ;;;
- (defun Dhvl_GetXrecord (objDict XRedName / objXRed
- XRedType XRedData TypeList DataList
- x
- )
- (setq objXRed (vla-GetObject objDict XRedName))
- (vla-GetXRecordData objXRed 'XRedType 'XRedData)
- (setq XRedType (vlax-safearray->list XRedType)
- XRedData (vlax-safearray->list XRedData)
- )
- (foreach x XRedType
- (setq TypeList (append TypeList (list x)))
- )
- (foreach x XRedData
- (setq DataList (append DataList (list (vlax-variant-value x))))
- )
- (list TypeList DataList)
- )
-
|