找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 643|回复: 0

[每日一码] 使用.NET创建一个包含文本的复杂AutoCAD线型

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-5-27 14:25:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

转自Kean的博客。
在我的前一篇帖子里,我们看到了如何使用.NET来创建简单的线型。在那篇帖子的评论里,Mark问到:
Kean, 我测试了你的代码,它运行的很好,但我想... 是否也可以通过程序在线型中添加文字?我试着使用ltr.SetTextAt(1, "TEST") ,但到目前为止我没有成功,可以给些建议吗???

事实上,只是调用SetTextAt()来让一个线型包含文字是稍微有点复杂的。为了理解需要设置什么属性,我先从acad.lin(使用LINETYPE命令)中载入HOT_WATER_SUPPLY线型:

20080112_1c638de4aadf6f9570edqvyZXMq1vo5a.png
  
我然后使用ArxDbg(一个ObjectARX SDK的示例,对于理解图形结构非常有帮助)来查看这个线型表的内容。下面是SNOOPDB命令(由ArxDbg定义)对于所装载的线型的显示:


20080112_d3af5002bd1823b9e29cLb42rS8Fcfxo.png
  

从上图中,我们可以非常直观地决定我们所要创建的包含文本部分的复杂线型的代码。我决定把这个新线型命名为"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命令后的结果:

20080112_ca02fccef577898bd5a54Rq2gkRgjPnd.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:36 , Processed in 0.343179 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表