天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 103|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1585

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 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. }
    复制代码

     

     

     

     

    [原创] 使用"Overrule“实现线中加文本
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-17 15:12 , Processed in 0.076868 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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