今天小博发现了一件事情,无论怎么用 IsHidden 都会出现报错 eDuplicateRecordName
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Command_hbtcWin22222 { [CommandMethod("Hiddenlayer")] public void Hiddenlayer() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Application.DocumentManager.MdiActiveDocument.LockDocument())//锁文档 { using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; string ss = "Test"; LayerTableRecord layerName = null; if (table.Has(ss)) { foreach (var item in table) { layerName = tr.GetObject(item, OpenMode.ForRead) as LayerTableRecord; if (layerName.Name == ss) { layerName.UpgradeOpen(); layerName.IsHidden = true; layerName.DowngradeOpen(); break; } } } else { layerName = new LayerTableRecord { Name = ss, IsHidden = false }; table.Add(layerName); tr.AddNewlyCreatedDBObject(layerName, true); } table.DowngradeOpen(); table.Dispose(); tr.Commit(); } } } }
2008和2019测试都是
第一次遍历,生成一个test图层,
第二次遍历,修改隐藏(相当于删除了的感觉)
第三次遍历,又生成了一个test图层
第四次遍历,修改隐藏报错了
后来得到e大的帮助,说了一个很重要的问题,遍历器上面没有,那么我就去看了块表,块表上面有个参数是 IncludingHidden,
所以代码要写这句,层表才会显示隐藏的图层:
LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; table = table.IncludingHidden;
之后,我就发现了,报错的原因:
第一次遍历,生成一个test图层,
第二次遍历,修改隐藏(相当于把图层改成了*Test的名字)
第三次遍历,又生成了一个test图层
第四次遍历,修改隐藏,相当于吧test改成*test,因为第二遍的时候隐藏的已经有这个名字了,就报错了!
因为*号是保留关键字,普通用户不给用的,大家要判断层名的时候就要打开IncludingHidden 遍历的时候同时判断 "*"+layerName 和 layerName
普通cad用户只能干着急,嘻嘻
e大还说了,把dwg存成dxf,然后用对比文件看,也能看到,并改......这貌似是给普通用户的简便修改方式?