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 - , db.Extmin.Y - , db.Extmin.Z - ),
new Point3d(db.Extmax.X + , db.Extmax.Y + , db.Extmax.Z + )
);//更新视图到全屏 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 > )
{
ed.WriteMessage($"{Environment.NewLine}打开修改Visible图元隐藏的数量是: {lsGetVisibleFalse.Count}");
}
if (cuids.Count > )
{
string gname = "";
db.CreateGroup(tr, cuids.ToArray(), ref gname);//新建组 ed.WriteMessage($"{Environment.NewLine}打开复制中断的产生的隐藏图元数量是: {cuids.Count}");
ed.WriteMessage($"{Environment.NewLine}已经产生编组: {gname}");
}
tr.Commit();
}
}
}
}
次要的函数:
/// <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 = , double height = , double scale = 1.0)
{
ViewTableRecord view = ed.GetCurrentView();
//设置视图的中心点、高度和宽度
view.CenterPoint = centerPoint;
view.Width = width == ? view.Width : width * scale;
view.Height = height == ? view.Height : height * scale;
ed.SetCurrentView(view);//更新当前视图
}
/// <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;
}
cad.net 复制图元的时候按下多次esc导致复制中断的bug,令REGEN,REGENALL更新图元无效.的更多相关文章
- zendstudio快捷键复制行Ctrl+Alt+向下无效的解决方法
今天不断地在百度输入类似"zendstudio快捷键复制行Ctrl+Alt+向下无效"这样的关键字,里面搜索到的内容都是在说系统的显卡驱动Ctrl+Alt+方向键和ZendStud ...
- 将 GitHub 的某人的特定仓库复制到自己的账户下 的方法
访问仓库页面,点击 Fork 按钮创建自己的仓库 Fork 就是将 GitHub 的某个特定仓库复制到自己的账户下. Fork 出的仓库与原仓库是两个不同的仓库,开发者可以随意编辑. 新建的仓库名为& ...
- eclipse快速复制一行代码(向下/向上)快捷键修改设置
eclipse快速复制一行代码(向下/向上)快捷键修改设置 2015年10月05日 17:46:57 xiaoguanglgc 阅读数:20906 标签: eclipse快速复制一行快捷键冲突英特尔 ...
- Linux下的MySQL主主复制
为什么,会有mysql的主主复制.因为在一些高可用的环境中,mysql的主从不能满足现实中的一些实际需求.比如,一些流量大的网站数据库访问有了瓶颈,需要负载均衡的时候就用两个或者多个的mysql服务器 ...
- 在Sql2000 sql2005 sql2008 下已能实现事务复制的强制订阅,但请求订阅始终不能实现总有下列错误提示
硬件环境 : 一台服务器 安装了 sqlserver2008 数据库 局域网还有一台机器 安装了 sqlserver2000数据库 两台server 通信 共享均没有问题 同步过程中遇到的问题 : ...
- linux 下文件重命名/移动/复制命令(转)
linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc 重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...
- Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg
package com.swift; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; i ...
- 解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位
$(function () { //解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位 var u = navigator.userAgent; var isiOS = !! ...
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 .
eclipse下修改项目名导致tomcat内发布名不一致的解决方法 . ------------------------------------------------------- 解决方案: 直接 ...
随机推荐
- 【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)
DataTable与Excel之间的互导 1.项目添加NPOI的引用 NPOI项目简介: NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office ...
- mvc控制器接收ajax传送的数据
视图层中ajax传数据 $.ajax({ type: "post",//提交方式 data: { complay_arry: complay_arry, site_arry: si ...
- Zabbix+Grafana打造高逼格监控系统
第一章 zabbix监控的意义 1.1 为什么要监控 业务安全性的保障 系统的保障 产品持续性的运行 1.2 监控的内容 1.3 zabbix的选择性 [x] 纯命令监控太局限性 [x] 监控三剑客( ...
- Nuxt中使用Vant,完成通知栏Notify的提示
第一次移动端开发,UI方面选择了使用vant框架,但是vant官网写的使用,在nuxt项目中照搬官方的实例,各种报错,所以还得靠自己(使用方法在最后) 官方实例: 方法一:直接复制粘贴的时候,报错No ...
- 解决Eclipe安装不上android的ADT的办法
Eclipse,https://dl-ssl.google.com/android/eclipse/安装不上去,ADT在线安装装不了,用离线包又出问题时会不会疯掉. 显然,国内网络和谐掉了google ...
- 解决IIS Web部署 svg/woff/woff2字体找不到问题(vue部署后找不到)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/smartsmile2012/articl ...
- .htaccess文件配置理解
0x00前言.htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的 .htaccess可以控制错误重定向,初始页面设置,文件夹的访问权限,文件的跳转等 ...
- 触发器TRIGGER 自增IDENTITY 聚集索引CLUSTERED
在触发器的“触发”过程中,有两个临时表inserted和deleted发生了作用.这两个特殊的临时表inserted和deleted,仅仅在触发器运行时存在,它们在某一特定时间和某一特定表相关. CR ...
- django_restframework项目之python虚拟环境配置(一)
虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...
- Elasticsearch+x-pack认证license过期处理
介绍: x-pack是Elasticsearch中的一个plugin,主要功能是实现认证功能 报错: 类似下面这样的报错,是因为licese过期导致的 解决: 1.首先去Elasticsearch的官 ...