AutoCAD从2010版开始出现了规则重定义,我们知道在AutoCAD中有自定义实体,和自定义实体相比,规则重定义没有增加新的实体类型,它允许改变AutoCAD标准实体的颜色、形状、颜色等信息。使视图中显示出来。规则重定义有多重类型,下面列举出个规则重定义类别,并加以说明。
重定义规则类型 | 重定义规则说明 |
|
|
ObjectOverrule | 数据库对象重定义,可以重定义数据库对象的基本行为。 |
DrawableOverrule | 可视化对象规则重定义,可重定义可视化对象的显示形式,重定义只是将图形的显示规则做了改变,图形的基本属性,类型不会变化。实现方法:从DrawableOverrule派生一个类,重写WorldDraw函数改变图形在绘图区域中的显示规则。
|
GripOverrule | 夹点重定义,可以自定义夹的行为。 |
OsnapOverrule | 重定义对象捕捉的行为。 |
GeometryOverrule | 重定义几何性质。 |
HighlightOverrule | 重定义高亮显示方式。 |
PropertiesOverrule | 重定义属性。 |
TransformOverrule | 重定义变形行为。 |
规则重定义有很多用处,在测绘中,可以重新定义大规模TIN的显示方式、复合线状物的显示。下面是一个可视化对象规则重定义的例子,具体代码如下。其中重定义了DrawableOverrule,重写了WorldDraw方法。该方法中第一个参数表示重定义的实体对象,第二参数是绘制实体的画布。两个参数都属于GraphicInterface命名空间。
class PlaneOverrule : DrawableOverrule
{
public DBObjectCollection copyCollection = new DBObjectCollection();
/*重写该方法*/
public override bool WorldDraw(Drawable drawable, WorldDraw wd)
{
Matrix3d matrix = Matrix3d.Rotation(Math.PI / 2, Vector3d.YAxis, Point3d.Origin);
Entity ent1 = drawable as Entity;
if (ent1.ObjectId != ObjectId.Null)
{
Entity copyEnt = ent1.GetTransformedCopy(matrix);
copyEnt.WorldDraw(wd);
copyCollection.Add(copyEnt);
}
return base.WorldDraw(drawable, wd);
}
}
使用前面重定义DrawableOverrule的PlaneOverrule。
如下:
class CmdTestDemo
{
private static PlaneOverrule overrule;
[CommandMethod("otdp")]
public static void TestOverrideToDifferentPlane(){
if (overrule == null)
{
overrule = new PlaneOverrule();
Overrule.AddOverrule(RXObject.GetClass(typeof(Entity)), overrule, false);
}
else {
foreach (DBObject obj in overrule.copyCollection)
{
obj.Dispose();
}
Overrule.RemoveOverrule(RXObject.GetClass(typeof(Entity)), overrule);
overrule.Dispose();
overrule = null;
}
Overrule.Overruling = !Overrule.Overruling;
Application.DocumentManager.MdiActiveDocument.Editor.Regen();
}
}
最后在AutoCAD中使用netload加载编译好的dll文件,输入执行命令,可以测试一下效果。
更多内容,微信扫二维码关注公众号