[C# MSCE]过滤特定类型元素(不用com接口)

符老师,.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 

  • 看出来得到的结果得在委托函数中处理 多谢符老师