dtcms模板 dtcms文档 java arrays jpa swiftui swagger Minjs vue使用教程 后台管理网页模板 python数据挖掘实战pdf svn默认安装路径 plsql连接mysql数据库 linux查看防火墙 单片机开发板工作原理 普通话网上报名 python加注释 python参考手册 python安装 python基本语法 python环境变量 简单python脚本实例 python函数内定义函数 javaindexof java数组反转 java编程课程 java环境安装 java初学者 java开发者 java学习平台 java读取文件内容 java实例方法 java声明变量 linuxls命令 网页游戏代码 右键菜单背景 exescope教程 霜之祝福 苹果5s降级 js轮播图代码
当前位置: 首页 > 学习教程  > 编程学习

cad.net 图层隐藏 IsHidden 用法 eDuplicateRecordName 报错

2021/1/9 1:53:27 文章标签: cad图层无法删除

今天小博发现了一件事情,无论怎么用 IsHidden 都会出现报错 eDuplicateRecordName public class Command_Fuckcad{[CommandMethod("Hiddenlayer")]public void Hiddenlayer(){Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Databas…

 

今天小博发现了一件事情,无论怎么用 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();
                }
            }
        }
    }
View Code

 

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();
                }
            }
        } 
    }
View Code
/// <summary>
        /// 是否成功修改的标记
        /// </summary>
        public enum LayerHiddenError
        {
            /// <summary>
            /// 成功更改隐藏
            /// </summary>
            OK,

            /// <summary>
            /// 不含有图层,所以没得更改隐藏
            /// </summary>
            No,

            /// <summary>
            /// 已有带*图层,不能隐藏 
            /// </summary>
            ErrorHaveStarsLayer,

            /// <summary>
            /// 已有不带*图层,不能取消隐藏
            /// </summary>
            ErrorNotStarsLayer,
        }

        /// <summary>
        /// 取消隐藏
        /// </summary>
        /// <param name="tr">事务</param>
        /// <param name="table">数据库</param>
        /// <param name="layerName">不带*的图层名称</param>
        /// <returns></returns>
        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;
            }
        }

        /// <summary>
        /// 隐藏图层
        /// </summary>
        /// <param name="tr">事务</param>
        /// <param name="db">数据库</param>
        /// <param name="layerName">不带*的图层名称</param>
        /// <returns></returns>
        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;
            }
        }
View Code

 

 

因为*号是保留关键字,普通用户不给用的,大家要判断层名的时候就要打开IncludingHidden 遍历的时候同时判断 "*"+layerName 和 layerName

 

普通cad用户只能干着急,嘻嘻

 

 

e大还说了,把dwg存成dxf,然后用对比文件看,也能看到,并改......这貌似是给普通用户的简便修改方式? 

 

转载于:https://www.cnblogs.com/JJBox/p/10878537.html


本文链接: http://www.dtmao.cc/news_show_1100048.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?