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

ADN Club => Revit API => Тема начата: enot от 10-02-2019, 10:41:13

Название: The references are not geometric references
Отправлено: enot от 10-02-2019, 10:41:13
При получении Reference некоторых элементов:
Reference reference = new Reference(element);

вылетает ошибка: The references are not geometric references
- are not geometric references - что это означает ? (что у элемента reference==null ?)
- как прописать условие, чтобы исключить такие элементы ?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 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
Название: Re: The references are not geometric references
Отправлено: enot от 10-02-2019, 11:17:01
Попробовал собрать всё возможное из проекта
А вы можете попробовать с OST_DuctCurvesCenterLine ?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 10-02-2019, 11:23:29
Попробовал, проблем не заметил:
(https://i.postimg.cc/PvsQV4ny/OST-Duct-Curves-Center-Line.png) (https://postimg.cc/PvsQV4ny)
Название: Re: The references are not geometric references
Отправлено: enot от 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);)

как верно прописать коллектор в общем случае?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 10-02-2019, 12:03:41
Ну кто так строит? (с)

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

С размерами вряд ли сгодится общий алгоритм, слишком много специфичных вещей. Например с теми же осевыми линиями труб/воздуховодов делается примерно так, как в этой теме https://forums.autodesk.com/t5/revit-api-forum/centerline/td-p/5447675
Название: Re: The references are not geometric references
Отправлено: enot от 10-02-2019, 12:07:56
Я понял. как бы решили мою задачу вы? использовали бы ElementMulticategoryFilter ?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 10-02-2019, 12:13:42
Я не знаю Вашей задачи. Вообще нужно понимать, как нужно для конкретных элементов создавать размеры, алгоритмы будут разными для стен, для плит, для колонн, осей и т.д. Зная конкретный алгоритм формируются нужный фильтр. Может вообще по имени семейства/типоразмера колонны, например.
Название: Re: The references are not geometric references
Отправлено: enot от 10-02-2019, 12:16:41
Все ясно, спасибо
Название: Re: The references are not geometric references
Отправлено: enot от 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)
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 11-02-2019, 11:37:28
Я почти полностью уверен, что в ReferenceArray затесался null.
Название: Re: The references are not geometric references
Отправлено: enot от 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);
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 11-02-2019, 11:43:52
Так нужно понимать какую/какие плоскости нужно извлекать из семейства, а не всё подряд пробовать))
Название: Re: The references are not geometric references
Отправлено: enot от 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.                     }

Я близок к истине?)
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 11-02-2019, 11:58:03
Общего решения, вероятно, не существует, так или иначе будут заточены под конкретные семейства.

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

Ну или если есть возможность повлиять на BIM-щика / ты сам BIM-щик, который создает/правит семейства, можно договориться о создании/именовании опорных плоскостей, тогда получать их по имени.
Название: Re: The references are not geometric references
Отправлено: enot от 11-02-2019, 12:07:21
если внутри семейства скажем нет каких то опорных плоскостей то и метод с поиском reference плоскостей (верха низа и т.д.) ничего не выдаст

семейства имеют разную форму,однако может есть какой то вариант свести их к более простой фигуре, скажем прямоугольнику, как вариант получить BoundingBox семейства и уже на конкретном виде получать крайние точки и привязываться к ним как к Reference ?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 11-02-2019, 12:17:48
BoundingBox не имеет reference-ов. В такой постановке можно, например, по краям этого box-а на виде создать короткие линии детализации и привязать размеры к ним.
Название: Re: The references are not geometric references
Отправлено: enot от 11-02-2019, 12:21:55
У линий детализации reference получаем через Reference reference = new Reference(detailLine); ?
Название: Re: The references are not geometric references
Отправлено: Александр Игнатович от 11-02-2019, 12:25:36
На вскидку -
Код - C# [Выбрать]
  1. detailCurve.GeometryCurve.Reference

но нужно проверить