Invalid number of references

Автор Тема: Invalid number of references  (Прочитано 909 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Invalid number of references
« : 28-04-2022, 14:57:31 »
Пожалуй, самое отвратительное, что могли сделать разработчики Revit API - это ошибка "Invalid number of references"! Потому что о причинах её возникновения можно только догадываться.
Лично у меня все идеи кончились. Может у кого-то тут появятся светлые мысли.
Имеем два размера на плане:



Используем такой вот код:
Код - C# [Выбрать]
  1. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2. {
  3.     try
  4.     {
  5.         var doc = commandData.Application.ActiveUIDocument.Document;
  6.         var dim1 = (Dimension)doc.GetElement(new ElementId(4233068));
  7.         var dim2 = (Dimension)doc.GetElement(new ElementId(4233075));
  8.  
  9.         var references = new ReferenceArray();
  10.  
  11.         foreach (Reference reference in dim1.References)
  12.         {
  13.             references.Append(reference);
  14.         }
  15.  
  16.         foreach (Reference reference in dim2.References)
  17.         {
  18.             references.Append(reference);
  19.         }
  20.  
  21.         using (var tr = new Transaction(doc, "Create dimension"))
  22.         {
  23.             tr.Start();
  24.  
  25.             doc.Create.NewDimension(commandData.Application.ActiveUIDocument.ActiveGraphicalView, (Line)dim1.Curve, references);
  26.  
  27.             tr.Commit();
  28.         }
  29.  
  30.         return Result.Succeeded;
  31.     }
  32.     catch (Exception exception)
  33.     {
  34.         TaskDialog.Show("Error", exception.Message);
  35.         return Result.Failed;
  36.     }
  37. }

Т.е. берем референсы из этих размеров и создаем с ними новый размер. Поправка - пытаемся создать, ибо во всех вариант ловим ошибку "Invalid number of references"

Файл (Ревит 2021)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13540
  • Карма: 1740
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Invalid number of references
« Ответ #1 : 28-04-2022, 15:47:56 »
Александр Пекшев aka Modis,
Я ничего не смыслю в Revit API, но подозреваю, что в references должно быть максимум два элемента - начало и конец.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #2 : 28-04-2022, 15:57:00 »
Александр Пекшев aka Modis,
Я ничего не смыслю в Revit API, но подозреваю, что в references должно быть максимум два элемента - начало и конец.
Верно. В данном случае их там 4, но это не влияет.
У меня давно сложилось впечатление, что ошибка "Invalid number of references" - это просто универсальный ответ. Лень было разъяснять причины ))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13540
  • Карма: 1740
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Invalid number of references
« Ответ #3 : 28-04-2022, 16:00:14 »
В данном случае их там 4, но это не влияет.
А если ты оставишь только два (например, уберешь второй цикл)?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #4 : 28-04-2022, 16:17:45 »
В данном случае их там 4, но это не влияет.
А если ты оставишь только два (например, уберешь второй цикл)?

Попробовал по очереди 4 варианта:
Код - C# [Выбрать]
  1. var dim1References = dim1.References.OfType<Reference>().ToList();
  2. var dim2References = dim2.References.OfType<Reference>().ToList();
  3.  
  4. // test 1
  5. references.Append(dim1References.First());
  6. references.Append(dim2References.Last());
  7.  
  8. // test 2
  9. references.Append(dim1References.Last());
  10. references.Append(dim2References.First());
  11.  
  12. // test 3
  13. foreach (var reference in dim1References)
  14. {
  15.     references.Append(reference);
  16. }
  17.  
  18. // test 4
  19. foreach (var reference in dim2References)
  20. {
  21.     references.Append(reference);
  22. }

При всех ошибка

Отмечено как Решение Александр Пекшев aka Modis 29-04-2022, 12:20:48

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

  • Administrator
  • *****
  • Сообщений: 1143
  • Карма: 333
  • Skype: alexandr.ignatovich.itc
Re: Invalid number of references
« Ответ #5 : 29-04-2022, 11:49:25 »
Да тут ошибка просто если строить по Reference-ам одного из размеров.

Причем, если построить размеры не по центральным линиям, то всё работает

Немножко поковырял Lookup-ом, из исходных dimension-ов Reference-ы выглядят как-то так:
Цитировать
1f0e710d-d965-4b08-9bae-a1f4791ede64-003b557f:0:LINEAR

В то время как у осевых линий Reference-ы выглядят вот так:
Цитировать
1f0e710d-d965-4b08-9bae-a1f4791ede64-003b557f:LINEAR

Таким образом получаем фикс, с ним уже всё работает...



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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #6 : 29-04-2022, 12:08:39 »
В то время как у осевых линий Reference-ы выглядят вот так
Да, но возникает вопрос - как теперь это учесть? Как я смогу определить, что референс на осевую линию, и что нужно его вот так вот скорректировать? (

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

  • Administrator
  • *****
  • Сообщений: 1143
  • Карма: 333
  • Skype: alexandr.ignatovich.itc
Re: Invalid number of references
« Ответ #7 : 29-04-2022, 12:19:14 »
Походу, получать элемент из Reference-а, если труба и строковое представление Reference-а содержит :0:, то это осевая линия и нужно править, но, возможно, потребуется проверять что-то дополнительно...

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #8 : 29-04-2022, 12:20:41 »
Походу, получать элемент из Reference-а, если труба и строковое представление Reference-а содержит :0:, то это осевая линия и нужно править, но, возможно, потребуется проверять что-то дополнительно...
Наверное начну с такого варианта, а дальше уже по фидбэкам. Спасибо

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #9 : 31-05-2022, 20:31:05 »
А вот и фидбеки прилетели ))
Итак, если размер построен по трубе, но не вдоль, а поперек, то StableRepresentation будет выглядеть примерно так:
beaa140b-2a6f-4bfe-9f38-f3ebdb6f40c9-000a7b6f:0:LINEAR/1то фикс не сработает. Если ничего не делать, то будет такая-же ошибка, как в топике. Как я понимаю, цифра после слэша - это индекс конца кривой.

Как тут быть - пока не ясно

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #10 : 01-06-2022, 09:23:11 »
Попробовал даже такой вариант:
Код - C# [Выбрать]
  1. var s = reference.ConvertToStableRepresentation(doc);
  2. if (s.Contains("LINEAR"))
  3. {
  4.     if (s.Contains("/") && int.TryParse(s.Split('/').Last(), out var endIndex))
  5.     {
  6.         foreach (var geometryObject in element.get_Geometry(new Options
  7.                  {
  8.                      ComputeReferences = true,
  9.                      View = doc.ActiveView
  10.                  }))
  11.         {
  12.             if (geometryObject is Curve curve)
  13.             {
  14.                 var endPointReference = curve.GetEndPointReference(endIndex);
  15.                 Debug.Print(endPointReference.ConvertToStableRepresentation(doc));
  16.                 return endPointReference;
  17.             }
  18.         }
  19.     }
  20.  
  21.     s = s.Replace(":0", string.Empty);
  22. }
  23.  
  24. return Reference.ParseFromStableRepresentation(doc, s);


Но почему-то продолжаю ловить ошибку The references are not geometric references.

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

  • Administrator
  • *****
  • Сообщений: 1143
  • Карма: 333
  • Skype: alexandr.ignatovich.itc
Re: Invalid number of references
« Ответ #11 : 01-06-2022, 12:22:46 »
В общем, получается, если забирать Reference-ы напрямую из геометрии, при этом stable representation получается того же самого вида
Цитировать
1f0e710d-d965-4b08-9bae-a1f4791ede64-003b5143:0:LINEAR/1

Я бы написал что-то вроде такого для получения reference-ов для исправления размеров по осевой линии (GetCenterlineReference) или продольных (GetEndPointReferences)

Код - C# [Выбрать]
  1. public class RevitPipe : IPipe
  2. {
  3.         private readonly Pipe pipe;
  4.         private readonly ElementId pipeCurvesCategoryId = new ElementId(BuiltInCategory.OST_PipeCurves);
  5.         private readonly ElementId pipeCurveCenterLineId = new ElementId(BuiltInCategory.OST_PipeCurvesCenterLine);
  6.  
  7.         public RevitPipe(Pipe pipe)
  8.         {
  9.                 this.pipe = pipe;
  10.         }
  11.  
  12.         public IEnumerable<Reference> GetEndPointReferences(View view)
  13.         {
  14.                 var curveLine = GetCurveLines(view).FirstOrDefault(IsPipeCurveLine);
  15.  
  16.                 if (curveLine == null)
  17.                         return Enumerable.Empty<Reference>();
  18.  
  19.                 return Enumerable.Range(0, 2).Select(curveLine.GetEndPointReference);
  20.         }
  21.  
  22.         public Reference GetCenterlineReference(View view) => GetCurveLines(view).FirstOrDefault(IsCenterLine)?.Reference ?? GetCurveLines(view).FirstOrDefault(IsPipeCurveLine)?.Reference;
  23.        
  24.         private IEnumerable<Line> GetCurveLines(View view)
  25.         {
  26.                 var options = new Options
  27.                         {
  28.                                 View = view,
  29.                                 ComputeReferences = true,
  30.                                 IncludeNonVisibleObjects = true
  31.                         };
  32.  
  33.                 return pipe
  34.                         .get_Geometry(options)
  35.                         .OfType<Line>();
  36.         }
  37.  
  38.         private bool IsPipeCurveLine(Line line) => IsCurveOfCategory(line, pipeCurvesCategoryId);
  39.  
  40.         private bool IsCenterLine(Line line) => IsCurveOfCategory(line, pipeCurveCenterLineId);
  41.  
  42.         private bool IsCurveOfCategory(Line line, ElementId curvesCategoryId)
  43.         {
  44.                 if (line.GraphicsStyleId == ElementId.InvalidElementId)
  45.                         return false;
  46.  
  47.                 var document = pipe.Document;
  48.                
  49.                 var graphicsStyle = (GraphicsStyle)document.GetElement(line.GraphicsStyleId);
  50.  
  51.                 return graphicsStyle.GraphicsStyleCategory?.Id == curvesCategoryId;
  52.         }
  53. }

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

  • ADN Club
  • *****
  • Сообщений: 1636
  • Карма: 359
  • Отец modplus.org
    • ModPlus
Re: Invalid number of references
« Ответ #12 : 01-06-2022, 12:51:57 »
Вот оно как неожиданно оказывается - чтобы построить размер, нужно из геометрии взять не ту кривую, которая в категории "Осевая линия", а ту, которая в категории "Трубы". Имеется ввиду категория графического представления. Век живи - век учись

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

  • Administrator
  • *****
  • Сообщений: 1143
  • Карма: 333
  • Skype: alexandr.ignatovich.itc
Re: Invalid number of references
« Ответ #13 : 01-06-2022, 13:27:00 »
Ну определенная логика в этом, всё-таки, есть. А вот то, что Reference из stable representation какой-то неправильный получается - это да, неприятно  :o