HEATS 发表于 2010-9-13 22:19:45

在AutoCAD Vlisp和VBA之间传递数据

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

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

中国磨削网