符老师,.Net有过滤元素的类吗?com接口有ElementScanCriteriaClass ,请符老师指导
新的编程框架下有ScanCriteria类,用于元素扫描。
cri.SetRangeTest 函数中用的ScanRange为何不是double 而是long 一直很纳闷
同时也没函数得到结果元素
给您一个.NET下ScanCriteria的例子如下:
int elemNo = 1; private StatusInt Scan(Element element, DgnModelRef modelRef) { string myStr = elemNo++.ToString() + " -- " + element.TypeName.ToString(); MessageCenter.Instance.ShowMessage(MessageType.Info, myStr, myStr, MessageAlert.None); return StatusInt.Success; } private void bitmaskTest() { ScanCriteria sc = new ScanCriteria(); sc.SetModelRef(Session.Instance.GetActiveDgnModel()); sc.SetModelSections(DgnModelSections.GraphicElements); BitMask elemTypeMask = new BitMask(false); elemTypeMask.Capacity = 128; elemTypeMask.ClearAll(); // Element Type Number - 1 = BitMask Index elemTypeMask.SetBit(2, true); // Element Type = Line, or (int)MSElementType.Line - 1 elemTypeMask.SetBit(3, true); // Element Type = LineString elemTypeMask.SetBit(5, true); // Element Type = Shape elemTypeMask.SetBit(16, true); // Element Type = Text elemTypeMask.SetBit(18, true); // Element Type = Solid (Not SmartSolid) sc.SetElementTypeTest(elemTypeMask); ScanRange range = new ScanRange(0,0,-10000, 10000, 10000, 10000); sc.SetRangeTest(range); sc.Scan(new ScanDelegate(Scan)); }
ScanRange之所以用整型数是由于历史原因造成的。原来的V7DGN元素底层都是用整数表达以提高程序的执行效率(我们知道操作整数比操作实数在CPU中快百倍以上)。到了V8DGN,元素坐标已经改为实数表达,但为了效率起见,元素范围仍然采用整数。之所以MS定位元素能这么快,与这个设计也是不无关系的。在DGN头部还有一个专门的元素范围索引,所以,当我们在视图中点一点后能快速找到该范围内的元素,都是有赖于此。
我记得老的MDL函数有mdlCnv_dRangeToScanRange专门实现DRange3d到ScanRange的转换的。
Answer Verified By: Andy
看出来得到的结果得在委托函数中处理 多谢符老师
上述例子通过elemTypeMask对象设置成搜索特定类型的元素, 怎么设置成搜索特定层上的元素?