網頁

2012年12月5日 星期三

檢驗 SST 工具及檢驗用之 AutoLisp 程式

SST 工具是 State Storage Tools 的簡稱,是 AutoCAD Civil 3D 2009 版以後才出現的工具。甫出現時是以 Subscription Extension 的方式提供給 Subsription User,2011 版以後則整合成為正式工具。這個工具主要是用來產生一個 Pond (滯洪池、水庫等) 的高程-面積-容積關係表 (H-A-V table),後續可據以生成高程-面積-容積率定曲線圖 (H-A-V diagram)。

使用的標準程序則可以參考 Analyzing Stage Storage Volumes 的說明。有興趣的朋友,可以瀏覽一下 AUGI (Autodesk User Group International)、civil4d.com 的文章Civil3Dreminder 的文章、甚至 Dona Probert 的文章 Using Civil 3D Stage Storage information in SSA

不過該工具一真具有"無法放心使用"的特性,這點也有許多文章有指出這點。   只是各位使用 Civi 3D 的朋友,不知您是否會如筆者般對於這個 SST 計算原理究竟如何深感好奇?想檢驗一下其計算品質及可用性為何?   其實許多討論 SST 使用程序的文章,其所使用的 Pond 地形物件是屬於 "定義良好"者,即池塘為無其它孤島分佈其中的簡單地形、各高程截面的聚合線為封閉曲線 (故截面積即為該曲線所包圍的面積),如此其按平均斷面公式、錐體公式的近似算法才會合理。   如果池塘地形是有包含孤島分佈其中的非簡單地形,或是各高程截面的聚合線不為封閉曲線,那麼 SST 的計算結果可會錯的離譜。這點雖然從原理上看是想當然耳地清楚,但是在工作中可能還是有 "眼見為憑" 的證據去與同事、業主溝通的需要。   筆者自行寫了一個 Autolisp 的小程式,目的是為了計算從地形中萃取出的各個高程等高線面積的簡單加總值,將其與 SST 的結果比較檢驗。程式內容如下,使用方法很簡單: 1. 萃取地形物件的等高線 2. 建議將萃取出的等高線 Wblock 成一個單純 CAD 檔。 3. 開啟該 CAD 檔。 4. 以 Appload 指令載入及執行 Polylist2。 5. 將結果顯示畫面或存為檔案。  

好了,就這樣,打完收功!其它就留給朋友您自行去動手檢驗及體會了!

(defun c:Polylist2()  
(prompt "\n 匯出 2D 聚合線高程、面積統計資料至螢幕或檔案 (Author: ghlin, last update in 2012/11/21.)...")

(if (null (ssget "X" (list (cons 0 "lwpolyline"))))
    (progn (Prompt "\ 圖面找不到任何 2D 聚合線 !") (prin1) (exit) )
)
(setq hs1 (getreal "\n 請輸入最小高程 Hs1 = "))
(setq hs2 (getreal "\n 請輸入最大高程 Hs2 (Hs2 > Hs1) = "))
(while (<= hs2 hs1) (setq hs2 (getreal "\n 輸入值過小!! 請重新輸入最大高程 : ")))
(setq temp (- hs2 hs1))
(setq hstep (getreal (strcat "\n 請輸入高程間距 H_step (需小於 " (rtos temp 2 2) ") : ")))
(while (> H_step temp) (setq H_step (getreal "\n 輸入值過小!! 請重新輸入高程間距 H_step : ")))
(setq parts (getreal "\n 是否匯出各高程中的分項面積, 0 (=Yes) / 1 (=No) <預設 =0, 輸出> : "))
(if (null parts) (setq parts 0) )
(setq file-out (getreal "\n 是否匯出至檔案, 0 (=Yes) / 1 (=No) <預設 =0, 輸出> : "))
(if (null file-out) (setq file-out 0) )
(if (= file-out 0)
    (progn
    (setq dat_file (getfiled "請選擇輸出檔案" "" "csv" 1))
    (setq ff (open dat_file "w"))
    (write-line "高程, 面積, 個數, 分項面積" ff)
    )
)
(setq hh hs1)
(while (<= hh hs2)
    (setq i 0)
    (setq area 0)
    (setq tt " ")
    (setq entlist (ssget "X" (list (cons 0 "lwpolyline") (cons 38 hh))))
    (if (not (null entlist))
        (progn
        (setq entlist_num (sslength entlist))
        (repeat entlist_num
            (setq en (ssname entlist i))
            (setq en_xobj (vlax-ename->vla-object en))
            (setq en_area (vla-get-area en_xobj))
            (setq area (+ area en_area))
            (if (= parts 0) (setq tt (strcat tt ", " (rtos en_area 2 2))))
            (setq i (1+ i))
        )
        (setq tt (strcat (rtos hh 2 2) ", " (rtos area 2 2) ", " (itoa entlist_num) tt ))
        (if (= file-out 0) (write-line tt ff) )
        (prompt (strcat "\n H = " tt))
        )
    )
    (setq hh (+ hh hstep))
)
(if (= file-out 0) (close ff) )
(if (= file-out 0) (Prompt (strcat "\n 查詢結果已輸出至 ==> " dat_file)))
(prin1)
)
(prompt "\n C:Polylist2 :(匯出 2D 聚合線高程、面積統計資料至檔案), last update in 2012/11/22.")
(prompt "\n PolylineList.lsp, Programed by Guan-Horng Lin (林冠宏), 狄斯唐工程顧問(股)公司。")
(prin1)

沒有留言: