我聽到許多關于這樣的問題。AutoLISP與VBA有什么不同呢?我要學習怎樣二次開發AutoCAD,但我不能確定先學哪一個工具。哪一個工具更好呢?
簡潔的回答是他們都好,你應當兩者都學。分析我的回答,你可以知道這不是最快的解決辦法,但在你做出一個完整的決定前,一個完整的回答需要時間和更多的問題。舉個例子:你懂BASIC嗎?如果你懂,那么VBA學起來會更快一些;如不懂BASIC,那么你學過其它的編程語言嗎?如果你學的正好是FORTRAN或PASCAL的話,那也很好。因為如果你已掌握了這兩種語言,則VBA的學習將十分簡單。如果你一點兒也不懂程序設計語言,那么AutoLISP將會是適合你學習的語言。
如果你正好沒有程序設計的知識和經驗,那么在AutoCAD里你應當學習什么語言?這個問題很難回答。這取決于你希望完成什么樣的工作?每種語言都有其優點和缺點,AutoLISP擅長建立新命令和產生已有命令的連接。VBA擅長執行包括在其他應用程序中的組件,如Microsoft的Excel和Access。AutoLISP是基于表處理的編程體系,它允許程序員隨意地存儲和操作傳送信息,然而VBA部件包括數據和對復雜情況的各種有效操作,這就是問題變得復雜的地方,除非你已真正懂得這些工具的好處,否則,很難回答你應該選擇哪一個,但你應當知道你想完成什么和允許完成什么,因為它將引導你向正確的解決方法前進。
稍后,你會發現這一簡潔的回答是恰當的,你將會學習兩種語言,你要做的一些事,可以在AutoLISP中用十分簡單的幾行代碼來解決。另一方面,你會發現VBA提供了一些最簡捷的應用程序解決方案。例如,建立一個復雜的包括許多對話框的應用,AutoLISP支持對話框,但是不如VBA支持的程度強,同時,在AutoCAD中一個任務的情況下,VBA提供在對象級別上訪問AutoCAD系統,但它對AutoCAD的一些基本命令的支持性并不是很好,而AutoLISP在這一點上卻做的很好。
這兩種語言不具有很好的兼容性,這種情況是必然的,就是說,你不能把在AutoLISP中寫的東西放到VBA中隨意使用,反之亦然。我并不是說這種情況不可能的,但卻是很難以實現。最低限度是,一但你選擇了一種語言來設計程序,你就不可能中途又用另一種語言來解決程序中的問題,你不得不繼續使用你最初選擇的語言。
建立個詞匯表
那么,讓我們從學術角度討論一些兩種語言間的不同之處。前面提到的AutoLISP是綜合了邏輯結構與傳統AutoLISP命令的一個完美工具,你能組合AutoCAD命令并放在一個有條件的邏輯腳本里,而產生強有力的自定義命令,這些命令能被用于自動操作通常的任務,也能解決計算問題而得到一個結果。基于命令種類的思想比目標角度的思想更簡單,一個清楚直接指出不同點的例子:在一個多義線對象里打斷編輯方法。如果你要打斷一條多義線,你必須先計算并重新更新這個物體,Extend和Trim命令也一樣。這些命令現在還并不包含在AutoCAD對象系統的實體對象編輯方法中。在不久它們會隨時出現,這就是對象的好處。
在許多情況下,對象級的處理比命令方式更高級。當你執行一個命令時,你有可能可以也有可能不可以直接操作你所選取的對象。因為你必須依賴于AutoCAD的對象選擇機制。對象不是模糊不清的。當你專門指定一個對象時,對你要操作的對象,它是很清楚的。
對象級別的處理在VisualLISP也可實現。使用VisualLISP中的(VL)擴展,你能改變對象的參數且在需要時調用對象的方法。你不得不使用對象引用,它可以從已有的實體名或直接產生的對象中生成,在大多數情況下,一個有經驗的AutoLISP程序員不需要使用這些對象,但遲早它們會派上用場。
VisualLISP的另一優點是比VBA更接近AutoCAD系統。VBA不是由AutoCAD產生的,它是在其它的環境下同樣工作的一個附加的語言,象Microsoft的Word和Excel一樣。它也類似于在AutoCAD中用VB(Visualbasic)語言編制程序的方法。VisualLISP僅在AutoCAD里運行,它的優勢是軟件間有著密切的工作關系。當在命令行里提示用戶時,你能發現一個不同點的例子。在VisualLISP里,你可以使用PROMPT或PRINT語句。在VBA里,你必須使用Prompt方法,這是優化對象的一部分,也是繪制對象的一部分,下面的幾行代碼將對AutoCAD命令行發出一個提示。第一行為VisualLISP語言;第二行用的是VBA。
(Prompt“nstarting.”)#p#分頁標題#e#
thisDrawing.Utility.PromptCh$(10)&“starting”
有兩件事顯而易見,在VisualLISP里,在命令行窗口中,“n”使光標跳到新的一行。VBA使用Chr$(10)功能,必需把它放在使用“&”操作符的提示字符串前才可以運行。其次是當類型數量相對實用對象的提示方法接近時,才會使用這個。
在AutoLISP中,可使用PRINT語句,在生成值前,“n”使順序轉到新的一行開始。PRINT的另一個特點是可以輸出任何數據類型,而PROMPT功能只能處理字符串。
在VBA里,對于優化對象的方法和AutoLISP里的“GET×××”函數一樣,你必須一直使用字符串。AutoLISP包括幾種不同的把你要使用的數據類型轉化成字符串型的函數。RTOS把數值型轉化成字符串型;ITOA把數值型轉化成整數型。VBA提供兩個數據轉換函數:STR和FORMAT。當轉化一個非負數時,STR函數返回一個精確的字符串,即在字符串前加上一個空格。這就是,str(-1.1)返回字符串“-1.1”,str(1.1)結果是“1.1”。FORMAT允許你設立特別的轉換格式。對正在學習VBA的人,可利用在線幫助查看有關該函數的幫助,它提供了大量的例子來演示數據是怎樣被轉化產生的。
衡量的尺度
對于AutoCAD的定制來說,由于AutoLISP語言是以命令的標準建立的,這促進了偏向于支持AutoLISP的尺度。你能使用AutoLISP中帶“C:”作為新命令名稱的頭兩個字符的方式來定義函數,該命令就像AutoCAD命令一樣使用。“C:”函數被叫做“命令函數”。VBA有宏,你必須從程序管理器里運行宏。從命令提示(或普通的macro菜單)里運行不了宏,這就存在著一個重要問題。用戶可以使用AutoLISP啟動VBA程序管理,然后以相同的方式執行宏。使用命令行語句時,你應該確信在語句前加了“-”,格式如下:
command“-VBALOAD”“mymacros”“-VBARUN”“mymacro”
如果你未用此負號,將會出現一個對話框,提示用戶裝載VBA和運行宏。在多數情況下用戶并不想出現這個對話框。取而代之的是在命令行裝載宏并用一個VBA模塊來運行它,這樣,首先出現的是在AutoLISP中很強列關注的東西,不再僅僅只是一個傾向。一但一個錯誤和漏洞發生,就會有其他相關問題出現,這在編程中并不尋常。
另外一點,VBA允許一個經由AutoLISP啟動的過程,VBA還有一個反應繪圖及同時處理多個圖形的優良機制。在VisualLISP里,你能做這些工作,但在VBA里就不是如此容易了。其反應的事物與圖形連系在一起,甚至嵌入圖形模板中,有多種原因允許你所編程繪制圖形。VisualLISP沒有一些靈活的運行程序或操作菜單,因此它沒有這些能力。VBA與VisualLISP爭奪的另一領域為數據種類。VBA的數據種類多于VisualLISP,它包括了一些有用的如Date、Time的數據類型。在VisualLISP里日期和時間是用字符串或是數值存儲的。在一張圖形里,當你通過系統變量存取系統日期信息時,你會得到純數字而不是日歷天數。
在VBA中操作日期和時間是非常容易的,Format函數可以產生幾乎任一種描述的格式,你可以用基本的數值來完成比較和區別。你能以某種自定義的格式存儲或操作時間信息,方法簡單。我聽說頑固的AutoLISP程序員聲稱VBA不支持表處理而LISP支持,這是事實。但VBA不支持Variants類型,Variants與LISP庫中的一些數據種類標志十分相似。Variants允許VBA使用不同類型的數據和結構,但不如LISP中的表處理功能強大。表能存儲許多種類型的數據且用幾行基于MAPCAR、FOREACH、APPLY的代碼就可以快速操作它們。但是這些程序設計體系需要時間去掌握,許多程序設計的新手在使用VBA時,將不會遺漏結構的存取。
坦白的說,表處理進程并不像對象操作那樣令人感興趣。在VBA(和VisualLISP)中你能連接其它系統支持的對象。對程序員而言,ActiveX是面向Windows的一個面向對象的過程到過程的通信編程系統,它允許你的VBA程序運行在AutoCAD里,并且可借用Excel或其它一些支持自動操作的程序。因為Excel支持VBA,所以你能在一個Excel工作表中驅動AutoCAD。當你試著思考它時,多自動進程處理有著某些讓人敬畏的潛力。
在下載部分的鏈接里,你會發現兩個程序:
一個是在VBA(帶有DVB擴展)里的,另一個在VisualLISP(帶有LSP擴展)里,這些函數完成相同的事:他們提示用戶輸入一些定義一個銑槽的參數,并畫出這個銑槽,這個銑槽可以放在任何角落且有一個90°的圓角或一個完整的半圓帽。這些例子表明了VBA與VisualLISP運行程序的風格的幾個不同點,或許這就是最明顯的產生lightweight多義線的的方法,在VBA里,該對象由一系列點確定,雛形產生后,拐點也相應產生了,VisualLISP的例子簡單使用PLINE命令去產生點和弧,因為他們可以從命令行提示中配置。從運行程序這一點而言,VisualLISP版本很容易產生,因為你不必知道任何拐點和他們怎樣在多義線中使用,在VisualLISP我用EntMake語句,在一個實體列表中確定拐點,這個版本的基本命令很容易編譯代碼。如果你更深入地學習,你會發現VisualLISP和VBA是十分平衡的,這個的弱項正是另一個的強項。然而VBA支持一些新的理論,對于AutoLISP程序員而然,他的缺點是把一個簡單問題復雜化。在大多數情況下,我傾向于VisualLISP,因為它提供了更多的自由度。對于AutoCAD的定制我有許多經驗,但有些時候,根據客戶需求,我會用VBA,因為對客戶而言,其更容易維護。它提供了一些面向自動生成的模板。我的許多客戶在定制AutoCAD時,并沒有廣博的經驗,但他們有Basic語言基礎,因為這點,他們使用我推薦的VBA。對于不久將需改變的元素的操作,他們感到很輕松。#p#分頁標題#e#
上面所有的原因,就是我為什么推薦VisualLISP和VBA二者都學的緣故。話又說回來,這還要依據你所使用的工具而定,學會其一,已可以了,但你會錯過向另一個方向發展的時間,這是必然的沖突。第一步,你可能從VBA中學習怎樣運行LISP語句或者從VisualLISP中學習運行傳統VBA的方法。誰知道下一個將會是什么?
從哪里開始
為了決定先學哪一個語言,讓我們做一些自我評價:如果你很好地了解了AutoCAD的命令并希望自動使用它們,那么VisualLISP將是你的首選;如果你不懂AutoCAD,但你是一名知道對象是如何工作的計算機程序員,你可以學習VBA;如果你是一名C++程序員,你可以通過學習VBA而了解對象集是怎么結合在一起的,然后花一點時間學習ObjectARX(一個DLLs結構的C++庫,運行于AutoCAD自身相同的內存映像),在這篇文章中沒有討論ObjectARX,是因為你必須使用外部的C++編譯器,且必須從Autodesk公司獲得開發工具包,而AutoCAD2000中直接配有VisualLISP和VBA編譯器。
給想學習AutoCAD的人最后一點建議:
尋找那些有范例的書和雜志。
上網查詢這些內容,甚至是例子。VisualLISP和VBA的在線幫助常令初學者感到困惑,因為一些函數從VBA中引證,而另一些從VisualLISP中引證。無論你使用哪一個語言,你都有可能有從其它語言里偶然得到幫助的好機遇,因為它們是相關的。因此我強烈推薦看一本或兩本書。你有大量選擇的自由,多存些好書。
[編者注:有關這些內容推薦兩本好書,BillKramer的《AutoLispTreasureChest》;BillKramer和JohnGibb的《UsingVisualBasicwithAutoCAD》(第二版)]
存在著許多選擇,每一個都有其優點。無論你先學什么,在某一時間你應當學習所有的東西,為了去追尋更多的知識,這就意味著要不停的編制程序。BillCramer——有著二十多年的運用CAD/CAM/CAE系統的經驗,對于代碼的更新,可到下載處下載。
相關文章
- 2021-09-08BIM技術叢書Revit軟件應用系列Autodesk Revit族詳解 [
- 2021-09-08全國專業技術人員計算機應用能力考試用書 AutoCAD2004
- 2021-09-08EXCEL在工作中的應用 制表、數據處理及宏應用PDF下載
- 2021-08-30從零開始AutoCAD 2014中文版機械制圖基礎培訓教程 [李
- 2021-08-30從零開始AutoCAD 2014中文版建筑制圖基礎培訓教程 [朱
- 2021-08-30電氣CAD實例教程AutoCAD 2010中文版 [左昉 等編著] 20
- 2021-08-30電影風暴2:Maya影像實拍與三維合成攻略PDF下載
- 2021-08-30高等院校藝術設計案例教程中文版AutoCAD 建筑設計案例
- 2021-08-29環境藝術制圖AutoCAD [徐幼光 編著] 2013年PDF下載
- 2021-08-29機械AutoCAD 項目教程 第3版 [繆希偉 主編] 2012年PDF