当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
21 Star 47 Fork 33

InspireFunction/NFox
暂停

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
SymbolTable.md 4.40 KB
一键复制 编辑 原始数据 按行查看 历史
vicwjb 提交于 4年前 . 调整目录结构

符号表用法

每个图形文件都包含有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次。

言归正传,通过上述的例子,我们会发现几个现象:

  1. 符号表的操作是在事务内。
  2. 符号表成了事务的属性
  3. 添加符号表记录到符号表调用Add函数就可以了(其实提供了好多的重载,来完成不同的细粒度的操作)。

符号表的操作都在事务内,这样由事务统一管理符号表的变动,减少出错的可能。

符号表作为事务的属性,那么获取符号表记录就变成了属性的索引值。var layertable = tr.LayerTable["MyLayer"];

不管是什么符号表,都是一个Add函数搞定添加操作。

而删除就是:tr.LayerTable.Remove("1");

看,我教会了你操作图层表,那么其他的8个表你都会了,都是一样的操作。

Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/inspirefunction/NFox.git
git@gitee.com:inspirefunction/NFox.git
inspirefunction
NFox
NFox
master

搜索帮助