乐筑天下

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

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

[复制链接]

18

主题

174

帖子

11

银币

后起之秀

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

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

使用道具 举报

18

主题

174

帖子

11

银币

后起之秀

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

铜币
244
发表于 2009-12-31 00:06:00 | 显示全部楼层
将上次的函数做了优化,最大可能的减少强制类型转换
接下来准备着手输出函数,给Lisp调用
偶是Lisp转过来的
回复

使用道具 举报

13

主题

119

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2010-1-18 20:26:00 | 显示全部楼层
飞诗你人真强,.NET学得这么好了。
回复

使用道具 举报

7

主题

55

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2010-1-20 18:05:00 | 显示全部楼层
飞诗。支持。我还不是很懂。收下了。
回复

使用道具 举报

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2010-9-13 09:32:00 | 显示全部楼层
平台:vs.net2008(C#), Autodesk Map3d 2010.
求用C#实现命令“创建要素”的方法。
谢谢
回复

使用道具 举报

10

主题

134

帖子

8

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2011-5-19 11:06:00 | 显示全部楼层
还是c语言强大,顶
回复

使用道具 举报

9

主题

30

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2011-6-8 09:22:00 | 显示全部楼层
飞诗也学C#了呀,我也从LSP跑到C#了呵呵
回复

使用道具 举报

1

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
13
发表于 2011-6-20 09:44:00 | 显示全部楼层
错误        1        无效的表达式项“>”
回复

使用道具 举报

14

主题

64

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
120
发表于 2011-6-20 12:06:00 | 显示全部楼层
共同学习中,一起进步中,我向你们学习,学习你们的谨慎
回复

使用道具 举报

3

主题

18

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2012-8-31 21:19:00 | 显示全部楼层
收藏了,等C#有基础了再看!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-29 14:47 , Processed in 0.523222 second(s), 73 queries .

© 2020-2025 乐筑天下

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