博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cad.net 复制图元的时候按下多次esc导致复制中断的bug,令REGEN,REGENALL更新图元无效....
阅读量:5344 次
发布时间:2019-06-15

本文共 7000 字,大约阅读时间需要 23 分钟。

浩辰没有这个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
(); //可以编组的图元 var cuidsN = new List
();//无法编组的图元 var lsAll = new List
(); //全图图元的id var lsGetVisibleFalse = new List
(); //减去故意隐藏的图元设置了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

 

 

次要的函数:

///         /// 设置屏幕位置        ///         /// 编辑器        /// 窗口的角点1        /// 窗口的角点2        /// 缩放比例        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);        }        ///         /// 设置屏幕位置        ///         /// 编辑器        /// 中心点        /// 宽度X        /// 高度Y         /// 缩放比例        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

 

///         /// id有效,未被删除        ///         ///         /// 
public static bool IsOk(this ObjectId id) {
return !id.IsNull && id.IsValid && !id.IsErased && !id.IsEffectivelyErased && id.IsResident); }

 

///         /// id转实体        ///         /// 图元ID        /// 事务        /// 
public static Entity ToEntity(this ObjectId id, Transaction tr) { return tr.GetObject(id, OpenMode.ForRead) as Entity; }

 

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

你可能感兴趣的文章
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
display:none与visible:hidden的区别
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
Solr4.8.0源码分析(5)之查询流程分析总述
查看>>
[Windows Server]安装系统显示“缺少计算机所需的介质驱动程序”解决方案
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>