• cad.net 复制图元的时候按下多次esc导致复制中断的bug,令REGEN,REGENALL更新图元无效.


    浩辰没有这个bug !!!!!!!

    如上述动图所示,cad在复制一个多图元的操作时候,多次按下esc键中断复制操作, **注意例子要有足够多的图元(大概一万个图元),才能很好展示这个bug,而且这个bug直到2019都会有,我已经测试了Acad2008和Acad2019,

    这个时候cad提交到数据库的操作是成功的,但是显示的提交却是失效,导致用户暂时无法操作隐藏的那个部分图元.

    用户可以关闭dwg,再打开,就能看见..

    样图在: 桌子的论坛链接

    主函数: 打开隐藏的方法,及判断数量的方法:

        //修改隐藏图元
        public static class Command_dakaiyinchang
        {
            [CommandMethod("jj_yc", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]//预选  | CommandFlags.DocExclusiveLock
            public static void jj_yc()
            {
                /*  bug: 复制中断
                 *  操作: 复制的时候如果连续用esc键,那么会导致复制中断,然后图元出现隐藏,令re,rea更新图元无效.
                 *  但是图元却是成功提交到数据库的!
                 *  原因: 桌子内置的更新显示函数没有和数据库提交的时候一起锁交互,导致出错了.
                 *  解决方法:  ent.Visible = true; 
                 *  但是if(!ent.Visible)不能够判断这样的情况,而直接设置可以成功更新到这个图元的状态.
                 *  如果要判断图元数量可以通过 SelectAll 来进行,经显示函数的获取是获取不到的,然后与遍历块表的差集就可以得出.
                 */
                Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
                Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
                ed.WriteMessage(Environment.NewLine + "****惊惊盒子-打开所有隐藏图元" + Environment.NewLine);
    
                ObjectId[] visibleSSAll;
                var cuids = new List<ObjectId>(); //可以编组的图元
                var cuidsN = new List<ObjectId>();//无法编组的图元
                var lsAll = new List<ObjectId>(); //全图图元的id
                var lsGetVisibleFalse = new List<ObjectId>(); //减去故意隐藏的图元设置了Visible False的
    
                ViewTableRecord viewOld = ed.GetCurrentView(); //旧视图 
                db.UpdateExt(true);//更新当前空间的范围,如果中断的bug的图元范围在(db.Extmin,db.Extmax)范围外,那么利用这个更新先
                ed.ZoomWindow(
                    new Point3d(db.Extmin.X - 1, db.Extmin.Y - 1, db.Extmin.Z - 1),
                    new Point3d(db.Extmax.X + 1, db.Extmax.Y + 1, db.Extmax.Z + 1)
                    );//更新视图到全屏
    
                using (Application.DocumentManager.MdiActiveDocument.LockDocument())//锁文档
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        //获取隐藏的数量
                        //选择集是通过显示函数获取的,复制中断引起的显示缺失图元是无法获取的 
                        //这种方式不能用,它和遍历全图一样 var ssall = ed.SelectAll();
                        //Acad2008 第二+次调用会卡一会,原因不明
                        // var ssall = ed.SelectWindow(db.Extmin, db.Extmax);
                        var ssall = ed.SelectCrossingWindow(db.Extmin, db.Extmax);
                        if (ssall.Status != PromptStatus.OK)
                        {
                            ssall = ed.SelectAll();
                            if (ssall.Status != PromptStatus.OK)
                            {
                                return;
                            }
                        }
                        ed.SetCurrentView(viewOld);//变回原有视图
                        visibleSSAll = ssall.Value.GetObjectIds();
    
                        //打开块表
                        var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
    
                        //遍历所有图元,显示出来
                        foreach (var item in bt)
                        {
                            if (item.IsOk())
                            {
                                var btr2 = item.GetObject(OpenMode.ForRead) as BlockTableRecord;
                                foreach (var item2 in btr2)
                                {
                                    if (item2.IsOk())
                                    {
                                        lsAll.Add(item2);
                                        var ent = item2.ToEntity(tr);
                                        ent.UpgradeOpen();
                                        if (!ent.Visible) //这个时候并不会判断这个bug发生
                                        {
                                            lsGetVisibleFalse.Add(item2);//不可见的加入
                                        }
                                        ent.Visible = true;  //有无可见均打开,这样才可以成功更新显示. 
                                        ent.DowngradeOpen();
                                    }
                                }
                            }
                        }
    
                        //差集
                        visibleSSAll = lsAll.Except(visibleSSAll).ToArray();//过滤出来复制中断产生的
                        visibleSSAll = visibleSSAll.Except(lsGetVisibleFalse).ToArray();//减去故意隐藏的 
    
                        //正则
                        Regex regex = new Regex("^ASSORTED_");//正则 
    
                        foreach (var item in visibleSSAll)
                        {
                            if (item.IsOk())
                            {
                                //判断图元空间
                                var ent = item.ToEntity(tr);
                                //这个几个东西会选上?
                                if (ent.BlockName != "_ArchTick" && !regex.IsMatch(ent.BlockName))
                                {
                                    cuids.Add(item);
                                }
                                else
                                {
                                    cuidsN.Add(item);
                                }
                            }
                        }
    
                        if (lsGetVisibleFalse.Count > 0)
                        {
                            ed.WriteMessage($"{Environment.NewLine}打开修改Visible图元隐藏的数量是: {lsGetVisibleFalse.Count}");
                        }
                        if (cuids.Count > 0)
                        {
                            string gname = "";
                            db.CreateGroup(tr, cuids.ToArray(), ref gname);//新建组
    
                            ed.WriteMessage($"{Environment.NewLine}打开复制中断的产生的隐藏图元数量是: {cuids.Count}");
                            ed.WriteMessage($"{Environment.NewLine}已经产生编组: {gname}");
                        }
                        tr.Commit();
                    }
                }
            } 
        }
    View Code

    次要的函数:

            /// <summary>
            /// 设置屏幕位置
            /// </summary>
            /// <param name="ed">编辑器</param>
            /// <param name="pt1">窗口的角点1</param>
            /// <param name="pt2">窗口的角点2</param>
            /// <param name="scale">缩放比例</param>
            public static void ZoomWindow(this Editor ed, Point3d pt1, Point3d pt2, double scale = 1.0)
            {
                ed.ZoomWindow(pt1.GetCenter(pt2).ToPoint2d(), Math.Abs(pt1.X - pt2.X), Math.Abs(pt1.Y - pt2.Y), scale);
            }
    
            /// <summary>
            /// 设置屏幕位置
            /// </summary>
            /// <param name="ed">编辑器</param>
            /// <param name="centerPoint">中心点</param>
            /// <param name="width">宽度X</param>
            /// <param name="height">高度Y</param> 
            /// <param name="scale">缩放比例</param>
            public static void ZoomWindow(this Editor ed, Point2d centerPoint, double width = 0, double height = 0, double scale = 1.0)
            {
                ViewTableRecord view = ed.GetCurrentView();
                //设置视图的中心点、高度和宽度
                view.CenterPoint = centerPoint;
                view.Width = width == 0 ? view.Width : width * scale;
                view.Height = height == 0 ? view.Height : height * scale;
                ed.SetCurrentView(view);//更新当前视图 
            }
    View Code
            /// <summary>
            /// id有效,未被删除
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public static bool IsOk(this ObjectId id)
            {return !id.IsNull && id.IsValid && !id.IsErased && !id.IsEffectivelyErased && id.IsResident);
    }
            /// <summary>
            /// id转实体
            /// </summary>
            /// <param name="id">图元ID</param>
            /// <param name="tr">事务</param>
            /// <returns></returns>
            public static Entity ToEntity(this ObjectId id, Transaction tr)
            {  
                return tr.GetObject(id, OpenMode.ForRead) as Entity;
            }


  • 相关阅读:
    poj 3624 (背包入门)
    poj 2175(最消费用最大流消圈法判断是否为最小费用)
    poj 2195 (最小费用最大流)
    poj 3659 (树上的最小支配集)
    Codeforces Beta Round #76 (Div. 1 Only)
    poj 2516(最小费用最大流)
    2013 腾讯马拉松初赛 第0场
    批量重命名,把文件名中的(1)去掉。
    ms sql server 添加列,删除列。
    winform 获取当前程序所在目录。
  • 原文地址:https://www.cnblogs.com/JJBox/p/11464977.html
Copyright © 2020-2023  润新知