C#基于netDXF遍历DXF文件图层时数量异常如何获取正确图层名
问题背景
在C#项目中使用netDXF库读取DXF文件图层信息时,直接遍历doc.Layers集合共得到5个图层对象,但文件实际可见的用户图层仅3个,无法正确匹配目标图层名称,原实现代码如下:
{ doc = new DxfDocument(); s = (string)RouteData.Values["pathName"]; doc = DxfDocument.Load((string)RouteData.Values["pathName"]); fileExist = System.IO.File.Exists(s); if (doc == null) { PathFlow = 4; } else if (doc != null) { PathFlow = 3; foreach (var layer in doc.Layers) { a.Add(layer.Name); b.Add(layer.ToString()); c.Add(layer.Handle); d++; } } }
问题原因
doc.Layers返回的是DXF文件内存储的全量图层集合,除了用户手动创建的可见图层外,还会包含两类默认不会在CAD编辑器图层列表显示的特殊图层:
- DXF规范强制要求的内置保留图层:默认的
0层、标注自动生成的Defpoints层,这两个图层的IsReserved属性值为true - 外部参照依赖图层:如果文件插入过外部块参照,会自动生成对应参照的依赖图层,这类图层的
IsExternalReference属性值为true
你拿到的5个图层,就是3个自定义图层+2个内置保留层,和感知到的实际图层数量差完全匹配。
正确读取实现
- 过滤特殊图层:遍历前通过Layer对象的内置属性筛掉保留图层、外部参照图层,得到实际用户可见的图层集合
- 调整代码逻辑顺序:把文件存在校验放在文件加载之前,移除无意义的重复实例化代码
修正后的代码如下:
{ s = (string)RouteData.Values["pathName"]; fileExist = System.IO.File.Exists(s); if (!fileExist) { PathFlow = 4; return; } doc = DxfDocument.Load(s); if (doc == null) { PathFlow = 4; } else { PathFlow = 3; // 清空历史统计数据 a.Clear(); b.Clear(); c.Clear(); d = 0; // 过滤得到实际用户图层:排除保留图层、排除外部参照图层 var visibleLayers = doc.Layers.Where(l => !l.IsReserved && !l.IsExternalReference); // 如果业务需要统计0层(很多场景下用户会直接在0层绘图),可把过滤条件调整为 // var visibleLayers = doc.Layers.Where(l => (!l.IsReserved || l.Name == "0") && !l.IsExternalReference); foreach (var layer in visibleLayers) { a.Add(layer.Name); b.Add(layer.ToString()); c.Add(layer.Handle); d++; } } }
内容的提问来源于stack exchange,提问作者Temp Account
相关产品推荐
相关产品推荐

