明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8989|回复: 10

[JIG] [原创]封装简化Jig操作,函数式实现DrawJig

  [复制链接]
发表于 2009-12-29 23:18:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-12-31 0:03:40 编辑

测试代码:
[CommandMethod("cc")]
public void cc()
{
    Circle cir = new Circle(new Point3d(), Vector3d.ZAxis, 10.0);
    var v = Drag.StartDrag("\n开始Jig托动:",
        rst => { cir.Center = rst.Point; rst.Draw(cir); }
        );
    if (v.Status != PromptStatus.OK)
        return;
    v = Drag.StartDrag(
        new JigPromptDistanceOptions
            ("\n指定半径:"),
        rst =>
        {
            cir.Radius = rst.Dist == 0.0 ? 1e-6 : rst.Dist;
            rst.Draw(cir);
        }
        );
    if (v.Status == PromptStatus.OK)
        CAD.AppendEntity(cir);
}
封装成函数的jig~调用是不是很方便呢???
CAD.AppendEntity()函数请自写!(加入Entity到当前图面)删除这行也能单独测试Jig
下面函数式Jig模块代码:
  1. #define 测试中
  2. using System;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.GraphicsInterface;
  8. using Autodesk.AutoCAD.Runtime;
  9. using System.Windows.Forms;
  10. using System.Drawing;
  11. namespace FsxmAcad
  12. {
  13.     /// <summary>
  14.     /// 封装简化Jig操作,函数式实现DrawJig
  15.     /// </summary>
  16.     public class Drag : DrawJig
  17.     {
  18.         protected Drag() { }
  19.         #region =====封装Jig方法=====
  20.         protected override bool WorldDraw(WorldDraw draw)
  21.         {
  22.             _callBack(new Result(_rst, draw));
  23.             return true;
  24.         }
  25.         protected override SamplerStatus Sampler(JigPrompts prompts)
  26.         {
  27.             return _acquireMod(prompts);
  28.         }
  29.         #endregion
  30.         #region 定义各种Jig模式
  31.         static PromptResult _rst;
  32.         delegate SamplerStatus AcquireMod(JigPrompts prompts);
  33.         //AcquirePoint
  34.         static Point3d _point3d;
  35.         static JigPromptPointOptions _PointOptions;
  36.         static SamplerStatus GetPoint(JigPrompts prompts)
  37.         {
  38.             PromptPointResult rst = prompts.AcquirePoint(_PointOptions);
  39.             _rst = rst;
  40.             if (rst.Value != _point3d)
  41.             {
  42.                 _point3d = rst.Value;
  43.                 return SamplerStatus.OK;
  44.             }
  45.             else
  46.             {
  47.                 return SamplerStatus.NoChange;
  48.             }
  49.         }
  50.         //AcquireDistance
  51.         static Double _double;
  52.         static JigPromptDistanceOptions _DistanceOptions;
  53.         static SamplerStatus GetDistance(JigPrompts prompts)
  54.         {
  55.             var rst = prompts.AcquireDistance(_DistanceOptions);
  56.             _rst = rst;
  57.             if (rst.Value != _double)
  58.             {
  59.                 _double = rst.Value;
  60.                 return SamplerStatus.OK;
  61.             }
  62.             else
  63.             {
  64.                 return SamplerStatus.NoChange;
  65.             }
  66.         }
  67.         //AcquireAngle
  68.         static JigPromptAngleOptions _AngleOptions;
  69.         static SamplerStatus GetAngle(JigPrompts prompts)
  70.         {
  71.             var rst = prompts.AcquireAngle(_AngleOptions);
  72.             _rst = rst;
  73.             if (rst.Value != _double)
  74.             {
  75.                 _double = rst.Value;
  76.                 return SamplerStatus.OK;
  77.             }
  78.             else
  79.             {
  80.                 return SamplerStatus.NoChange;
  81.             }
  82.         }
  83.         //AcquireString
  84.         static Point _cur;
  85.         static JigPromptStringOptions _StringOptions;
  86.         static SamplerStatus GetString(JigPrompts prompts)
  87.         {
  88.             var rst = prompts.AcquireString(_StringOptions);
  89.             _rst = rst;
  90.             var cur = Form.MousePosition;
  91.             if (Form.MousePosition != _cur)
  92.             {
  93.                 _cur = cur;
  94.                 return SamplerStatus.OK;
  95.             }
  96.             else
  97.             {
  98.                 return SamplerStatus.NoChange;
  99.             }
  100.         }
  101.         #endregion
  102.         /// <summary>回调函数之参数</summary>
  103.         public class Result
  104.         {
  105.             PromptResult rst;
  106.             WorldDraw draw;
  107.             internal Result(PromptResult promptResult, WorldDraw worldDraw)
  108.             {
  109.                 rst = promptResult;
  110.                 draw = worldDraw;
  111.             }
  112.             /// <summary>原始返回值</summary>
  113.             public PromptResult PromptResult
  114.             {
  115.                 get { return rst; }
  116.             }
  117.             /// <summary>绘图对象</summary>
  118.             public Geometry Geometry
  119.             {
  120.                 get { return draw.Geometry; }
  121.             }
  122.             /// <summary>绘图方法</summary>
  123.             public void Draw(Drawable entity)
  124.             {
  125.                 if (draw != null)
  126.                     draw.Geometry.Draw(entity);
  127.             }
  128.             /// <summary>GetPoint模式下的当前点位置</summary>
  129.             public Point3d Point
  130.             {
  131.                 get { return _point3d; }
  132.             }
  133.             /// <summary>GetDist模式下的当前距离</summary>
  134.             public Double Dist
  135.             {
  136.                 get { return _double; }
  137.             }
  138.             /// <summary>GetAngle模式下的当前角度</summary>
  139.             public Double Angle
  140.             {
  141.                 get { return _double; }
  142.             }
  143.             /// <summary>返回值指示</summary>
  144.             public PromptStatus Status
  145.             {
  146.                 get { return rst.Status; }
  147.             }
  148.             /// <summary>返回的字串or关键字</summary>
  149.             public string String
  150.             {
  151.                 get { return rst.StringResult; }
  152.             }
  153.         }
  154.         static Action<Result> _callBack;
  155.         static AcquireMod _acquireMod;
  156.         /// <summary>简便快捷执行Jig托动</summary>
  157.         /// <param name="options">选项</param>
  158.         /// <param name="callFun">回调函数</param>
  159.         public static PromptResult StartDrag(JigPromptOptions options, Action<Result> callFun)
  160.         {
  161.             if (options is JigPromptPointOptions)
  162.             {
  163.                 _PointOptions = options as JigPromptPointOptions;
  164.                 _acquireMod = GetPoint;
  165.             }
  166.             else if (options is JigPromptDistanceOptions)
  167.             {
  168.                 _DistanceOptions = options as JigPromptDistanceOptions;
  169.                 _acquireMod = GetDistance;
  170.             }
  171.             else if (options is JigPromptAngleOptions)
  172.             {
  173.                 _AngleOptions = options as JigPromptAngleOptions;
  174.                 _acquireMod = GetAngle;
  175.             }
  176.             else if (options is JigPromptStringOptions)
  177.             {
  178.                 _StringOptions = options as JigPromptStringOptions;
  179.                 _acquireMod = GetString;
  180.             }
  181.             _callBack = callFun;
  182.             Autodesk.AutoCAD.ApplicationServices.Application.
  183.                 DocumentManager.MdiActiveDocument.Editor.Drag(new Drag());
  184.             _callBack(new Result(_rst, null));
  185.             return _rst;
  186.         }
  187.         /// <summary>简便快捷执行Jig托动[Point模式]</summary>
  188.         /// <param name="msg">提示信息</param>
  189.         /// <param name="kwd">关键字</param>
  190.         /// <param name="callFun">回调函数</param>
  191.         public static PromptResult StartDrag(string msg, string kwd, Action<Result> callFun)
  192.         {
  193.             return StartDrag(new JigPromptPointOptions(msg, kwd), callFun);
  194.         }
  195.         /// <summary>简便快捷执行Jig托动[Point模式]</summary>
  196.         /// <param name="msg">提示信息</param>
  197.         /// <param name="callFun">回调函数</param>
  198.         public static PromptResult StartDrag(string msg, Action<Result> callFun)
  199.         {
  200.             return StartDrag(new JigPromptPointOptions(msg), callFun);
  201.         }
  202.     }
  203. #if 测试中
  204.     public class test
  205.     {
  206.         [CommandMethod("tt")]
  207.         public void tt()
  208.         {
  209.             Circle cir = new Circle(new Point3d(), Vector3d.ZAxis, 10.0);
  210.             var v = Drag.StartDrag("\n指定圆中心点:",
  211.                 rst => { cir.Center = rst.Point; rst.Draw(cir); }
  212.                 );
  213.             if (v.Status != PromptStatus.OK)
  214.                 return;
  215.             v = Drag.StartDrag(
  216.                 new JigPromptDistanceOptions("\n指定圆半径:"),
  217.                 rst =>
  218.                 {
  219.                     cir.Radius = rst.Dist == 0.0 ? 1e-6 : rst.Dist;
  220.                     rst.Draw(cir);
  221.                 }
  222.                 );
  223.             if (v.Status == PromptStatus.OK)
  224.                 CAD.AppendEntity(cir);
  225.         }
  226.     }
  227. #endif
  228. }

评分

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

查看全部评分

 楼主| 发表于 2009-12-31 00:06:00 | 显示全部楼层

将上次的函数做了优化,最大可能的减少强制类型转换

接下来准备着手输出函数,给Lisp调用

偶是Lisp转过来的

发表于 2010-1-18 20:26:00 | 显示全部楼层
飞诗你人真强,.NET学得这么好了。
发表于 2010-1-20 18:05:00 | 显示全部楼层
飞诗。支持。我还不是很懂。收下了。
发表于 2010-9-13 09:32:00 | 显示全部楼层

[求助]C#实现命令“创建要素”的方法

平台:vs.net2008(C#), Autodesk Map3d 2010.

求用C#实现命令“创建要素”的方法。

谢谢

发表于 2011-5-19 11:06:11 | 显示全部楼层
还是c语言强大,顶
发表于 2011-6-8 09:22:44 | 显示全部楼层
飞诗也学C#了呀,我也从LSP跑到C#了呵呵
发表于 2011-6-20 09:44:24 | 显示全部楼层
错误        1        无效的表达式项“>”       
发表于 2011-6-20 12:06:54 | 显示全部楼层
共同学习中,一起进步中,我向你们学习,学习你们的谨慎
发表于 2012-8-31 21:19:39 | 显示全部楼层
收藏了,等C#有基础了再看!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 16:57 , Processed in 0.190583 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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