每个图形文件都包含有9个固定的符号表。不能往数据库里添加新的符号表。如图层表(LayerTable),其中包含图层表记录,还有块表(BlockTable),其中包含块表记录等。所有的图形实体(线、圆、弧等等)都属于一个块表记录。缺省情况下,任何图形文件都包含为模型空间和图纸空间预定义的块表记录。每个符号表都有对应的符号表记录,可以理解为符号表是一个集合,而符号表记录是这个集合的元素。CAD的符号表和符号表记录的对应关系如下:
名称 | 符号表 | 符号表记录 |
---|---|---|
块表 | BlockTable | BlockTableRecord |
标注样式表 | DimStyleTable | DimStyleTableRecord |
图层表 | LayerTable | LayerTableRecord |
线型表 | LinetypeTable | LinetypeTableRecord |
注册应用程序表 | RegAppTable | RegAppTableRecord |
字体样式表 | TextStyleTable | TextStyleTableRecord |
坐标系表 | UcsTable | UcsTableRecord |
视口表 | ViewportTable | ViewportTableRecord |
视图表 | ViewTable | ViewTableRecord |
那么如何来操作这些符号表呢?下面是一个新建图层的例子:
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// 返回当前数据库的图层表
LayerTable acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId,OpenMode.ForRead) as LayerTable;
// 检查图层表里是否有图层 MyLayer
if (acLyrTbl.Has("MyLayer") != true)
{
// 以写模式打开图层表
acLyrTbl.UpgradeOpen();
// 新创建一个图层表记录,并命名为”MyLayer”
LayerTableRecord acLyrTblRec = new LayerTableRecord();
acLyrTblRec.Name = "MyLayer";
// 添加新的图层表记录到图层表,添加事务
acLyrTbl.Add(acLyrTblRec);
acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true);
//提交修改
acTrans.Commit();
}
// 关闭事务,回收内存;
}
上面的例子用了20多行的代码来完成一个很简单的功能,这就是AutoCAD提供的api太过于基础,没有进行进一步的封装造成。那么如果我们单独为图层表封装一个函数来处理图层表,其他的8个符号表也要同样的各自封装函数,这样看起来没什么问题,但是对于代码的复用却没有很好的考虑进去。仔细思考一下,其实对于符号来说无非就是增删改三个主要的操作等,对于符号表记录来说无非就是一些属性的操作,增加实体的操作等。那么有没有一种办法可以统一管理9个符号表呢?其实AutoCAD提供了9个符号表和符号表记录的抽象基类,SymbolTable和SymbolTableRecord,但是这两个类提供的功能又很简单,只有寥寥几个函数和属性,完全不能满足我们的需求。因此NFox内裤提供了符号表类来封装9个符号表的大部分功能。那么用内裤来完成上述的操作是什么样子的呢?见下面的例子:
using (DBTransaction tr = new DBTransaction())
{
var layertable = tr.LayerTable.Add("MyLayer");
}
同样的功能我们只需要四行就可以搞定了。那么有同学会问了,我同样单独对每个符号表的封装一样可以达到这个效果?是的,确实可以达到一样的效果,但是我只封装了一次,只是针对符号表的差异部分做了一些增量的处理,其他的代码都是复用的,而你要写9次。
言归正传,通过上述的例子,我们会发现几个现象:
符号表的操作都在事务内,这样由事务统一管理符号表的变动,减少出错的可能。
符号表作为事务的属性,那么获取符号表记录就变成了属性的索引值。var layertable = tr.LayerTable["MyLayer"];
不管是什么符号表,都是一个Add函数搞定添加操作。
而删除就是:tr.LayerTable.Remove("1");
看,我教会了你操作图层表,那么其他的8个表你都会了,都是一样的操作。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。