netcore程序员(一种为.NET三维应用增加文件序列化和事务能力的方法)
netcore程序员(一种为.NET三维应用增加文件序列化和事务能力的方法)若软件功能特多,就可以考虑使用高级交互模块里面的命令机制来管理功能。对于完整的桌面端应用,一般都需要保存业务数据以便下次打开可以接着编辑,在编辑过程中需要有后退前进,这时候就需要专门的数据管理模块,如下图所示:对于简单的工具,或者用户了数据管理模块的情况下,用户应用可以直接集成几何造型和显示引擎模块,如下所示:此处的应用界面包含了业务逻辑。1.2 基于数据管理模块的应用架构
CAD/CAE/CAM等专业软件必不可少的功能是文件的保存/打开、操作状态的Undo/Redo等,我们统称为应用数据管理。应用数据管理与业务领域强相关,与应用层紧密关联,实现起来比较繁琐且容易出错。如何在应用中快速实现一个完备的为老板节省开发成本的数据管理功能呢?
AnyCAD Rapid SDK for .NET对文档序列化、操作回退进行了抽象,提供了通用应用数据管理模块,基于API可以快速的开发专业级应用。
1 整体架构
1.1 简单集成应用
对于简单的工具,或者用户了数据管理模块的情况下,用户应用可以直接集成几何造型和显示引擎模块,如下所示:
此处的应用界面包含了业务逻辑。
1.2 基于数据管理模块的应用架构
对于完整的桌面端应用,一般都需要保存业务数据以便下次打开可以接着编辑,在编辑过程中需要有后退前进,这时候就需要专门的数据管理模块,如下图所示:
若软件功能特多,就可以考虑使用高级交互模块里面的命令机制来管理功能。
2 核心类说明
数据管理的内存模型API层主要由Document和Element组成,围绕这两个类构建了DocumentIO(文档数据读写)和Undotransaction(Undo事务机制),整体关系如下:
2.1 Document
Document[1]代表一个文档容器,所有需要保存的信息都需要保存在Document中。
2.2 Element
Element[2]代表一个基本的元素,可以是一个体,也可以是一条线,一个材质。只有从Element继承而来的对象才能被序列化。
AnyCAD内置了基本的Element对象如下:
若需要保存创建或者导入的TopoShape对象,使用ShapeElement[3]即可。
3 使用流程
使用数据管理模块就像把大象放进冰箱一样简单,分以下几步:
•创建Document对象:可以new一个,也可以从已有的文档打开。•编辑文档
•创建事务UndoTransaction对象
•开始事务
•修改Document或者Element对象
•提交事务
•保存文档
以创建一个ShapeElement为例,流程如下:
3.1 新建文档
mDocument = new Document();
3.2 打开文档
var dlg = new OpenFileDialog();
dlg.Filter = "AnyCAD Rapid Files(*.acad)|*.acad";
if (dlg.ShowDialog() == DialogResult.OK)
{
mDoc = DocumentIO.Load(dlg.FileName);
}
3.3 增加图元
从文件中打开一个IGES模型,并用Document管理起来的代码示例[4]:
class ImportIgesCommand : UICommand
{
public ImportIgesCommand()
{
this.Name = "ImportIGES";
}
public override bool Execute(UICommandContext ctx)
{
var dlg = new OpenFileDialog();
dlg.Filter = "IGES Files(*.iges;*.igs)|*.iges;*.igs";
if (dlg.ShowDialog() == DialogResult.OK)
{
var shape = IgesIO.Open(dlg.FileName);
if (shape != null)
{
//创建事务并开始
var transaction = new UndoTransaction(ctx.Document);
transaction.Start(this.Name);
var shapeElement = new ShapeElement();
shapeElement.SetName(ImportStepCommand.ExtractName(dlg.SafeFileName));
ctx.Document.AddElement(shapeElement);
shapeElement.SetMaterialId(ctx.DefaultMaterialId);
shapeElement.SetShape(shape);
ctx.ShowElement(shapeElement);
//提交事务
transaction.Commit();
ctx.RequestUpdate();
}
}
return true;
}
}
3.4 保存文档
var dlg = new SaveFileDialog();
dlg.Filter = "AnyCAD Rapid Files(*.acad)|*.acad";
if (dlg.ShowDialog() == DialogResult.OK)
{
DocumentIO.Save(mDocument dlg.FileName);
}
4 应用示例
RapidCAX[5]在AnyCAD数据管理模块的基础上搭建了Ribbon界面,可以基于这个项目来做修改,运行界面如下:
5 总结
文档序列化、编辑状态Undo/Redo是基础的软件功能,实现起来也相对繁琐。AnyCAD Rapid SDK提供了开箱即用的API,应用开发者可专注于业务功能开发,为老板节省成本,为客户快速交付产品。
AnyCAD Rapid SDK同时支持.NET4和.NET5,即可用用于WinForm,也可以用于WPF。在代码仓库https://gitee.com/anycad/RapidCAX 就可以获得完整的示例代码。欢迎大家批评指正~
References
[1] Document: http://anycad.cn/api/class_document.html[2] Element: http://anycad.cn/api/class_element.html[3] ShapeElement: http://anycad.cn/api/class_shape_element.html[4] 代码示例: https://gitee.com/anycad/RapidCAX/blob/master/AnyCAD.Rapid.Core/FileCommands.cs[5] RapidCAX: https://gitee.com/anycad/RapidCAX