明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2008|回复: 4

如何使用DrawJig绘制折线和多边形?

[复制链接]
发表于 2011-2-10 16:02:26 | 显示全部楼层 |阅读模式
如何使用DrawJig绘制折线和多边形,给出代码,让参考下
发表于 2011-2-10 18:20:03 | 显示全部楼层
请去参考ObjectARX SDK 里面的 \samples\dotNet\EllipseJig 工程
发表于 2011-2-11 09:56:53 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2011-2-11 10:50 编辑

  1. using aApp = Autodesk.AutoCAD.ApplicationServices.Application;
  2. using aPolyline = Autodesk.AutoCAD.DatabaseServices.Polyline;
  3. public class sPolylineJig : EntityJig
  4.   {
  5. /// <summary>
  6.     /// 模拟AutoCAD画多义线命令Polyline
  7. /// </summary>
  8.     static public void DrawPolylineJig()
  9.     {
  10.       try
  11.       {
  12.         Editor ced = aApp.DocumentManager.MdiActiveDocument.Editor;
  13.         Database cdb = aApp.DocumentManager.MdiActiveDocument.Database;
  14.         Autodesk.AutoCAD.DatabaseServices.TransactionManager ctm = aApp.DocumentManager.MdiActiveDocument.Database.TransactionManager;
  15.         PromptPointOptions opts = new PromptPointOptions("\nStart Point :");
  16.         PromptPointResult res = ced.GetPoint(opts);
  17.         if (res.Status != PromptStatus.OK) return;
  18.         Point3dCollection p3ds = new Point3dCollection();
  19.         p3ds.Add(res.Value);
  20.         sPolylineJig jig = new sPolylineJig(p3ds);
  21.         sPolylineJig jig_bake = jig;
  22.         int pcount = p3ds.Count;
  23.         ced.Drag(jig);
  24.         while (jig.Status == 1)
  25.         {
  26.           jig_bake = jig;
  27.           p3ds = new Point3dCollection();
  28.           for (int i = 0; i <= pcount; i++)
  29.           {
  30.             p3ds.Add(((aPolyline)jig.Entity).GetPoint3dAt(i));
  31.           }
  32.           jig = new sPolylineJig(p3ds);
  33.           pcount += 1;
  34.           ced.Drag(jig);
  35.         }
  36.         if (jig.Status == 0)
  37.           return;
  38.         if (jig.Status == 2)
  39.           ((aPolyline)jig_bake.Entity).Closed = true;
  40.         using (Transaction ctrans = ctm.StartTransaction())
  41.         {
  42.           BlockTable cbt = (BlockTable)ctm.GetObject(cdb.BlockTableId, OpenMode.ForRead, false);
  43.           BlockTableRecord cbtr = (BlockTableRecord)ctm.GetObject(cbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
  44.           cbtr.AppendEntity(jig_bake.GetEntity());
  45.           ctm.AddNewlyCreatedDBObject(jig_bake.GetEntity(), true);
  46.           ctrans.Commit();
  47.         }
  48.         jig_bake.Entity.Dispose();
  49.         jig.Entity.Dispose();
  50.         p3ds.Dispose();
  51.       }
  52.       catch (System.Exception ex)
  53.       {
  54.         Debug.WriteLine("\n" + ex.Message);
  55.       }
  56.     }
  57.     static public aPolyline GetPolylineJig()
  58.     {
  59.       return sPolylineJig.GetPolylineJig(Point3d.Origin, 0);
  60.     }
  61.     static public aPolyline GetPolylineJig(Point3d basePoint, int index)
  62.     {
  63.       try
  64.       {
  65.         Editor ced = aApp.DocumentManager.MdiActiveDocument.Editor;
  66.         Point3dCollection p3ds = new Point3dCollection();
  67.         switch (index)
  68.         {
  69.           case 0:
  70.             PromptPointOptions opts = new PromptPointOptions("\nStart Point :");
  71.             PromptPointResult res = ced.GetPoint(opts);
  72.             p3ds.Add(res.Value);
  73.             break;
  74.           default:
  75.             p3ds.Add(basePoint);
  76.             break;
  77.         }
  78.         bool continuous = true;
  79.         sPolylineJig jig = new sPolylineJig(p3ds);
  80.         sPolylineJig jig_bake = jig;
  81.         int pcount = p3ds.Count;
  82.         while (continuous)
  83.         {
  84.           ced.Drag(jig);
  85.           if (jig.Status == 1)
  86.           {
  87.             jig_bake = jig;
  88.             p3ds = new Point3dCollection();
  89.             for (int i = 0; i <= pcount; i++)
  90.             {
  91.               p3ds.Add(((aPolyline)jig.Entity).GetPoint3dAt(i));
  92.             }
  93.             jig = new sPolylineJig(p3ds);
  94.             pcount += 1;
  95.           }
  96.           else
  97.             continuous = false;
  98.         }
  99.         if (jig.Status == 0)
  100.           return null;
  101.         if (jig.Status == 2)
  102.           ((aPolyline)jig_bake.Entity).Closed = true;
  103.         jig.Entity.Dispose();
  104.         p3ds.Dispose();
  105.         return (aPolyline)jig_bake.Entity;
  106.       }
  107.       catch (System.Exception ex)
  108.       {
  109.         Debug.WriteLine("\n" + ex.Message);
  110.         return null;
  111.       }
  112.     }
  113.     Point3d _EndPoint, _StartPoint;
  114.     int _Status = 1;
  115.     public sPolylineJig(Point3dCollection p3ds)
  116.       : base(new aPolyline())
  117.     {
  118.       ////注意: 在此不能用aPolyline作为基类,原因是aPolyline无法初始化,
  119.       ////而对aPolyline的操作基本上都是要求实体已经实例化,在DataBase已经有记录
  120.       ////但aPolyline的结果在外面表示就是LWPolyline
  121.       try
  122.       {
  123.         for (int i = 0; i < p3ds.Count; i++)
  124.         {
  125.           ((aPolyline)Entity).AddVertexAt(i, new Point2d(p3ds.X, p3ds.Y), 0, 0, 0);
  126.         }
  127.         ((aPolyline)Entity).AddVertexAt(p3ds.Count, new Point2d(p3ds[p3ds.Count - 1].X, p3ds[p3ds.Count - 1].Y), 0, 0, 0);
  128.         pcount = p3ds.Count;
  129.         _EndPoint = p3ds[p3ds.Count - 1];
  130.         _StartPoint = _EndPoint;
  131.       }
  132.       catch (System.Exception ex)
  133.       {
  134.         Debug.WriteLine("\n" + ex.Message);
  135.       }
  136.     }
  137.     private int pcount = 0;
  138.     protected override bool Update()
  139.     {
  140.       try
  141.       {
  142.         ((aPolyline)Entity).SetPointAt(pcount, new Point2d(_EndPoint.X, _EndPoint.Y));
  143.       }
  144.       catch (System.Exception ex)
  145.       {
  146.         Debug.WriteLine("\n" + ex.Message);
  147.         return false;
  148.       }
  149.       return true;
  150.     }
  151.     protected override SamplerStatus Sampler(JigPrompts prompts)
  152.     {
  153.       try
  154.       {
  155.         JigPromptPointOptions jigopts = new JigPromptPointOptions();
  156.         jigopts.UserInputControls = UserInputControls.NullResponseAccepted;
  157.         jigopts.BasePoint = _StartPoint;
  158.         jigopts.UseBasePoint = true;
  159.         jigopts.Keywords.Add("Close");
  160.         jigopts.Message = "\nNext Point [Close]:";
  161.         PromptPointResult dres = prompts.AcquirePoint(jigopts);
  162.         if (dres.Value != _EndPoint)
  163.         {
  164.           _EndPoint = dres.Value;
  165.         }
  166.         else
  167.         {
  168.           return SamplerStatus.NoChange;
  169.         }
  170.         if (dres.StringResult == "Close")
  171.         {
  172.           _Status = 2;
  173.           return SamplerStatus.Cancel;
  174.         }
  175.         if (dres.Status == PromptStatus.Cancel || dres.Status == PromptStatus.Error)
  176.         {
  177.           _Status = 0;
  178.           return SamplerStatus.Cancel;
  179.         }
  180.         else if (dres.Status == PromptStatus.None)
  181.         {
  182.           _Status = 3;
  183.           return SamplerStatus.Cancel;
  184.         }
  185.         else
  186.         {
  187.           return SamplerStatus.OK;
  188.         }
  189.       }
  190.       catch (System.Exception ex)
  191.       {
  192.         Debug.WriteLine("\n" + ex.Message);
  193.         return SamplerStatus.OK;
  194.       }
  195.     }
  196.     public int Status { get { return _Status; } }
  197.     public Entity GetEntity()
  198.     {
  199.       return Entity;
  200.     }
  201.   }

评分

参与人数 1威望 +1 明经币 +1 收起 理由
雪山飞狐_lzh + 1 + 1

查看全部评分

发表于 2011-2-11 09:57:31 | 显示全部楼层
    /// <summary>
    /// 模拟AutoCAD画多义线命令Polyline
    /// </summary>
    [CommandMethod("sPolyline")]
    static public void DrawPolylineJig()
    {
      sPolylineJig.DrawPolylineJig();
    }
发表于 2011-2-11 09:58:43 | 显示全部楼层
本帖最后由 sieben 于 2011-2-11 09:59 编辑

再说句多余的,我不认同你问问题的方式和学习的方法!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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