提要:影响图层显示的主要有:
关闭 isOff
冻结 IsFrozen
图层隐藏 isHidden
视口冻结 FreezeLayersInViewport
今天小博发现了一件事情,无论怎么用 IsHidden 都会出现报错 eDuplicateRecordName
public class Command_Fuckcad { [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,因为第二遍的时候隐藏的已经有这个名字了,就报错了!
写了个例子给大家抄: 尝试注释掉打开隐藏那个,反复执行一下fuckcad命令
public class Command_Fuckcad { [CommandMethod("fuckcad")] public void Fuckcad() { 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; table = table.IncludingHidden;//层表包含隐藏的,全部显示出来 string layerName = "Test"; LayerTableRecord ltr = null; if (!table.Has(layerName)) { ltr = new LayerTableRecord { Name = layerName }; table.Add(ltr); tr.AddNewlyCreatedDBObject(ltr, true); } switch (LayerHiddenOn(tr, db, layerName)) { case LayerHiddenError.OK: ed.WriteMessage("\n更改隐藏成功"); break; case LayerHiddenError.No: ed.WriteMessage("\n不含有图层,所以没得更改隐藏"); break; case LayerHiddenError.ErrorHaveStarsLayer: ed.WriteMessage("\n已有带*图层,不能隐藏"); break; case LayerHiddenError.ErrorNotStarsLayer: ed.WriteMessage("\n已有不带*图层,不能取消隐藏");//这句始终不会执行 break; } switch (LayerHiddenOff(tr, db, layerName)) { case LayerHiddenError.OK: ed.WriteMessage("\n更改隐藏成功"); break; case LayerHiddenError.No: ed.WriteMessage("\n不含有图层,所以没得更改隐藏"); break; case LayerHiddenError.ErrorHaveStarsLayer: ed.WriteMessage("\n已有带*图层,不能隐藏");//这句始终不会执行 break; case LayerHiddenError.ErrorNotStarsLayer: ed.WriteMessage("\n已有不带*图层,不能取消隐藏"); break; } tr.Commit(); } } } }
////// 是否成功修改的标记 /// public enum LayerHiddenError { /// /// 成功更改隐藏 /// OK, /// /// 不含有图层,所以没得更改隐藏 /// No, /// /// 已有带*图层,不能隐藏 /// ErrorHaveStarsLayer, /// /// 已有不带*图层,不能取消隐藏 /// ErrorNotStarsLayer, } /// /// 取消隐藏 /// /// 事务 /// 数据库 /// 不带*的图层名称 /// public static LayerHiddenError LayerHiddenOff(Transaction tr, Database db, string layerName) { LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; table = table.IncludingHidden;//层表包含隐藏的,全部显示出来 if (!table.Has(layerName)) { string layerNameX = "*" + layerName; foreach (var item in table) { if (item.IsOk()) { var ltr = tr.GetObject(item, OpenMode.ForRead) as LayerTableRecord; if (ltr.Name == layerNameX) { ltr.IsHidden = false; return LayerHiddenError.OK; } } } return LayerHiddenError.No; } else { return LayerHiddenError.ErrorNotStarsLayer; } } /// /// 隐藏图层 /// /// 事务 /// 数据库 /// 不带*的图层名称 /// public static LayerHiddenError LayerHiddenOn(Transaction tr, Database db, string layerName) { LayerTable table = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; table = table.IncludingHidden;//层表包含隐藏的,全部显示出来 if (!table.Has("*" + layerName)) { foreach (var item in table) { if (item.IsOk()) { var ltr = tr.GetObject(item, OpenMode.ForWrite) as LayerTableRecord; if (ltr.Name == layerName) { ltr.IsHidden = true; //隐藏就是 "*" + layerName return LayerHiddenError.OK; } } } return LayerHiddenError.No; } else { return LayerHiddenError.ErrorHaveStarsLayer; } }
因为*号是保留关键字,普通用户不给用的,大家要判断层名的时候就要打开IncludingHidden 遍历的时候同时判断 "*"+layerName 和 layerName
普通cad用户只能干着急,嘻嘻
e大还说了,把dwg存成dxf,然后用对比文件看,也能看到,并改......这貌似是给普通用户的简便修改方式?