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