主要實現了在模型空間下的得到乙個包圍所有圖元的最小圓,該演算法的思路是這樣:
1.從點集中隨機選出兩個點作為直徑對圓進行初始化。
2.判斷下乙個點p是否在圓中,如果在則繼續本步驟,如果不在則進行步驟3。
3.使用p作為新圓的乙個邊界點,另乙個邊界點為距離p最遠的圓上的點,使用這兩個點作為直徑構造新圓。
4.繼續步驟2,直到遍歷完所有點。
參考:實現出來的效果如圖所示:
首先是獲得所有的點,包括參照的點和普通實體的點,獲取點之後得到的點集去重。如果是塊參照要看它的bounds屬性是否有值,有值就取邊界值,如果是普通實體就取entity的extends屬性的邊界點。還有如果是標註,就不計入點,因為標註的邊界屬性得出來的點不準確。我先得到blockrecord的bounds邊界,然後繼續把這個blockrecord遍歷了一遍,得到實體。這樣做,我是想把塊參照也遍歷進去,但是我不知道如何區分普通的實體所在的塊和有名塊,還有可能有匿名的塊參照,我區分不了,,就重複遍歷了,最後得到的點集去個重就行了。
**:
publicview codevoid
getallpts()
//實體
foreach (objectid entid in
rec)
if (ent != null
) }}
}listpts = listpts.distinct().tolist();
trans.commit();}}
得到點集之後,就可以寫演算法了,這裡,我先得到第乙個圓,如果模型空間上只有乙個圖元,我就已這個圖元的中心做圓心,邊界對角線的一半作為半徑 構成乙個圓返回;如果是只有兩個圖元,我就以這兩個圖元的中心點做直徑,直徑的中點做圓心構成乙個圓返回;如果是3個或者3個以上,我就以點集的第乙個點,和點集的中間點構成乙個圓返回。**如下:
publicview codecircle getfirstcircle()
else
if (listpts.count == 2
)
else
}
最後是第二步和第三步的演算法:
//所有的點集
listlistpts = new list();
list
listradius = new list();
[commandmethod(
"getminc")]
public
void
getcircle()
else
else}}
mincircle =c;
}else
if (mincircle != null
)
//加入模型空間
mincircle.tospace();
mincircle.dispose();
}
AutoCAD進行二次開發
本文基於autocad 2006新推出的.net api為工具,介紹了在.net平台下對autocad進行二次開發的技術,並與目前常用的vba objectarx作了對比。同時討論了如何彌補.net api某些不足的功能。當前autocad的二次開發工具主要有 visuallisp vba和obje...
AutoCAD二次開發的好處
autocad二次開發的好處 首先,autocad自身的功能就很強大,對於一般的平面製圖 比如建築 結構方面 不使用任何第三方的軟體,僅憑 autocad 自帶的基本命令,就可以完成。但如果這樣的話,cad製圖就是一件很枯燥乏味 效率低下的事情,比手工製圖強不到 去。autocad 的高明之處就在於...
用C 進行AutoCAD的二次開發
在上一次的例子中我是通過引用autocad 2004 type library來進行c 與autocad之間的通訊,但這種方法存在兩個致命的缺點。第乙個缺點是每次除錯程式的時候c 都要重新啟動autocad,如果除錯的次數非常多 比如跟蹤錯誤然後除錯 那麼程式設計的效率就很低,因為啟動一次cad還是...