说一下acad的bug及问题
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime; namespace BlockImport
{
public class BlockImportClass
{
[CommandMethod("tt")]
public void ImportBlocks()
{
DocumentCollection dm = Application.DocumentManager;
Editor ed = dm.MdiActiveDocument.Editor;
Database destDb = dm.MdiActiveDocument.Database;
Database sourceDb = new Database(false, true);
PromptResult sourceFileName;
try
{
//从命令行要求用户输入以得到要导入的块所在的源 DWG 文件的名字
#if false
sourceFileName = ed.GetString("\n输入来源DWG的完整路径: "); //把源 DWG 读入辅助数据库
sourceDb.ReadDwgFile(sourceFileName.StringResult, System.IO.FileShare.Read, true, "");
#else
sourceDb.ReadDwgFile(@"D:\桌面\T.dwg", System.IO.FileShare.Read, true, "");
#endif
//用集合变量来存储块 ID 的列表
var blockIds = new ObjectIdCollection();
using (Transaction tr = sourceDb.TransactionManager.StartTransaction())
{
//打开块表
BlockTable bt = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false) as BlockTable;
//在块表中检查每个块
foreach (ObjectId btrId in bt)
{
var btr = tr.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
//只添加有名块和非 layout 块(layout 块是非 MS 和非 PS 的块)
if (!btr.IsAnonymous && !btr.IsLayout)
blockIds.Add(btrId);
btr.Dispose(); //释放块表记录引用变量所占用的资源
}
bt.Dispose();//释放块表引用变量所占用的资源 //没有作改变,不需要提交事务
tr.Dispose();
}
//用 WblockCloneObjects 把所有的块从源库拷贝块到目的库的块表中
//这只能实现导入块到指定的数据库中,但不是深度克隆,
//若对块参照实行深度克隆的话,其所引用的块也会被克隆到指定的数据库中
IdMapping mapping = new IdMapping();
sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
ed.WriteMessage
("\n复制 "
+ blockIds.Count.ToString()
+ " 个块的定义"
//+ sourceFileName.StringResult
+ " 到当前绘图的块表记录."
);
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage("\n复制过程中的错误: " + ex.Message);
}
sourceDb.Dispose();
}
}
}
这是一个kean在博客的dbx例子,也就是后台打开dwg...
这个例子有个问题,利用它插入图元之后,(某些情况下)单行文字会出现基点不在文字图形的中间,我称为"文字偏移".
原因是文字或属性使用了"新宋体",然后使用了"中间,正中,中等等.."非"左"的对齐方式,这将导致这事件发生....其他字体貌似没有发现问题,仅仅发生在"新宋体"上...
左 AttachmentPoint.BaseLeft肯定不会,其他尚未测试...
而我用lisp调用insert命令实现没有这个问题....
文字偏移的情况会保存到dwg内,但是直接打开图纸双击文字,(不加载问题功能前提下)它又会恢复原状!!!气煞我也!! 遇到不妨用代码移动一个0,0到0,0
解决方案是:
1,来源数据库的文字样式表修改"新宋体"为任何一种大字体,
2,再更改文字实体对齐方式为"左",
3,再进行克隆(WblockCloneObjects)....
4,最后在目标数据库还原样式....(已经亲测,必须这样做,只改一项都不行)
注意的是修改Dbtxt的对齐方式从 左 到 其他 时候,要提交一次事务,再开事务,才能获得到单行文字的新基点(很奇葩!),再能从新基点移动到旧基点..
这样克隆(WblockCloneObjects)才不会出现文字矩阵的错误!!
//还原操作
db.TraverseTextStyleTable(tr, tstr =>
{
tstr.UpgradeOpen();
if (tstr.Name == "SD_宋体")
{
tstr.Font = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("宋体", false, false, , );
}
});
可惜的是e大复现了两次都没有成功复现我这个问题,
所以我没能正确告诉桌子如何修改的bug(毕竟他们是歪果仁)
后来群里有个人说,如果使用了开图复制,那么文字矩阵不会出错.
我的配置是32位修改的Acad2008安装到64位的win10上,但是我的Acad2019也会出现同样的情况,而e大用英文的2019却没有复现成功...
文字偏移在外部参照绑定的时候也会出现,但是insert却不会,而最新的ACAD2020里面的insert小面板也会,可见桌子的代码传承有问题,(这个时候没有说我为什么喜欢用旧版本了吧)
绑定参照后"新宋体"出现文字偏移效果见下图:
*************************************************************************************************************************************************************************************************************************
2008netapi如果你建一个块,再删除他,再添加一个同名块,用名称获取块定义会得到删除了的那个,然后爆了,
这在2008所有符号表上均存在,所以要循环获取并容错处理,或检测id是否已经被删除,
而高版本已经修复了这个问题.
Autodesk 至今都没有公开动态块的纯代码,大家可以通过分析动态块表记录组码和xdata来进行这里的操作..
说一下acad的bug及问题的更多相关文章
- cad.net之ACAD移植到GCAD的自动加载问题
将acad.pgp,lsp,fas,vlx,名称增加一份gcad.pgp,lsp,fas,vlx.涉及系统加载用. Lisp的拖拉加载在gcad无法通过lastprompt获取命令历史栏最后一行(含路 ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- a标签点击跳转失效--IE6、7的奇葩bug
一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- 了不起的 nodejs-TwitterWeb 案例 bug 解决
了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...
- 应该是Angular2的一个bug?
为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
随机推荐
- Centos上安装phpmyadmin
查看PHP有没有安装:php -v查看apache有没有安装:httpd -v如已经安装则想办法删除. 一.安装Apache(默认安装目录etc/httpd/) 1. 使用yum命令安装Apache ...
- trunc()用法和add_months()
TRUNC函数用于对值进行截断. 用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期. (1)截断数字: 格式:TRUNC(n1,n2),n1表示被截断的数字,n2 ...
- Web中的四大作用域对象
request:请求对象 类型:HttpServletRequest session:表示一次会话,可以处理一个用户多个页面之间的请求 application:标识web应用上下文,类型:Servle ...
- flask框架基础
一 web的一些框架介绍 Flask:短小精悍,内部没有包含多少组件,但是第三方的组件是非常丰富的. Django:django是一个重武器,内部包含了非常多的组件:orm,form,modelFor ...
- 2018.12.31 bzoj4001: [TJOI2015]概率论(生成函数)
传送门 生成函数好题. 题意简述:求nnn个点的树的叶子数期望值. 思路: 考虑fnf_nfn表示nnn个节点的树的数量. 所以有递推式f0=1,fn=∑i=0n−1fifn−1−i(n>0) ...
- 2018.10.29 洛谷P4129 [SHOI2006]仙人掌(仙人掌+高精度)
传送门 显然求出每一个环的大小. Ans=∏i(siz[i]+1)Ans=\prod_i(siz[i]+1)Ans=∏i(siz[i]+1) 注意用高精度存答案. 代码: #include<b ...
- NETCLR via C#第四版(文摘)
第1部分 CLR基础 第1章 CLR的执行模型 第2章 生成,打包,部署和管理应用程序及类型 第3章 共享程序集和强命名程序集 第2部分 设计类型 第4章 类型 第5章 基元类型 引用类型和值类型 第 ...
- w7 目录
第17章 期中架构体系介绍 期中架构环境准备 01-期中架构内容简介 02-期中架构大酒楼详解 03-期中架构使用到的软件简介 04-期中架构运维角度观察与使用的软件 05-重头开始创建一台新的虚拟机 ...
- vs2013查看代码性能后删除保存的性能查看文件导致再打开提示未找到与约束匹配的导出
1.关闭VS: 2.删除C:/Users//AppData/Local/Microsoft/VisualStudio/12.0/ComponentModelCache文件夹下所有文件及文件夹: 3.重 ...
- silverlight 父窗体传值给ChildWindow
在网上找了许多列子,有的没有看懂,有的太麻烦. 现在有两种方法又简单又实用的,分享给大家! 第一种:使用构造函数传值 1.子页面新建一个构造函数 public ChildWindowTest(stri ...