找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 269|回复: 0

在AutoCAD Vlisp和VBA之间传递数据

[复制链接]
发表于 2010-9-13 22:19:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转磨削论坛

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

×
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 (objDictXRedName / 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)
) ) T/ H) x% l' f4 Q: k1 |4 V1 P: [
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

中国磨床技术论坛
论 坛 声 明 郑重声明:本论坛属技术交流,非盈利性论坛。本论坛言论纯属发表者个人意见,与“中国磨削技术论坛”立场无关。 涉及政治言论一律删除,请所有会员注意.论坛资源由会员从网上收集整理所得,版权属于原作者. 论坛所有资源是进行学习和科研测试之用,请在下载后24小时删除, 本站出于学习和科研的目的进行交流和讨论,如有侵犯原作者的版权, 请来信告知,我们将立即做出整改,并给予相应的答复,谢谢合作!

中国磨削网

QQ|Archiver|手机版|小黑屋|磨削技术网 ( 苏ICP备12056899号-1 )

GMT+8, 2024-11-16 12:45 , Processed in 0.137001 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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