System.NullReferenceException при ожидании выбора пользователя

Автор Тема: System.NullReferenceException при ожидании выбора пользователя  (Прочитано 3332 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн A.EgorovАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Привет  :)
Во время ожидания выбора пользователем элемента Revit бросает System.NullReferenceException, которые видны только при отладки приложения (не попадают в catch{}).
Помогите разобраться почему бросаются исключения (моя версия что из-за фильтра). Можно ли их избежать или обработать?

Класс фильтра
Код - C# [Выбрать]
  1. class PickFilter : ISelectionFilter
  2. {
  3.         readonly BuiltInCategory category;
  4.         public PickFilter(BuiltInCategory category)
  5.         {
  6.                 this.category = category;
  7.         }
  8.         public bool AllowElement(Element e)
  9.         {
  10.                 return (e.Category.Id.IntegerValue.Equals((int)category));
  11.         }
  12.         public bool AllowReference(Reference r, XYZ p)
  13.         {
  14.                 return false;
  15.         }
  16. }

Класс Command
Код - C# [Выбрать]
  1. [TransactionAttribute(TransactionMode.Manual)]
  2. [RegenerationAttribute(RegenerationOption.Manual)]
  3. public class Command : IExternalCommand
  4. {
  5.         UIApplication uiapp;
  6.  
  7.         public Result Execute(ExternalCommandData commandData,
  8.                 ref string messege,
  9.                 ElementSet elements)
  10.         {
  11.                 uiapp = commandData.Application;
  12.                 UIDocument uidoc = commandData.Application.ActiveUIDocument;
  13.                 try
  14.                 {
  15.                         Element e = GetElement(uidoc, BuiltInCategory.OST_Floors);
  16.                         return Result.Succeeded;
  17.                 }
  18.  
  19.                 catch (Autodesk.Revit.Exceptions.OperationCanceledException)
  20.                 {
  21.                         return Result.Cancelled;
  22.                 }
  23.                 catch (Exception ex)
  24.                 {
  25.                         messege = ex.Message;
  26.                         return Result.Failed;
  27.                 }
  28.         }
  29.         static Element GetElement(UIDocument uidoc, BuiltInCategory category)
  30.         {
  31.                 Selection sel = uidoc.Application.ActiveUIDocument.Selection;
  32.                 PickFilter filter = new PickFilter(category);
  33.                 Reference pickRef = sel.PickObject(ObjectType.Element, filter, "Select Element");
  34.                 Element e = uidoc.Document.GetElement(pickRef.ElementId);
  35.                 return e;
  36.         }
  37. }
« Последнее редактирование: 04-12-2020, 17:17:07 от A.Egorov »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Ряд элементов не имеют категории как таковой, так что null reference exception вполне может ждать тебя здесь: e.Category.Id.


Оффлайн A.EgorovАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
На Revit API Docs для интерфейса ISelectionFilter приведен такой пример:
Код - C# [Выбрать]
  1. public class MassSelectionFilter : ISelectionFilter
  2. {
  3.     public bool AllowElement(Element element)
  4.     {
  5.         if (element.Category.Name == "Mass")
  6.         {
  7.             return true;
  8.         }
  9.         return false;
  10.     }
  11.  
  12.     public bool AllowReference(Reference refer, XYZ point)
  13.     {
  14.         return false;
  15.     }
  16. }
Здесь тоже обращение к категории и System.NullReferenceException.
Получается от этого никак не избавиться?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Revit бросает System.NullReferenceException, которые видны только при отладки приложения (не попадают в catch{})
Ревит при работе бросает десятки эксепшенов. Если они не влияют на работу вашего плагина, то зачем вообще забивать ими себе голову?

Отмечено как Решение A.Egorov 04-12-2020, 17:42:46

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Получается от этого никак не избавиться?

Проверить что element.Category не null не судьба?