我想看一级黄色大片_久久亚洲国产精品一区二区_久久精品免视看国产明星_91久久青青青国产免费

您的位置:網站首頁 > 機械制圖 > 機械技巧

在AutoCAD Vlisp和VBA之間傳遞數據

時間:2011-05-26 08:09:50 來源:未知
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)
)