AutoCAD開發常見問題(一)
 
 
Home 其他類 AutoCAD開發常見問題(一)
AutoCAD開發常見問題(一) PDF 列印 E-mail
作者是 Administrator   
週一, 11 五月 2009 21:11

AutoCAD開發常見問題(一)


問︰有什麼模式可以在AutoCAD啟動的時候自動加載VBA工程?
答︰當VBA加載時會在AutoCAD目錄下尋找一個名叫acad.dvb的工程。如果找到,就會自動加載它。如果你想VBA和缺省工程在AutoCAD啟動的時候每次都加載,你需要在acad.rx文件中生成一個入?。VBA被設計成命令加載模式(在沒有激活一個VBA命令之前不佔用任何內存和進程)。為了總是加載VBA和acad.dvb工程,請在acad.rx文件中包含下列一行︰
acadvba.arx
在AutoCAD 2000中支持嵌入工程,這樣當你打開擁有嵌入工程的圖形文件時該工程就會自動加載。所以定義嵌入工程也是一個很好的自動加載VBA工程的辦法。
問︰有辦法可以在AutoCAD啟動時自動營運一個VBA例程或宏嗎?

答︰當然。你可以從AutoCAD的acad.lsp文件的啟動功能中透過VBARUN的命令行版本營運一個工程中的宏。首先,你需要準備acad.dvb文件以便自動加載。以drawline.dvb作為例子,用VBALOAD命令彈出VBA IDE對話框。然後用VBA IDE保存為菜單命令保存此工程為新的名字acad.dvb。下一步,激活notepad.exe並且建立或添加下列行到acad.lsp文件中︰
(defun S::STARTUP() (command "_-vbarun" "drawline"))
問︰ AutoCAD支持VBA多工程的打開嗎?
答︰在2000中支持。但在14版中尚不支持。
問︰我可以加密我的VBA模塊代碼嗎?
答︰雖然VBA不支持可執行文件的創建,但是它確實在一個工程的基礎上提供了密碼保護工程窗體、類和模塊可見性的功能。你可以發現這個工程保護功能在VBA IDE菜單中。選擇 工具 > 工程屬性 > 保護。如下圖所示︰

問︰在VBA中如何在命令行上提示?
答︰有一些方法允許在命令行提示輸入以獲取數據。這些方法以“GET”開頭。你可以發現決大多數的方法(如果不是全部的話)透過對象瀏覽器搜索AutoCAD類型庫。啟動VBA IDE。擊F2功能鍵或者從視圖菜單中選擇對象瀏覽器。?對象瀏覽器窗口中使用庫範圍下拉列表把缺省的改成AutoCAD。庫列表下面的編輯列表框是用來搜索的。輸入GET到那個編輯列表框中並且敲返回鍵。包含“GET”的類和成員函數就會顯示在滾動列表中。AcadUtility的一些成員函數可以?命令行上提示用戶輸入。如下圖所示︰
問︰我怎樣從AutoCAD菜單中激活一個VBA例程?
答︰你需要編輯菜單和添加VBARUN模塊子例程。首先確認正確的VBA工程已經加載。
問︰我怎樣從AutoCAD菜單中啟動一個VBA對話框(窗體)?
答︰除了創建一個VBA窗體,你還需要創建一個VBA子例程來顯示這個窗體。而這個子例程需要用VBARUN命令激活。1. 啟動VBA IDE;2. 從菜單中選擇 插入 > 用戶窗體(缺省名稱為UserForm1);3. 添加合適的控件到你的窗體中; 4. 下一步,從菜單中選擇 插入 > 模塊;5. 輸入以下的代碼到缺省的Module1模塊中︰Sub Foo() UserForm1.showEnd Sub6. 最後,編輯AutoCAD菜單調用以下命令來激活對話框︰ -VBARUN Module1.foo.
問︰我已經寫了一個VBA例程用ThisDrawing.Utility.GetPoint獲取一個點。當我從一個VBA對話框中啟動這個例程時,我可以在命令行上看到提示。但是我不能在AutoCAD螢幕上點取一個點。我作錯了什麼?
答︰首先需要關閉對話框,然後才能從AutoCAD獲取數據。添加以下的代碼到ThisDrawing.Utility.GetPoint之前的任何地方以關閉對話框,然後你就可以獲得一個點了。
Me.Hide
問︰有方法加載一個VBA工程而在加載后不顯示VBA IDE嗎?

答︰如果你設置AutoCAD系統變量FILEDIA為0,或者在你加載一個工程的時候把的開關關閉,你就不會?加載之后看到VBA IDE了。這是一個標準的AutoCAD轉換機製。
問︰VBA和AutoLISP有何不同,兩者如何轉換?
答︰如果你已經熟知AutoLISP並且想學習VBA,透過把VBA和AutoLISP表達式聯繫起來的方法就可以容易地做到。以下就是一個關於兩種語言的比較。由於大量的AutoLISP代碼可以利用,轉換一個已有的AutoLISP代碼段為VBA遠比重新編製VBA代碼來得容易。如果兩者的變量名字保持一致,那么比較兩者的代碼也就變得容易了。
點︰
在AutoLISP中,你用(setq)函數來設置一個點。下面這一行把點(0,0,0)分發給PT1變量。(0,0,0)代表這個點位置的x,y,z坐標。
(setq PT1 (0 0 0))
在VBA中,這個操作需要更多的代碼行來完成︰
Dim PT1(0 To 2) As Double
PT1(0) = 0#
PT1(1) = 0#
PT1(2) = 0#
在VBA中,你使用Dim語句來聲明變量。點總是保存在一個三維雙精度值數組中。一個數組也就是一個變量列表。在數組中的變量都擁有相同的名字。數組中的第一個元素使用索引值0,即PT1(0)。第二個元素使用索引值1,即PT1(1)。依次類推。
VBA使用#號作為雙精度值類型的后綴字符。在這個數組中,PT1(0)保存x坐標值,PT1(1)保存y坐標值,PT1(2)保存z坐標值。
既然你已經知道如何保存一個點,我們就可以寫一個VBA宏來在兩點之間畫一條線。
在AutoLISP中,你使用(defun)來定義一個名叫Line1的T諍智暗腃: 意味著擁護可以直接從AutoCAD命令行上執行這個函數。下一步,分發兩個點,然後用AutoCAD的LINE命令?兩點之間畫一條線了。
在VBA中,一個子例程創建一個與AutoLISP相當的函數。下面是AutoLISP和VBA的源代碼。
AutoLISP code

(defun C:LINE1 ()
(setq PT1 (0 0 0))
(setq PT2 (4 4 0))
(command "._line" PT1 PT2 "")
)
VBA code

Sub Line1()
Dim NewLine As Object
Dim PT1(0 To 2) As Double
Dim PT2(0 To 2) As Double
PT1(0) = 0#
PT1(1) = 0#
PT1(2) = 0#
PT2(0) = 4#
PT2(1) = 4#
PT2(2) = 0#
Set NewLine = ModelSpace.AddLine(PT1, PT2)
End Sub
子例程的第一行聲明變量NewLine為一個對象。對象是一個應用程式的一個元素。線,視圖和層都是對象的例子。下一步,點數組聲明了兩個點值。最後,AutoCAD從(0,0,0)到(4,4,0)畫一條線。添加一條線到模型空間中,你需要使用ModelSpace對象集合中的AddLine方法和一條線的起始和終止點。
獲取點︰
用AutoLISP,你經常需要提示擁護選擇一個點。你可以在VBA中用Utility對象的GetPoint方法達到這個目的。你需要聲明一個額外的VarRet變量來保存返回值。以下是Line2的AutoLISP和VBA的代碼對照︰
AutoLISP code

(defun C:LINE2 ()
(setq PT1 (getpoint "\nStart Point: "))
(setq PT2 (getpoint PT1 "\nEnd Point: "))
(command "._line" PT1 PT2 "")
)
VBA code

Sub Line2()
Dim VarRet As Variant
Dim NewLine As Object
Dim PT1(0 To 2) As Double
Dim PT2(0 To 2) As Double
VarRet = Utility.GetPoint(, "Start Point: ")
PT1(0) = VarRet(0)
PT1(1) = VarRet(1)
PT1(2) = VarRet(2)
VarRet = Utility.GetPoint(PT1, "End Point: ")
PT2(0) = VarRet(0)
PT2(1) = VarRet(1)
PT2(2) = VarRet(2)
Set NewLine = ModelSpace.AddLine(PT1, PT2)
End Sub
這一次,GetPoint方法返回一個Variant數據類型。這種數據類型可以保存任何類型的數據。為了使用你選擇的並且保存在變量VarRet之中的開始和終止點,你必須轉換Variant數據為一個雙精度值的數組並且把他們付值給PT1和PT2。
現下兩個VBA子例程已經建立起來了,如何營運它們呢?
啟動AutoCAD,打開一個新圖;
加載工程;
選擇 工具|宏|營運宏;
選擇宏位置(缺省為所有活動圖形和工程);
5. 從窗口中選擇宏名稱;
6. 點擊營運按鈕。

最近更新在 週一, 10 八月 2009 08:41