2018年3月25日 星期日

Autolisp 讓文字大小,Mleader比例自動跟著標註設定

複製下程式碼,存成  Mtext.lsp 並載入

(defun c:MaxText (/ dimscal )
  ;;------------- 支援 annotative ---------------------
  (if (= 1 (getvar "DIMANNO"))
    (progn
      (setq dimscal (/ 1 (getvar "cannoscalevalue")))
      (setvar "TextSize" (* dimscal 3))
    )
    (progn
      (setq dimscal (getvar "dimscale"))
      (setvar "TextSize" (* dimscal 3))
    )
  ) ;_if
  ;;------------- 支援 annotative ---------------------
  (setvar "clayer" "text" ;_切換圖層
  (initdia;;強制顯示下個 command 的 dialog box 
  (command "mtext")
  (princ)
) ;_defun


記得在contents 再加入一次,以後AutoCAD 啟動就會自動載入




接著只要在 cui 找到 Multiline Text  將 Macro 改成 ^C^C_MaxText 就可以了



這個程式的好處在於不論你是用傳統的方式或 Annotative  的標註,他都會自動調整文字大小到目前標註設定的大小。

例如 CNS 1:1 時字高為 3~3.5mm
程式會根據標助比例調整字高。

你完全不需要再去調整字型設定,但是要注意的是 TextStyle 的字高一定要設定成 0 。


Mleader 也可以自動設定,完全不必再去調整其大小

上述程式簡單改一改就可以 
(setvar "MLEADERSCALE" dimscal)


(defun c:MaxMleader (/ dimscal )
  ;;------------- 支援 annotative ---------------------
  (if (= 1 (getvar "DIMANNO"))
    (progn
      (setq dimscal (1 (getvar "cannoscalevalue")))
    )
    (progn
      (setq dimscal (getvar "dimscale"))
      (setvar "MLEADERSCALE" dimscal)
    )
  ) ;_if
  ;;------------- 支援 annotative ---------------------
  (setvar "clayer" "dim" ;_切換圖層
  (initdia)  ;;強制顯示下個 command 的 dialog box 
  (command "mleader")
  (princ)
;_defun


如此一來不論是傳統的一個標註型式一個比例的用法,或是Annotative 的用法,都不必再調整字高,或Mleader 形式,只要切換標註比例 (DimScale ),或是Annotative 比例,他就能自動切換。


標籤: , , ,

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 格式,個人覺得很不方便。



標籤: ,

2018年3月14日 星期三

AutoCAD 2018 ToolBar 在儲存 Wrokspace 位置之後還是會跑掉


儲存好了位置至還是跑掉 ,編輯Cui 後位置也跑掉

來回切換 workspace  讓人感到困擾


解決辦法,
1.建立一個快速回復的按鈕                             
2.在 Macro 的地方輸入 ^C^C_workspace;;;    
3.隨便選一個你要的 icon ,編輯 icon 圖形。



下次 ToolBar 位置跑掉,你只需要點一下就搞定,回到你儲存的 Workspace 時的樣子。



標籤: , , , ,