Dallas_whu 发表于 2008-5-1 10:48:00

C#.NET里面怎样实现多重过滤选择?

例如选择“0"层半径大于40的圆,或者选择“0”层文字高度等于5的所有文字等等之类。

Dallas_whu 发表于 2008-5-3 20:50:00

是不是问题太简单了,居然没有人回应。没办法自己摸索吧,终于弄出来了,呵呵,同lisp语言有点儿类似。不敢独享,对还有疑问的人可能会有帮助。

功能:选择半径大于等于40,小于100的所有圆和0层、1层上的所有线(*LINE)。

lisp代码:(setq ss (ssget      '((-4 . "<OR")
                  (-4 . "<AND")
                  (0 . "CIRCLE")
                  (-4 . ">=")
                  (40 . 40)
                  (-4 . "<")
                  (40 . 100)
                  (-4 . "AND>")
                  (-4 . "<AND")
                  (0 . "*LINE")
                  (8 . "0,1")
                  (-4 . "AND>")
                  (-4 . "OR>")
               )
         )
)C#代码:using System;
using System.Collections.Generic;
using System.Text;

// 访问AutoCAD程序对象。
using Autodesk.AutoCAD.ApplicationServices;

// 访问 the AutoCAD 编辑器。
using Autodesk.AutoCAD.EditorInput;

// 命令注册。
using Autodesk.AutoCAD.Runtime;

// 访问数据库对象。
using Autodesk.AutoCAD.DatabaseServices;

namespace Prompt
{
    public class Class1
    {
      
      static public void SelectEnt()
      {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptSelectionOptions selectionOp = new PromptSelectionOptions();
            // 多重选择,选择半径大于等于40的圆或者0,1层上的所有线
            TypedValue[] filList =
            {
                new TypedValue(-4,"<OR"),
                  new TypedValue(-4,"<AND"),
                  new TypedValue(0,"CIRCLE"),
                  new TypedValue(-4,">="),
                  new TypedValue(40,40),
                  new TypedValue(-4,"<"),
                  new TypedValue(40,100),
                  new TypedValue(-4,"AND>"),
                  new TypedValue(-4,"<AND"),
                  new TypedValue(0,"*LINE"),
                  new TypedValue(8,"0,1"),
                  new TypedValue(-4,"AND>"),
                new TypedValue(-4,"OR>")
            };//注意分号
            SelectionFilter filter = new SelectionFilter(filList);
            PromptSelectionResult ssRes = ed.GetSelection(selectionOp, filter);
            if (ssRes.Status == PromptStatus.OK)
            {
                SelectionSet SS = ssRes.Value;
                int nCount = SS.Count;
                ed.WriteMessage("选择了{0}个实体", nCount);
            }
      }
    }
}

sieben 发表于 2008-5-6 11:01:00

请问你的AutoCAD是什么版本?

Dallas_whu 发表于 2008-5-6 12:09:00

跟版本有关系吗?我用的是Autocad 2009.

sieben 发表于 2008-5-7 13:54:00

据我了解,你的代码至少在2006,2007版本里是不行的,和语法无关,应该是SelectionFilter里的bug;<br/>比如同样的方式,实现选取半径为40的圆是可以的,但实现选取半径为40的圆和圆弧是不可以的,选取图层A的直线和圆也是不可以的.

muzi2005888 发表于 2008-6-5 18:49:00

sieben发表于2008-5-7 13:54:00static/image/common/back.gif据我了解,你的代码至少在2006,2007版本里是不行的,和语法无关,应该是SelectionFilter里的bug;比如同样的方式,实现选取半径为40的圆是可以的,但实现选取半径为40的圆和圆弧是不可以的,选

<p></p><p></p><p>那你给搞成可以在2006,2007,2009版本都可运行的</p>

wangfen_feng 发表于 2008-7-31 16:13:00

都是些强人!!!

Dallas_whu 发表于 2010-1-19 15:22:00

function XML() {
   
}

dukeyongwang 发表于 2010-1-20 15:49:00

2006的SelectionFilter中有BUG?以前好像在2006中使用过多重选择,没遇到问题啊?

hnzgs 发表于 2011-1-24 17:13:18

回复 dukeyongwang 的帖子

我用的就是2006,是否可以提供一下相关代码,想要过滤选择所有长度大于210的LWPOLYLINE,用楼主的代码一直调试不过,谢了先~~~
页: [1] 2
查看完整版本: C#.NET里面怎样实现多重过滤选择?