维坦

感谢您的关注!


  • Aug
    15

    扩展方法的使用

    Filed under: 编程; Tagged as: ,

    在AutoCAD开发中, 如果想要在命令行输出结果之前插入时间, 你会怎么做?

    当然最直接的就是拼接字符串了, 又或者定义静态方法来调用

    之前有次在群里, 好多人对我的一段F#代码惊讶不已.
    下面就是把好多人雷到的Super Code:

     
    type Editor with
        member t.WriteWithTime x =
            "[" + DateTime.Now.TimeOfDay.ToString() + "] " + x + "\n"
            |> t.WriteMessage
     
    let ed = Application.DocumentManager.MdiActiveDocument.Editor
    ed.WriteWithTime("带时间的输出风格.")
     

    看到了吗? 我给Editor"增加"了一个WriteWithTime方法!
    这叫什么? 狗尾续貂? 貂尾续狗? 汗...
    它的学名叫: 扩展方法

    如果可以这样写程序会怎么样?
    "用户密码".MD5()
    DateTime.GetMyBirthday()

    之所以我给[增加]二字括上了引号, 是因为Editor其实没变, 障眼法而已, 人称语法糖, 目的是让你写代码更舒服, 可事实上和定义静态方法也没什么区别, 深入的我也说不清楚, 看看C#3.0该怎么实现这个吧:
    注意: 这是C#3.0的新特性, 因此也只能用于VS2008. 更详细的信息请参考:
    http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

     
    using System;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Runtime;
     
    namespace EditorExt
    {
        public class Class1
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
     
            [CommandMethod("Test1")]
            public void Test1()
            {
                ed.WriteMessage("WriteMessage - 普通输出.");
            }
     
            [CommandMethod("Test2")]
            public void Test2()
            {
                ed.WriteWithTime("WriteWithTime - 带时间输出.");
            }
        }
     
        static class MyExtensionMethods
        {
            // 第一个参数代表要扩展的类 前面加this修饰 调用时只显示一个message参数
            public static void WriteWithTime(this Editor editor, string message)
            {
                editor.WriteMessage("[" + System.DateTime.Now.TimeOfDay.ToString() + "] " + message + "\n");
            }
        }
    }
     

    运行结果:

    命令: netload
    命令: test1
    WriteMessage - 普通输出.
    命令: test2
    [15:52:00.2029960] WriteWithTime- 带时间输出.

    命令: Okey如我所愿
    未知命令"OKEY如我所愿"。按 F1 查看帮助。

    命令: 囧...
    未知命令"囧..."。按 F1 查看帮助。

    2 Comments
  • Nov
    20

    AutoCAD反应器的灵异现象

    Filed under: 随笔; Tagged as:

    几天以来研究反应器碰到的灵异现象


    (princ)
    函数哪里去啦? 是谁害死了这位幕后英雄?


    又是谁绑架了(load), 这不是堵住了CAD的嘴了么?


    "按Y重置:", 注意: 是Y, 不是O, 也不是Enter. 不乖乖的输入Y就别想跳出循环, ESC都不行!

    No Comments
  • Nov
    10

    AutoCAD 2009 beta1 开始测试

    Filed under: 编程; Tagged as: ,

    AutoCAD 2009 开发代号: Raptor (猛禽)

    09是个里程碑式的版本, 与以前的版本将发生较大的变化.

    目前beta1版已经开放测试, 如果感兴趣的可以到Autodesk的网站上去申请: http://myfeedback.autodesk.com/

    .NET新增功能:

    1. 新增加了acdbmgdbrep.dll这个托管文件, 它是对应于C++的brep功能, 有了它, 我们可以很方便地编程来求出三维实体的几何性质, 如立方体的面、边等等.
    2. Editor类新增RunCommand函数, 这个是对应于C++的acedCmd函数的. 我想在以前的版本中大家都是用Document类的SendStringToExecute函数来调用AutoCAD 的命令, 但此命令有很大的问题, 现在好了, 终于有了acedCmd的托管版本RunCommand.
    3. ShowModalDialog与ShowModlessDialog函数分别由3种形式增加到8种形式.
    4. acmgdinternal.dll中新增加EntFirst EntLast EntNext函数
    5. acmgdinternal.dll中新增加AddCommand与RemoveCommand函数, 通过这两个函数你可以动态注册或删除AutoCAD命令.

    录制宏:

    AutoCAD2009 ActionRecoder

    参考:  AutoCAD 2009 .NET中新增功能初探

    2 Comments
  • May
    14

    ACAD让人郁闷的BUG

    Filed under: 编程; Tagged as:

    AutoCAD command must less then 4 times
    谁能告诉我这是为什么啊?

    No Comments