這個頁面上的內容需要較新版本的 Adobe Flash Player。

取得 Adobe Flash Player

It is currently 2010-Sep-09, 00:47

All times are UTC + 8 hours




Post new topic Reply to topic  [ 20 posts ]  Go to page 1, 2  Next
Author Message
 PostPosted: 2010-Jan-11, 16:37
#0 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
前言:
這篇主題主要是在講解座標式尺寸標註的原理,供有興趣的朋友參考或是DIY一個自己所需的程式,也因為主要目的在於講解原理,所以程式碼部分會盡量簡單,以方便了解。

單元一:簡易座標式自動標註程式
此單元成果預覽:
Attachment:
File comment: 完成效果
fig-3.gif
fig-3.gif [ 29.76 KB | Viewed 1805 times ]


一:分析圖面
一般多數的工程圖裏,有絕大比例的組成圖元為直線以及圓,而圓通常亦會伴隨中心線,而這些直線中大多數又是正交的,所以如果把圖面上的正交直線標出其端點的座標值,大概就能標註出這張圖的八、九成了。
Attachment:
File comment: 圓帶有中心線,且多數直線為正交。
fig-1.png
fig-1.png [ 8.04 KB | Viewed 1468 times ]


接著再分析如何標註這些正交直線。一條二維空間的任意直線有兩個端點,各帶有一組 X、Y 座標,也就是要完整描述一條二維空間的直線,必須使用四個獨立變數才能達成,但對於正交直線來說,勢必有兩個變數其數值相同,以一條水平直線為例,其兩端點的Y值相同,所以只需兩個X值與一個Y值便足以描述此直線,但實際上對於整張圖面來說,實體直線的端點勢必接到其他線條上,所以上述例子的水平線的X值勢必會相同於其他垂直直線的X值,而對於未與其他直線相接的線條,例如圓的中心線,標出單一X或Y值更是合理,比方說水平的中心線,就不應該標出它的X座標。同理稍加歸納,不難發現只要標註水平線的Y值與垂直線的X值,就足以描述整張工程圖裏所有的正交直線。

二:製作程式
依照上述原理,便可先做出「順著」正交直線標註的程式碼,所謂「順著」指的是如果是水平直線就沿水平方向標註,自然標出其Y座標,而垂直直線沿垂直方向標註,也自然會標出其X座標。
Attachment:
File comment: 只需「順著」標註
fig-2.png
fig-2.png [ 1.31 KB | Viewed 1472 times ]

此部分程式碼如下:
Code:
(defun ac-dimObj(ent / dat p1 p2 ang half-pi)
  (setq dat (entget ent)
   typ (cdr (assoc 0 dat))
  )
  (if (= typ "LINE")
    (progn
      (setq p1 (trans (cdr (assoc 10 dat)) 0 1)
       p2 (trans (cdr (assoc 11 dat)) 0 1)
       ang (angle p1 p2)
       half-pi (/ pi 2.0)
      )
      (if (or (equal (rem ang half-pi) 0.0 0.01) (equal (rem ang half-pi) half-pi 0.01))
   (command "DIMORDINATE" "endp" p2 "none" (polar p2 ang 5.0))
      )
    )
  )
)

如果參數 ent 為正交直線圖元,便會「順著」它標註。

有了這個副程式,接著做一個選取圖元與指定基準點的主程式,並將選取到的圖元全部交給上述副程式處理,就完成一個簡潔的座標式自動標註尺寸程式了。
Code:
(defun C:ac-autoDim(/ ss ent i)
  (setq ss (ssget)
   pt (getpoint "\nBase point: ")
   ent (ssname ss 0)
   i 0
  )
  (command "UCS" "O" pt)
  (while ent
    (ac-dimObj ent)
    (setq i (1+ i)
     ent (ssname ss i)
    )
  )
  (command "UCS" "P")
)


最後此程式的效果如下圖所演示
Attachment:
File comment: 完成效果
fig-3.gif
fig-3.gif [ 29.76 KB | Viewed 1805 times ]


完整程式檔案,載入後,執行 ac-autoDim,接著選取要標註物件與指定基準點,完成。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim01.lsp [1.1 KB]
Downloaded 99 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

接下來還有更精彩的,未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-11, 17:50
#1 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元二:改善尺寸線配置

單元一的例子是一律將座標標註在「順著」直線的終點端,接著我們嘗試看看,若依某個「原則」來決定標註在起點端或是終點端,是否會有較佳的配置表現。

一:決定原則
在此我們採用最直覺的「原則」,也就是以圖面中心作放射狀方向標註,有秩序的朝外圍方向,不僅尺寸線的分佈會較均勻,視覺上也會較為對稱整齊,也比較能夠預期完成後的配置狀況。
Attachment:
File comment: 以圖面中心作放射狀方向標註
fig-4.png
fig-4.png [ 3.54 KB | Viewed 1493 times ]


二:演算法分析
在此我們修改單元一的副程式,用以得到各線段的X值、Y值與兩端點座標,並稍加修改主程式,使主程式可利用所有線段的X值與Y值得出此圖面的中心位置。
接著再作另一個副程式,用以判斷各線段的兩端點何者距離整體中心點較遠,以此點作「順著」標註,達到以中心點作放射狀配置的目的,其程式碼不再贅述,有興趣者請自行下載參考。

完成效果演示,可以看出此程式所標註的比先前單元一的有更好的可讀性。
Attachment:
File comment: 完成效果
fig-5.gif
fig-5.gif [ 29.12 KB | Viewed 1495 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim02.lsp [1.98 KB]
Downloaded 69 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-11, 19:18
#2 
Offline

Joined: 2009-Dec-14, 17:48
Posts: 5
程式設計果然是另一門學問....佩服


Top
 Profile  
 
 PostPosted: 2010-Jan-12, 11:10
#3 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
js_lin wrote:
程式設計果然是另一門學問....佩服

謝謝您。


單元三:錯誤處理與 undo
這個單元基本上與第二單元的核心原理沒甚麼不同,只是多了錯誤處理並加上undo記號,一旦程式運行發生不可預期的錯誤時,能平順結束程式;而undo記號,方便使用者使用「U」指令直接回復未執行程式前的狀態,若少了undo記號,要回復原狀態可要執行好幾次「U」指令才行(每一個尺寸線就要對應一個「U」指令)。

一:修改上個單元的程式
直接將上個單元的主程式改為本單元副程式,另建立一個主程式使用 vl-catch-all-apply 呼叫它,以攔截任何可能發生的錯誤,並作適當處理。另外,也在這些描述式的前頭與結尾告知 undo 記號的起始與結束。

此修改部分的程式碼大致如下:
將原本的 C:ac-autoDim 更名為 ac-autoDim,並另建立新的 C:ac-autoDim 去呼叫它。
Code:
(defun C:ac-autoDim (/ err)
  (command "UNDO" "BE")
  (setq err (vl-catch-all-apply 'ac-autoDim nil))
  (if (vl-catch-all-error-p err)
    (progn
      ;; add some error handles here
    )
  )
  (command "UNDO" "E")
)


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim03.lsp [2.2 KB]
Downloaded 56 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續,下個單元將介紹如何標註不帶中心線的圓……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-12, 15:01
#4 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元四:標註不帶中心線的圓
為方便了解程式運作原理,本單元的標註程式將只針對圓作標註。
前幾個單元的程式都是只針對直線作標註,若是想要標註不帶中心線的圓該如何做呢?基本上只要用圓的圓心座標取代直線的端點座標,並且不須理會所謂的「順著」標註,X 向與 Y 向同時標註即可,但另一方面也由於圓心的座標只有一點,單元二的作「放射狀」配置機制,就不適用於圓了,所以我們必須用其他方式來判斷如何使單一點(如圓心)作「放射狀」標註配置。

一:單一點「放射狀」配置演算法
考慮如下的圖形,V 為圖面中心點至圓心向量,Vx 與 Vy 分別為 V 向量的 X 方向與 Y 方向分量,只要將圓心的 X 座標值依 Vy 分量方向標出,同理,Y 座標值依 Vx 分量方向標出,自然整張圖就會將圓心的座標作「放射狀」配置。
Attachment:
File comment: 圖面中心至圓心的向量與其分量
fig-6.png
fig-6.png [ 6.15 KB | Viewed 1430 times ]


二:編寫程式碼
當得出圖面中心至圓心的向量後,分別取其 X 分量與 Y 分量,當 X 分量大於 0 即標註此圓心之 Y 座標值於 +X 方向,反之標註於 -X 方向,以同樣原理處理 X 座標值標註。此部分程式碼如下:
Code:
(defun ac-dimCir(pts cpt / pt v)
  (foreach pt pts
    (setq v (mapcar '- pt cpt))
    (if (> (car v) 0.0)
      (command "DIMORDINATE" "none" pt "none" (polar pt 0.0 5.0))
      (command "DIMORDINATE" "none" pt "none" (polar pt pi 5.0))
    )
    (if (> (cadr v) 0.0)
      (command "DIMORDINATE" "none" pt "none" (polar pt (* 0.5 pi) 5.0))
      (command "DIMORDINATE" "none" pt "none" (polar pt (* 1.5 pi) 5.0))
    )
  )
)


另一方面,雖然此單元程式只針對圓作標註,但為求得圖面中心座標,所有直線的 X 值與 Y 值依舊是必要條件,所以除了記錄所有圓心座標外亦須記錄所有直線的 X 值與 Y 值供程式計算圖面中心座標。此部分程式碼如下:
Code:
(defun ac-dimInfC(ent / dat p1 p2 ang half-pi pts xs ys inf rad)
  (setq dat (entget ent)
   typ (cdr (assoc 0 dat))
  )
  (cond   ((= typ "LINE")
    (setq p1  (trans (cdr (assoc 10 dat)) 0 1)
          p2  (trans (cdr (assoc 11 dat)) 0 1)
          xs  (list (car p1) (car p2))
          ys  (list (cadr p1) (cadr p2))
          inf (list nil xs ys)
    )
   )
   ((= typ "CIRCLE")
    (setq p1 (trans (cdr (assoc 10 dat)) 0 1)
          rad (cdr (assoc 40 dat))
          xs (list (+ (car p1) rad) (- (car p1) rad))
          ys (list (+ (cadr p1) rad) (- (cadr p1) rad))
    )
    (setq inf (list p1 xs ys))
   )
  )
  inf
)


完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註尺寸(不帶中心線的圓)
fig-7.gif
fig-7.gif [ 26.07 KB | Viewed 1388 times ]


完整程式碼,為與先前只標註直線的程式有所區別,此程式執行指令為 ac-autoDimC,亦即載入後,輸入 ac-autoDimC 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim04.lsp [2.34 KB]
Downloaded 66 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

圓,還沒完喔,請待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-13, 12:01
#5 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元五:圓的直徑
在上一個單元,我們完成標註不帶中心線圓的位置座標,這個單元將對上個單元的程式梢作修改,使其也能順便標註圓的直徑。

一:直徑標註位置
對於直徑要標註在圓的哪個方位,我們延續使用「放射狀原則」,如下圖所示。
在此要注意「DIMTMOVE」這個系統變數,它必須設為 0 ,才能允許使用者去調整直徑標註時尺寸線位置,否則會一律以固定方向標出,所以程式一開頭就先將此變數設為 0,結束後再返回原值。
Attachment:
File comment: 「放射狀原則」的尺寸線布局方式
fig-8.png
fig-8.png [ 6.44 KB | Viewed 1354 times ]


二:程式碼修改
除了主程式須注意「DIMTMOVE」系統變數的設定外,我們還得修改幾個副程式。
修改上個單元中的 ac-dimInfC 副程式,使其除了傳回圓心座標外,並傳回圓半徑與圓圖元,供後續標註直徑時使用,修改後程式碼如下:
Code:
(defun ac-dimInfC(ent / dat p1 p2 ang xs ys inf rad)
  (setq dat (entget ent)
   typ (cdr (assoc 0 dat))
  )
  (cond   ((= typ "LINE")
    (setq p1  (trans (cdr (assoc 10 dat)) 0 1)
          p2  (trans (cdr (assoc 11 dat)) 0 1)
          xs  (list (car p1) (car p2))
          ys  (list (cadr p1) (cadr p2))
          inf (list nil xs ys)
    )
   )
   ((= typ "CIRCLE")
    (setq p1 (trans (cdr (assoc 10 dat)) 0 1)
          rad (cdr (assoc 40 dat))
          xs (list (+ (car p1) rad) (- (car p1) rad))
          ys (list (+ (cadr p1) rad) (- (cadr p1) rad))
    )
    (setq inf (list (list p1 rad ent) xs ys))
   )
  )
  inf
)

另一方面,修改負責標註部分的副程式 ac-dimCir,添加對直徑的標註,程式碼如下:
Code:
(defun ac-dimCir(paks cpt / pt rad ent v ux uy)
  (foreach pak paks
    (setq pt  (nth 0 pak)
     rad (nth 1 pak)
     ent (nth 2 pak)
     v   (mapcar '- pt cpt)
    )
    (if (> (car v) 0.0)
      (progn
   (command "DIMORDINATE" "none" pt "none" (polar pt 0.0 5.0))
   (setq ux (+ (car pt) rad 5.0))
      )
      (progn
   (command "DIMORDINATE" "none" pt "none" (polar pt pi 5.0))
   (setq ux (- (car pt) rad 5.0))
      )
    )
    (if (> (cadr v) 0.0)
      (progn
   (command "DIMORDINATE" "none" pt "none" (polar pt (* 0.5 pi) 5.0))
   (setq uy (+ (cadr pt) rad 5.0))
      )
      (progn
   (command "DIMORDINATE" "none" pt "none" (polar pt (* 1.5 pi) 5.0))
   (setq uy (- (cadr pt) rad 5.0))
      )
    )
    (command "DIMDIAMETER" (list ent (polar pt 0.0 rad)) "none" (list ux uy 0.0))
  )
)


完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註(圓位置與直徑)
fig-9.gif
fig-9.gif [ 40.02 KB | Viewed 1399 times ]


完整程式碼,載入後,輸入 ac-autoDimC 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim05.lsp [2.81 KB]
Downloaded 58 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-14, 13:23
#6 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元六:同心圓
上個單元,我們完成了標註不帶中心線的圓並且標出各個圓的直徑,但一張工程圖裏通常都有同心圓的存在,而上個程式對於同心圓會造成位置座標的重複標註,以及直徑標註的重疊。本單元就針對同心圓作探討。

一:同心圓的標註
既然都是同心圓了,位置尺寸當然只標一個就行了,而直徑標註部分,在此採用一起敘述的方式,如下圖所示,只由最外圍的圓拉尺寸線,而各個圓的直徑則由小到大以逗點分開標註。
Attachment:
File comment: 同心圓,直徑由小到大以逗點分開標註。
fig-10.png
fig-10.png [ 5.36 KB | Viewed 1300 times ]


二:程式碼編寫
這部分的程式碼與上個單元差異不大,主要在新增一個副程式,使其能對同心圓分組,供後續負責標註的副程式使用,這部分的程式碼如下:
Code:
(defun ac-reducePaks (paks / pt rad ent infs ptStr inf subPaks newPak newPaks)
  (foreach pak paks
    (setq pt (nth 0 pak)
     rad (nth 1 pak)
     ent (nth 2 pak)
     ptStr (strcat (rtos (car pt) 2 4) "," (rtos (cadr pt) 2 4))
     inf (assoc ptStr infs)
    )
    (if inf
      (setq infs (subst (append inf (list pak)) inf infs))
      (setq infs (cons (list ptStr pak) infs))
    )
  )
  (foreach inf infs
    (setq subPaks (vl-sort (cdr inf) '(lambda(a b) (< (cadr a) (cadr b))))
     newPak (list (caar subPaks) (mapcar 'cadr subPaks) (caddr (last subPaks)))
     newPaks (cons newPak newPaks)
    )
  )
  newPaks
)


其他與上個單元程式碼不同處,就不再贅述,有興趣者請自行下載完整程式碼參考。

完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註(同心圓)
fig11.gif
fig11.gif [ 46.41 KB | Viewed 1350 times ]


三:圓的探討
通常一張工程圖裏,圓、同心圓是少不了的要件,但圓的直徑直接標註在圖面上真的適合嗎?直覺上也許會認為,既然是自動標註尺寸,當然是越詳盡越好囉,直徑標註是不能少的。但再仔細分析,工程圖的「圓」並不是真的只是單純的「幾何圖形的圓」,通常他們代表著各式各樣的孔,比方說,鑽孔、螺孔、梢孔、沉頭孔等等,要描述這些孔以方便加工者製造工件,直接描述其幾何圖形並不是最恰當的作法,在實作上通常是直接描述那些圓代表甚麼規格的甚麼孔,以及與之相關的孔有哪幾個,位在何處等等,所以用引線標註,或是列表方式來描述這些孔會比較適合,而圖面的可讀性亦較高。(請參考製圖學等相關書籍)

完整程式碼,載入後,輸入 ac-autoDimC 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim06.lsp [3.74 KB]
Downloaded 53 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

感謝您耐心的看到本單元,但……還沒完喔,請待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-15, 16:46
#7 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元七:稍作整理
經過上述的幾個單元後,我們除了有直線的自動標註也有圓的自動標註,接下來我們來嘗試將這兩部分合為一個程式,以建造出可以同時標直線與圓的自動標註程式。

一:圖面再分析
如果圖面只有直線與不帶中心線的圓,那直接將兩部分的程式(標直線與標圓的程式)合在一起就能處理了,但對於帶有中心線的圖形就有些問題了,單是表示一個圓的位置,有中心線的座標也有圓心的座標,將會降低圖面的可讀性。那如果不標註圖面中心線部分呢?相對的有些對稱圖形裏的中心線也會被忽略(如下圖),乍看之下這對於座標式標註尺寸,其實是沒甚麼差別,反正形狀位置都標出來也交代清楚了,但是否有隱藏其他的問題呢?這我們留到下個單元再討論,先就這部分作個嘗試。
Attachment:
File comment: 對稱圖形裏的中心線
fig-11.png
fig-11.png [ 3.65 KB | Viewed 1300 times ]


二:修改標註直線部分程式
首先修改單元三標註直線的程式,將 ac-dimInf 副程式修改為只對非「Center」線型的直線作要標註的紀錄,而無法判定線型的直線,一律把線型當作「ByLayer」,為方便了解程式運作,我們在此只作簡易的判別,如果要考量其他狀況的中心線,比方說線型 ByLayer 但所在圖層線型為 Center 或是更極端的,線型名稱不叫 Center 但樣子就長得像中心線,對於這類的判斷,不是三言兩語能解釋完畢,也非本主題討論範圍,就不在此討論。修改後的副程式如下:
Code:
(defun ac-dimInf(ent / dat typ ltyp p1 p2 ang half-pi pts xs ys inf)
  (setq dat (entget ent)
   typ (cdr (assoc 0 dat))
   ltyp (cdr (assoc 6 dat))
  )
  (if (null ltyp)
    (setq ltyp "ByLayer")
  )
  (if (and (= typ "LINE") (/= (strcase ltyp) "CENTER"))
    (progn
      (setq p1 (trans (cdr (assoc 10 dat)) 0 1)
       p2 (trans (cdr (assoc 11 dat)) 0 1)
       ang (angle p1 p2)
       half-pi (/ pi 2.0)
       xs (list (car p1) (car p2))
       ys (list (cadr p1) (cadr p2))
      )
      (if (or (equal (rem ang half-pi) 0.0 0.01) (equal (rem ang half-pi) half-pi 0.01))
   (setq pts (list p1 p2))
      )
      (setq inf (list pts xs ys))
    )
  )
  inf
)


三:整合兩部分程式
在此我們將修改後的單元三程式與單元六程式合併為單一程式,由個別程式碼可以看出有不少部分重複,所以我們再稍加整理一下,完成可同時標圓與標直線的的自動標註程式,程式碼部分就不再贅述,有興趣者請直接下載完整程式碼研究。

完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註尺寸(直線與圓的整合)
fig-12.gif
fig-12.gif [ 28.46 KB | Viewed 1262 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim07.lsp [4.53 KB]
Downloaded 62 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-18, 13:46
#8 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元八:中心線與重複標註
對稱圖形裏的中心線被忽略會有甚麼問題呢?首先遇到問題的是長孔,依照上個單元的程式,圖面上的長孔將只有兩直線邊會被標註,而真正代表長孔軸位置與端點的座標皆被忽略,乍看之下這問題有個很快速的解決方式,就是也對圓弧作自動標註,但圖面上有許多圓弧其實代表的是倒圓弧,而他們是毋須標註位置與半徑的,頂多也是用個引線代表性的敘述一下R角多少即可。

一:再一次審視中心線
那該如何知道哪些圓弧是該標註,哪些又不須標註呢?中心線似乎給了我們答案,正規工程圖裏都是以中心線表示圓或圓弧的位置尺寸,也就是說,必須明確表示位置的圓或圓弧,都會有其對應的中心線,而倒圓弧則通常都不帶有中心線,再加上單元六對圓的探討,表示在圖面上直接標註各個圓的直徑並非妥當,所以是否該回到最原先的程式,只標直線並且要求使用者一定要標上圓的中心線呢?還是說讓程式可以既標註中心線且標註不帶中心線的圓呢?

二:重複標註
不管使用何種方案,我們都會遇到相同的問題:圓心位置的重複標註。
如果程式可以同時標註中心線與不帶中心線的圓,對於圖面上已經有帶中心線的圓,其重複標註可想而知。
Attachment:
File comment: 同時標註中心線與圓
fig8-1.png
fig8-1.png [ 3.73 KB | Viewed 1253 times ]


如果程式只標直線且要求使用者一定得替圓標上中心線,還是會遇到重複標註問題,原因在於使用 AutoCAD 標註中心記號時,若系統變數「DIMCEN」為負值,則 AutoCAD 除了會在圓中心繪上小十字外,另會繪出他們的延伸線,也就是以六條直線來表示圓的中心記號,那此時若以只標註直線的程式作自動標註時,就會以六條直線的座標值來表示一個圓的位置座標,這就不太合理了。
Attachment:
File comment: 六個座標值表示一個圓的位置
fig8-2.png
fig8-2.png [ 3.29 KB | Viewed 1227 times ]


三:過濾重複座標值
為了避開上述圓中心位置重複標註問題,接下來我們嘗試過濾重複的座標值,對於一個座標值僅標註一次,這樣不僅能避開六個座標值標註一個圓位置座標的狀況,甚至不帶中心線的圓心座標也可一併處理,因為最後都會被過濾成只標一處,不會有重複標註問題,並且其它非圓心位置的重複標註,或是斷線、線中線等問題(如圖),也可順道一起過濾。
Attachment:
File comment: 非圓心位置的重複標註,以及斷線、線中線狀況。
fig8-3.png
fig8-3.png [ 5.6 KB | Viewed 1264 times ]


四:演算法分析
在此的程式碼開始變得有些複雜,所以就不解釋程式碼的部分了,但其基本原理同於單元六對於同心圓分組原理,這裡是將所有的 X 座標與 Y 座標座分組,每組僅標一個座標值,達到重複座標值過濾的效果,有興趣者請直接研究程式源碼。

完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註尺寸(去除重複標註)
fig8-4.gif
fig8-4.gif [ 28.04 KB | Viewed 1240 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim08.lsp [4.45 KB]
Downloaded 60 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-20, 08:39
#9 
Offline
User avatar

Joined: 2009-May-26, 14:08
Posts: 372
如有需要此單元所演示的圖檔,可以點取下載。

下載座標式自動標註尺寸原理解說圖檔:
Attachment:
座標式自動標註尺寸原理解說圖檔.dwg [73.76 KB]
Downloaded 35 times

_________________
實力是一點一滴累積而成...


Top
 Profile  
 
 PostPosted: 2010-Jan-21, 14:46
#10 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元九:外圍式尺寸線布局
在上個單元,我們的程式已經能去除重複的座標資訊,接著要嘗試的是將尺寸線全部標註在圖形外。

一:尺寸線拉至外圍
更改尺寸線標註時的位置,使所有尺寸線拉至外圍,由於這時圖面所有的尺寸線將集中於圖形四周,所以很容易遇到尺寸線重疊的問題(如圖)。
Attachment:
File comment: 外圍尺寸線重疊
fig9-1.png
fig9-1.png [ 3.62 KB | Viewed 1178 times ]


解決尺寸線重疊的方法有很多種,在這裡我們利用記錄上個尺寸線的位置,並判斷接下來要標註的尺寸線是否有足夠空間與上個尺寸線隔開,若無足夠空間,則往某特定方向移至有足夠空間出現。

二:尺寸線空間
要達到上述的方法,除了要將標註位置「順著」移到最外圍外,首先還必須對要標註的座標位置排序,使其依照某個方向找尋適合的空間位置標註尺寸線,為延續這整個主題所採用的「放射狀」原則,排序的方式就是與中心點位移的距離作為依據,由中心往兩邊找尋適合的標註空間。而所謂足夠的空間,則是以相鄰尺寸線的間距是否大於或等於尺寸文字高度加上兩倍尺寸文字與引線距離作判斷。

三:尺寸線偏移問題
從第一單元以來,都是使用「順著」方式標註,所以在標註尺寸的階段,可以直接採用 AutoCAD 自行判斷所標座標為 X 值或 Y 值,但本單元的標註已不再是單純的「順著」方式,為找尋適合的尺寸線空間,尺寸線物件有可能會作某些程度的偏移,而 AutoCAD 的自行判斷可能會與我們的預期不符,這時在標註階段就有必要指定所標座標值是 X 值或 Y 值了。
Attachment:
File comment: 標註在同樣位置,有指定座標方向與未指定的差別。
fig9-2.png
fig9-2.png [ 5.21 KB | Viewed 1169 times ]


上述兩部分的程式碼原理不難(就是上面所述),但是繁雜,所以就不在文章中作說明,有興趣者請直接參考原始碼。

完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註尺寸(外圍式)
fig9-3.gif
fig9-3.gif [ 96.58 KB | Viewed 1433 times ]


三:重複標註的討論
這個單元與上個單元的程式主要重點在去除重複標註,使整體圖面看起來更加清爽,而這真的有比較適合實際作業所需嗎?雖然每一個位置在圖上都能找到對應的座標值,但當所有尺寸線接標註於外圍時,縱使尺寸線沒有疊在一起,對於比較密集的地方,還是有些讀圖上的不方便,而另外一點,不管是否將尺寸線拉至最外圍,同樣都會有些位置的座標值資訊離開本體太遠的問題,對於實際加工時,必須花些精神集中注意在找尋其座標值,不盡理想;但若不去除重複座標,將每一個座標通通標註,又會有同一位置重複標註問題,比如帶中心線的圓,所以該如何取捨哪些座標需要過濾而哪些又要保留是自動標註的另一個課題。
Attachment:
File comment: 座標資訊離本體太遠
fig9-4.png
fig9-4.png [ 15.37 KB | Viewed 1186 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim09.lsp [7.35 KB]
Downloaded 65 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-22, 11:36
#11 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元十:非正交直線
到目前為止,我們都一直忽略非正交直線,原因在於由最初的圖面分析,發現只要標註正交直線就可標註出整個工程圖的八、九成了,而又可避開重複標註問題,並且也能使整個圖面全部採用單純的「順著」方式來完成標註。但程式探討至此,我們已能過濾重複標註,為使程式更加完整,本單元開始處理非正交直線。

一:「順著」標
非正交直線不若正交直線只要「順著」標就可以自然帶出所需的 X 或 Y 座標值,所以必須將它當成不帶中心線的圓一樣處理,而與圓不同的是,直線有兩個端點,所以得把非正交直線的兩個端點視為兩個圓來處理。

二:角度標註
既然是自動標註程式又開始處理非正交直線,那非正交直線的傾斜角度是否也要一併標註呢?
事實上角度標註牽涉到加工時基準面的問題,這都得視工件的設計或與其他零件的相對關係而定;另一方面,圖面上的非正交直線不見得都是需要精準標出的斜面,有些可能是某種加工記號或是習慣倒角,標出這些特徵的角度並非合理。
不過基於探討自動標註,我們還是大致研究一下角度標註。
Attachment:
File comment: 一個非正交直線,因基準面的不同,而有不同的角度標註。
fig10-1.png
fig10-1.png [ 4.46 KB | Viewed 1144 times ]


三:標註空間尋找
在這裡我們簡化角度標註的樣式,直接使用引線來描述角度,並忽略基準面問題,將角度縮減成45度角內,標註位置則是在直線兩邊選擇有較充裕空間擺下標註文字的那一邊。
為判斷哪一邊才有足夠空間,首先必須知道我們即將標註的文字所佔空間大小,這部分可以利用 lisp 的 textbox 函式達到目的,但要注意此函式的根據判斷是當前的文字型式與文字字高,與尺寸線文字的型式與字高不見得相同,若要精準判斷,必須將目前的文字型式與字高設為與尺寸線的文字型式與顯示字高相同,並在程式結束後,返回原先的設定值,但在這裡就不再佔篇幅討論文字型式的取得與改變,先將它們當作是一樣的,為求程式的原理清楚,程式裡也只對字高作些必要調整。
Attachment:
File comment: 以文字所佔空間大小在直線兩邊找尋適合的標註空間
fig10-2.png
fig10-2.png [ 3.16 KB | Viewed 1132 times ]


其他為簡化程式,我們在標註時將 DIMTAD 系統變數設為 0,使文字與引線對齊在中間高度,這樣程式在判斷文字空間時,就不用再考慮文字與引線間的距離。
Attachment:
File comment: DIMTAD 系統變數與引線文字位置
fig10-3.png
fig10-3.png [ 3.13 KB | Viewed 1133 times ]


有了文字所佔空間的大小資訊後,我們利用 lisp 的 ssget 函式,抓取空間內的物件,比較直線兩邊將來要擺文字的空間內的物件多寡,來決定將角度標註於哪一邊。

四:程式碼
本單元的程式碼與上個單元大致相同,只增加對非正交物件的資訊處理,並在最後將所有的非正交物件標上角度註解。
主要負責角度標註的副程式為新增的 ac-dimAngle 副程式,對於這些副程式,也許有人會有這樣的疑問:這些程式碼為何不藉由全域變數的妥善運用達到簡化?原因是此主題目的在於說明自動標註的原理,所以程式碼部分力求每個副程式可以是容易了解的獨立模組,對於程式碼未最簡化與不清楚部分,還請多多包涵。

五:千層麵
剛剛在吃前幾天剩下的比薩時,意外發現快速製作千層麵的方法,把比薩「疊」在方形可微波的盒子裡,加熱一下,就變成千層麵啦。

完成後,其程式運作如下圖所演示:
Attachment:
File comment: 自動標註尺寸(非正交直線)
fig10-4.gif
fig10-4.gif [ 50.05 KB | Viewed 1127 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim10.lsp [10.07 KB]
Downloaded 58 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

加油!已經接近尾聲了,未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-22, 18:03
#12 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元十一:雜項
雖然在前幾個單元的討論裡,有提到由於圓在工程圖裏所扮演的角色並非單純的幾何圓圖形,所以直接標註圓的直徑並非妥當,同理所有圓弧的半徑直接標出也不適合,但如同角度標註,就學習程式目的,我們在本單元來探討如何尋找適合圓直徑與弧半徑尺寸線位置的空間。

一:尺寸線位置
之前單元(單元五、六、七)的程式對於直徑的標註位置皆是以「放射狀」原則來配置,並無判斷要放置的位置是否有其他物件存在,另外對於弧半徑的標註,則很難符合「放射狀」原則,所以此單元將放棄「放射狀」原則,對圓直徑的標註改採由45度角開始尋找適合位置,而弧則以弧中點位置開始到弧的兩端尋找合適標註空間。
Attachment:
File comment: 尋找標註空間
fig11-1.png
fig11-1.png [ 10.73 KB | Viewed 1114 times ]


二:程式碼
如同尋找角度標註空間,在這裡也是以標註的文字大小,利用 ssget 判斷物件較少的位置,當作是標註位置。
為使此部分程式原理較清楚,我們利用單元六只標圓的程式來修改,並去除標註位置的部分。

此部分完成後,其程式運作如下圖所演示:
Attachment:
File comment: 修改單元六的程式,自動尋找適合空間標註圓直徑與弧半徑。
fig11-2.gif
fig11-2.gif [ 63.05 KB | Viewed 1124 times ]


此部分完整程式碼,載入後,輸入 ac-autoDimC 即可使用。
Attachment:
File comment: 此部分完整程式碼,轉載請註明出處。
autoDim06-b.lsp [6 KB]
Downloaded 53 times


三:再整理
雖然我們一再強調圓直徑、弧半徑與非正交直線角度等這些特徵涉及現場加工狀況以及與其他零件相對關係,所以並不適合毫無過濾的全部在圖面上直接標註,但在此我們還是把上述程式與單元十的程式做個結合,另外我們也把前幾個單元沒考慮的圖塊標註一併加入,由於圖塊在圖面上通常已有其獨立的完整敘述,所以圖塊的標註就只標註其插入點。

完成後,其整個程式運作如下圖所演示:
Attachment:
File comment: 自動標註(含圓直徑、弧半徑、非正交直線角度與圖塊)
fig11-3.gif
fig11-3.gif [ 79.34 KB | Viewed 1119 times ]


完整程式碼,載入後,輸入 ac-autoDim 即可使用。
Attachment:
File comment: 完整程式碼,轉載請註明出處。
autoDim11.lsp [14.35 KB]
Downloaded 67 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

未完待續……

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Jan-22, 18:11
#13 
Offline
User avatar

Joined: 2009-May-08, 12:15
Posts: 504
單元十二:總結
在這個單元,我們將所有的單元作個總整理。

一:圓直徑、弧半徑與非正交直線角度
工程圖的「圓」並不是真的只是單純的「幾何圖形的圓」,通常他們代表著各式各樣的孔,比方說,鑽孔、螺孔、梢孔、沉頭孔等等,要描述這些孔以方便加工者製造工件,直接描述其幾何圖形並不是恰當的作法。
圖面上有很多的圓弧其實代表的是倒圓弧或是長孔,而倒圓弧通常是用引線代表性的敘述一下R角多少,長孔上的圓弧標註其半徑亦不適合。
非正交直線在圖面上有可能只是某個加工符號的一部分或是習慣倒角,而標註這些物件的角度並非妥當,即使是需要註明角度的斜面,也存在著加工基準面的問題,直接自動標註不見得是合適的。

二:程式構思流程
有接觸過 AutoLISP 開發的朋友應該不難發現這個主題內的程式都算簡短,甚至會覺得說,某些部分該用 ActiveX 的方式來提升程序運行效率,或是應該要好好運用全域變數,來使得程式碼更為簡潔,但考量此主題是以說明自動標註原理為目的,所以在程式結構上盡量讓各個副程式可以是容易了解的單一模組,而程式碼也以較基本的方式呈現,若是覺得有些需要修改的地方,也容易自行下手改成自己所需。
雖說程式碼很短且看似淺顯易懂,但不代表這程式簡單,從第一單元至最後單元都在闡述整個程式開發的構思流程,由最先的不到五十行程式就將自動標註給勾勒出來,到後面漸漸考慮各項變因,使得程式碼演變成與最初幾乎完全不同的狀態,這其中除了程式語言本身的學習,更重要的是要藉由參考製圖學原理並探討現場加工的實際狀況以及如何將這些經驗利用數學知識轉化為程式語言,這些都不是簡單的程式設計內容,其中包含了多方面的專業知識,並非一般初學程式開發所能體會。
總而言之,這程式沒有精美的外包裝,(所謂外包裝,指的是漂亮的使用者介面、連同標註型式一起完善的規劃等等,非自動標註主要原理部分)但這個核心程式絕對是專業級的,還請各位愛護。

三:重點程式
在這邊將整個主題內的重點程式作一個整理。
最基本的自動標註(單元三)
Attachment:
File comment: 最基本的自動標註程式碼,轉載請註明出處。
autoDim03.lsp [2.2 KB]
Downloaded 63 times


只標圓位置的自動標註(單元四,推薦使用,理由:座標式標註尺寸有極大的使用目的在於敘述各種孔的座標,使用此單元程式可以單純就近標註出各個孔的位置,圖面較清楚明瞭)
Attachment:
File comment: 只標圓位置的自動標註程式碼,轉載請註明出處。
autoDim04.lsp [2.34 KB]
Downloaded 53 times


只標圓位置與直徑的自動標註(單元六)
Attachment:
File comment: 只標圓位置與直徑的自動標註程式碼,轉載請註明出處。
autoDim06.lsp [3.74 KB]
Downloaded 48 times


過濾重複標註但未標圓直徑的自動標註(單元八,推薦使用,理由:去除重複標註,圖面較清爽。)
Attachment:
File comment: 過濾重複標註但未標圓直徑的自動標註程式碼,轉載請註明出處。
autoDim08.lsp [4.45 KB]
Downloaded 50 times


不含圓直徑外圍式自動標註(單元九,推薦使用,理由:整體外圍標註,圖面較整齊。)
Attachment:
File comment: 不含圓直徑外圍式自動標註程式碼,轉載請註明出處。
autoDim09.lsp [7.35 KB]
Downloaded 45 times


含圓直徑、弧半徑、非正交直線角度與圖塊的外圍式自動標註(單元十一)
Attachment:
File comment: 含圓直徑、弧半徑、非正交直線角度與圖塊的外圍式自動標註程式碼,轉載請註明出處。
autoDim11.lsp [14.35 KB]
Downloaded 69 times


本程式與技術原理由「萊昂運算股份有限公司」提供,轉載請註明出處,謝謝。

感謝您耐心的看到最後,本主題到此單元已全部結束,謝謝。

_________________
Sodium
Adaucogit Calculations Co., Ltd.


Top
 Profile  
 
 PostPosted: 2010-Apr-16, 08:52
#14 
Offline

Joined: 2009-Nov-12, 10:35
Posts: 1
谢谢了 @onion9@


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 20 posts ]  Go to page 1, 2  Next

All times are UTC + 8 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye