本文目錄一覽:
- 1、簡述autolisp使用的七種數據類型
- 2、autolisp 組碼後面的值怎麼引用變量?
- 3、autolisp 錯誤: DXF 組不正確:
- 4、請求幫忙用autolisp或者vlisp寫一句代碼
- 5、求此AUTOlisp代碼的錯誤之處…
- 6、跪求快速繪製一個圖形的autolisp的源代碼
簡述autolisp使用的七種數據類型
第一篇關於LISP的參考文獻是由John McCarthy 在1960年4月的《ACM通訊》中發表的。
除了FORTRAN和COBOL,大多數在六十年代早期開發出來的語言都過時了,可是LISP卻生存下來,並且已經成為人工智能(AI)的首選程序序言。AutoLISP解釋程序位於AutoCAD軟件包中,然而AutoCAD R2.17及更低版本中並不包含AutoLISP解釋程序,這樣,只有通過AutoCAD R2.18及更高版本才可以使用AutoLISP語言。
開發軟件編輯
AutoCAD軟件包中包含大多數用於產生圖形的命令,但仍有某些命令未被提供。例如,AutoCAD中沒有在圖形文本對象內繪製矩形及作全局改變的命令。通過AutoLISP,你可以使用AutoLISP程序語言編製能夠在圖形文本對象內繪製矩形或作全局選擇性改變的程序。事實上,可以用AutoLISP編製任何程序,或把它嵌入到菜單中,這樣定製你的系統會取得更高的效率。
現在,已經有數以百計的第三方軟件開發人員使用AutoLISP語言編製各種應用程序軟件包,例如,本文作者開發了一個名為SMLayout的軟件包,用它可以產生各種複雜幾何圖形的平面布局圖,這些幾何圖形包括管道的交叉部、過渡都、圓柱、彎管接頭、圓錐以及罐頂。目前社會上非常需要AutoLISP程序員為應用軟件及客戶菜單的開發提供顧問。
在本章中,我們假定讀者已經熟悉了AutoCAD命令及AutoCAD的系統變量。但是,在開始學習AutoLISP時,卻並不需要你是一位AutoCAD或編程專家。同時,本章還假定讀者並無編程方面的知識。如果你熟悉任何一種編程語言,那麼學習AutoLISP就會很容易。對各種函數的評細探討以及對例題的逐步講解會使你學起來很有興趣。本章討論常用的AutoLISP函數以及它們S程序編製中的應用。對於本章中未涉及的函數,請參閱Autodesk公司的《AutoLISP程序員參考手冊》。AutoLISP對硬件沒有任何特殊要求。如果系統能夠運行AutoCAD,那麼同樣也可以運行AutoLISP。AutoLISP程序可以使用任何文本編輯器進行編製。
數學運算編輯
任何編程語言都提供數學函數。在AutoLISP中,同樣提供了編程以及數學計算所需的大部分數學函數,你可以使用AutoLISP對數字進行加、減、乘、除運算,還可以得到以弧度表示的角度的正弦值、餘弦值及反正切值等。使用AutoLISP還可以進行許多其他計算。這一節主要討論AutoLISP程序語言支持的常用數學函數。
加法
格式(+ num1 num2 num3…)
此函數(+)計算加號(+)右邊所有數字的和(+ num1 num2 num3…)。這些數字可以是整數或實數。如果均為整數,則和為整數;如果均為實數,則和為實數。但是如果既有整數又有實數,則和為實數。如下所示,在前兩個例子中,所有數字均為整數,所以結果是整數。在第三個例子中,一個是實數(50.0),故結果為實數。
示例:
Command:(+2 5)返回 7
Command:(+2 30 4 50)返回86
Command:(+2 30 4 50.0)返回 86.0
減法
格式(- num1 num2 num3…)
此函數(-)從第一個數中減去第二個數(num1-num2)。如果多於兩個數,就用第一個數字減去其後所有數字的和[num1-(num2+num3…)]。在下面的第一個例子中,28減去14後返回14。因為兩個數均為整數,結果亦為整數。在第三個例子中20與10.0相加,並用50減去兩數的和(30.0),返回一個實數20.0。
示例:
Command:(- 28 14) 返回14
Command:(- 25 7 11)返回7
Command:(- 50 20 10.0)返回20.0
Command:(- 20 30)返回-10
Command:(- 20.0 30.0)返回-10.0
乘法
格式(* num1 num2 num3…)
此函數(*)計算乘號右邊所有數字的乘積( num1×num2×num3…)。若均為整數,它們的乘積亦為整數;若其中含有一個實數,乘積即為實數。
示例:
Command:(* 2 5) 返回10
Command:(* 2 5 3) 返回30
Command:(* 25 3 2.0) 返回150.0
Command: (* 2 -5.5) 返回-11.0
Command: (* 2.0 -5.5 -2) 返回22.0
除法
格式( / num1 num2 num3…)
此函數(/)用第一個數除以第二個數。如果多於兩個數,就用第一個數除以其後所有數的乘積[num1/(num2 × num3 ×…)]。在下面的第四個例子中,用200除以5.0與4的乘積[200/(5.0×4)]。
示例:
Command:(/ 30)返回 30
Command:(/ 3 2)返回1
Command:(/3.0 2) 返回 1.5
Command:(/ 200.0 5.0 4)返回 10.0
Command:(/ 200 -5)返回-40
Command:(/ -200 -5.0)返回40.0
增量數字編輯
格式(1+ number)
此函數(l+)使數字與1(整數)相加,返回一個增加1的數。在下面的第二個例子中,1與-10.5相加返回-9.5。
示例:
(1+ 20)返回 21
(1+ -10.5)返回-9.5
減量數字編輯
格式(1- number)
此函數(1-)從數字中減去1(整數),並返回一個減去1的數。在下面的第二個例子中-10.5減去1返回-11.5。
示例:
(1- 10)返回9
(1- -10.5)返回-11.5
絕對數字編輯
格式(abs num)
abs函數返回一個數的絕對值。該數可以是整數或者實數。在下面的第二個例子中,由於-20的絕對值為20,故函數返回20。
(abs 20)返回 20
(abs -20)返回20
(abs -20.5)返回20.5
三角函數編輯
sin函數
格式( sin angle)
sin函數計算一個角(以弧度表示)的正弦值。在下面的第二個例子中,sin函數計算Pi(180度)的正弦值並返回0。
示例:
Command:(sin 0)返回0.0
Command:(sin Pi)返回0.0
Command:(sin 1.0472)返回0.866027
cos函數
格式(cos angle)
cos函數計算一個角(以弧度表示)的餘弦值。在下面的第三個例子中,cos函數計算Pi(180度)的餘弦值並返回-1.0。
示例:
Command:(cos 0)返回l.0
Command:(cos 0.0)返回1.0
Command:(cos Pi)返回-1.0
Command:(cos 1.0)返回0.540302
atan函數
格式( atan num1)
atan函數計算數的反正切值,返回角度以弧度表示。下面的第二個atan函數計算1.0的反正切值並返回0.785398(弧度)。
示例:
Command:(atan 0.5)返回0.463648
Command:(atan 1.0)返回0.785398
Command:(atan -1.0)返回-0.785398
兩個參數的atan函數
格式( atan num1 num2)
還可以在atan函數中再指定一個數。若指定了第二個數,函數將以弧度形式返回(num1/num2)的反正切值。在下面的第一個例子中,第一個數(0.5)除以第二個數(1.0),atan函數計算商(0.5/1=0.5)的反正切值。
示例:
Command:(atan 0.5 1.0)返回0.463648弧度
Command:(atan 20 3.0)返回0.588003弧度
Command:(atan 2.0 -3.0)返回2.55359弧度
Command:(atan -2.0 3.00)返回-0.5880033弧度
Command:(atan -2.0 -3.0)返回-2.55359弧度
Command:(atan 1.0 0.0)返回1.5708弧度
Command:(atan -0.5 0.0)返回-1.5708弧度
angtos函數
格式(angtos angle[made[precision]])
angtos函數以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的設置決定。
示例:
Command:(angtos 0.588003 0 4)返回“33.6901″
Command:(angtos 2.55359 0 4)返回“145.3099″
Command:(angtos 1.5708 0 4)返回“90.0000″
Command:(angtos -1.5708 0 2)返回“270.00″
注意 在(angtos angle[mode[precision]])中:
angle是以弧度表示的角度值。
mode是與AutoCAD系統變量AUNITS相對應的angtos模式。
AutoCAD中可用模式如下:
ANGTOS模式 編輯格式
0 十進制角度
1 度/分/秒
2 梯度
3 弧度
4 測量單位
precision是一個整數,用於控制小數的位數,與AutoCAD系統變量AUPREC相對應。 其最小值為0,最大值為4。
在上面的第一個例子中,angle為0.588003弧度,mode為0(十進制角度),precision為4(小數點後有四位)。函數返回33.6901。
表達式編輯
在程序中,通常都需要測試某些特定的條件。若條件為真,程序執行某些功能,若不為真,執行另外一些功能。例如,條件表達式(if( X 5)),若變量x的值小於5,測試結果為真。編程過程中經常要用到這種類型的測試條件。本節討論在AutoLISP編程中要用到的各種關係表達式。
等於
格式(= atom1 atom2…)
該函數(=)檢查兩個元素是否相等。若相等,條件為真,函數返回T。同樣,若指定的元素不相等,條件為假,函數返回nil。
示例:
(= 5 5)返回T
(= 5 49)返回nil
(= 5.5 5.5 5.5)返回T
(= “yes”“yes”)返回T
(=“yes” “yes” “no”)返回nil
不等於
格式(/= atom1 atom2…)
該函數(/=)檢查兩個元素是否不相等。若不相等,條件為真,函數返回T。同樣,若指定的元素相等,條件為假,函數返回nil。
示例:
(/=50 4)返回T
(/= 50 50)返回nil
(/= 50 -50)返回T
(/= “yes” “no”)返回T
小於
格式(atom1 atom2…)
該函數()檢查第一個元素(atoml)是否小於第H個元素(atomZ)。若為真,函數返回T,否則返回nil。
示例:
( 3 5)返回T
( 5 3 4)返回nil
( “x” “y”)返回T
小於等於
格式(= atom1 atom2…)
該函數(=)檢查第一個元素(atom1)是否小於等於第二個元素(atom2),若是,函數返回T,否則返回nil。
示例:
(= 10 15)返回T
(=“c”“b”)返回nil
(= 2.0 0)返回T
大於
格式( atom1 atom2…)
該函數()檢查第一個元素(atom1) 是否大於第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,15大於10,因此,關係表達式為真,且函數返回T。在第二個例子中,10大於9,但9並不大於其後的9,因此函數返回nil。
示例:
( 15 10)返回T
(10 9 9)返回nil
(“c”“b”)返回T
大於等於
格式(= atom1 atom2…)
該函數(=)檢查第一個元素(atom1)的值是否大於等於第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,78大於但木等於50,因此,函數返回T。
示例:
(= 78 50) 返回T
(= “x”“y”) 返回nil
abs 返回參數的絕對值
(abs number)
參數 number
返回值 參數的絕對值
示例 (abs 100) 返回100
(abs -3) 返回3
8.acad_colordlg
顯示標準的AutoCAD顏色選擇對話框
(acad_colordlg colornum [flag])
參數
colornum
整數,其取值範圍是 0-256 (包括 0 和 256),它用於指定顏色對話框的缺省的顏色代碼。
flag
如可選參數 flag 設為 nil,禁用“隨層”和“隨塊”按鈕;省略 flag 參數或將其設為非 nil 值,則可啟用“隨層”和“隨塊”按鈕。
colornum 為 0 時代表 BYBLOCK(隨塊),為 256 時代表 BYLAYER(隨層)。
返回值
用戶所選擇的顏色代碼,如果用戶取消該對話框則返回 nil。
示例
下列代碼提示用戶選擇一種顏色,如果不選則指定綠色為缺省顏色:
(acad_colordlg 3)
9.acad-pop-dbmod
恢復 DBMOD 系統變量的值到最近用 acad-push-dbmod 保存的值
(acad-pop-dbmod) 該函數使用 acad-push-dbmod 控制 DBMOD 系統變量。DBMOD 系統變量跟蹤圖形的修改狀態和觸發保存圖形請求。
返回值
如果成功時返回 T;否則,如果堆棧為空時,返回 nil。
10 . acad-push-dbmod
儲存 DBMOD 系統變量的當前值
(acad-push-dbmod)
該函數使用 acad-pop-dbmod 來控制 DBMOD 系統變量。用戶可使用該函數來更改圖形而保持 DBMOD 系統變量不變。DBMOD 系統變量跟蹤圖形的修改狀態和觸發保存圖形請求。
該函數在 acapp.arx 中實現,acapp.arx 默認狀態下是加載的。該函數可將 DBMOD 系統變量的當前值轉到內部堆棧。要使用 acad-push-dbmod 和 acad-pop-dbmod,必須先進行 acad-push-dbmod 操作,再使用 acad-pop-dbmod 來恢復 DBMOD 系統變量的初始狀態。
返回值
總是返回 T。
示例
以下例子顯示了怎樣儲存圖形的修改狀態,接着對圖形進行修改,最後恢復初始狀態。
(acad-push-dbmod)(setqnew_line ‘((0 . “LINE”) (100 . “AcDbEntity”) (8 . “0”) (100 . “AcDbLine”) (10 1.0 2.0 0.0) (11 2.0 1.0 0.0) (210 0.0 0.0 1.0)))(entmake new_line) ; DBMOD 被設置標誌 1(command “_color” “2”) ; DBMOD 被設置標誌 4(command “_-vports” “_SI”) ; DBMOD 被設置標誌 8(command “_vpoint” “0,0,1”) ; DBMOD 被設置標誌 16(acad-pop-dbmod) ; DBMOD 被設置回初始值
嵌入目的編輯
AUTOLISP嵌入AutoCAD的目的使用戶充分利用AutoCAD進行二次開發;實現直接增加、修改AutoCAD的命令,隨意擴大圖形編輯功能,建立圖形庫和數據庫並對當前圖形進行直接訪問和修改,開發CAD軟件包等。
數據類型編輯
符號 (SYM)
字符串 (STR)
表 (LIST)
文件描述符 (FILE)
AutoLISP的內部函數 (SUBP)
AutoCAD的選擇集 (PICKSET)
AutoCAD的實體名 (ENAME)
函數分頁表 (PAGETB)
典型應用編輯
一、實現參數化繪圖程序設計,包括尺寸驅動程序、鼠標拖動程序等。到目前為止,大多數參數化程序都是針對二維平面圖形編製的。實際上,立體圖同樣可以實現參數化繪圖,AutoCAD中編製實體的立體圖參數化程序比其三維視圖程序更簡單,而且立體圖生成後,可以很方便地生成三視圖、剖面圖和軸測圖。
二、構成DCL文件創建自己的對話框。驅動利用AutoCAD提供的PDB模塊構成DCL文件創建自己的對話框。
命令特點編輯
可以直接調用AutoCAD中的全部命令;
具備一般高級語言的基本結構和功能;
具有強大的圖形處理功能。
功能編輯
1.AutoLISP語言是在普通的LISP語言基礎上,擴充了許多適用於CAD應用的特殊功能而形成的,一種僅能以解釋方式運行於AutoCAD內部的解釋性程序設計語言。
2.AutoLISP語言中的一切成分都是以函數的形式給出的,它沒有語句概念或其他語法結構。執行AutoLISP程序就是執行一些函數,再調用其他函數。
3.AutoLISP把數據和程序統一表達為表結構,即S-表達式處理,故也可把程序當作數據來處理,也可把數據當作程序來執行。
4.AutoLISP語言中的程序運行過程就是對函數求值過程,是在對函數求值過程中實現函數功能。
5.AutoLISP語言的主要控制結構是採用遞歸方式。遞歸方式的使用,使得程序設計簡單易懂。
主要工具編輯
文本編輯器、格式編排器、語法檢查器、源代碼調試器、檢驗和監視工具、文件編譯器、工程程序系統、上下文相關幫助與自動匹配功能和智能化控制平台。
autolisp 組碼後面的值怎麼引用變量?
ssget語句的格式不對。
格式:(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])
sel-method 字符串,指定對象選擇方法。
filter-list 關聯表,指定對象的特性。
例:
創建一個選擇集,該選擇集由 pt_list 所定義的多邊形包含的所有藍色線段組成:
命令: (ssget “_WP” pt_list ‘((0 .
“LINE”) (62 . 5)))
Selection set: 8
autolisp 錯誤: DXF 組不正確:
組碼40和62需要的都是數字,dcl讀取出來的都是字符串,只要將這些字符串轉換成數字就可以了,可以用函數atof和atoi轉換。
請求幫忙用autolisp或者vlisp寫一句代碼
(defun c:QS (/ DICEN)
(setq DICEN (namedobjdict))
(if (dictsearch DICEN “AcadDim”)
(dictremove DICEN “AcadDim”)
)
(dictadd DICEN
“AcadDim”
(entmakex ‘((0 . “XRECORD”)
(100 . “AcDbXrecord”)
(280 . 1)
(90 . 990106)
(3 . “”);;—–引線和箭頭-〉箭頭[用戶箭頭的缺省塊名,””則表示未設置]
(60 . 2);;—–注釋-〉注釋類型[0,1,2,3,4]
(61 . 0);;—–注釋-〉重複使用注釋[0,1,2]
(62 . 1);;—–附着-〉文字在右邊[0,1,2,3,4]
(63 . 1);;—–附着-〉文字在左邊[0,1,2,3,4]
(64 . 0);;—–附着-〉最後一行加下劃線[0,1]
(65 . 0);;—–引線和箭頭-〉引線[0,1]
(66 . 0);;—–引線和箭頭-〉點數-〉無限制[0,1]
(67 . 3);;—–引線和箭頭-〉點數[任意正整數]
(68 . 1);;—–注釋-〉多行文字選項-〉提示輸入寬度[0,1]
(69 . 0);;—–注釋-〉多行文字選項-〉始終左對齊[0,1]
(70 . 0);;—–引線和箭頭-〉角度約束-第一段[0,1,2,3,4,5]
(71 . 0);;—–引線和箭頭-〉角度約束-第二段[0,1,2,3,4,5]
(72 . 0);;—–注釋-〉多行文字選項-〉文字邊框[0,1]
(40 . 0.0)
(170 . 2);;—-控制“引線設置”對話框的缺省選項卡[0,1,2]
;; (340 . 圖元名)
;;—–當DXF組碼60的值為3,且已經設定了塊參照的塊名,則340組碼才會出現
;;—–格式為(340 . 上次使用塊參照作為注釋對象,實際插入的塊實例的圖元名)
)
)
)
(command “Qleader”)
)
設置一次之後,以後使用Qleader都不用再設置了。你也可以每次都使用QS命令。
求此AUTOlisp代碼的錯誤之處…
服了你了。
1、VISUAL lisp有調試器,單步跟蹤、設置斷點、變量監視,很容易找到錯誤。
2、如果提問的話,把錯誤提示信息貼上來,這樣大家少浪費點時間!!!
跪求快速繪製一個圖形的autolisp的源代碼
(defun C:tes ( / dis1 dis2 dis3 p1 p2 p3 p4 p5 p6 p7 p8 ss1 tc1 tc2 x)
(if (and (setq tc1 (entsel “\n請選擇中心線參考圖層”))
(setq tc2 (entsel “\n請選擇圓的參考圖層”))
(setq p1 (getpoint “\n請輸入第一點”))
( (setq dis1 (getdist p1 “\n請輸入長度”)) 4)
( (setq dis2 (getdist p1 “\n請輸入高度”)) 4)
( (setq dis3 (getdist p1 “\n請輸入圓半徑”)) 0)
)
(progn
(setq ss1 ‘() tc1 (assoc 8 (entget (car tc1))) tc2 (assoc 8 (entget (car tc2))))
(setq p2 (polar p1 0 2) ss1 (cons p2 ss1) p2 (polar p2 0 (- dis1 4)) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.25) (* 2 (expt 2 0.5))) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.5) (- dis2 4)) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.75) (* 2 (expt 2 0.5))) ss1 (cons p2 ss1)
p2 (polar p2 pi (- dis1 4)) ss1 (cons p2 ss1)
p2 (polar p1 (* pi 0.5) (- dis2 2)) ss1 (cons p2 ss1)
p2 (polar p1 (* pi 0.5) 2) ss1 (cons p2 ss1);多段線點集合
p2 (polar p1 0 (* dis1 0.25)) p2 (polar p2 (* pi 0.5) (* dis2 0.5));圓心1
p1 (polar p2 0 (* dis1 0.5));圓心2
p3 (polar p2 pi (* dis1 0.5)) p4 (polar p1 0 (* dis1 0.5));中心線
p5 (polar p2 (* pi 0.5) (* dis2 0.75)) p6 (polar p2 (* pi 1.5) (* dis2 0.75))
p7 (polar p5 0 (* dis1 0.5)) p8 (polar p6 0 (* dis1 0.5))
)
(entmake (append (list ‘(0 . “LWPOLYLINE”) ‘(100 . “AcDbEntity”) ‘(100 . “AcDbPolyline”) (cons 90 (length ss1)) ‘(70 . 1)) (mapcar ‘(lambda (x)(cons 10 x)) ss1 )));多段線繪製
(entmake (list ‘(0 . “CIRCLE”) tc2 (cons 10 p2) (cons 40 dis3)));圓繪製
(entmake (list ‘(0 . “CIRCLE”) tc2 (cons 10 p1) (cons 40 dis3)))
(entmake (list ‘(0 . “LINE”) tc1 (cons 10 p3) (cons 11 p4)));直線繪製
(entmake (list ‘(0 . “LINE”) tc1 (cons 10 p5) (cons 11 p6)))
(entmake (list ‘(0 . “LINE”) tc1 (cons 10 p7) (cons 11 p8)))
)
)
(prin1)
);複製到記事本,以【.lsp】為後綴命名,autolisp加載後,命令為【TES】
;1.沒有明確給出中心線圖層;2.沒有給出圓圖層;3.沒有給出圓半徑
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/279284.html