AutoCAD二次开发&规则重定义

        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文件,输入执行命令,可以测试一下效果。


                                                                       更多内容,微信扫二维码关注公众号

                                                                               

       


                                     

猜你喜欢

转载自blog.csdn.net/u010608964/article/details/81607878
今日推荐