乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 130|回复: 8

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

[复制链接]

20

主题

73

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
153
发表于 2009-9-21 11:45:00 | 显示全部楼层 |阅读模式
在lzh741206的帮助下(其实可以说是他写的),实现了在直线中加居中文本,并销除文本后面的线段。
具体效果如下图:

y15czpvares.gif

y15czpvares.gif


具体实现代码如下:
  1. using System;
  2. using Autodesk..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  30)
  117.                 {
  118.                     mtxt.Contents = "直线超长:" + line.Length.ToString("0.00");
  119.                     mtxt.ColorIndex = 1;
  120.                 }
  121.                 else
  122.                 {
  123.                     mtxt.Contents = "直线长度:" + line.Length.ToString("0.00");
  124.                     mtxt.ColorIndex = 3;
  125.                 }
  126.                 Extents3d ext = mtxt.GeometricExtents;
  127.                 mtxt.Rotation = douAngle;
  128.                 double width = (ext.MaxPoint - ext.MinPoint).Length;
  129.                 Point3d p1 = line.StartPoint + vec * (line.Length - width) / 2;
  130.                 Point3d p2 = p1 + vec * width;
  131.                 Line lineLeft = new Line(line.StartPoint, p1);
  132.                 Line lineRight = new Line(p2, line.EndPoint);
  133.                 wd.Geometry.Draw(lineLeft);
  134.                 wd.Geometry.Draw(lineRight);
  135.                 return base.WorldDraw(mtxt, wd);
  136.             }
  137.         }
  138.     }
  139. }
回复

使用道具 举报

20

主题

73

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
153
发表于 2009-9-21 11:52:00 | 显示全部楼层
本贴最大的特色是:
1.实现了文本文字不管在什么角度,都正向朝北。
2.实现了文本文字背后我的线段被销除。
3.能动态显示直线的长度。
4.根据直线的长度是否在某个值的范围内,更换文本内容及文本颜色,从而实现了直线与文本两者的颜色不同而存。
回复

使用道具 举报

40

主题

115

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
274
发表于 2009-9-21 16:49:00 | 显示全部楼层
翔麟牛
回复

使用道具 举报

0

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
2
发表于 2009-9-23 22:15:00 | 显示全部楼层

[assembly: CommandClass(typeof(ArrowOverrule.Helper))]
[assembly: ExtensionApplication(typeof(ArrowOverrule.TlsApplication))]
为什么用两种不同的方式呢?一个是CommandClass,一个是ExtensionApplication?有什么区别吗?
还有下面这一句出错,找不到类型或命名空间名称DrawableOverrule(是否缺少using指令或程序集引用?)
//显示重定义
    public class LArrowDrawOverrule : DrawableOverrule
回复

使用道具 举报

16

主题

53

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2009-9-23 23:46:00 | 显示全部楼层
楼上,你用的CAD是什么版本,这个Overrule目前只能在AutoCAD2010上运行!
回复

使用道具 举报

20

主题

73

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
153
发表于 2009-9-24 12:35:00 | 显示全部楼层
我用的是2009啊!
请问2010哪里有下载啊?
回复

使用道具 举报

16

主题

53

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2009-9-24 12:55:00 | 显示全部楼层
应用版的置顶贴
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-9-24 13:37:00 | 显示全部楼层
确实不一般.看来我要转到CAD2010上开发了.
游天居士到此一游.
回复

使用道具 举报

7

主题

55

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2009-9-24 22:58:00 | 显示全部楼层
毛线用,保存后再打开就没了,体验不如属性块
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 13:19 , Processed in 0.520311 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表