2018年3月15日 星期四

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 則留言:

  1. 寫LISP 就是這樣.當初想寫一個圖檔管理系統.~構思很久.一直沒動作~~後來一開始寫.就停不下來.~也寫了好幾天.~直到完成.寫完之後也不大須要什麼修改..

    回覆刪除
    回覆
    1. hi 許大哥,感謝您,我那個產生欄位的程式ok 了
      謝謝您來看我 ^^

      刪除