在AutoCAD Vlisp和VBA之间传递数据
LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据。当vlax-ldata-put第一个参数为指定全局词典的字符串时,VBA可以通过命名词典“看到”数据,当第一个参数为图元对象时,VBA只能判断出实体具有扩展词典,但“看不到”数据,所以目前还只能用vlax-ldata-**族函数处理LDATA,VBA存取不行。你是想要在Vlisp和VBA之间传递数据吧?可以找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。 <BR><BR> LDATA保存在DWG中是无疑的,只是地点没有“暴露”给VBA,所以VBA无法存取,这和其他一些第三方程序自定对象数据不能存取是一个道理,类似的东西还有一些,这个LDATA对于使用VL和VBA混合编程并需要在两者之间传递数据的人有些误导作用。 <BR><BR> 应该让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]