如何通过线宽在CATIA VBA中筛选选择集?
工程图中筛选指定线宽的Polyline/Curve2D方案
首先明确:Selection.Search确实无法直接通过线宽属性筛选,因为多数CAD系统的搜索语法仅支持颜色、图层、实体类型等有限属性,线宽(Thickness/LineWidth这类)不在可搜索的属性范围内,所以你之前的尝试既不报错也无结果是正常的。
替代方案是通过API批量获取实体后筛选,比纯逐个遍历快很多,以下是具体实现(以SolidWorks为例,其他CAD系统逻辑类似):
优化版筛选代码(VBA)
Dim swApp As SldWorks.SldWorks Dim swDraw As SldWorks.DrawingDoc Dim allEntities As Variant Dim singleEntity As SldWorks.DrawingEntity Dim targetLineWidth As Double Dim matchedEntities As Collection Set swApp = Application.SldWorks Set swDraw = swApp.ActiveDoc targetLineWidth = 1 '替换为你需要的线宽值 '一次性获取所有绘图实体,减少API调用次数 allEntities = swDraw.GetDrawingEntities2(swDrawingEntityType_e.swAllDrawingEntities) Set matchedEntities = New Collection '批量筛选类型和线宽 For i = 0 To UBound(allEntities) Set singleEntity = allEntities(i) '匹配Polyline或Curve2D类型 If singleEntity.GetType = swDrawingEntityType_e.swPolylineDrawingEntity Or _ singleEntity.GetType = swDrawingEntityType_e.swCurve2DDrawingEntity Then '匹配目标线宽 If singleEntity.LineThickness = targetLineWidth Then matchedEntities.Add singleEntity End If End If Next i '选中所有符合条件的实体 swDraw.ClearSelection2 True For Each singleEntity In matchedEntities singleEntity.Select True Next singleEntity
更高效的C#版本(LINQ过滤)
var swApp = (SldWorks)Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application")); var swDraw = (DrawingDoc)swApp.ActiveDoc; double targetWidth = 1; //用LINQ一次性过滤类型和线宽,比循环更高效 var matchedEntities = swDraw.GetDrawingEntities2((int)swDrawingEntityType_e.swAllDrawingEntities) .Cast<DrawingEntity>() .Where(e => e is PolylineDrawingEntity || e is Curve2DDrawingEntity) .Where(e => e.LineThickness == targetWidth) .ToList(); //选中结果 swDraw.ClearSelection2(true); foreach (var entity in matchedEntities) { entity.Select(true); }
非代码替代方案
如果你的CAD系统支持图层管理,可以提前将同线宽的Polyline/Curve2D归类到同一图层,之后直接通过图层筛选,无需编写代码,效率更高。
内容的提问来源于stack exchange,提问作者N.TW12
相关产品推荐
相关产品推荐

