原文链接:https://blog.csdn.net/u010608964/article/details/86669792
今天这个例子为大家演示一下,在AutoCAD中实现使用将多行文本转为单行文本的方法。我们这里使用的是炸开的方式将多行文本转换为单行文本。
在这里顺便提一下,有很多小伙伴不知道怎么对AutoCAD进行二次开发,如果说使用的是C#,这里使用的.net的开发方式,对于AutoCAD2010只需要将acdbmgd.dll和acmgd.dll这两个库添加到我们创建的新类中即可。具体操作如下图所示。
当然,还要注意设置这两个dll的复制属性特性,将复制属性设置为false。如下图所示。
同时在上面的属性列表栏中,我们可以看到dll的版本,这里是18.0.0对应着AutoCAD2010版。
好了,说这么多只是前期的准备工作,下面我们来编写我们本次要实现的代码。具体的代码实现如下所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
namespace MTextToText
{
public class Class1
{
[CommandMethod("TestExplodeMText")]
public static void ExplodeMText()
{
Document doc = null;
Editor ed = null;
Database db = null;
try
{
doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
ed = doc.Editor;
db = doc.Database;
var per = ed.GetEntity("Mtext:");
if (per.Status != PromptStatus.OK)
return;
ObjectId mtId = per.ObjectId;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
MText mt = tr.GetObject(mtId, OpenMode.ForRead) as MText;
if (mt!=null)
{
var explObjs = new DBObjectCollection();
mt.Explode(explObjs);
if (explObjs.Count > 0)
{
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db),
OpenMode.ForWrite);
foreach (DBObject mtObj in explObjs)
{
Entity mtEnt = mtObj as Entity;
if (mtEnt != null)
{
ObjectId entId = ms.AppendEntity(mtEnt);
tr.AddNewlyCreatedDBObject(mtEnt, true);
}
}
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage(ex.Message);
}
}
}
}
最后编写好代码后,可能会需要我们队代码进行调试,这里我们使用附加进程的方式进行调试,如下图所示。
只要点击debug运行,然后就会启动AutoCAD程序,就 可以按照一般普通的方式绘图了。在AutoCAD中,我们使用netload命令,加载我们编译好的dll。本次功实现了选择多行文本,然后将这些文本转换为当行文本。