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

ADN Club => Revit API => Тема начата: asia от 09-09-2020, 13:21:48

Название: Получить id элемента, для которого назначен TextNote
Отправлено: asia от 09-09-2020, 13:21:48
Добрый день.
Задача такова, что в документе рядом с размерными линиями находятся TextNote, в которых записаны данные. Некоторые из этих TextNote содержат ключевые слова. Мне нужно найти id текстНоутов, которые содержат эти определенные слова, а так же id размерностей, которым они назначены (расположение текстНоута допустимо на расстоянии 2*offset текста).

Код - C# [Выбрать]
  1. foreach (var textN in textNoteList)
  2. {
  3.     TextNote tn = (TextNote)textN;
  4.     if (checkText(tn.Text))
  5.     {
  6.          textNotes.Add(string.Format("textnote id: {0}, text: {1}\n", tn.Id.IntegerValue, tn.Text));
  7.     }
  8. }
  9.  
Я нахожу все TextNote  в документе и среди них выбираю те, которые содержат ключевые слова.
Код - C# [Выбрать]
  1. checkText()
это проверка на содержание ключевых слов.

Подскажите пожалуйста, как проверить расположение TextNote относительно размерной линии, чтобы определить его принадлежность? Можно ли реализовать такую проверку с помощью пересечений и если можно, каким образом?
(https://i.postimg.cc/n9JcDbL2/ex.png) (https://postimg.cc/n9JcDbL2)
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: Александр Ривилис от 09-09-2020, 13:31:19
А если сравнить взаимное расположение BoundingBox для них?
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: asia от 09-09-2020, 13:42:17
Это как?
Получается, нужно найти ближайшую размерную линию.
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: Александр Ривилис от 09-09-2020, 13:45:56
Получается, нужно найти ближайшую размерную линию.
Именно. А как иначе? Нужно найти все размерные линии и все TextNote. Для них для всех найти BoundingBox. Ну и дальше взаимное расположение для каждой пары размерной линии и TextNote.
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: asia от 09-09-2020, 14:01:07
А если парное соответствие отсутствует? Размерных линий 1000, а TextNotes может быть 10. Тогда нужно для каждого TextNote найти BoundingBox и проверить, попадает ли туда размерная линия (или находится от него на допустимом расстоянии)?
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: Александр Ривилис от 09-09-2020, 14:06:45
asia,
Упрощенно алгоритм:
1. Для каждого TextNote находим его BoundingBox и заносим в массив aTextNoteBoxes
2. Для каждой размерной линии находим её BoundingBox и заносим в массив aDimBoxes
3. Цикл по всем элементам aTextNoteBoxs и нахождение для каждого из них ближайшего из aDimBoxes, оценка расстояния (наверное имеет смысл работать с центром каждого BoundingBox)
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: asia от 09-09-2020, 14:11:02
Спасибо вам за совет. Буду разбираться.
Название: Re: Получить id элемента, для которого назначен TextNote
Отправлено: Александр Ривилис от 09-09-2020, 14:32:24
asia,
Если размеров и TextNotes может быть очень много, то рекомендую использовать RTree.