【发布时间】:2018-12-17 03:52:59
【问题描述】:
我是 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();
mt.SetDatabaseDefaults();
mt.Location = location;
mt.Attachment = attachmentpoint;
mt.Contents = contents;
mt.Height = height;
mt.Color = Color.FromColorIndex(ColorMethod.ByAci, color);
mt.BackgroundFill = usebackgroundmask;
mt.UseBackgroundColor = usebackgroundcolor;
mt.BackgroundScaleFactor = backgroundscale;
blocktablerecord.AppendEntity(mt);
transaction.AddNewlyCreatedDBObject(mt, true);
});
}
最后,当我在某处实际创建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?
【问题讨论】:
标签: c# lambda autocad autocad-plugin