1 Star 1 Fork 179

徐雷 / IFoxCAD

forked from InspireFunction / IFoxCAD 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
DBTrans.md 5.22 KB
一键复制 编辑 原始数据 按行查看 历史
vicwjb 提交于 2022-01-12 14:10 . update docs/DBTrans.md.

事务管理器用法

事务管理器介绍

事务管理器是cad .net二次开发过程绕不过去的一个部分,只要是涉及到读写cad数据的地方几乎都推荐在事务里完成。利用事务管理器可以自动的在退出事务的时候执行释放对象等操作,防止程序员不能释放对象,造成cad崩溃。

但是,在日常的使用中,会发现每次开启事务,然后完成的都是差不多的任务,然后每次都要调用commit()函数,每次都要获取到符号表,每次要写模式,读模式等提权降级操作,但是这些操作其实都可以自动完成的,因此 ifoxcad 内裤提供事务管理器类来完成本来需要手工完成的工作,让用户可以更方便的处理事务内的程序。

用事务管理器类可以完成:

  • 原生cad提供的事务管理器的全部操作
  • 方便的符号表操作
  • 方便的基础属性操作
  • 方便的对象获取操作
  • 方便的字典操作

事务管理器类的类名为:DBTrans。开启默认的事务管理器写法为:

using (DBTrans tr = new DBTrans())
{
  ....
}

原生的事务管理器操作

关于cad提供的原生事务管理器的操作不是本文档的重点,因为那操作起来麻烦,不够集中的将需要在事务内的操作做统一管理。

符号表操作

Ifoxcad 类库的符号表其实是一个符号表的泛型类,直接将符号表和符号表记录包装为一个整体。不用担心,在实际使用的过程中,你几乎不会关心符号表的构成原理。

Ifoxcad 类库里采用如下的符号来表示9大符号表。

符号表名 符号表含义
BlockTable 块表
LayerTable 图层表
DimStyleTable 标注样式表
LinetypeTable 线型表
RegAppTable 应用程序表
TextStyleTable 字体样式表
UcsTable 坐标系表
ViewportTable 视口表
ViewTable 视图表

然后怎么使用呢?使用符号表一共分几步呢?

using (DBTrans tr = new DBTrans()) // 第一步,开启事务
{ 
  var layerTable = tr.LayerTable;// 第二步,获取图层表  
} // 事务结束并自动提交

上面是一个获取层表的例子,其他的符号表都是一样的写法,因为这些符号表都是事务管理器的属性。那么获取到符号表之后能做些什么?

  • 向符号表里添加元素
using (DBTrans tr = new DBTrans()) 
{ // 第一步,开启事务
  	var layerTable = tr.LayerTable;
  // 第二步,获取图层表
  	layerTable.Add("1");// 返回值为ObjectId
  // 第三步,向层表里添加一个元素,也就是新建一个图层。
} // 事务结束并自动提交

每个符号表都有Add函数,而且提供了不止一个重载函数。

  • 添加和获取符号表里的元素

想要添加和获取符号表内的某个元素非常的简单:

using (DBTrans tr = new DBTrans()) // 第一步,开启事务
{ 
  var layerTable = tr.LayerTable; // 第二步,获取图层表
  layerTable.Add("1"); // 第三步,添加名为“1”的图层,即新建图层
  ObjectId id = layerTable["1"]; // 第四步,获取图层“1”的id。   
} // 事务结束并自动提交

每个符号表都提供了索引形式的获取元素id的写法。

  • 线型表
// 两种方式
// 第一种,直接调用tr.LinetypeTable.Add("hah")函数,然后对返回值ObjectId做具体的操作。
// 第二种,直接在Action委托里把相关的操作完成。
tr.LinetypeTable.Add(
                    "hah",
                    ltt => 
                    {
                        ltt.AsciiDescription = "虚线";
                        ltt.PatternLength = 0.95; //线型的总长度
                        ltt.NumDashes = 4; //组成线型的笔画数目
                        ltt.SetDashLengthAt(0, 0.5); //0.5个单位的划线
                        ltt.SetDashLengthAt(1, -0.25); //0.25个单位的空格
                        ltt.SetDashLengthAt(2, 0); // 一个点
                        ltt.SetDashLengthAt(3, -0.25); //0.25个单位的空格
                    });
// 这段代码同时演示了 ifoxcad 类库关于符号表的public ObjectId Add(string name, Action<TRecord> action)这个函数的用法。
// 或者直接调用:
tr.LinetypeTable.Add("hah", "虚线",0.95,new double[]{0.5,-0.25,0,-0.25});
// 获取线型表
tr.LinetypeTable["hah"];

其他符号表的操作类同。如果类库没有提供的Add函数的重载,那么Action委托可以完成你想完成的所有事情。

基础属性操作

事务管理器类提供了DocumentEditorDatabase三个属性来在事务内部处理相关事项。

同时还提供了关于字典的相关属性。

对象获取操作

提供了1个泛型 GetObject<T>函数的重载来根据ObjectId来获取到对象。

字典操作(未完待续)

  • 扩展字典

    SetXRecord 保存扩展数据到字典

    GetXRecord 获取扩展数据

  • 对象字典

    SetToDictionary 保存数据到字典

    GetFromDictionary 从字典获取数据

    GetSubDictionary 获取子对象字典

C#
1
https://gitee.com/xulei112233/ifoxcad.git
git@gitee.com:xulei112233/ifoxcad.git
xulei112233
ifoxcad
IFoxCAD
develop

搜索帮助