马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
转自Kean的博客。
在我的前一篇帖子里,我们看到了如何使用.NET来创建简单的线型。在那篇帖子的评论里,Mark问到:
Kean, 我测试了你的代码,它运行的很好,但我想... 是否也可以通过程序在线型中添加文字?我试着使用ltr.SetTextAt(1, "TEST") ,但到目前为止我没有成功,可以给些建议吗???
事实上,只是调用SetTextAt()来让一个线型包含文字是稍微有点复杂的。为了理解需要设置什么属性,我先从acad.lin(使用LINETYPE命令)中载入HOT_WATER_SUPPLY线型:
我然后使用ArxDbg(一个ObjectARX SDK的示例,对于理解图形结构非常有帮助)来查看这个线型表的内容。下面是SNOOPDB命令(由ArxDbg定义)对于所装载的线型的显示:
从上图中,我们可以非常直观地决定我们所要创建的包含文本部分的复杂线型的代码。我决定把这个新线型命名为"COLD_WATER_SUPPLY",把"CW"放置在中间。因为我只是简单的复制了一个已有的线型的属性,所以请不要问我它们都是什么意思。 :-)
下面是C#的代码:
[C#] 纯文本查看 复制代码 using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
namespace Linetype
{
public class Commands
{
[CommandMethod("CCL")]
public void CreateComplexLinetype()
{
Document doc =
Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
Transaction tr =
db.TransactionManager.StartTransaction();
using (tr)
{
// 我们使用文本样式表来访问"Standard"文本样式,用于文本部分
TextStyleTable tt =
(TextStyleTable)tr.GetObject(
db.TextStyleTableId,
OpenMode.ForRead
);
// 获取线型表
LinetypeTable lt =
(LinetypeTable)tr.GetObject(
db.LinetypeTableId,
OpenMode.ForWrite
);
// 创建新的线型表记录...
LinetypeTableRecord ltr =
new LinetypeTableRecord();
// ... 设置线型表记录的属性
ltr.Name = "COLD_WATER_SUPPLY";
ltr.AsciiDescription =
"Cold water supply ---- CW ---- CW ---- CW ----";
ltr.PatternLength = 0.9;
ltr.NumDashes = 3;
// 短划线 #1
ltr.SetDashLengthAt(0, 0.5);
// 短划线 #2
ltr.SetDashLengthAt(1, -0.2);
ltr.SetShapeStyleAt(1, tt["Standard"]);
ltr.SetShapeNumberAt(1, 0);
ltr.SetShapeOffsetAt(1, new Vector2d(-0.1,-0.05));
ltr.SetShapeScaleAt(1, 0.1);
ltr.SetShapeIsUcsOrientedAt(1, false);
ltr.SetShapeRotationAt(1, 0);
ltr.SetTextAt(1, "CW");
// 短划线 #3
ltr.SetDashLengthAt(2, -0.2);
// 把新线型添加到线型表
ObjectId ltId = lt.Add(ltr);
tr.AddNewlyCreatedDBObject(ltr, true);
// 使用这个线型创建一条测试直线
BlockTable bt =
(BlockTable)tr.GetObject(
db.BlockTableId,
OpenMode.ForRead
);
BlockTableRecord btr =
(BlockTableRecord)tr.GetObject(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite
);
Line ln =
new Line(
new Point3d(0, 0, 0),
new Point3d(10, 10, 0)
);
ln.SetDatabaseDefaults(db);
ln.LinetypeId = ltId;
btr.AppendEntity(ln);
tr.AddNewlyCreatedDBObject(ln, true);
tr.Commit();
}
}
}
}
下面是调用CCL命令后的结果:
|