明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7147|回复: 12

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

  [复制链接]
发表于 2008-5-1 10:48 | 显示全部楼层 |阅读模式
例如选择“0"层半径大于40的圆,或者选择“0”层文字高度等于5的所有文字等等之类。
 楼主| 发表于 2008-5-3 20:50 | 显示全部楼层
是不是问题太简单了,居然没有人回应。没办法自己摸索吧,终于弄出来了,呵呵,同lisp语言有点儿类似。不敢独享,对还有疑问的人可能会有帮助。

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

lisp代码:
  1. (setq ss (ssget        '((-4 . "<OR")
  2.                   (-4 . "<AND")
  3.                   (0 . "CIRCLE")
  4.                   (-4 . ">=")
  5.                   (40 . 40)
  6.                   (-4 . "<")
  7.                   (40 . 100)
  8.                   (-4 . "AND>")
  9.                   (-4 . "<AND")
  10.                   (0 . "*LINE")
  11.                   (8 . "0,1")
  12.                   (-4 . "AND>")
  13.                   (-4 . "OR>")
  14.                  )
  15.          )
  16. )
C#代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. // 访问AutoCAD程序对象。
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. // 访问 the AutoCAD 编辑器。
  7. using Autodesk.AutoCAD.EditorInput;
  8. // 命令注册。
  9. using Autodesk.AutoCAD.Runtime;
  10. // 访问数据库对象。
  11. using Autodesk.AutoCAD.DatabaseServices;
  12. namespace Prompt
  13. {
  14.     public class Class1
  15.     {
  16.         [CommandMethod("SelectFilter")]
  17.         static public void SelectEnt()
  18.         {
  19.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  20.             PromptSelectionOptions selectionOp = new PromptSelectionOptions();
  21.             // 多重选择,选择半径大于等于40的圆或者0,1层上的所有线
  22.             TypedValue[] filList =
  23.             {
  24.                 new TypedValue(-4,"<OR"),
  25.                   new TypedValue(-4,"<AND"),
  26.                     new TypedValue(0,"CIRCLE"),
  27.                     new TypedValue(-4,">="),
  28.                     new TypedValue(40,40),
  29.                     new TypedValue(-4,"<"),
  30.                     new TypedValue(40,100),
  31.                   new TypedValue(-4,"AND>"),
  32.                     new TypedValue(-4,"<AND"),
  33.                     new TypedValue(0,"*LINE"),
  34.                     new TypedValue(8,"0,1"),
  35.                   new TypedValue(-4,"AND>"),
  36.                 new TypedValue(-4,"OR>")
  37.             };//注意分号
  38.             SelectionFilter filter = new SelectionFilter(filList);
  39.             PromptSelectionResult ssRes = ed.GetSelection(selectionOp, filter);
  40.             if (ssRes.Status == PromptStatus.OK)
  41.             {
  42.                 SelectionSet SS = ssRes.Value;
  43.                 int nCount = SS.Count;
  44.                 ed.WriteMessage("选择了{0}个实体", nCount);
  45.             }
  46.         }
  47.     }
  48. }
发表于 2008-5-6 11:01 | 显示全部楼层
请问你的AutoCAD是什么版本?
 楼主| 发表于 2008-5-6 12:09 | 显示全部楼层
跟版本有关系吗?我用的是Autocad 2009.
发表于 2008-5-7 13:54 | 显示全部楼层
据我了解,你的代码至少在2006,2007版本里是不行的,和语法无关,应该是SelectionFilter里的bug;
比如同样的方式,实现选取半径为40的圆是可以的,但实现选取半径为40的圆和圆弧是不可以的,选取图层A的直线和圆也是不可以的.
发表于 2008-6-5 18:49 | 显示全部楼层
sieben发表于2008-5-7 13:54:00据我了解,你的代码至少在2006,2007版本里是不行的,和语法无关,应该是SelectionFilter里的bug;比如同样的方式,实现选取半径为40的圆是可以的,但实现选取半径为40的圆和圆弧是不可以的,选

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

发表于 2008-7-31 16:13 | 显示全部楼层
都是些强人!!!
 楼主| 发表于 2010-1-19 15:22 | 显示全部楼层
function XML() {
    [native code]
}
发表于 2010-1-20 15:49 | 显示全部楼层
2006的SelectionFilter中有BUG?以前好像在2006中使用过多重选择,没遇到问题啊?
发表于 2011-1-24 17:13 | 显示全部楼层
回复 dukeyongwang 的帖子

我用的就是2006,是否可以提供一下相关代码,想要过滤选择所有长度大于210的LWPOLYLINE,用楼主的代码一直调试不过,谢了先~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-8 15:52 , Processed in 0.169531 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表