2014年3月26日 星期三

螺栓繪圖程式

這是我最近寫的一個程式,終於寫完了,為了生活程式只能偷點時間寫,這是一個基礎螺栓詳圖繪圖程式

使用步驟如下

1. 使用者選取基礎螺栓形式 (TYPE 2, 3, 5)
2. 選取螺栓直徑 (配合螺栓形式有不同直徑)
3. 輸入螺栓埋置突出長度 (PROJECTION),螺栓總長自動計算,使用者可自行修改。
4. 選擇繪出形式 (完整或單線,如下圖),雙線圖可選擇是否標示尺寸,使用者可選擇繪出圖形是否建立圖塊,圖塊名稱可使用程式內定名稱或自訂圖塊名稱。





    所有螺栓細部尺寸均已內建,按確定後,點選詳圖放置點即可完成,繪圖錯誤可使用 UNDO 指令 B 選項回復至程式執行前狀態。


    另外加贈螺帽及墊片詳圖繪製功能。





這邊說說我寫 Visual Lisp 的兩個基本原則

一是程式成果不能低於人工繪圖的品質

二是不追求程式 100% 全自動 (雖然這是所有老闆的夢想)






2014年3月23日 星期日

Visual Lisp 內的括號



LISP 語法中,括弧的特色在編寫中會是一大困惱
數量跟位置都不能出錯,如果你寫過 EXCEL 儲存格的公式,只要敘述稍微長一點,就得小心括號配對的問題,但 EXCEL的括號通常不算多,而且有顏色提示。

看一下 AutoCAD Visual Lisp 怎麼處理這個問題,下面是我最近寫的一段程式碼




一堆括號,少打一個括號無法執行,雖然 IDE 會有提示,但是還是得找出來在哪哩,萬一位置放錯,程式敘述完全錯誤,像 (* (+ A B) C D) (* (+ A B C) D) 都能通過檢查,但結果天差地遠。

IDE 內有個功能,CTRL+SHIFT+[ CTRL+SHIFT+] 可以將游標位置處同一對括號範圍內程式碼反白


除了能檢查程式碼外,對於找出某一區塊程式碼進行編輯也是相當方便。

2014年3月20日 星期四

一個增加功力的論壇

Visual Lisp 不算是一個熱門的語言 (代表資源少),但又不是三兩下就可精通

有個論壇是可以一試,就在 AutoCAD 本家裡

http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/bd-p/130

有什麼優點呢,我認為最大的優點是論壇風氣不藏私
有什麼缺點 ? 可能就是英文 (但是並不難)

當然也有些中國的 lisp 網站,像明經通道,曉東 ...

如同前面說的,總有些藏步的感覺
另外,理面的高手很多應該是資訊本科出身,在此出沒主要有秀 lisp  功力的味道,lisp 可以用精簡的程式碼寫出令人咋舌的功能卻非我輩所能輕易理解。


2014年3月17日 星期一

VISUAL LISP 編輯環境

Visual Lisp 怎麼編輯?如果你願意,使用筆記本敲敲打打也不是不可,但絕對不是成大事的方法,現在的程式語言都有 IDE (Integrated Development Environment)工具,基本上就是整合編輯、除錯與編譯等等功能的應用程式,沒了它,程式撰寫將會非常困難,哪裡可以找到編輯 Visual Lisp 的環境呢?事實上就在 AutoCAD 裡,打上 VLIDE (Visual Lisp + IDE) 就可以了,如果你照著輸入後你應該可以看到這畫面。
 
 
第一看到的主控台不是編輯程式碼的地方,一開始當然先開新檔案,按左上角開新檔案圖示才是爬程式碼的地方,就從這裡開始寫起,寫什麼,還用問

"HELLO WORLD"

程式碼如下

(defun C:HW ( / s)

    (setq s "HELLO WORLD")

    (alert s)

)

輸入後畫面應該像這樣

首先,成對括弧是必須的 (有四對)

最外面的括弧是
(defun C:HW ( / s)

…….

…….

)
這是宣告定義一個函數名叫 HW,前面加 C: 讓它成為 AutoCAD 的一個命令,只要載入後,HW 就成為 COPY MOVE LINE 一樣的指令,當然如果你把它取名為 COPY,那後果你應該知道會如何。

( / s) 斜線前為引數,斜線後為局部變數

(setq s "HELLO WORLD")

setq 是等於函數 (LISP 不用 "="),換句話說,這行程式碼設定 s 變數為 HELLO WORLD 字串 (Lisp 沒有宣告變數型態的動作)

(alert s)

這個函數顯示 AutoCAD 的標準警示對話盒,顯示內容是變數 s,當然,就是 HELLO WORLD。

先到此為止,說明兩點,首先,整個程式碼的關鍵字有不同顏色標示,再者,Visual Lisp 的線上函數輔助說明只要將游標移到關鍵字 (藍色) 內,按 F1 就有相對應的說明,例如 alert 函數 (只有英文版)


怎麼執行,Lisp 是直譯式語言,就是不用編譯的意思(BASIC)

呼叫方法一,輸入以下指令 (先存檔,然後要放在支援搜尋路徑中,否則要打齊完整路徑)

(LOAD "HW.LSP")

我們先用這個
載入編輯器中的文字(E) Ctrl-Alt-E
會出現以下畫面

(程式基本邏輯有誤,例如括號不成對,這時會有錯誤訊息)

回到 AutoCAD 主程式,輸入 HWHELLO WORLD 出現。




萬事起頭難,還有很多沒交代,先到此暫停吧

2014年3月12日 星期三

一行程式碼 (三)

Visual Lisp 中如何操縱 AutoCAD 畫出圖形? 正統的答案是使用 entmake 函數,對於一般使用者,entmake 並不切親,那麼另一種呢?

其時操縱Visual Lisp 畫圖並不難,只要會畫圖就可以了,舉個例,你現在要在(100, 100) 位置上,畫出半徑 10 的圓,你會怎麼做

首先,呼叫 circle 指令 (選單、按鈕或指令打字)
輸入 100,100 (圓的中心點)
輸入 10 (圓的半徑)

打完收工,一個半徑 10 的圓乖乖的出現在螢幕上。

Lisp 上場,Lisp 派出 command 函數,請看
(command "circle" "100,100" "10")

你應該要抗議了,它抄我 !!!

是的,它完全抄 AutoCAD 指令,有沒有覺得天空亮出數道光束,鴿子四處飛舞?

實際在 Visual Lisp 程式內,"100,100" "10" 通常會是變數,隨著程式運算,給予不同的數值。

當然,這個指令有些缺點常被拿來說嘴,例如說執行速度比 entmake 慢,拜託,什麼時代了,如你會覺得電腦鈍,那你的 PC 應該有 7 8 年的歷史了吧,多久沒有殺手級軟體出現,再則,以我輩功力,要寫出讓電腦卡住的程式,大概只有一種可能,寫錯了,例如掉入無限迴圈之類;它有其它的缺點,以後再提吧。

這裡再補充一下,在 command 下有兩個值一提的輸入 PAUSE "", PAUSE 是讓指令暫停等待使用者輸入,"" 則是代替 ENTER,例如

(command "LINE" PAUSE "@100,0" "")

執行後會直接要求你輸入起始點 (PAUSE),輸入後起始點後便直接畫出向右 100長度的直線 (@100,0),最後不會問你下一點是否要輸入直接結束 (""),如果你會修改指令,這應該是個良好的提示。

2014年3月7日 星期五

一行程式碼 (二)

Visual LISP 依附在 AutoCAD 裏另一個例子,看看下面這行程式碼

(SETVAR "CLAYER" "標註")

首先,它有一組括號,符合 LISP 的特徵

第二,第一個文字 SETVAR,基本上可以猜出它是設定變數的函數 (SET VARIABLE),你可以在 AutoCAD 文字指令中輸入SETVAR,馬上可以了解這是設定 AutoCAD 系統變數的命令,有興趣的話,如果再輸入 "?" "*" 便可以瀏覽到完整的系統變數 (很多,很多,很多 ...)

再來 "CLAYER",如果你眼睛夠犀利,就可以在一行行系統變數中看到這個字,很明顯的它的設定值是目前所使用的圖層名稱。

到此,真相大白,基本上這行程式碼就是設定 "標註" 成為預設所使用的圖層。

那又如何?

在使用 CAD 繪圖時,常常有某些圖元 (線,圓,文字 ...) 一定歸屬於某一特圖層,例如線性標註會設定在 "標註" 這個圖層上 (當然,叫做 "DIMENSION", "DIM" 也很常見),於是每次繪圖前,往往第一個動作不是去找標註的命令按鈕,而是先去變更圖層。

如果 (SETVAR "CLAYER" "標註") dimlinear 能夠同時執行,那麼自然可以提高效率 (或是說 $)。

怎麼作,方法如下
1. 滑鼠移到按鈕上方,按下右鍵。
2. 從浮動選單中往下找,直到最下面「自訂(C)...   
3. 在「自訂指令介面」對話盒中,找到此按鈕之命令 (左上方區域),選到"線性標註"這個之指令 (2006)
      (或是用選單中 工具(T) / 自定(C) / 介面(I))
4. 此時,可以看到 AutoCAD 所設定原始巨集,應該是^C^C_dimlinear   (^C^C 是強迫中斷執行中指令,避免在別的指令中執行 _dimlinear)
5. 編輯它成為 ^C^C(SETVAR "CLAYER" "標註");_dimlinear
   (注意,要有分號,不要有多餘的空格)
6. 確定後即可使用

當然,圖檔中必須要有 "標註" 這個名稱之圖層,否則會有錯誤訊息。

2014年3月4日 星期二

一行程式碼說起

來看看 LISP 的語言風格,先看下面一行簡單的運算式

3 + 2 * 6

來個括號,順便確認運算順序 (前一段時間還吵過一陣先乘除後加減的口水戰)

(3 + (2 * 6))

把運算符號 + 跟 * 搬到每一對括號前

(+ 3 (* 2 6))

賓果! 這就是 LISP 程式語言的風格,它有一個專有名詞叫做 S-expression,這有什麼用?

這裡先暫停,想象有個你熟悉的語言 (C BASIC FORTRAN...),定義了兩個函數

PLUS
   輸入 A B
RETURN A+B


MUTIPLY
   輸入 A B
RETURN A*B

再看看下面這行程式
(PLUS 3 (MUTIPLY 2 6))

是的,LISP 出現了,實際上 + * 在 LSIP 中與其他函數是平等的,這樣做最大的意義在於資料的格式與程式語言將得到統一 (以後再談 LISP 的資料)。

回頭來看看跟 AutoCAD 有何關聯,你也許聽過一種 AutoCAD 的秘技,假設要畫一條直線,此時要輸入一段距離,假設是 123 456 789 的總和,手邊卻連算盤都沒有,密技會告訴你,這時只要輸入指令 (+ 123 456 789) 就可以得到 1368 的距離,此時,你應該知道其實你就是運用了 LISP。

最後要說的是 LISP 一對刮號將自動傳回其運算值,所以 1368 是 (+ 123 456 789) 的 RETURN。

2014年3月2日 星期日

為何是 LISP

Visual Lisp 是一種在 AutoCAD 中執行程式開發語言

事實上 C, C++, 或是 VBA 也是

不過 LISP 有幾個優點

第一 它跟 AutoCAD 是緊密結合在一起的,安裝完 AutoCAD 自然就可以使用

當然,若是它離開了 AutoCAD,一些函數就會失效

但是

只要會一句程式碼 (也不一定要學會,COPY & PASTE 也可)

就可以改善工作效率

還有其他優點嗎?

有,它所使用的 LISP 語言是一種古老而優美的語言

但上面這句話藏了一道問題

既然如此,似乎不常聽過這種語言? (至少像我這種工程師是如此,工作使用 AutoCAD 才聽過 LISP)


應用方向不同也造成了會 LISP 語言高手不懂工程 (或是 AutoCAD),而工程繪圖人員面對程式碼卻又無從下手,尤其是一大堆可惡的括號,跟那奇怪的運算方式

就從這裡開始,我會將我所會的一點一滴的記錄下來