autocad 二次開發 最小包圍圓演算法

2022-01-11 21:35:26 字數 1553 閱讀 8120

主要實現了在模型空間下的得到乙個包圍所有圖元的最小圓,該演算法的思路是這樣:

1.從點集中隨機選出兩個點作為直徑對圓進行初始化。

2.判斷下乙個點p是否在圓中,如果在則繼續本步驟,如果不在則進行步驟3。

3.使用p作為新圓的乙個邊界點,另乙個邊界點為距離p最遠的圓上的點,使用這兩個點作為直徑構造新圓。

4.繼續步驟2,直到遍歷完所有點。

參考:實現出來的效果如圖所示:

首先是獲得所有的點,包括參照的點和普通實體的點,獲取點之後得到的點集去重。如果是塊參照要看它的bounds屬性是否有值,有值就取邊界值,如果是普通實體就取entity的extends屬性的邊界點。還有如果是標註,就不計入點,因為標註的邊界屬性得出來的點不準確。我先得到blockrecord的bounds邊界,然後繼續把這個blockrecord遍歷了一遍,得到實體。這樣做,我是想把塊參照也遍歷進去,但是我不知道如何區分普通的實體所在的塊和有名塊,還有可能有匿名的塊參照,我區分不了,,就重複遍歷了,最後得到的點集去個重就行了。

**:

public

void

getallpts()

//實體

foreach (objectid entid in

rec)

if (ent != null

) }}

}listpts = listpts.distinct().tolist();

trans.commit();}}

view code

得到點集之後,就可以寫演算法了,這裡,我先得到第乙個圓,如果模型空間上只有乙個圖元,我就已這個圖元的中心做圓心,邊界對角線的一半作為半徑 構成乙個圓返回;如果是只有兩個圖元,我就以這兩個圖元的中心點做直徑,直徑的中點做圓心構成乙個圓返回;如果是3個或者3個以上,我就以點集的第乙個點,和點集的中間點構成乙個圓返回。**如下:

public

circle getfirstcircle()

else

if (listpts.count == 2

)

else

}

view code

最後是第二步和第三步的演算法:

//所有的點集

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還是...