欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AutoCAD .Net禁止图元被删除的方法

程序员文章站 2022-06-23 21:52:29
本文为大家分享了autocad .net禁止图元被删除的具体代码,供大家参考,具体内容如下 禁止图元被用户删除可以通过 objectoverrule 实现。 以下代码:...

本文为大家分享了autocad .net禁止图元被删除的具体代码,供大家参考,具体内容如下

禁止图元被用户删除可以通过 objectoverrule 实现。

以下代码:

1、命令 adderaseoverrule 创建两个图元并禁止被删除。
2、命令 removeeraseoverrule 移除删除限制。

static eraseoverrule eraserule = null;

public class eraseoverrule : objectoverrule
{
 public override void erase(dbobject dbobject, bool erasing)
 {
  throw new autodesk.autocad.runtime.exception(
    autodesk.autocad.runtime.errorstatus.notapplicable);
  //base.erase(dbobject, erasing);
 }
}

[commandmethod("adderaseoverrule")]
public static void adderaseoverrule()
{
 if (eraserule == null)
 {
  eraserule = new eraseoverrule();
  overrule.addoverrule(rxobject.getclass(typeof(entity)),
        eraserule, true);
  overrule.overruling = true;

  eraserule.setidfilter(createentities());
 }
}

[commandmethod("removeeraseoverrule")]
public static void removeeraseoverrule()
{
 if (eraserule != null)
 {
  overrule.overruling = false;
  overrule.removeoverrule(rxobject.getclass(typeof(entity)),
        eraserule);
  eraserule.dispose();
  eraserule = null;
 }
}

private static objectid[] createentities()
{
 document doc = application.documentmanager.mdiactivedocument;
 database db = doc.database;

 objectid[] oids = new objectid[2];
 using (transaction tr = db.transactionmanager.starttransaction())
 {
  blocktablerecord space = tr.getobject(db.currentspaceid, openmode.forwrite) as blocktablerecord;

  //
  line line = new line();
  line.startpoint = new point3d(0, 0, 0);
  line.endpoint = new point3d(100, 100, 0);
  space.appendentity(line);
  tr.addnewlycreateddbobject(line, true);

  oids[0] = line.objectid;

  //
  circle circle = new circle();
  circle.center = new point3d(0, 0, 0);
  circle.radius = 50;
  space.appendentity(circle);
  tr.addnewlycreateddbobject(circle, true);

  oids[1] = circle.objectid;

  tr.commit();
 }

 return oids;
}

1、类 eraseoverrule 继承自 objectoverrule,并重写了 erase 方法。
在该方法中,通过抛异常而不是执行删除操作,禁止图元被删除。

2、setidfilter 确保该规则只对特定 objectid 的图元有效。
objectoverrule 还有方法 setxdatafilter,可以用来设置只对拥有特定 xdata 的对象有效。

参考文章: prevent deletion/erasing of entity

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。