2012-09-08

AutoCAD 的ObjectID在64bit無法利用..

在AutoCAD中,每個圖元,他都有他唯一的編號,也就是ObjectID,利用這個序號,程式可以快速獲得該圖元並進行分析與編輯。但是自從ACAD 2008版以後,他發行了64位元版,這個好用的方式,竟然變成程式執行的錯誤....

過去只要利用
Dim pickEnt as acadEntity
Dim lngObjID as long
LngObjID=pcikEnt.ObjectID  '獲取元件ID
Dim getEnt as acadEntity
set getEnt=ThisDrawing.ObjectIdToObject(lngObjID)  '獲取元件
就可以把某個圖元給抓到,不過這方式沒法在64位元版來利用了。難道過去多年辛苦寫得程式都沒用了?還未必,至少改些碼還可以撐陣子...

目前知道可以變通的方式有兩個

1.改變64位元的屬性名與方法名
Dim pickEnt as acadEntity
Dim lngObjID as long
LngObjID=pcikEnt.ObjectID32  '獲取元件ID(改屬性名)
Dim getEnt as acadEntity
set getEnt=ThisDrawing.ObjectIdToObject32(lngObjID)  '獲取元件(改方法名)
2. 改抓Handle值:
Dim pickEnt as acadEntity
Dim strObjHandle as long
strObjHandle=pcikEnt.Handle  '獲取元件Handle
Dim getEnt as acadEntity
set getEnt=ThisDrawing.HandleToObject(strObjHandle)  '獲取元件
綜合上面的結論,第一種方式雖然可以解決64位元版本的困擾,但程式改寫後卻不能在32位元的版本執行,所以比較徹底的方式,還是改以Handle值來做存取比較實在。

2018/06/30 後記:ObjectID32這參數是為了配合64位元的作業系統而產生,但在網路文章中有發現:自ACAD2016版以後,又將這個參數給拿掉,改成ObjectID了。這下子在程式設計中想符合多版本運作視乎更加困難。

沒有留言:

張貼留言