地籍图 cad cass 二次开发 过滤器过滤扩展数据组码1000的解决方案
筆者最近在做一個(gè)地籍的項(xiàng)目。單位叫開發(fā)一個(gè)基于cad二次開發(fā)的地籍軟件,方便工作人員繪圖入庫使用。繪圖人員前期作業(yè)主要是采用cass軟件(cad二次開發(fā)的)進(jìn)行作業(yè)。所以一些開發(fā)工作要兼顧到cass軟件的圖形屬性的存儲(chǔ)方式。筆者主要是對(duì)繪圖人員繪制的地籍圖批量導(dǎo)出shp格式的數(shù)據(jù),方便后期入庫使用。cass對(duì)圖形的屬性數(shù)據(jù)存儲(chǔ)方式主要以擴(kuò)展數(shù)據(jù)為主,例如cass編碼。在導(dǎo)入cad數(shù)據(jù)時(shí),要分要素導(dǎo)出,就是將相同cass編碼的數(shù)據(jù)導(dǎo)出到同一個(gè)shp文件中。所以就要使用選擇集過濾具有相同cass編碼的要素。當(dāng)過濾1001組碼的擴(kuò)展數(shù)據(jù)時(shí)都可以成功的過濾,在過濾1000組碼的時(shí)候始終過濾不成功,個(gè)數(shù)為0,最關(guān)鍵的是cass編碼都存儲(chǔ)在1000組碼當(dāng)中。
TypedValue[] acTypValAr = new TypedValue[2];
acTypValAr.SetValue(new TypedValue(1001, "SOUTH"), 0);
acTypValAr.SetValue(new TypedValue(1000, casscode), 1);
SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
PromptSelectionResult acSSPrompt;
acSSPrompt = acDocEd.SelectAll(acSelFtr);
?if (acSSPrompt.Status == PromptStatus.OK)
??????????????? {
??????????????????? SelectionSet acSSet = acSSPrompt.Value;
??????????????????? Application.ShowAlertDialog("Number of objects selected: " + acSSet.Count.ToString());
??????????????? }
??????????????? else
??????????????? {
??????????????????? Application.ShowAlertDialog("Number of objects selected: 0");
??????????????? }
????????????????????? 這段代碼始終跳到else里。后來經(jīng)過查證確實(shí)autocad不能直接對(duì)1000組碼進(jìn)行選擇集過濾。
經(jīng)過在QQ群里的一番詢問,發(fā)現(xiàn)有些人也遇到過類似的問題,但卻都沒有解決,繞過了這個(gè)問題,用了比較簡單而粗暴的方式去做,就是通過遍歷圖中的每個(gè)圖元的所有擴(kuò)展數(shù)據(jù)去判斷該圖元是否有指定的cass編碼。因?yàn)楣P者這次做的不是針對(duì)個(gè)別圖元進(jìn)行判斷,而是針對(duì)整個(gè)已經(jīng)繪制好的地籍圖批量導(dǎo)出,如果按照群友的說法,顯然運(yùn)行效率會(huì)大大降低。于是繼續(xù)尋找,查了百度,google。最后在autodesk官網(wǎng)的論壇下終于找到了個(gè)較好的解決方案。這個(gè)問題是個(gè)老外提出的,也是個(gè)老外解決的。代碼如下:
private? string curCasscode;
private? void FeatureFilter()
??????? {
??????????? // Get the current document editor獲取當(dāng)前文檔編輯器
??????????? Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
??????????? Document doc = Application.DocumentManager.MdiActiveDocument;
??????????? Database db = doc.Database;
??????????????? TypedValue[] acTypValAr = new TypedValue[1];
??????????????? acTypValAr.SetValue(new TypedValue(1001, "SOUTH"), 0);
??????????????? SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
??????????????? PromptSelectionResult acSSPrompt;
???????????????? using (Transaction tr = db.TransactionManager.StartTransaction())
??????????? {
??????????????? acDocEd.SelectionAdded += OnSelectionAdded;
??????????????? acSSPrompt = acDocEd.SelectAll(acSelFtr); ;
??????????????? acDocEd.SelectionAdded -= OnSelectionAdded;
??????????????? if (acSSPrompt.Status == PromptStatus.OK)
??????????????? {
??????????????????? SelectionSet acSSet = acSSPrompt.Value;
??????????????????? Application.ShowAlertDialog("Number of objects selected: " + acSSet.Count.ToString());
??????????????? }
??????????????? else
??????????????? {
??????????????????? Application.ShowAlertDialog("Number of objects selected: 0");
??????????????? }
??????????????? tr.Commit();
??????????? }
??????????? }
??????? }
??????? void OnSelectionAdded(object sender, SelectionAddedEventArgs e)
??????? {
??????????? ObjectId[] ids = e.AddedObjects.GetObjectIds();
??????????? for (int i = 0; i < ids.Length; i++)
??????????? {
??????????????? DBObject obj = ids[i].GetObject(OpenMode.ForRead);
??????????????? ResultBuffer data = obj.GetXDataForApplication("SOUTH");
??????????????? bool has = false;
??????????????? foreach (TypedValue tv in data)
??????????????? {
??????????????????? if (tv.TypeCode == 1000 && (string)tv.Value == curCasscode)
??????????????????? {
??????????????????????? has = true;
??????????????????????? break;
??????????????????? }
??????????????? }
??????????????? if (!has) e.Remove(i);
??????????? }
??????? }
主體思路:editor提供了SelectionAdded事件,事件可以自定義。在選擇集過濾的時(shí)候,根據(jù)需要,逐個(gè)擴(kuò)展數(shù)據(jù)判斷,過濾出符合要求的要素。
雖然也是逐個(gè)擴(kuò)展數(shù)據(jù)判斷,卻大大提高了運(yùn)行效率,比網(wǎng)友的解決方案要好一些。
總結(jié)
以上是生活随笔為你收集整理的地籍图 cad cass 二次开发 过滤器过滤扩展数据组码1000的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看/修改Linux时区和时间
- 下一篇: jQuery 1.9+ 移除$.brow