public static void GetAllAlignmentFromActiveDgnModel( out List<Element> listLeft, out List<Element> listRight) { BIM.Application app = BMI.Utilities.ComApp; //获取所有廊道路线 app.ActiveDesignFile.Models["Default-3D"].Activate(); ModelElementsCollection cols = Session.Instance.GetActiveDgnModel().GetGraphicElements(); listLeft = new List<Element>(); listRight = new List<Element>(); List<string> StrLeft = new List<string>() { "PKX-", "PJX-", "BG-L-2","BG-L-3","BG-L-4","BG-L-5", "JSG-L-2","JSG-L-3","JSG-L-4","JSG-L-5" , "PSG-L-1", "PSG-L-8", "PSG-L-7", "PSG-L-6" ,"YDJ-","-WBP","-TBT","ZFD-","-TBP" ,"CL" ,"XCD-","LYD-","YLJ-","TLJ-","LJTT-T-L-0"}; List<string> StrRight = new List<string>() { "PKX-", "PJX-", "BG-R-2","BG-R-3","BG-R-4","BG-R-5", "JSG-R-2","JSG-R-3","JSG-R-4","JSG-R-5" , "PSG-R-1", "PSG-R-8", "PSG-R-7", "PSG-R-6" ,"YDJ-","-WBP","-TBT","ZFD-","-TBP" ,"CL" ,"XCD-","LYD-","YLJ-","TLJ-","LJTT-T-R-0"}; //List<Element> list = new List<Element>(); //获取当前模型下所有廊道线(out list); foreach (var element in cols) { string featureName = element.GetFeaturizedEntityName(); //左侧 foreach (string str in StrLeft) { if (featureName.Contains(str) && featureName.Contains("-L")) { listLeft.Add(element); break; } } //右侧 foreach (string str in StrRight) { if (featureName.Contains(str) && featureName.Contains("-R")) { listRight.Add(element); break; } } } }
目前看并没有什么好的办法,要么把廊道指定在某个图层,然后遍历某个指定图层去获取该廊道的廊道线。
好吧, 谢谢张老师
两个建议:
1、廊道线都可能是什么元素类型的?可以考虑用ScanCriteria根据元素类型先筛查一下,然后再进入你这个详细判断中。这样过滤后要考察的元素个数肯定会比你当前这个cols中的元素要少非常多。
2、将您的-L和-R直接写入列表StrLeft和StrRight中构成一个完整的FeatureName,这样就可以用字符串相等的比较运算而不用Contains运算了。设想一下,Contains函数是包含的意思,那底层算法一定是很复杂的。这样,您的
foreach (string str in StrLeft) { if (featureName.Contains(str) && featureName.Contains("-L")) { listLeft.Add(element); break; } }
就可以简写成:
for (int i=0; i<StrLeft.Count; i++) { if (featureName == StrLeft[i]) { listLeft.Add (element); break; } }
【注意】:我还改用for取代了foreach。据说for能比foreach又快很多
3、如果还想进一步优化程序的话,其实listLeft和listRight中可以保存元素的ID,待需要用到时再读取出来。这样占用内存会小许多。一个element会占用较多的内存的。当然,这一步不是为了提高速度的。可以暂时忽略。
收到, 我试试, 谢谢符老师
老师, 后来经过测试发现, 最耗费时间的其实是 string featureName = element.GetFeaturizedEntityName(); 这句话, 不知道为什么