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

ADN Club => Revit API => Тема начата: Александр Пекшев aka Modis от 14-08-2019, 17:52:23

Название: GetGeneratingElementIds - ошибка "It is invalid to use in looking up the necess"
Отправлено: Александр Пекшев aka Modis от 14-08-2019, 17:52:23
Всем привет. У элементов существует метод GetGeneratingElementIds (https://www.revitapidocs.com/2020/112590d2-de20-dd1f-ae05-df7dfb3b410f.htm), который позволяет получить идентификаторы элементов, которые являются генераторами для проверяемого геометрического объекта.
Имеется вот такой код:
Код - C# [Выбрать]
  1. private void CheckInserts(Element element, Options options, ICollection<Element> checkedElements)
  2. {
  3.     try
  4.     {
  5.         if (element is HostObject hostObject)
  6.         {
  7.             var inserts = hostObject.FindInserts(true, true, true, true).ToList();
  8.             inserts.ForEach(insertId =>
  9.             {
  10.                 var insertElement = element.Document.GetElement(insertId);
  11.                 var stop = false;
  12.                 var geometryElement = hostObject.get_Geometry(options);
  13.                 if (geometryElement != null)
  14.                 {
  15.                     foreach (GeometryObject geometryObject in geometryElement)
  16.                     {
  17.                         if (stop)
  18.                             break;
  19.                         if (geometryObject is Solid solid)
  20.                         {
  21.                             foreach (Face face in solid.Faces)
  22.                             {
  23.                                 try
  24.                                 {
  25.                                     if (hostObject.GetGeneratingElementIds(face).Any(x => x == insertId))
  26.                                     {
  27.                                         if (checkedElements.All(x => x.Id != insertId))
  28.                                         {
  29.                                             checkedElements.Add(insertElement);
  30.                                             stop = true;
  31.                                             break;
  32.                                         }
  33.                                     }
  34.                                 }
  35.                                 catch (Exception exception)
  36.                                 {
  37.                                     // может возникать неясная ошибка в методе GetGeneratingElementIds (в справке не описана)
  38.                                     Debug.Print(exception.Message + Environment.NewLine + exception.StackTrace);
  39.                                 }
  40.                             }
  41.                         }
  42.                     }
  43.                 }
  44.             });
  45.         }
  46.     }
  47.     catch (Exception exception)
  48.     {
  49.         _loginAction($"При поиске вхождений элемента {element.Id.IntegerValue} произошла ошибка: {exception.Message}");
  50.     }
  51. }

И вот метод GetGeneratingElementIds может кидать такую ошибку
Цитировать
It is invalid to use in looking up the necessary information.
Если проверяемых элементов не много, то особо не страшно - ошибка "проглатывается", да и ладно. Но когда таких элементов десятки тысяч, то постоянное срабатывание try{} catch{} становится очень затратным.

Есть ли какой-либо способ проверить геометрический (GeometryObject) заранее, чтобы не отправлять его в метод GetGeneratingElementIds? При отладке по свойствам не заметил разницы у граней (face), которые выдавали ошибку и граней, которые не выдавали ошибку
Название: Re: GetGeneratingElementIds - ошибка "It is invalid to use in looking up the necess"
Отправлено: Александр Игнатович от 14-08-2019, 18:18:30
Пример модельки и где смотреть приложить сможете?
Название: Re: GetGeneratingElementIds - ошибка "It is invalid to use in looking up the necess"
Отправлено: Александр Пекшев aka Modis от 15-08-2019, 10:34:11
Пример модельки и где смотреть приложить сможете?
Хотел сделать файл для тестов, взяв элементы из рабочего проекта и выяснил, что ошибка возникает не во всех файлах. Буду в течении дня проверять на всех проектах, которые придется проверять и тогда сделаю файлик
Название: Re: GetGeneratingElementIds - ошибка "It is invalid to use in looking up the necess"
Отправлено: Александр Пекшев aka Modis от 20-08-2019, 11:07:10
Как оказалось, причина возникновения этой ошибки кроется в Options (https://www.revitapidocs.com/2020/aa41fc13-9f81-836c-4271-82568ba5d7e8.htm), а конкретно в свойстве IncludeNonVisibleObjects (https://www.revitapidocs.com/2020/0d277b80-d5e5-1151-d413-b0899da0976f.htm) - если его установить в значение true, то эти самые невидимые геометрические объекты тоже будут пытаться обрабатываться и выдавать такую ошибку
Название: Re: GetGeneratingElementIds - ошибка "It is invalid to use in looking up the necess"
Отправлено: Александр Игнатович от 20-08-2019, 11:10:56
Хм. Окей, будем иметь ввиду, спасибо.