關于autoulisp在用cad機械制圖二次開發(fā)中的應用.doc_第1頁
關于autoulisp在用cad機械制圖二次開發(fā)中的應用.doc_第2頁
關于autoulisp在用cad機械制圖二次開發(fā)中的應用.doc_第3頁
關于autoulisp在用cad機械制圖二次開發(fā)中的應用.doc_第4頁
關于autoulisp在用cad機械制圖二次開發(fā)中的應用.doc_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

autolisp在autocad機械制圖中的應用在2005年8月7日8月12日期間我們在第一汽車集團公司工藝裝配有限公司的工藝裝配研究所進了為期一周的三下鄉(xiāng)的實習學習活動,我們本著科學嚴謹的態(tài)度象王俊偉副所長學習autolisp在autocad在二次開發(fā)中的應用。現在對autolisp語言以有了初步的了解。還在王副所長的指導下獨自編寫了幾個有用的小程序,在這次活動中我們收益非淺不但過了一個有益的假期還提高了自己的就業(yè)競爭力。在眾多的autocad開發(fā)工具中,autolisp是使用最簡單、應用最廣泛、使用者最多的一種開發(fā)工具。但是,autolisp只是一種解釋型語言,且不能加密。為了解決這個問題,autodesk公司在autocad r14中推出了visual lisp的測試版,隨后在autocad 2000中推出了visual lisp的正式版本。visual lisp完全兼容以前的autolisp,同時應用了autocad的另一個開發(fā)工具-objectarx面向對象技術和activex技術,使visual lisp開發(fā)的應用程序功能更強大,運行速度更快,從而真正成為一個能開發(fā)商業(yè)軟件的開發(fā)平臺.autolisp是由autodesk公司開發(fā)的一種lisp程序語言(lisp是list processor的縮寫)。第一篇關于lisp的參考文獻是由john mccarthy 在1960年4月的acm通訊中發(fā)表的。除了fortran和cobol,大多數在六十年代早期開發(fā)出來的語言都過時了,可是lisp卻生下來,并且已經成為人工智能(ai)的首選程序序言。autolisp解釋程序位于autocad軟件包中,然而autocad r2.17及更低版本中并不包含autolisp解釋程序,這樣,只有通過autocad 2.18及更高版本才可以使用autolisp語言。autocad軟件包中包含大多數用于產生圖形的命令,但仍有某些命令末被提供。例如,autocad中沒有在圖形文本對象內繪制矩形及作全局改變的命令。通過autolisp,你可以使用autolisp程序語言編制能夠在圖形文本對象內繪制矩形或作全局選擇性改變的程序。事實上,可以用autolisp編制任何程序,或把它嵌入到菜單中,這樣定制你的系統(tǒng)會取得更高的效率?,F在,已經有數以百計的第三方軟件開發(fā)人員使用autolisp語言編制各種應用程序軟件包,例如,象smlayout的軟件包,用它可以產生各種復雜幾何圖形的平面布局圖,這些幾何圖形包括管道的交叉部、過渡都、圓柱、彎管接頭、圓錐以及罐頂。目前社會上非常需要autolisp程序員為應用軟件及客戶菜單的開發(fā)提供顧問。任何編程語言都提供數學函數。在autolisp中,同樣提供了編程以及數學計算所需的大部分數學函數,可以使用autolisp對數字進行加、減、乘、除運算,還可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用autolisp還可以進行許多其他計算。由于我們學習過c語言所以autolisp語言對我們學習起來難度不大,autolisp語言具有計算機語言的一般性所以不難理解。機械制圖中,常常得做許多大量的重復工作。下面這幾個用lisp編寫得程序,是我畫圖時經常使用的,節(jié)省了我的不少時間,希望也能幫助廣大使用autocad的工程師們。 1.自動求和 機械制圖中材料表的填寫是畢不可少的,填寫完后還需根據材料表求出總重量。一般一幅圖中常有幾十個物體,將這些重量一項一項相加個繁瑣的過程,而且容易出錯。使用下面這個程序,只需用鼠標選定需要相加的數,其和就會自動的顯示在命令行中。 因為在autocad中沒有“數”這種實體,所有的數都以實體“text”存在,所以程序中使用了“atof”函數,將以字符串形式表示的數轉換為實數。 (defun c:total( / cmdmode sset ssl nsset temp ssl1 total) (if *error* quit) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) (prompt nselect numbers to add: ) (setq sset (ssget) (if (null sset) (princ nerror: nothing selected!n) ;過濾出選中的“text”實體,并報告有多少“text”實體被選中。 (progn (setq ssl (sslength sset) (setq nsset (ssadd) (while ( ssl 0) (setq temp (ssname sset (setq ssl(1- ssl) (if (= (cdr (assoc 0 (entget temp) text) (ssadd temp nsset) ) ) (setq ssl (sslength nsset) (print ssl) (princ text entities are found.) ;選出所有可轉化為數的“text”,并求和。 (setq total 0) (setq ssl1 ssl) (while ( ssl 0) (setq temp (ssname nsset (setq ssl (1- ssl) (setq number (atof(cdr(assoc 1 (entget temp) (if (= 0 number) (setq ssl1 (1- ssl1) (setq total (+ total number) ) ) ;顯示和及加數的個數,便于用戶檢查是否多選或漏選。 (princ nthe total is ) (princ total) (princ of the ) (princ ssl1) (princ numbersn) ) ) (setvar cmdecho cmdmode) ) (princ ntc:total loaded. start command with total.) 2.自動生成遞增數 用cad作圖時,常需畫一些距離一定、數值遞增的數。如填寫材料表時,“序號”一欄就需填寫由下至上的遞增數。通常,我們先用“text”命令寫一個數,再用“array”命令將其按一定方向陣列,最后用“edit”命令一個一個的改正。下面這個程序可將你從這單調重復的動作中解放出來。 (defun c:arn( / ent temp d a number yorn) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) ;選擇一個實體,并判斷能否作為生成遞增數的初始數。 (setq ent (entsel nselect number to arn: ) (if (null ent) (progn (princ nerror: nothing selected!n) (exit) ) ) (setq temp (entget (car ent) (if (= (cdr (assoc 0 temp) text) ;輸入生成遞增數的個數、數間距及其方向。 (progn (setq number(getint number of texts:) (setq d(getdist dist between texts:) (setq a (atoi(cdr(assoc 1 temp) (initget 1 v h) (setq yorn (getkword direction(v/h)?) (if (= yorn v) (setq p (list 0 d) ) (if (= yorn h) (setq p (list d 0) ) ;重復拷貝前一個數,并將拷貝數加1。 (while (/= number 1) (command copy ent p ) (setq ent (entlast) (setq temp (entget ent) (setq a (+ a 1) (entmod (subst (cons 1 (itoa a) (assoc 1 temp) temp) (setq number (1- number) ) ) ) (setvar cmdecho cmdmode) ) (princ ntc:arn loaded. start command with arn.) 3.修改編號 作圖時,常常需要對圖中的物體進行編號,有時會在已編好號的物體中插入幾個物體,那么在這之后的編號都需作相應的增加。對于比較多的編號,一個個的尋找再修改就很麻煩,下面這個程序可以自動完成對編號的尋找及修改過程。 為了能夠清楚的看清要改變的數字及及其所處的位置,用變量“h”記錄數字的高度,變量“viewctr”及“viewsize”記錄了使用命令前的視窗中心及其大小。 (defun c:chn( / cmdmode viewctr viewsize sset i j k ssl nsset temp ent number x1 y1 x y h yorn) (defun *error*(s) (exit) ) (setq cmdmode (getvar cmdecho) (setvar cmdecho 0) (setq viewctr (getvar viewctr) (setq viewsize (getvar viewsize) (prompt nselect numbers to add: ) (setq sset (ssget) (if (null sset) (progn (princ nerror: nothing selected!n) (exit) ) ) ;根據用戶指定范圍過濾出需要改變的編號,并報告找到多少編號。 (setq i(getintnthe number from which to change:) (setq j(getintnthe number to which to add:) (setq k(getintnhow much you want to add:) (setq ssl (sslength sset) (setq nsset (ssadd) (while ( ssl 0) (setq temp (ssname sset (setq ssl(1- ssl) (if (= (cdr (assoc 0 (entget temp) text) (progn (setq number (atoi(cdr(assoc 1 (entget temp) (if(and (= j number) (ssadd temp nsset) ) ) ) (setq ssl (sslength nsset) (if (= ssl 0) (progn princ(nno numbers selected!) (exit) (print ssl) (princ numbers are found.) ;使被改變編號以一定大小處于屏幕中心位置并被高亮度顯示, ;改變每個編號前先詢問用戶,以免改變了不想改變的編號。 (setq x1 (car viewctr) (setq y1 (cadr viewctr) (setq ent (entget (ssname nsset (- ssl 1) (setq h (cdr(assoc 40 ent) (while ( ssl 0) (setq ent(entget (ssname nsset (setq ssl (1- ssl) (setq x (cadr(assoc 10 ent) (setq y (caddr(assoc 10 ent) (if (or ( (abs (- x x1) (* h 10) ( (abs (- y y1) (* h 6) (progn (command zoom c (list x y ) (* h 20) ) (setq x1 x) (setq y1 y) ) ) (redraw (cdr(assoc -1 ent) 3) (initget 1 yes no) (setq number (atoi(cdr(assoc 1 ent) (princ nthe number ) (princ number) (setq yorn (getkword to be changed?(y/n) (if (= yorn yes) (entmod (subst (cons 1 (itoa(+ number k) (assoc 1 ent) ent) ) (redraw (cdr(assoc -1 ent) 1) ) ;所有編號改變完成后,恢復使用本命令前的視窗。 (command zoom c viewctr viewsize) (setvar cmdecho cmdmode) ) (princ ntc:chnumber loaded. start command with chn.) 4.自動畫管線圖的小程序 畫一些管路原理圖時,常常有許多管路在圖中相交,而這些管路實際并不相連。我們常把在相交點處次要的管路斷開,在用一半圓連接兩斷點,下面的程序可以幫助大家完成做這一繁瑣的工作。 程序中使用“break”命令截斷需要被斷開的管線,再用“arc”命令畫一半圓連接兩斷點。變量p讀取管線交點;p1、p2為點p的左右或上下兩點;p3為連接p1、p2半圓的中點。由于使用“break”命令時若autocad環(huán)境處于對象捕捉方式(osmode0),則“break”命令截斷的p1、p2兩點可能為變?yōu)閜1、p2附近的捕捉點。所以程序開始時用變量myosmode記錄系統(tǒng)變量osmode,而后設置osmode為0,程序結束后再設置還原osmode。變量horn判斷用戶需要斷開的是水平線還是垂直線。 (defun c:brel(/myosmode horv p p1 p2 p3) (setq myosmode (getvar osmode) (setvar osmode 0) (setq p (getpoint nselect point to break:) (initget 1 h v) (setq horv (getkword directionh/v?) (if (= horv h) (progn (setq p1 (list (- (car p) 1.5) (cadr p) (setq p2 (list (+ (car p) 1.5) (cadr p) (setq p3 (list (car p) (+ (cadr p) 1.5) ) (progn (setq p1 (list (car p) (- (cadr p) 1.5) (setq p2 (list (car p) (+ (cadr p) 1.5) (setq p3 (list (+ (car p) 1.5) (cadr p) ) ) (command break p1 p2) (command arc p1 p3 p2) (setvar osmode myosmode) (princ) ) (princ nstart command with brel which will break a line and join it with an arc.) autocad 2000 中的visual lisp開發(fā)工具開發(fā)三維圓柱螺旋線程序,給出了開發(fā)程序代碼和運行結果,以及三維彈簧、螺紋繪制實例。在用autocad 2000繪制三維工程圖時,經常遇到繪制螺紋、彈簧這類三維圓柱螺旋線的問題。在autocad中,繪制三維線的命令有很多,如line、3dpoly、spline等命令,而可以作為三維拉伸路徑的線只有3dpoly命令繪出的線可以勝任,而且不能使用其中的擬合項。因此,為了保證繪制的三維圓柱螺旋線尺寸精確,就必須輸入大量精確數據,才能一點一點地畫出所需的螺旋線,這樣做起來非常麻煩。有關資料介紹采用圓弧近似構成螺旋線1,但是這樣畫出的螺紋不能通過裝配干涉檢查。由于在autocad中不方便繪制螺旋線,為了解決這個問題,筆者采用編制一個lisp程序來實現。該程序可以實現圓柱螺旋線自動繪圖,不僅可以用于繪制彈簧螺旋線和螺紋的螺紋線。還可以進行參數化繪圖。3、 圓柱螺旋線的繪制3.1 圓柱螺旋線數學模型* 圓柱螺旋線的形成圓柱螺旋線是技術上應用最廣的空間曲線,其形成如圖1所示。一動點m沿圓柱的母線ab作等速直線運動,而該母線又繞圓柱的軸線作等角速旋轉時,點m的運動軌跡即為圓柱螺旋線。* 數學模型 當圓柱螺旋線的軸線與坐標系的z軸重合時,圓柱螺旋線上動點m(x,y,z)的參數方程如下:x=rcos y=rsinz=t1*/(2)在參數方程中:r為圓柱面的半徑,為螺旋線升角,t1為導程(即母線ab旋轉一周時,動點m沿軸線方向上升的距離),右旋取正號,左旋取負號。開始 參數r、t1、k賦值 給出基點坐標計算x, y, z各點坐標繪制螺旋線結束打開autocad2000進入visual lisp開發(fā)環(huán)境,新建一個文件,在visual lisp文本編輯器窗口進行程序代碼編制。 繪制圓柱螺旋線的autolisp程序代碼如下:; this program is using for drawing a helix(setqb1(getpoint請輸入基點:)(setqr(getreal半徑 r=:)(setqt1(getreal節(jié)距 t1=:)(setqk(getint段數 k=:)(setqn(getint圈數 n=:)(setqta(/(*23.14159)k)(setqj1(/t1k)(setqa0)(setqjj0)(setqii0)(commanducsob1)(command3dpoly(listr00)(repeatn(repeatk(setqjj(+jj1)(setqa(+taa)(setqx(*r(cosa)(setqy(*r(sina)(setqz(*j1jj)(setqp2(listxyz)(commandp2)(setqii(+ii1)(setqz(*t1ii)(command )段數k 最好為36或36的倍數(72)。繪彈簧時,n為彈簧的總圈數;繪螺紋時,若螺紋的長度為l,則n=l / t1。將這個lisp程序保存為“helix.lsp。在編寫lisp程序時,應注意輸入一定要正確,括號和空格都必不可少,否則會影響到螺旋線的軌跡。自動生成明細表巧門在利用計算機進行機械繪圖的領域里,autocad是國內公認的功能強大的繪圖軟件。但其在文字、表格處理上卻顯得很薄弱,尤其是在制作表格上,甚至沒有提供此項功能。而人工繪制表格和文字輸入不但花費的時間長,而且嚴重地影響了繪圖速度。因此,如何自動而有效地生成明細表便顯得很有意義。本文通過實例介紹如何在autocad系統(tǒng)下自動生明細表的方法。 圖1 明細表 序號規(guī)格名稱數量材料備注135.1汽缸透蓋1zg35235.2汽缸體135335.3螺塞2a3f4gb6170-86螺母m1012a3f535.4壓蓋1th200實現方法1. 建立明細表數據文件首先,把明細表的數據信息,用文字編輯器按如下格式寫入磁盤文件mxb.txt中,作為明細表數據文件?!?”“35.1”“氣缸透蓋”“1”“zg35”“”“”“”“2”“35.2”“氣缸體”“1”“35”“”“”“”“3”“35.3”“螺塞”“2”“a3f”“”“”“”“4”“gb617086”“螺母m10”“12”“a3f”“”“”“”“5”“35.4”“壓蓋”“1”“th200”“”“”“”然后用autolisp的readline函數提取有關數據信息,并把該數據信息賦給表格圖塊屬性。注意:各字符串要加雙引號,空字符串引號“”不可省略,以便autolisp識別。2.建立明細表格式圖塊通常,一個明細表是由表頭和表體兩部分組成。表頭是固定的,因此可以用autocad命令生成一個固定的表頭,并把它作為一個圖塊存入磁盤。假設要得到如圖1所示的明細表,則先做一個明細表表頭。 表頭 表頭實際上是一個圖形文件,本文設定該文件名為mxb.dwg,然后用autocad命令建立一個。 圖塊 當用戶向表中插入該塊時,系統(tǒng)會向用戶詢問屬性值,此時用autolisp程序將上面建立的明細表數據文件中的數據分別賦給各個屬性。屬性的定義是用autocad命令attdef完成的。編制程序首先,用autolisp的i/o函數readline讀入數據文件mxb.txt,再用字符串連接函數strcat給文件的每一行加上括號,此時數據類型為字符串(str)。然后,再利用read函數把字符串轉換成一個表(list),以方便autolisp對表中的每一項進行各種操作。最后,用autolisp的command函數調用insert命令,先將圖塊mxb.dwg插入表中,再將mxb1.dwg插入表中,用nth函數將前面autolisp讀入的數據中各項信息分別賦給mxb1.dwg中的各個屬性。下面給出實現上述功能的程序清單: (defun c:mxb(/scmde p f1 bk a m1 m2 m3 m4 m5 m6 m7 m8 p1)(setq scmde (getvar “cmdecho)(setvar “cmdecho 0)(setq p (getpoint “n please input a point:)(setq f1 (getstring “n please input file name:)(setq f (open f1 “r)(print “n please wait .)(setq bk “mxb)(command “insert bk p 1 1 0)(setq bk “mxb1)(setq p1 (list (car p) ( (cadr p) 8)(while (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論