|
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. 點擊營運按鈕。 |