明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7183|回复: 13

[重定义] [原创]小狼专集——使用"Overrule“实现Cass电力线

  [复制链接]
发表于 2009-9-27 12:40:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-9-28 16:05:39 编辑

被飞狐批评了,改了重发一个
  1. [assembly: CommandClass(typeof(WolfDrawOverrule.WolfHelper))]
  2. [assembly: ExtensionApplication(typeof(WolfDrawOverrule.WolfLineAnnoOverrule))]
  3. namespace WolfDrawOverrule
  4. {
  5.     class WolfPoleOverrule : IExtensionApplication
  6.     {
  7.         #region IExtensionApplication Members
  8.         //初始化例程,重定义生效
  9.         void IExtensionApplication.Initialize()
  10.         {
  11.             WolfHelper.OverruleStart();
  12.             Overrule.Overruling = true;
  13.         }
  14.         //
  15.         void IExtensionApplication.Terminate()
  16.         {
  17.             WolfHelper.OverruleEnd();
  18.             Overrule.Overruling = false;
  19.         }
  20.         #endregion
  21.     }
  22.     static class WolfHelper
  23.     {
  24.         //Xdata应用程序名称
  25.         public readonly static string PoleRegAppName = "Wolf.Pole";
  26.         //是否显示基线
  27.         public static bool DrawPoleBaseLine = false;
  28.         public static void OverruleStart()
  29.         {
  30.             Overrule.AddOverrule(RXObject.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline)), TelegraphPoleOverrule.TheOverrule, false);
  31.             Overrule.AddOverrule(RXObject.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline)), TelegraphPoleTransformOverrule.TheOverrule, false);
  32.         }
  33.         public static void OverruleEnd()
  34.         {
  35.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline)), TelegraphPoleOverrule.TheOverrule);
  36.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline)), TelegraphPoleTransformOverrule.TheOverrule);
  37.         }
  38.         //测试代码,使用不方便,可以自行替换。Esc生成对象
  39.         [CommandMethod("POLE")]
  40.         public static void AddPole()
  41.         {
  42.             Document doc = Application.DocumentManager.MdiActiveDocument;
  43.             Editor ed = doc.Editor;
  44.             PromptPointResult res = ed.GetPoint("\n请输入起点:");
  45.             Point3dCollection point3dColl = new Point3dCollection();
  46.             while (res.Status == PromptStatus.OK)
  47.             {
  48.                 point3dColl.Add(res.Value);
  49.                 PromptPointOptions opts = new PromptPointOptions("\n请输入下一点:");
  50.                 opts.BasePoint = res.Value;
  51.                 opts.UseBasePoint = true;
  52.                 res = ed.GetPoint(opts);
  53.             }
  54.             if (point3dColl.Count < 2)
  55.             {
  56.                 ed.WriteMessage("\n错误线段点位小于2个,不能画线.");
  57.                 return;
  58.             }
  59.             Database db = doc.Database;
  60.             using (Transaction trans = AcadPropers.Tm.StartTransaction())
  61.             {
  62.                 RegAppTable rat = (RegAppTable)trans.GetObject(AcadPropers.Database.RegAppTableId, OpenMode.ForRead, false);
  63.                 if (!rat.Has(PoleRegAppName))
  64.                 {
  65.                     rat.UpgradeOpen();
  66.                     RegAppTableRecord regapp = new RegAppTableRecord();
  67.                     regapp.Name = PoleRegAppName;
  68.                     rat.Add(regapp);
  69.                     trans.AddNewlyCreatedDBObject(regapp, true);
  70.                 }
  71.                 Autodesk.AutoCAD.DatabaseServices.Polyline polyline = new Autodesk.AutoCAD.DatabaseServices.Polyline();
  72.                 for (int i = 0; i < point3dColl.Count - 1; i++)
  73.                 {
  74.                     Point2d point2d = new Point2d(point3dColl[i].X, point3dColl[i].Y);
  75.                     polyline.AddVertexAt(i, point2d, 0, 0, 0);
  76.                 }
  77.                 //设置代码及图块名称
  78.                 SetTo(polyline, WolfHelper.PoleRegAppName, "171101", "gc013a");
  79.                 BlockTableRecord btr =
  80.                             (BlockTableRecord)trans.GetObject(
  81.                                 db.CurrentSpaceId,
  82.                                 OpenMode.ForWrite,
  83.                                 false);
  84.                 btr.AppendEntity(polyline);
  85.                 trans.AddNewlyCreatedDBObject(polyline, true);
  86.                 trans.Commit();
  87.             }
  88.         }
  89.         //设置对象XData属性
  90.         public static void SetTo(Entity entity, string RegAppName, string code, string blockName)
  91.         {
  92.             ResultBuffer rb = new ResultBuffer();
  93.             rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, RegAppName));
  94.             if (code != "" || blockName != "")
  95.             {
  96.                 rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, code));
  97.                 rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, blockName));
  98.             }
  99.             entity.XData = rb;
  100.         }
  101.     }
  102.     static class PoleGeometryHelper
  103.     {
  104.         //获取重定义规则对象
  105.         public static DBObjectCollection GetPoleGeometrys(Autodesk.AutoCAD.DatabaseServices.Polyline polyline)
  106.         {
  107.             DBObjectCollection dbObjColl = new DBObjectCollection();
  108.             try
  109.             {
  110.                 string layer = polyline.Layer;
  111.                 Point3dCollection point3dColl = polyline.GetPolylinePoint3ds();
  112.                 ResultBuffer rb = polyline.XData;
  113.                 //获取电力线方向箭头块
  114.                 string blockName = rb.AsArray()[2].Value as string;
  115.                 for (int i = 0; i < point3dColl.Count; i++)
  116.                 {
  117.                     Point3d startPoint3d = point3dColl[i];
  118.                     BlockReference block = GetBlock("gc170", startPoint3d, layer, 0, new Scale3d(1, 1, 1));
  119.                     dbObjColl.Add(block);
  120.                     if (i + 1 < point3dColl.Count)
  121.                     {
  122.                         Point3d endPoint3d = point3dColl[i + 1];
  123.                         Vector3d vector = (startPoint3d - endPoint3d).GetNormal();
  124.                         double douAngle = vector.AngleOnPlane(polyline.GetPlane());
  125.                         block = GetBlock(blockName, startPoint3d, layer, (douAngle - Math.PI), new Scale3d(1, 1, 1));
  126.                         dbObjColl.Add(block);
  127.                         block = GetBlock(blockName, endPoint3d, layer, douAngle, new Scale3d(1, 1, 1));
  128.                         dbObjColl.Add(block);
  129.                     }
  130.                 }
  131.                 return dbObjColl;
  132.             }
  133.             catch
  134.             {
  135.                 return dbObjColl;
  136.             }
  137.         }
  138.         //获取图块
  139.        private static BlockReference GetBlock(string blcokName, Point3d insertPt, string layer, double angle, Scale3d scale3d)
  140.         {
  141.             Database db = AcadPropers.Database;
  142.             BlockReference blockRef = null;
  143.             using (Transaction trans = AcadPropers.Tm.StartTransaction())
  144.             {
  145.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  146.                 if (bt.Has(blcokName))
  147.                 {
  148.                     ObjectId blkId = bt[blcokName];
  149.                     blockRef = new BlockReference(insertPt, blkId);
  150.                     blockRef.ScaleFactors = new Scale3d(1, 1, 1);
  151.                     blockRef.Rotation = angle;
  152.                     blockRef.ScaleFactors = scale3d;
  153.                     blockRef.Layer = layer;
  154.                 }
  155.                 trans.Commit();
  156.             }
  157.             return blockRef;
  158.         }
  159.     }
  160.     //显示重定义
  161.     class TelegraphPoleOverrule : DrawableOverrule
  162.     {
  163.         public static TelegraphPoleOverrule TheOverrule = new TelegraphPoleOverrule();
  164.         //设置重定义的过滤条件
  165.         public TelegraphPoleOverrule()
  166.         {
  167.             SetXDataFilter(WolfHelper.PoleRegAppName);
  168.         }
  169.         //显示重载
  170.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  171.         {
  172.             Autodesk.AutoCAD.DatabaseServices.Polyline polyline = (Autodesk.AutoCAD.DatabaseServices.Polyline)drawable;
  173.             DBObjectCollection dbObjColl = PoleGeometryHelper.GetPoleGeometrys(polyline);
  174.             foreach (DBObject dbObject in dbObjColl)
  175.             {
  176.                 wd.Geometry.Draw(dbObject);
  177.             }
  178.             //是否显示基线
  179.             if (WolfHelper.DrawPoleBaseLine)
  180.                 base.WorldDraw(drawable, wd);
  181.             return true;
  182.         }
  183.     }
  184.     class TelegraphPoleTransformOverrule : TransformOverrule
  185.     {
  186.         public static TelegraphPoleTransformOverrule TheOverrule = new TelegraphPoleTransformOverrule();
  187.         public TelegraphPoleTransformOverrule()
  188.         {
  189.             SetXDataFilter(WolfHelper.PoleRegAppName);
  190.         }
  191.         //重载Explode方法
  192.         public override void Explode(Entity entity, DBObjectCollection entitySet)
  193.         {
  194.             Autodesk.AutoCAD.DatabaseServices.Polyline polyline = (Autodesk.AutoCAD.DatabaseServices.Polyline)entity;
  195.             DBObjectCollection dbObjColl = PoleGeometryHelper.GetPoleGeometrys(polyline);
  196.             foreach (DBObject dbObj in dbObjColl)
  197.             {
  198.                 //此处必须使用add方法
  199.                 //entitySet = dbObjColl;无法生存对象
  200.                 entitySet.Add(dbObj);
  201.             }
  202.         }
  203.     }
  204. }

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +1 明经币 +2 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 2 + 20 + 5 + 5 【精华】好程序

查看全部评分

发表于 2009-9-27 13:17:00 | 显示全部楼层

小狼的专集终于开张啦,恭喜恭喜!!!

不过要是能加点说明或GIF图就更好.

小狼加油...

发表于 2009-9-27 14:23:00 | 显示全部楼层
很帅 是诱惑我学习的动力!
 楼主| 发表于 2009-9-27 15:00:00 | 显示全部楼层

总于有个加精的帖子了

好激动啊

发表于 2009-9-27 17:25:00 | 显示全部楼层
serious support

发表于 2009-9-28 23:57:00 | 显示全部楼层
这个比较有意思,好好学习一下。
发表于 2009-9-28 23:59:00 | 显示全部楼层

能否在端点外也画个箭头啊?

如果一个电杆上有两条以上电线怎么办啊?

 楼主| 发表于 2009-9-29 08:56:00 | 显示全部楼层

没有做完善的

暂时没有时间弄了

可以做两个属性

表示起点和终点是否电杆和电力线方向符号

发表于 2009-9-29 16:35:00 | 显示全部楼层

有点意思

发表于 2009-10-18 10:58:00 | 显示全部楼层
CASS里面是用骨架线实现的,我觉得还算方便,修改骨架线后,使用里面的"重新生成功能",像围墙,活树篱笆之类的还是比较方便的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 20:22 , Processed in 0.203313 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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