我是 C# 编程(和一般编程)的新手,但我正在使用 AutoDesk .NET API 进行工作项目的 AutoCAD 开发。
在 AutoCAD 开发中有一些重复的任务,我一直在创建帮助方法来简化我的代码。为了通过 .API 在 AutoCAD 中创建对象(线、多段线、注释等),程序员必须编写一个相当复杂的语句来访问 AutoCAD 环境,获取当前图形,获取数据库当前绘图文件,开始与数据库的事务//do work,然后在最终提交和关闭事务之前将创建的实体附加到数据库。
所以我写了下面的代码来简化这个任务:
public static void CreateObjectActionWithinTransaction(Action<Transaction, Database, BlockTable, BlockTableRecord> action)
{
var document = Application.DocumentManager.MdiActiveDocument;
var database = document.Database;
using (var transaction = document.TransactionManager.StartTransaction())
{
BlockTable blocktable = transaction.GetObject(database.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord blockTableRecord = transaction.GetObject(blocktable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
action(transaction, database, blocktable, blockTableRecord);
transaction.Commit();
}
}
然后我的 Lambda 表达式创建一个泛型MText并为其设置一些参数:
public static void createMtext(Point3d location, AttachmentPoint attachmentpoint, string contents, double height, short color, bool usebackgroundmask, bool usebackgroundcolor, double backgroundscale)
{
CreateObjectActionWithinTransaction((transaction, database, blocktable, blocktablerecord) =>
{
MText mt = new MText();
});
}
最后,当我实际在MText某处创建时,我可以在一行中创建它,并为所有参数传入值,而无需为其编写庞大的事务代码:
Helpers.createMtext(insertpoint, AttachmentPoint.MiddleLeft, "hello world", .08, colors.AutoCAD_Red, true, true, 1.2);
所以这很棒,当我想自己创建一个MText并将它放在某个地方时它可以工作。但是,在某些其他情况下MText,我想MText使用与上述相同的基本前提创建一个,而不是仅创建一个并将其放置在绘图中,但将其作为值返回以在其他地方使用。
AutoCAD 具有称为注释对象Multileaders,它们基本上MText就像上面一样,但附加到一些线和一个箭头以指向图形中的某些内容。在 API 中,您需要定义一个MText并将其附加到Multileader对象。但是我上面的代码不能使用,因为它没有返回任何东西。
所以我的问题归结为,我怎样才能创建一个像上面这样的方法来创建一个对象,而不是仅仅创建那个对象,让它返回那个对象以供另一段代码使用?
对于 Lambda 表达式的初学者,还有什么好的资源吗?书籍、网站、YouTube?
qq_笑_17
斯蒂芬大帝
largeQ
相关分类