The references are not geometric references

Автор Тема: The references are not geometric references  (Прочитано 4870 раз)

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

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

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
The references are not geometric references
« : 10-02-2019, 10:41:13 »
При получении Reference некоторых элементов:
Reference reference = new Reference(element);

вылетает ошибка: The references are not geometric references
- are not geometric references - что это означает ? (что у элемента reference==null ?)
- как прописать условие, чтобы исключить такие элементы ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #1 : 10-02-2019, 11:00:41 »
Сначала пройтись отладчиком, никогда не встречал, откуда такие элементы взялись, тогда кидайте пример проекта с id элементов. Попробовал собрать всё возможное из проекта, как-то не выдает такую ошибку:
Код - Python [Выбрать]
  1. col = FilteredElementCollector(doc)
  2.  
  3. els = col.WherePasses(LogicalOrFilter(ElementIsElementTypeFilter(), ElementIsElementTypeFilter(True)))
  4.  
  5. refs = map(lambda x: Reference(x), els)
  6.  
  7. print refs.Count

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #2 : 10-02-2019, 11:17:01 »
Попробовал собрать всё возможное из проекта
А вы можете попробовать с OST_DuctCurvesCenterLine ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #3 : 10-02-2019, 11:23:29 »
Попробовал, проблем не заметил:


Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #4 : 10-02-2019, 11:26:59 »
Попробовал, проблем не заметил
Значит причина в другом...
Вообще, я собираю все элементы на виде между которыми возможно создать размер,
мне кажется именно OST_DuctCurvesCenterLine (его reference)  дает ошибку при создании размера

Когда сейчас коллектор написал так (метод тыка):
Код - C# [Выбрать]
  1.             var els = new FilteredElementCollector(doc, doc.ActiveView.Id)              
  2.                 .WhereElementIsViewIndependent()          
  3.              
  4.                 .Cast<Element>().Where(x => x.CanBeLocked() && x.CanHaveTypeAssigned()) ;

этот коллектор не учел OST_DuctCurvesCenterLine  и вроде как все без ошибок сработало (т.е.  doc.Create.NewDimension(doc.ActiveView, Line, referenceArray);)

как верно прописать коллектор в общем случае?

Отмечено как Решение enot 10-02-2019, 12:16:55

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #5 : 10-02-2019, 12:03:41 »
Ну кто так строит? (с)

Зачем писать, что ошибка при
Reference reference = new Reference(element);

С размерами вряд ли сгодится общий алгоритм, слишком много специфичных вещей. Например с теми же осевыми линиями труб/воздуховодов делается примерно так, как в этой теме https://forums.autodesk.com/t5/revit-api-forum/centerline/td-p/5447675

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #6 : 10-02-2019, 12:07:56 »
Я понял. как бы решили мою задачу вы? использовали бы ElementMulticategoryFilter ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #7 : 10-02-2019, 12:13:42 »
Я не знаю Вашей задачи. Вообще нужно понимать, как нужно для конкретных элементов создавать размеры, алгоритмы будут разными для стен, для плит, для колонн, осей и т.д. Зная конкретный алгоритм формируются нужный фильтр. Может вообще по имени семейства/типоразмера колонны, например.

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #8 : 10-02-2019, 12:16:41 »
Все ясно, спасибо

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #9 : 10-02-2019, 20:49:06 »
Появился еще вопрос по текущей теме. Та же ошибка (The references are not geometric references ) возникает при попытке создания размера между экземплярами семейств (неверно определяю Reference ?):

Код - C# [Выбрать]
  1. foreach (x in fam_insts)
  2. {
  3.        FamilyInstance famInst = x as FamilyInstance;
  4.        var famInstRef = famInst.GetReferences(FamilyInstanceReferenceType.CenterElevation).FirstOrDefault();
  5.        referenceArray.Append(famInstRef);
  6. }
  7.  
  8.  doc.Create.NewDimension(doc.ActiveView, Line, referenceArray)

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #10 : 11-02-2019, 11:37:28 »
Я почти полностью уверен, что в ReferenceArray затесался null.

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #11 : 11-02-2019, 11:41:26 »
Я почти полностью уверен, что в ReferenceArray затесался null.
Перепробовав почти все FamilyInstanceReferenceType , видимо, все они возвращают null (

Так же не получилось с

Код - C# [Выбрать]
  1. Reference reference = new Reference(fam_inst);
  2. referenceArray.Append(reference);

и               

Код - C# [Выбрать]
  1. var lp = fam_inst.Location as LocationPoint;
  2. Point pt = Point.Create(lp.Point);
  3. referenceArray.Append(pt.Reference);

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #12 : 11-02-2019, 11:43:52 »
Так нужно понимать какую/какие плоскости нужно извлекать из семейства, а не всё подряд пробовать))

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: The references are not geometric references
« Ответ #13 : 11-02-2019, 11:52:22 »
Эмм... а какие плоскости нужны на разрезе ? верх низ семейства... так сейчас буду пробовать

так кажется надо использовать что то вроде (пока результата нет, но и ошибок тоже  ;D)

Код - C# [Выбрать]
  1.                     var famInstRef = famInst.GetReferences(FamilyInstanceReferenceType.Bottom);
  2.  
  3.                     foreach (var y in famInstRef)
  4.                     {
  5.                         referenceArray.Append(y);
  6.  
  7.                     }

Я близок к истине?)

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: The references are not geometric references
« Ответ #14 : 11-02-2019, 11:58:03 »
Общего решения, вероятно, не существует, так или иначе будут заточены под конкретные семейства.

Проще всего поиграться так - создать размер, RevitLookup посмотреть stable representation reference-ов, получать из семейства через GetReferences / GetReferenceByName, смотреть их stable representation, сравнивать. Ну и надо понимать, что в семействе у опорной плоскости в свойстве "Связь" не должно стоять "нет".

Ну или если есть возможность повлиять на BIM-щика / ты сам BIM-щик, который создает/правит семейства, можно договориться о создании/именовании опорных плоскостей, тогда получать их по имени.