□劉海心(河南省水利勘測設計研究有限公司)
隨著計算機輔助制圖技術的不斷發(fā)展,美國AutoDesk公司的AutoCAD已成為制圖人員的一件利器,然而大量的重復性工作又使得制圖人員為之頭痛,AutoLisp語言能夠通過編程大量成批地去解決這一問題。在水利工程地質勘察中,節(jié)理的統計是至關重要的,需要將一批節(jié)理先按走向進行統計,再在走向統計結果的基礎上進行傾向和傾角的統計,統計結果形成玫瑰花圖。統計過程非常煩瑣,并容易出錯,形成玫瑰花圖也同樣費時費力,若有成百上千條節(jié)理,那手工統計幾乎難以完成。應用AutoLisp語言對節(jié)理進行統計并自動將統計結果生成CAD圖件,將使工作事半功倍。
AutoLisp語言是一種運行在AutoCAD環(huán)境下的Lisp編程語言,或稱為AutoCAD的一種嵌入式語言,是一種能以直譯方式 (不須先行編譯)亦可于AutoCAD內部執(zhí)行的直譯性程序語言。它采用了與CommandLisp(一種通用的Lisp語言版本)相近的語法及習慣約定,并吸收了Lisp語言的主要函數,同時增加了針對AutoCAD特點的許多功能,如:可以把AutoLisp和Auto-CAD的繪圖命令透明地結合起來,使設計和繪圖完全融為一體。利用AutoLisp語言編程可以實現對AutoCAD當前圖形數據庫進行直接訪問和修改。在Lisp語言中,最基本的數據類型是符號表達式,lisp語言的特點是程序和數據都采用符號表達式的形式,即一個lisp程序可以把另一個lisp程序作為它的數據進行處理,因此使用lisp語言十分靈活,看起來是一個一個的函數調用。支持遞歸定義也是AutoLisp語言的重要特點。
AutoLisp語言是提供給用戶的主要二次開發(fā)工具之一,用AutoLisp編寫應用程序,可以為AutoCAD增加新的命令或修改AutoCAD,以適應用戶的特殊需要。掌握使用和編制AutoLisp應用程序的方法和技術將大大提高用戶的工作效率和二次開發(fā)水平,增強AutoCAD的靈活性,并將得到長期、穩(wěn)定的技術支持。
AutoLisp語言是由COMMON LISP語言的一個子集再增加一些與圖形處理有關的特殊函數組成,并內嵌在AutoCAD之中,即是嵌入AutoCAD內部的通用LGP程序設計語言的子集。Auto Lisp語言靈活簡潔、表達能力強,通過定義函數實現各種功能。除可以完成各種科學計算外,還能調用AutoCAD各項命令,直接訪問圖形數據,從而大大地擴充了圖形處理功能。
但由于Auto Lisp語言是一種解釋語言,其保密性差、運行速度慢、自頂而下的程序設計思想、調試不便等缺點使得它不適合開發(fā)大型的計算密集型的系統。而且,它與目前推廣的OOP(面向對象程序設計)技術并不兼容,另外,其表達式的表示法也不易讓一般開發(fā)人員習慣和接受。
一種用以表示節(jié)理空間方位及其發(fā)育程度的圖解。其作法是:首先對一定地區(qū)范圍內的節(jié)理進行系統測量,將測得的節(jié)理產狀及密度數據按空間方位間隔分組(如5°或10°為一組),求出每組的節(jié)理數量和平均走向(或傾向)。然后在節(jié)理走向玫瑰花圖標明地理方位的圓內,以半徑方向表示節(jié)理方位,以半徑上的長度單位表示該組節(jié)理的數量,將各組節(jié)理投入圖上,連接相鄰各投影點(如某一方位無節(jié)理,則連至圓心),即得到節(jié)理玫瑰花圖。表示節(jié)理走向的圖叫走向玫瑰花圖,只作上半圓;在節(jié)理最發(fā)育的方向上(一組或二組),引一延長線,將其劃分為90°,根據這組節(jié)理所具有的傾角、傾向和條數,按一定比例繪在延長線上。
首先讀入節(jié)理的走向、傾向和傾角,讀入后,要進行分組,走向若以10°分組,組號為0~35,傾向分為五組,分別為用A、B、C、D、E,分別對應四個象限,若傾角為90°,則為E組。傾角以10°分組,組號為0~8,分組后,就可將讀入的產狀進行分組統計。比如某一節(jié)理走向為10°,傾向為100°,傾角為36°,讀入后,將走向10°放入SumStrike2和NStrike2、AverageStrike中分別進行累加、計數及求平均值,其中2表示走向的第2組;100°對應象限為第二象限,也就是傾向SE,為B;傾角為36°,將其放入 B2SumAngle、B2NAngle、B2AverageTrendAngle分別進行累加、計數及求平均值。
讀入完所有的產狀后,將統計結果分別放入以上相應的變量中后,要求出走向最多的分組,才能在此走向分組上進行傾向和傾角的統計。而走向最多的分組是不確定的,可能為1個,也可能為2個,甚至更多,這樣就必須將最多的分組存入一個字符串中,每個分組間用一個標識符隔開,比如走向第5組、第10組和第20組都為15個節(jié)理,為各個組中的最多,這樣字符串為5B10B15B,其中B為標識符,這樣就可以確認哪幾個分組為最多的節(jié)理分組。
各個分組的統計結果要存入到變量中,這個變量應以數組的方式存在,但AutoLisp語言不支持數組,只能以動態(tài)變量來表達。用循環(huán)將變量后增加一個數做為一個新的變量,這個數是可以變化的,這樣,再把統計結果放到這些新的變量中,就可達到動態(tài)數組的目的,如A變量,增添后為A1、A2、A3……等。
統計結束后,利用三角函數將走向線終點以及最長走向線所對應的兩個傾向的傾角頂點坐標求出,然后將相鄰的坐標點連接起來,不相鄰的孤立坐標點和原點相連。這里涉及到許多初等數學的幾何關系,不再贅述。
AutoLisp語言編程能夠替代部分重復的、煩瑣的手工制圖,使得工作效率提高,事半功倍。AutoLisp語言和一般的編程語言在語法上不太一樣,并且不支持數組,使用起來很不習慣,不過它支持選擇集,可以代替數組。本文提到的動態(tài)設置變量也可以替代數組質,對于初學者來說,動態(tài)設置變量相對選擇集要較容易掌握,采用AutoLisp語言編制程序繪制節(jié)理玫瑰花圖,重要的是進行分組統計,并進行編碼標識。