發送命令
Acad的低版本只能發送命令的方式獲取邊界信息,edata說這個bo是寫在arx內的,不是接口,所以也不能反射用(沒深究了)
到了Acad2011,就可以通過以下語句獲取:
Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
ed.TraceBoundary(........);
然后低版本,通過命令發送bo的方法:點我
要注意的是,如果空格再次執行上次命令,你會執行到bo,而不是你的當前命令..而正常的cad用戶都是要執行當前的命令.
解決方法:要解開文檔鎖的情況下發送一次當前命令,而且在命令外做一個立即結束的標記,在最前面寫:
算法概念
但是,要是自己能造一個邊界算法,為什么要靠桌子的.
打倒自動桌子!!!! 打倒Acad!!!
於是乎,我做了一張圖(拖拉圖片看大圖)
不要問為什么是奇點不是起點,因為點的意義太多了,換個字免得引起歧義而已(用原點又會跟世界坐標原點重意辣!).
分析桌子算法
本來的初衷是覺得它的邊界算法無法很好的將邊界線給閉合,所以是想通過遍歷數據庫來實現對屏幕外的邊界做補充.
在了解了桌子的bo算法原理之后,決定放棄...因為它的是最佳實踐來的,幾乎沒什么好改的.
其先獲取當前屏幕可視的圖形,然后遍歷它們的圖元信息,而按照我的想法,將不可避免的很多次數據庫.
但是要自己干也不是不可能,尤其是可以做優化算法:
1, 獲取屏幕內圖元時候加一條屏幕邊界來做范圍.
利用四叉樹
2, 需要減少雙層遍歷數量O(n²)復雜度:
拋棄非邊界計算圖元,例如文字,標注,引線.
如果奇點,不在塊的嵌套層次上,那么表示塊邊界才是遍歷的,(此邊界是指塊內涉及邊界的圖元,並且造成一條鏈)
如果在嵌套層次里,先算層次內,邊界沒密封才繼續遍歷其他塊邊界.
拆解算法
下面是山人告訴我的bo算法思想... 它就是圖上的拆解算法.
樣圖
全部交點打斷,然后bo到的邊界就是我標數字的線段組成的.(其實不是打斷,是求交點,我是便於大家理解)
步驟如下
&1 射線求交點
從A點做0°直線(射線),與所有的線只有4個交點,就是我畫綠色圓的點;
選擇一個離A點最近的點,並通過這個點得到1號直線: 數學上來講就是兩個直線方程聯立.
&2 獲取下一段線段
得到1號直線的兩個端點,選擇相對A-1線角度逆時針方向的點C,
由C點做選擇集,得到2號和1號直線,排除1號直線:
可能C點相交有多個圖元,存在和 &3 一樣的情況,可能存在沒有相交的圖元,需要細節處理.
然后用2號直線的另一個交點d做選擇集:
非選擇集需要輪詢(所有圖元? 2號線包圍盒范圍內的?) 與2號線來求交,得出最近交點,
得到2號、3號,21、22號直線.(如果是不打斷的話,則沒有21、22,但是,萬一情況是圖元接上去呢,則需要以相同條件來進行)
&3 逆時針選擇的作用
這個時候,你要選擇3號直線才是對的,
算法應選擇直線的角度更靠近逆時針的那個: 也就是說d為基點,22號 在最右,21在中間,3在最左,那就選擇最左的那個3
這時候的你輪廓集合里已經有3條直線了,分別為1 、2 、 3
&4 循環以上操作
然后就是不斷的重復,直到走到12號線,又一次選擇到了1號線,循環結束;
分析
經過&1和&2的步驟可知,每次都需要輪詢一次所有的圖元,那么這個輪詢就是數量就是線性遞減的,因為已經分析過的圖元,除了第一個需要保留以判斷閉環之外,其他都可以拋棄.
這個是最簡單的,沒有內部孤島,沒有曲線,的bo原理.
(完)