標籤:

在cad中如何創建lisp程序?以及大神們所說的lisp解決重複性勞動問題是怎麼回事?


余同 答主已經詳細的回答了如何開始。我就直接實戰為例吧,以Alisp為開發語言,擴展CAD的功能。

推薦兩個網站,明經通道 和 曉東CAD ,這裡聚集了很多喜歡CAD二次開發的人,是擁有最全大神和源碼的兩個中文網站。

首先,你需要知道lisp支持的函數,這些函數構成了代碼的骨幹並為我們實現想要的功能。以下資源來自MJTD

但是不要急著去背誦函數,用的時候查閱就可以了,學這門語言最好的方法就是看別人的代碼注釋,自己操作

我們先從簡單的開始,工作中常見的繪圖操作有修建延伸命令,假如我們想要達到下圖中的結果,讓系統自動判斷是修剪還是延伸至所選的邊界線,批量完成操作

1、首先定義功能函數,我們常用
(defun 函數名 (全局變數&<函數引入的變數&> / 局部變數&<函數運行完會釋放變數值&>)
(...);英文單引號用來做注釋,所在行後面的內容不編譯,用來提醒自己或者告訴他人代碼含義
);通常LISP的代碼由不斷嵌套的成對() 組成,這就引來下面的笑話:
話說有個某特工九死一生偷到了美國火箭發射程序的源代碼的最後幾頁,可惜全是))))))))))))))))),好吧我承認這個笑話一點不好笑,下面進入正題
函數名 全局變數 局部變數
(defun trim_or_extend (borderline ss_lst / i ent pt10 pt11 obj1 obj2 interpt old_edgemode)
2、然後寫入功能
(setq old_edgemode (getvar "edgemode))
;setq是最常用的變數賦值函數 (setq 變數名 值&<可以是1--數值,「1」--字元,a--變數,(..)&<表達式&>)
(setvar "edgemode" 1)
;(setvar / getvar "系統變數) 獲得CAD內置的變數用來控制操作的模式
(setq i 0)
(repeat (length ss_lst)
;repeat while foreach 等都是循環語句的用法,篇幅限制,略下不表
(setq ent (nth i ss_lst) ;表達式 系統自帶函數
dd (xl-3p ent) ;表達式 自定義函數
;下面講講自定義函數,就像萬花筒的變化多端案都來自基本圖案,代碼的功能就基於各種輪子,
除非必要,請不要自己造輪子,輪子哥除外^_^
(defun xl-3p (e / ps pe pm)
(setq ps (vlax-curve-getstartparam e)
pe (vlax-curve-getendparam e)
pm (/ (- pe ps) 2))
(mapcar "vlax-curve-getpointatparam (list e e e) (list ps pm pe))
)
;通用函數的作用在於程序的通用性和標準化,只要注意函數的&<傳入/輸出值&>就行,黑箱操作;
這樣的函數可以放在程序的絕大部分位置。
dxf (entget ent)
pt10 (car dd)
pt11 (last dd)
)
(setq obj1 (vlax-ename-&>vla-object borderline)
;看見vl-xx,vla-xx,vlax-xx就記得去查Visual lisp函數,此處按下不表
obj2 (vlax-ename-&>vla-object ent)
)
(setq interpt (vlax-invoke obj1 "intersectwith obj2 0))
(setq pt1 (vlax-curve-getClosestPointTo obj1 pt10 t)
pt2 (vlax-curve-getClosestPointTo obj1 pt11 t)
)
(if (/= interpt nil)
(if (&< (distance pt10 interpt) (distance pt11 interpt)) (command "._trim" borderline "" (list ent pt10) "") (command "._trim" borderline "" (list ent pt11) "") ;command是模擬系統自帶的命令的手動操作過程,不懂的話就用trim去試 ) (if (&< (distance pt10 pt1) (distance pt11 pt2)) (command "._extend" borderline "" (list ent pt10) "") (command "._extend" borderline "" (list ent pt11) "") ) ) (setq i (1+ i)) ) (setvar "edgemode" old_edgemode);改動的系統變數記得還原 ) 3、最後定義調用命令 (defun c:tt (trim_or_extend borderline ss_lst));C:後面的tt就是你調用這個函數的命令, 相當於你在cad中輸入trim 怎麼樣,是不是特別簡單,快上手試試吧!

這類程序的編寫、調試、編譯等都可以在Autocad中自帶的編輯器中進行,啟動命令 Vlide

隨著你接觸二次開發的時間越長,就積累了越多的代碼,自然而然就想把這些優秀的功能組合起來,這時候就到了製作屬於自己的工具箱的時候了。市面上典型的幾類菜單有如下幾種:

1、浮動面板型(如:燕秀、賤人)

這類菜單優點是:簡單易學、通過lisp可以實現;缺點也很明顯:若功能多則佔用的屏幕大使用容易眼花繚亂,只能使用時喚出不能常駐。

2、工具欄型(如:Msteel、常青藤)

3、抽屜式側邊欄型(如:Tbtools)

4、下拉菜單欄型(如:易橋)

填坑中。。。。

最後,打個小廣告,歡迎使用交流 小草集工具箱

HTTPS://QR.ALIPAY.COM/FKX002830P0WLCHO0SMW79 (二維碼自動識別)


  • 如何創建Lisp程序

AutoLisp代碼可以在任意的文本編輯器中創建.不過AutoCAD也提供了Visual Lisp編輯器,可以支持語法高亮,調試編譯什麼的.打開Visual Lisp編輯器有兩種方式:

1. AutoCAD2008及之前的版本,在菜單欄「工具(Tools)"下面,選擇」AutoLisp"----&>"Visual Lisp編輯器".(」AutoLisp"----&>"導入應用"這個命令是用來載入AutoLisp腳本的.

2. AutoCAD2009及之後的版本, 在功能區的」管理「選項卡里可以直接打開Visual Lisp編輯器。

打開Visual Lisp編輯器之後新建一個文件,並另存為Lisp源文件。然後就可以在編輯窗口裡輸你的代碼了。

代碼編輯並調試確認無錯誤後,就可以在AutoCAD中使用了。

左邊的按鈕表示立即運行當前代碼,如果有錯誤就會提示出來,右邊按鈕是切換到CAD窗口。

如果不需要再修改代碼了還可以將代碼進行編譯以加速運行。

根據嚮導一步步進行編譯很簡單的。

如果在其他CAD圖形文件中需使用當前代碼文件或編譯後的文件,就按上面第一點的,或者在命令行輸入」ap",打開導入應用的對話框。

1是用來臨時導入的,2是將程序加入CAD的啟動組。

以上。具體如何入門AutoLisp程序設計,可以參照AutoCAD 完全應用指南 (豆瓣)這本書。

  • lisp解決重複性勞動問題

在設計和繪圖中,你覺得都是簡單粗暴的重複性工作,就可以考慮用AutoLisp來代替你做。

首先,AutoLisp也是一個程序設計語言,屬於Common Lisp的子集,同時加入了很多自定義的函數。即然是一個程序語言,就是其他編程語言能做的,它也能做,只是他的lisp語法跟一般的語言有些差另就是了,但是如果是一個沒有VB、C#、C++(對應於AutoCAD的開發方式分別是VBA,.net,ObjectArx)的基礎的人來說,AutoLisp是很簡單而且特別容易上手的一個語言。

作為一個編程語言,AutoLisp能做的很多:

  1. 擴充AutoCAD的原有命令。任何帶有C:前綴的AutoLisp函數,在AutoCAD中都可以像"line" "circle" "dim"等命令一樣使用。
  2. 編寫代碼直接根據國標圖庫要求來繪出一些常用圖庫標準件什麼的,或是代替人查找各種設計手冊中的相關數據並繼續使用。
  3. 進行參數化繪圖,對於一些不特別複雜的系統,提供窄範圍、大深度的專業設計自動化或者輔助系統,如發動機裝配工具設計、縱使機主軸箱設計等。
  4. DWG文件本質上是AutoCAD在圖形生成和編輯中使用的資料庫,可以將一些非圖形信息的數據(粗糙度,高度,厚度。。)等存於DWG文件中作 為非圖形資料庫文件,然後利用Lisp程序進行讀取等。
  • 各種AutoCAD二次開發方式的比較

由於 .net語言和c++的學習曲線比較陡峭,所以簡單易學的AutoLisp經常與VBA進行對比。(當然如果有VB的基礎還是直接學VBA好了。)

AutoLISP擅長建立新命令和產生已有命令的連接。VBA擅長執行包括在其他應用程序中的組件,如Microsoft的Excel和Access。AutoLISP是基於表處理的編程體系,它允許程序員隨意地存儲和操作傳送信息,然而VBA部件包括數據和對複雜情況的各種有效操作,這就是問題變得複雜的地方。(/選擇AutoLISP還是VBA)

不過,在AutoCAD2000開始,Autodesk公司就在AutoCAD中加入了Visual Lisp編輯器,引入了許多新函數擴充AutoLisp的功能,並支持ActiveX對象的訪問方式,所以使用AutoLisp來與WordExcel等程序進行交互也是變簡單了。

另外,在創建帶GUI圖形界面的應用程序上,VBA當然是所見即所得的了,而AutoLisp是通過DCL文件來實現GUI的(語法很簡單,但做不到所見即所得).這點是AutoLisp略遜一籌了。


題主想問的應該是AutoLisp,一種LISP的方言,由Autocad載入並執行。

作為一門語言,AutoLisp是用戶除了圖形界面外,和CAD程序進行交互的最簡單的渠道,既然是交互,那麼我們使用AutoLisp場景通常也是讓Autocad替我們執行一些操作,全自動或半自動的。

多說一點,AutoLisp為了使我們能夠更容易地實現所期望的操作,提供了數組,函數,等等基礎設施。除了LISP的基礎部件外,AutoLisp所提供的函數大多圍繞DWG資料庫以及CAD中的圖形實體的操作。

如何創建AutoLisp?其他答案已經說的很仔細了,就不贅述了。

至於題主問的效率問題,AutoLisp除了能夠組合你常用的操作外,還能藉助選擇集,擴展字典等工具實現在圖形界面里很難做到的事情。

不過,CAD開發做到後面,都會投入到ObjectARX(C++)的汪洋大海中。。。


然而AutoCAD使用的卻是跟Office一樣的VBA……


http://www.zhihu.com/question/24866040/answer/30382926 可以參考本回答後半部分,創建一個簡單的程序。


不是專業人士,上學期剛選修的的CAD/CAM,現在來講一下我所知道的。

1、 啟動一個文本編輯器

如在Windows系統,可以用記事本來編寫lisp程序。

2、編輯一個AutoLISP程序

舉一個簡單的例子:

(defun c: triangle (/ p1 p2)

(setq p1 (getpoint "
左下角點: ")

len (getreal "
邊長:")

p2 (polar p1 0 len)

p3 (polar p2 (/ (* 2 pi) 3.0) len )

); end of setq

(command "pline" p1 p2 p3 "c")

); end of function

編輯完成後,保存為擴展名為lsp的文件。如存為prog01.lsp。

3、啟動AutoCAD,載入上述程序

方法一:單擊「工具」下拉菜單,選擇「程序調入」選項,在對話框中輸入文件名,注意應指明路徑。如「d:prog01.lsp」,載入程序,如有錯誤,則返迴文本編輯器進行修改。重新載入程序,直至程序正確。

方法二:在命令行輸入(load 「d:\prog01.lsp」), 如有錯誤,則返迴文本編輯器進行修改。重新載入程序,直至程序正確。

4、在AutoCAD命令行中輸入命令triangle運行上述程序,查看程序運行結果。

另外用list程序解決重複性勞動問題,我的理解是在機械設計過程中(抱歉,我對給排水方向不了解,我想應該和機械設計方面差不多吧!)很多零、部件的形狀是相似的,因此它們的二維視圖(幾何模型)也是相似的;例如鍵、銷、螺釘、螺母、滾動軸承等。繪製這此零件的視圖一般都採用程序變數方式。在參數化程序方式下,用戶不再調用繪圖命令逐條線地繪製圖形,這樣的工作交給程序來完成,用戶只需向程序提供所需的一些參數,就像調用編好的函數一樣,非常方便快捷,也大大減少了重複工作量。


關於怎麼創建lisp參考其他答案就可以了。

而如果要解決重複腦洞的問題,對於一個沒學過編程的設計師來說,lisp和腳本是最優的選擇啊,而其中又以可以直接在命令行敲而略勝一籌:神器 command 函數加上循環語句就可以滿足大部分的需求了。


高級版本的cad分離了VBA模塊,需要到官網下載安裝,而且不建議拿來寫了。lisp在寫cad交互操作上非常好用,內置的編輯器也足夠好,打開方式:工具-&>autolisp-&>visual lisp編輯器。如果要數據轉移或者開發高級功能,建議用c#或者c++。


autoLISP適用於「系列化」的繪圖實踐中,即你在繪圖中,經常要繪製同一類的一組圖形,這組圖形是相似的,或者說可以把他們「改造」成相似的,也即可以把每一個不同的圖形編程編入同一個CAD命令中,而此命令中可以設置若干參數,以供執行命令時選擇。

打個比方,你可以編一個atuoLISP命令專門繪製螺栓,而你可以把螺栓的公稱直徑、螺紋長度、頭部形式等作為參數編程編進這個命令中。

#######################

另,autoLISP還有另一個應用,即實現機構運動模擬或切削加工模擬。

拿切削加工模擬來說。用程序實現刀具和工件的各自進給,讓它們在空間中處於正確的方位,然後通過各自的微小進給以及連續的布爾運算,最終即可得到你要的工件形狀,這在設計複雜螺桿刀具時非常有用,因為,你可用得到的虛擬工件形狀反過來去校驗你所設計的刀具形狀是否合理。


通過lisp需要寫一些自己想要的功能放到CAD中去執行,提高工作效率!在網上可以找一些資料學習!


以前玩過一段時間autolisp,關於重複性勞動我舉個簡單的例子,比如圖上有100個編號,每個編號有1到5個不等,在審圖的時候發現要增加號,如果一個個手工修改,那是會累死人的。但用autolisp能有效的解決。


推薦閱讀:

高版本CAD不能用查找替換命令查找鋼筋符號,如何解決?
為什麼 AutoCAD Architecture 在國內基本沒人用,而天正基本獨霸了建築市場呢?

TAG:CAD | Lisp | CAD製圖 |