找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 237|回复: 0

[原创] 使用"Overrule“实现线中加文本

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-9 11:07:29 | 显示全部楼层 |阅读模式
  1. using System;
  2. using Autodesk.<a href="http://bbs.mjtd.com/forum-41-1.html" target="采用blank" class="relatedlink">AutoCAD</a>.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.GraphicsInterface;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. [assembly: CommandClass(typeof(ArrowOverrule.Helper))]
  9. [assembly: ExtensionApplication(typeof(ArrowOverrule.TlsApplication))]
  10. namespace ArrowOverrule
  11. {
  12.     //管理重定义
  13.     class TlsApplication : IExtensionApplication
  14.     {
  15.         //初始化例程,重定义生效
  16.         void IExtensionApplication.Initialize()
  17.         {
  18.             Helper.OverruleStart();
  19.             Overrule.Overruling = true;
  20.         }
  21.         //
  22.         void IExtensionApplication.Terminate()
  23.         {
  24.             Helper.OverruleEnd();
  25.             Overrule.Overruling = false;
  26.         }
  27.     }
  28.     //静态类,存放常用的参数
  29.     static class Helper
  30.     {
  31.         //XData的应用程序注册名
  32.         public readonly static string RegAppName = "TlsCad.Arrow";
  33.         //箭头长度,暂时无法更改,可扩展功能
  34.         public static double ArrowLen = 5;
  35.         //重定义生效
  36.         public static void OverruleStart()
  37.         {
  38.             Overrule.AddOverrule(RXObject.GetClass(typeof(Line)), LArrowDrawOverrule.TheOverrule, false);
  39.         }
  40.         //重定义失效
  41.         public static void OverruleEnd()
  42.         {
  43.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(Line)), LArrowDrawOverrule.TheOverrule);
  44.         }
  45.         //让特定的实体附着XData,以便重定义重载可以过滤到该实体
  46.         public static void SetTo(Line line)
  47.         {
  48.             ResultBuffer rb =
  49.                 new ResultBuffer(
  50.                     new TypedValue[] {
  51.                          new TypedValue((int)DxfCode.ExtendedDataRegAppName, RegAppName),
  52.                          new TypedValue((int)DxfCode.ExtendedDataReal, ArrowLen) });
  53.             line.XData = rb;
  54.         }
  55.         [CommandMethod("larr")]
  56.         public static void LArrow()
  57.         {
  58.             Document doc = Application.DocumentManager.MdiActiveDocument;
  59.             Editor ed = doc.Editor;
  60.             PromptPointResult res1 = ed.GetPoint("\n请输入起点:");
  61.             if (res1.Status == PromptStatus.OK)
  62.             {
  63.                 PromptPointOptions opts = new PromptPointOptions("\n请输入终点:");
  64.                 opts.BasePoint = res1.Value;
  65.                 opts.UseBasePoint = true;
  66.                 PromptPointResult res2 = ed.GetPoint(opts);
  67.                 if (res2.Status == PromptStatus.OK)
  68.                 {
  69.                     Database db = doc.Database;
  70.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  71.                     {
  72.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);
  73.                         Line line = new Line(res1.Value, res2.Value);
  74.                         btr.AppendEntity(line);
  75.                         tr.AddNewlyCreatedDBObject(line, true);
  76.                         RegAppTable rat = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead, false);
  77.                         if (!rat.Has(RegAppName))
  78.                         {
  79.                             rat.UpgradeOpen();
  80.                             RegAppTableRecord regapp = new RegAppTableRecord();
  81.                             regapp.Name = RegAppName;
  82.                             rat.Add(regapp);
  83.                             tr.AddNewlyCreatedDBObject(regapp, true);
  84.                         }
  85.                         SetTo(line);
  86.                         tr.Commit();
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.     }
  92.     //显示重定义
  93.     public class LArrowDrawOverrule : DrawableOverrule
  94.     {
  95.         public static LArrowDrawOverrule TheOverrule = new LArrowDrawOverrule();
  96.         //设置重定义的过滤条件
  97.         public LArrowDrawOverrule()
  98.         {
  99.             SetXDataFilter(Helper.RegAppName);
  100.         }
  101.         //显示重载
  102.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  103.         {
  104.             Line line = (Line)drawable;
  105.             if (line.Length == 0)
  106.             {
  107.                 return base.WorldDraw(drawable, wd);
  108.             }
  109.             else
  110.             {
  111.                 double cenpar = (line.StartParam + line.EndParam) / 2;
  112.                 Point3d cenpnt = line.GetPointAtParameter(cenpar);
  113.                 Vector3d vec = (line.EndPoint - line.StartPoint).GetNormal();
  114.                 double douAngle = vec.AngleOnPlane(line.GetPlane());
  115.                 //让文本朝北
  116.                 if (douAngle > Math.PI / 2 && douAngle < 3 * Math.PI / 2)
  117.                 {
  118.                     douAngle -= Math.PI;
  119.                 }
  120.                 MText mtxt = new MText();
  121.                 mtxt.Attachment = AttachmentPoint.MiddleCenter;
  122.                 mtxt.Location = cenpnt;
  123.                 mtxt.Height = 0.5;
  124.                 if (line.Length > 30)
  125.                 {
  126.                     mtxt.Contents = "直线超长:" + line.Length.ToString("0.00");
  127.                     mtxt.ColorIndex = 1;
  128.                 }
  129.                 else
  130.                 {
  131.                     mtxt.Contents = "直线长度:" + line.Length.ToString("0.00");
  132.                     mtxt.ColorIndex = 3;
  133.                 }
  134.                 Extents3d ext = mtxt.GeometricExtents;
  135.                 mtxt.Rotation = douAngle;
  136.                 double width = (ext.MaxPoint - ext.MinPoint).Length;
  137.                 Point3d p1 = line.StartPoint + vec * (line.Length - width) / 2;
  138.                 Point3d p2 = p1 + vec * width;
  139.                 Line lineLeft = new Line(line.StartPoint, p1);
  140.                 Line lineRight = new Line(p2, line.EndPoint);
  141.                 wd.Geometry.Draw(lineLeft);
  142.                 wd.Geometry.Draw(lineRight);
  143.                 return base.WorldDraw(mtxt, wd);
  144.             }
  145.         }
  146.     }
  147. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 06:40 , Processed in 0.125564 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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