乐筑天下

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

选择来自对象类型+图层的筛选

[复制链接]

30

主题

125

帖子

30

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
218
发表于 2015-11-12 04:06:22 | 显示全部楼层 |阅读模式
朋友们,大家好!
我有一个问题要对选择过滤器进行分类。我想在同一图层上过滤不同类型的对象。在我的示例中,我尝试仅过滤层“200”上的3d折线,
但我在层“200”上获取所有对象。我怀疑我没有在
  1. new TypedValue((int)DxfCode.Subclass, "AcDb3dPolyline")

中使用正确的类型
,这是孔代码
  1.         [CommandMethod("FilterSelectionSet")]
  2.         public static void FilterSelectionSet()
  3.         {
  4.             // Get the current document editor
  5.             Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
  6.             // Create a TypedValue array to define the filter criteria
  7.             
  8.             TypedValue[] acTypValAr = new TypedValue[3]
  9.             {
  10.                     new TypedValue((int)DxfCode.Subclass, "AcDb3dPolyline"),
  11.                     new TypedValue((int)DxfCode.LayerName, "200"),
  12.                     new TypedValue((int)DxfCode.LayoutName, "Model"),
  13.             };
  14.             // Assign the filter criteria to a SelectionFilter object
  15.             Autodesk.AutoCAD.EditorInput.SelectionFilter acSelFtr = new Autodesk.AutoCAD.EditorInput.SelectionFilter(acTypValAr);
  16.             // Request for objects to be selected in the drawing area
  17.             PromptSelectionResult acSSPrompt;
  18.             acSSPrompt = acDocEd.GetSelection(acSelFtr);
  19.             // If the prompt status is OK, objects were selected
  20.             if (acSSPrompt.Status == PromptStatus.OK)
  21.             {
  22.                 SelectionSet acSSet = acSSPrompt.Value;
  23.                 Application.ShowAlertDialog("Number of objects selected: " +
  24.                                             acSSet.Count.ToString());
  25.             }
  26.             else
  27.             {
  28.                 Application.ShowAlertDialog("Number of objects selected: 0");
  29.             }
  30.         }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-11-12 06:55:24 | 显示全部楼层
您好,
您不能使用DxfCode。子类(100)作为过滤器,使用“DXF类型”DxfCode。改为从(0)开始
对于DXF,Polyline3d是<strong>多段线</strong>以及Polyline2d和多边形网格;因此,您也必须检查70标志(它必须包含8位代码)
类型值[]ActyValar=新类型值[5]
{
新的TypedValue(0,“折线”),//DxfCode.Start
新的TypedValue(-4,&'),//Dxfcode.Operator
新的TypedValue(70,8),//DxfCode.Int16
新的TypedValue(8,“200”),//DxfCode.LayerName
新的TypedValue(410,“Model”),//DxfCode.LayoutName
}
编辑:如果您是从LISP提交的,如签名中所建议的,您可以看到用于构建SelectionFilter实例的TypedValue数组看起来像AutoLISP中使用的点对列表。
回复

使用道具 举报

30

主题

125

帖子

30

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
218
发表于 2015-11-12 08:27:51 | 显示全部楼层
嗨gile!
感谢回复,我对您的版本的问题是所有Polyline无论“AcDb2dPolyline”、“AcDb3dPolyline”、“AcDbPolyline”(LWPolyline)都在一个选择集中还是?
我希望“AcDb2dPolyline”和“AcDbPolyline”(所有2dPolyline)在一个选择中
和所有“AcDb3dPolyline”在注释器选择中,这可能吗?
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2015-11-12 10:53:58 | 显示全部楼层

德克,我会指出我经常遇到的一些事情。
问题不在于gile的代码解决方案...他很好地解决了你提出的问题。
问题是你问了一个问题,也希望我们知道你也想回答一些没有提到的问题。
如果这看起来简洁而纠缠不清,请原谅。
我发布这个只是因为gile太有礼貌了,不愿意兴风作浪。
回复

使用道具 举报

30

主题

125

帖子

30

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
218
发表于 2015-11-12 14:48:40 | 显示全部楼层
对不起,克里,你是对的。如果我得到解决方案,这听起来很糟糕,但不要从一开始就解释我的问题。所以我会做得更好。我会问你是否可以将LWPolyline,2dPolyline和3dPolyline分开(我的意思是在三个选择集中)。在我的程序中,应该可以选择例如层“200”上的所有2dPolyline,然后尝试在层“200”上获取所有3dPolyline,最后尝试在层“200”上获取所有LWPolyline。
new TypedValue((int)DxfCode.Start,“LWPOLYLINE,POLYLINE”) 我得到所有的Polylines。在POLYLINE类型中包括2dPolyline和3dPolyline,但我将具有不同的选择集。这意味着一个选择中的 2dPolyline+LwPolyline 或/和另一个选择中的 3dPolyline。
希望现在更好地理解。
?!
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-11-12 14:52:44 | 显示全部楼层
Kerry,
感谢您的回复。
我不是“太客气”,我只是在英语方面有些困难。
Dirk,
我发布的示例仅过滤模型空间中图层“200”上的三维多段线。
我建议您学习DXF代码(几乎是实体部分)、选择集过滤列表以及相关主题,如关系测试和逻辑分组测试。
我建议您使用LISP来学习这个,因为使用AutoCAD进行测试要容易得多,而且正如我上面所说的,将LISP过滤器列表转换成。NET类型值数组。
回复

使用道具 举报

30

主题

125

帖子

30

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
218
发表于 2015-11-13 02:51:44 | 显示全部楼层
thanx Gile
我不确定分组代码70。我没有选择二维多段线代码2]
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-11-13 03:54:52 | 显示全部楼层
从关于关系测试的帮助:
从多段线实体70代码的DXF文档:
这意味着多段线3d将总是具有第8位,并且如果闭合的话可能具有第1位(8 + 1 = 9)(如果是样条曲线的话,则具有第2位或第4位),因此检查第8位足以确保多段线是多段线3d。8 & 8 = 8或8 & 9 = 8或8 & 10 = 8等等,都不同于0。
多段线2d可能具有位0、2或4,加上可能的1(如果闭合),加上可能的128,即它可以是0、1、2、3 (2 + 1)、4、5 (4 + 1)、128、129 (1 + 128)、130 (2 + 128)、131 (1 + 2 + 128)、132 (4 + 128)、133 (1 + 4 + 128)。但是它不能有第8、16、32或64位。因此,检查折线实体是否没有这些位足以确保它是一条2d折线。
因此,您可以使用带有关系测试“&”和120 (8 + 16 +32 +64)的逻辑组“NOT”来过滤多段线2d。
这里有一些LISP表达式,它们只关注实体类型来过滤折线、二维多段线和三维多段线。
Polyline: LWPOLYLINE足够了代码3]
Polyline3d:多段线和位8
  1. (sssetfirst nil (ssget "_X" '((0 . "POLYLINE") (-4 . "&") (70 . 8))))

Polyline2d: POLYLINE而不是位8或16或32或64
  1. (sssetfirst nil (ssget "_X" '((0 . "POLYLINE") (-4 . ""))))

我让您添加其他过滤标准(层、布局)...
回复

使用道具 举报

30

主题

125

帖子

30

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
218
发表于 2015-11-13 05:15:08 | 显示全部楼层
非常感谢您抽出宝贵时间提供解决方案。这很有帮助,节省了时间。我很高兴!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 22:00 , Processed in 0.157579 second(s), 70 queries .

© 2020-2025 乐筑天下

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