cadplayer 发表于 2015-11-12 04:06:22

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

朋友们,大家好!
我有一个问题要对选择过滤器进行分类。我想在同一图层上过滤不同类型的对象。在我的示例中,我尝试仅过滤层“200”上的3d折线,
但我在层“200”上获取所有对象。我怀疑我没有在
new TypedValue((int)DxfCode.Subclass, "AcDb3dPolyline")

中使用正确的类型
,这是孔代码
      
      public static void FilterSelectionSet()
      {
            // Get the current document editor
            Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
            // Create a TypedValue array to define the filter criteria
            
            TypedValue[] acTypValAr = new TypedValue
            {
                  new TypedValue((int)DxfCode.Subclass, "AcDb3dPolyline"),
                  new TypedValue((int)DxfCode.LayerName, "200"),
                  new TypedValue((int)DxfCode.LayoutName, "Model"),
            };
            // Assign the filter criteria to a SelectionFilter object
            Autodesk.AutoCAD.EditorInput.SelectionFilter acSelFtr = new Autodesk.AutoCAD.EditorInput.SelectionFilter(acTypValAr);
            // Request for objects to be selected in the drawing area
            PromptSelectionResult acSSPrompt;
            acSSPrompt = acDocEd.GetSelection(acSelFtr);
            // If the prompt status is OK, objects were selected
            if (acSSPrompt.Status == PromptStatus.OK)
            {
                SelectionSet acSSet = acSSPrompt.Value;
                Application.ShowAlertDialog("Number of objects selected: " +
                                          acSSet.Count.ToString());
            }
            else
            {
                Application.ShowAlertDialog("Number of objects selected: 0");
            }
      }

**** Hidden Message *****

gile 发表于 2015-11-12 06:55:24

您好,
您不能使用DxfCode。子类(100)作为过滤器,使用“DXF类型”DxfCode。改为从(0)开始
对于DXF,Polyline3d是<strong>多段线</strong>以及Polyline2d和多边形网格;因此,您也必须检查70标志(它必须包含8位代码)
类型值[]ActyValar=新类型值
{
新的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中使用的点对列表。

cadplayer 发表于 2015-11-12 08:27:51

嗨gile!
感谢回复,我对您的版本的问题是所有Polyline无论“AcDb2dPolyline”、“AcDb3dPolyline”、“AcDbPolyline”(LWPolyline)都在一个选择集中还是?
我希望“AcDb2dPolyline”和“AcDbPolyline”(所有2dPolyline)在一个选择中
和所有“AcDb3dPolyline”在注释器选择中,这可能吗?

Kerry 发表于 2015-11-12 10:53:58


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

cadplayer 发表于 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。
希望现在更好地理解。
?!

gile 发表于 2015-11-12 14:52:44

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

cadplayer 发表于 2015-11-13 02:51:44

thanx Gile
我不确定分组代码70。我没有选择二维多段线代码2]

gile 发表于 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
(sssetfirst nil (ssget "_X" '((0 . "POLYLINE") (-4 . "&") (70 . 8))))
Polyline2d: POLYLINE而不是位8或16或32或64
(sssetfirst nil (ssget "_X" '((0 . "POLYLINE") (-4 . ""))))
我让您添加其他过滤标准(层、布局)...

cadplayer 发表于 2015-11-13 05:15:08

非常感谢您抽出宝贵时间提供解决方案。这很有帮助,节省了时间。我很高兴!
页: [1]
查看完整版本: 选择来自对象类型+图层的筛选