ADN Open CIS
Сообщество программистов Autodesk в СНГ

09/11/2013

Предотвращение удаления примитива

Один из путей для предотвращения удаления примитива – это использование объектного переопределение (overrule). При помощи этого переопределения можно переопределить функционал удаления (“Erase”) таким образом, что примитив нельзя будет удалить.

Ниже приведен пример, предотвращающий удаление только тех примитивов, у которых есть расширенные данные с именем приложения “ADS”. Чтобы добавить имя приложения к расширенным данным можно воспользоваться статьей «Использование .NET API для добавления и удаления расширенных данных»

Для использования этого кода сначала создайте несколько примитивов и добавьте им расширенные данные с именем приложения “ADS”. Запустите команду “eraseOverrule”, которая добавит к этим примитивам переопределение. Вызов “SetXDataFilter()” указывает, что переопределение будет относиться только к примитивам, у которых в расширенных данных есть имя приложения “ADS”.  Теперь попробуйте удалить примитив с этими расширенными данными. Функция обратного вызова “Erase” будет вызвана и вернёт значение “NotApplicable”. Это заставит AutoCAD не удалять этот примитив.

Код - C#: [Выделить]
  1. static EraseOverrule eraseRule = null;
  2.  
  3. public class EraseOverrule : ObjectOverrule
  4.  
  5. {
  6.  public override void Erase(DBObject dbObject, bool erasing)
  7.  {
  8.      throw new Autodesk.AutoCAD.Runtime.Exception(
  9.  
  10.             Autodesk.AutoCAD.Runtime.ErrorStatus.NotApplicable);
  11.  
  12.      //base.Erase(dbObject, erasing);
  13.  }
  14. }
  15.  
  16. [CommandMethod("eraseOverrule")]
  17. static public void eraseOverrule()
  18. {
  19.  if (eraseRule == null)
  20.  {
  21.      eraseRule = new EraseOverrule();
  22.      Overrule.AddOverrule(RXObject.GetClass(typeof(Entity)), eraseRule, true);
  23.      Overrule.Overruling = true;
  24.      eraseRule.SetXDataFilter("ADS");
  25.  }
  26.  else
  27.  {
  28.      Overrule.Overruling = false;
  29.      Overrule.RemoveOverrule(RXObject.GetClass(typeof(Entity)), eraseRule);
  30.      eraseRule.Dispose();
  31.      eraseRule = null;
  32.  }
  33. }

Источник: http://adndevblog.typepad.com/autocad/2012/05/prevent-deletionerasing-of-entity.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=314

Опубликовано 09.11.2013
Отредактировано 09.11.2013 в 17:32:43