2D 斷面物理性質 及 如何撰寫 Autolisp
這個程式想寫很久了,最近終於完成了,實際花費時間大概是4天。
含注解大約 1130 行 ,我發現專注力還是蠻強的,只是體力不行了 XD
除了AI 程式撰寫,對一般程式設計來說都是一樣的,可以用一句話概括 :
程式設計就是 輸入 及 輸出 。
就以此程式為例
你要輸出什麼? 你要輸入什麼?
1.面積 ,你得安排一個程式
(defun ShapeArea (obj / )
;;內容先不管
)
2.周長
(defun ShapePerimeter (obj / ))
3.邊界座標
(defun ShapeBoundingBox (Obj / ))
4.形心座標
(defun ShapCenter (obj / ))
.......
對於該程式傳入的是物件 所以給予參數 obj 的名稱
對於每個輸出應該是什麼型別,你也應當標示 :
(defun ShapeArea (obj / )) ;_string
(defun ShapePerimeter (obj / )) ;_string
(defun ShapeBoundingBox (Obj / )) ;_pointList
(defun ShapCenter (obj / )) ;_point
.......
接著對每個上述副程式做測試
(defun c:test ( / Obj CenterPt )
;;*********** centroid 形心副程式 *************
(defun ShapCenter (obj / o c)
;;程式碼
bula bula bula ........
) ;_傳回 point
(setq Obj (ssget))
(setq CenterPt (ShapCenter Obj))
(command "point" CenterPt "")
)
這些工作都不會白做,這個測試用的程式也表達了副程式呼叫的方式。你可以註解的形式,為該副程式加上呼叫方式的註解。
(defun ShapCenter (obj / )) ;_point
;;呼叫方式 (setq CenterPt (ShapCenter Obj))
;; 參數為Region 物件。
甚至可以用Xmind 或 Visio 等軟體會制流程,順著這個架構,安排好
輸入 及輸出,讓方向明確,架構清楚,效率也會好很多。
還有就是不要懶惰不寫注解,有一天你進步了,你想大改某支程式,沒註解你就要全部重新理解,浪費時間。
變數的使用,則要一眼能看出他的作用與型別例如:
AreaStr
LeftTopPt
AreaReal
用途與型別一眼就知道。
另外就是lisp 的一個特色
(defun c:test ( 傳入參數 傳入參數 / 本地化變數 本地化變數 ...... )
你可以在一個 程序 Procedure 或 函數 Function 中任意宣告一個變數,但是他是 Public,不只同檔案可以存取,其他檔案也可以,那真是噩夢一場,
所以你一定要將每個變數本地化。
對於公有變數你一定要加上 Public_變數名稱_型別 ,否則在除錯的過程這些都是噩夢,當然這種公有變數的使用並不多。
程序 Procedure 或 函數 Function 也是一樣,如果只有這個程式用到
儘量將其包含在該程式中,以避免同名稱的問題例如:
(defun c:test ( / Obj CenterPt )
;;*********** centroid 形心副程式 *************
(defun ShapCenter (obj / o c)
;;程式碼
bula bula bula ........
) ;_傳回 point
(setq Obj (ssget))
(setq CenterPt (ShapCenter Obj))
(command "point" CenterPt "")
)
Lsip 其實超級簡單易用
所有的指令函式甚至結構式都可以概括成一種形式
(指令 名稱 參數)
(程序 名稱 參數 參數 參數)
(算子 名稱 參數)
例如 :
(defun ShapeArea (obj / )) ;_string
這裡 defun 是說你要定義一個程序或函式
ShapeArea 是其名稱
obj 是你要傳入的參數
/ 之後的為該函式的私有變數
(+ 1 1 )
加為其指令
後面是兩個參數或更多個參數
像這類測試你可以直接在 console 測試
每個括號前後快速的點兩下滑鼠,他都會告訴你對稱的範圍。
(defun c:test ( / )
;;*********** centroid 形心副程式 *************
(defun ShapCenter (obj / o c)
;;程式碼
bula bula bula ........
) ;_傳回 point
;;-------------- 主程式 ------------------
(setq Obj (ssget)) ;_ Obj 變數 一定要是Region
(setq CenterPt (ShapCenter Obj)) ;_ 呼叫 ShapCenter 函數
(command "point" CenterPt "") ;_ 輸出繪製點
) ;_ defun
想想是不是一句話就能概括?
程式設計就是 輸入 及 輸出 。
我就是這樣開始寫的,這句話是一位朋友當年跟我講的,當時我是寫Foxpro 和 Delphi (Pascal) ,其他程式設計的細節呢?
按 F1 鍵
完整的手冊就跳出來
在比較舊的版本都是CHM 檔案,這是我最愛的一種,因為可以用 CyberArticle 轉出來。
很可惜現在都改成Html 格式,個人覺得很不方便。
3 個意見:
寫LISP 就是這樣.當初想寫一個圖檔管理系統.~構思很久.一直沒動作~~後來一開始寫.就停不下來.~也寫了好幾天.~直到完成.寫完之後也不大須要什麼修改..
2018年6月19日 星期二 上午8:34:00 [PDT]
作者已經移除這則留言。
2018年6月21日 星期四 上午9:19:00 [PDT]
hi 許大哥,感謝您,我那個產生欄位的程式ok 了
謝謝您來看我 ^^
2018年6月21日 星期四 上午9:19:00 [PDT]
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁