乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 107|回复: 9

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

[复制链接]

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2008-5-1 10:48:00 | 显示全部楼层 |阅读模式
例如选择“0"层半径大于40的圆,或者选择“0”层文字高度等于5的所有文字等等之类。
回复

使用道具 举报

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2008-5-3 20:50:00 | 显示全部楼层
是不是问题太简单了,居然没有人回应。没办法自己摸索吧,终于弄出来了,呵呵,同lisp语言有点儿类似。不敢独享,对还有疑问的人可能会有帮助。
功能:选择半径大于等于40,小于100的所有圆和0层、1层上的所有线(*LINE)。
lisp代码:
  1. (setq ss (ssget        '((-4 . "=")
  2.                   (40 . 40)
  3.                   (-4 . "")
  4.                   (-4 . "")
  5.                   (-4 . "OR>")
  6.                  )
  7.          )
  8. )
C#代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;// 访问AutoCAD程序对象。
  4. using Autodesk.AutoCAD.ApplicationServices;// 访问 the AutoCAD 编辑器。
  5. using Autodesk.AutoCAD.EditorInput;// 命令注册。
  6. using Autodesk.AutoCAD.Runtime;// 访问数据库对象。
  7. using Autodesk.AutoCAD.DatabaseServices;namespace Prompt
  8. {
  9.     public class Class1
  10.     {
  11.         [CommandMethod("SelectFilter")]
  12.         static public void SelectEnt()
  13.         {
  14.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  15.             PromptSelectionOptions selectionOp = new PromptSelectionOptions();
  16.             // 多重选择,选择半径大于等于40的圆或者0,1层上的所有线
  17.             TypedValue[] filList =
  18.             {
  19.                 new TypedValue(-4,"="),
  20.                     new TypedValue(40,40),
  21.                     new TypedValue(-4,""),
  22.                     new TypedValue(-4,""),
  23.                 new TypedValue(-4,"OR>")
  24.             };//注意分号
  25.             SelectionFilter filter = new SelectionFilter(filList);
  26.             PromptSelectionResult ssRes = ed.GetSelection(selectionOp, filter);
  27.             if (ssRes.Status == PromptStatus.OK)
  28.             {
  29.                 SelectionSet SS = ssRes.Value;
  30.                 int nCount = SS.Count;
  31.                 ed.WriteMessage("选择了{0}个实体", nCount);
  32.             }
  33.         }
  34.     }
  35. }
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2008-5-6 11:01:00 | 显示全部楼层
请问你的AutoCAD是什么版本?
回复

使用道具 举报

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2008-5-6 12:09:00 | 显示全部楼层
跟版本有关系吗?我用的是Autocad 2009.
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2008-5-7 13:54:00 | 显示全部楼层
据我了解,你的代码至少在2006,2007版本里是不行的,和语法无关,应该是SelectionFilter里的bug;
比如同样的方式,实现选取半径为40的圆是可以的,但实现选取半径为40的圆和圆弧是不可以的,选取图层A的直线和圆也是不可以的.
回复

使用道具 举报

8

主题

31

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2008-6-5 18:49:00 | 显示全部楼层

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

使用道具 举报

0

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2008-7-31 16:13:00 | 显示全部楼层
都是些强人!!!
回复

使用道具 举报

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2010-1-19 15:22:00 | 显示全部楼层
function XML() {
    [native code]
}
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2010-1-20 15:49:00 | 显示全部楼层
2006的SelectionFilter中有BUG?以前好像在2006中使用过多重选择,没遇到问题啊?
回复

使用道具 举报

9

主题

29

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2011-1-24 17:13:00 | 显示全部楼层
回复
我用的就是2006,是否可以提供一下相关代码,想要过滤选择所有长度大于210的LWPOLYLINE,用楼主的代码一直调试不过,谢了先~~~
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 12:44 , Processed in 0.349444 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表