明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4279|回复: 9

[翔麟专集] [原创]翔麟专集——使用"Overrule“实现线中加文本

[复制链接]
发表于 2009-9-21 11:45 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-9-21 13:56:49 编辑

在lzh741206的帮助下(其实可以说是他写的),实现了在直线中加居中文本,并销除文本后面的线段。
具体效果如下图:

具体实现代码如下:
  1. using System;
  2. using Autodesk.AutoCAD.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. }

本帖子中包含更多资源

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

x
发表于 2019-3-19 20:11 | 显示全部楼层
毛线用,保存后再打开就没了,体验不如属性块
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2009-9-21 11:52 | 显示全部楼层

本贴最大的特色是:

1.实现了文本文字不管在什么角度,都正向朝北。

2.实现了文本文字背后我的线段被销除。

3.能动态显示直线的长度。

4.根据直线的长度是否在某个值的范围内,更换文本内容及文本颜色,从而实现了直线与文本两者的颜色不同而存。

评分

参与人数 1明经币 +3 收起 理由
雪山飞狐_lzh + 3 【好评】表扬一下

查看全部评分

发表于 2009-9-21 16:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-9-23 22:15 | 显示全部楼层
翔麟牛
发表于 2009-9-23 23:46 | 显示全部楼层
本帖最后由 作者 于 2009-9-24 0:10:59 编辑

[assembly: CommandClass(typeof(ArrowOverrule.Helper))]
[assembly: ExtensionApplication(typeof(ArrowOverrule.TlsApplication))]

为什么用两种不同的方式呢?一个是CommandClass,一个是ExtensionApplication?有什么区别吗?

还有下面这一句出错,找不到类型或命名空间名称DrawableOverrule(是否缺少using指令或程序集引用?)

//显示重定义
    public class LArrowDrawOverrule : DrawableOverrule

 楼主| 发表于 2009-9-24 12:35 | 显示全部楼层
楼上,你用的CAD是什么版本,这个Overrule目前只能在AutoCAD2010上运行!
发表于 2009-9-24 12:55 | 显示全部楼层

我用的是2009啊!

请问2010哪里有下载啊?

发表于 2009-9-24 13:37 | 显示全部楼层
发表于 2009-9-24 22:58 | 显示全部楼层

确实不一般.看来我要转到CAD2010上开发了.

游天居士到此一游.

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 13:09 , Processed in 1.970254 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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