这一篇,我们翻开CAD的类库看看更多的常用类型,这一篇计划分为三节。首先主动出击杠一件事情,标题当中问渠那得清如许中的“那”并非错别字,是个通假字,通“哪”,之所以想了这样一个标题是我认为想了解二次开发中更多的操作,就要首先了解类库中更多的类型。在C#学习笔记中也提到过,C#语言中,类型在声明出来之后就决定了它拥有的成员以及所配套的运算。那么,我们闲话少叙,这是第一节:就这上次说到的GetPoint交互类往下挖挖其他的用户交互相关的类,再看看这几种类型都有什么常见的属性和方法可以利用,同时封装一些新的可能有用的方法。
鼠标指针选取点有关的两个类分别是PromptPointOptions,PromptPointResult,同时Editor类中对应的获取点的方法是GetPoint,为了方便,我们把前两个类依次叫做选项类和结果类,把GetPoint方法叫做获取方法,那么交互操作有关的其他的类关系可以概括为下表:
交互作用 | 选项类 | 结果类 | 获取方法 |
鼠标点击一个点 | PromptPointOptions | PromptPointResult | GetPoint |
输入一个整数 | PromptIntegerOptions | PromptIntegerResult | GetInteger |
输入一个实数 | PromptDoubleOptions | PromptDoubleResult | GetDouble |
那么这里先来看看PromptPointOptions:
可以看到他有一个基类,那么再来看它的基类PromptCornerOptions:
这些有些类成员看名字就大概知道含义:布尔属性UseBasePoint就是是否在选择点的过程中有一个鼠标悬停点到基点的提示,而BasePoint属性就是刚刚的基点,再比如:LimitsChecked界限检查,AllowNone是否允许空值等等。那么,与之对应的,PromptIntegerOptions与PromptDoubleOptions同样可以去观察他们的定义,它们都继承于PromptNumericalOptions类
这里,可以通过属性来控制是否允许输入负值或空值,是否设置默认值等等。
为了加强直观理解,还是采用实例来简单说明,来看这样一个过程:点两个点画一条直线,而后输入实数确定线宽,输入整数确定线的颜色(CAD的颜色在二次开发中用ColorIndex这个属性来控制,取值范围0-255,颜色值刚好是打印图纸的时候的选择的对应值)
ColorIndex的定义:
打印选择界面:
那么我们分别封装方法,获取线宽返回值为double类型,不需要参数,获取颜色返回值为int类型,不需要参数,这里注意取值范围的检测,其代码分别如下:
//获取线宽public static double GetWidth(){ //编辑栏 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; //定义一个输入线宽的实数交互类 PromptDoubleOptions optDouble = new PromptDoubleOptions("\n请输入线宽"); //不允许输入负值 optDouble.AllowNegative = false; //默认值为0 optDouble.DefaultValue = 0; PromptDoubleResult doubleResult = ed.GetDouble(optDouble); if (doubleResult.Status==PromptStatus.OK) { double width = doubleResult.Value; return width; } else { return 0; }}
//获取颜色public static int GetColor(){ //编辑栏 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; // PromptIntegerOptions optInt = new PromptIntegerOptions("\n请输入颜色的索引值(0-256)"); //默认值为0 optInt.DefaultValue = 0; PromptIntegerResult IntResult = ed.GetInteger(optInt); if (IntResult.Status==PromptStatus.OK) { int colorIndex = IntResult.Value; //一共有0-255种颜色 if (colorIndex>0 & colorIndex<256) { return colorIndex; } else return 0; } else return 0;}
封装好想要的方法后,在类库中注册命令,实现上述功能:
//注册命令[CommandMethod("InputNumber")]//命令所对应的方法public static void InputNumber(){ //数据库 Database db = HostApplicationServices.WorkingDatabase; //当前编辑栏 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Point3d p1 = new Point3d(); Point3d p2 = new Point3d(); //选择一个点 PromptPointOptions opt1 = new PromptPointOptions("请选择起点"); PromptPointResult resP1 = ed.GetPoint(opt1); if (resP1.Status==PromptStatus.OK) { p1 = resP1.Value; } else { return; } //选择直线的另一个点 PromptPointOptions opt2 = new PromptPointOptions("\n请选择终点"); PromptPointResult resP2 = ed.GetPoint(opt2); if (resP2.Status==PromptStatus.OK) { p2 = resP2.Value; } else { return; } //获取线宽 double width=MyMethods.GetWidth(); //获取颜色 int color=MyMethods.GetColor(); //声明直线 Line line = new Line(p1, p2); //赋值并添加到模型 line.Thickness = width; line.ColorIndex = color; db.AddToModelSpace(line);}
效果如视频所示,特性中的Thickness就是我们选择的线宽,两条直线的颜色分别输入了5和2,如上面打印界面调整颜色的截图所示,分别为蓝色和黄色。
好的,今天就演示到这里,这个过程呢也是我尽量将内容结合起来举的一个例子,以便了解和应用,问题的解决方法也不一定唯一,下一节看一下圆弧这个实体类以及输入关键字的交互类。有什么问题,指导或建议,欢迎关注并在公众号内留言,谢谢大家!