Аналог SelectCrossingPolygon

Автор Тема: Аналог SelectCrossingPolygon  (Прочитано 5582 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Аналог SelectCrossingPolygon
« : 07-02-2016, 22:45:32 »
Добрый день!
Может кто подскажет есть какой-либо API для получения перечня объектов проходящих через указанную точку или область (polygon). Например нужно отловить все полилинии проходящие через заданную область или точку. В настоящий момент использую SelectCrossingPolygon для решения этой задачи, но для использования нужно, чтоб было все видно на мониторе, а также если вызывать SelectCrossingPolygon например более 1000 раз в разных областях то получается очень медленно.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Аналог SelectCrossingPolygon
« Ответ #1 : 07-02-2016, 23:17:43 »
Автокадных Api нет. Чтоб было быстро можно "руками", ищите на этом сайте по слову R-Tree.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Аналог SelectCrossingPolygon
« Ответ #2 : 08-02-2016, 09:12:49 »
Загружаем все интересные объекты в дерево, а потом ищем в дереве

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Аналог SelectCrossingPolygon
« Ответ #3 : 08-02-2016, 11:18:10 »
Спасибо. Суть алгоритма если я правильно понял в исключении множественной итерации по всем элементам чертежа, буду пробовать.
Я себе представляю примерно так:
1. Получаем границы чертежа, например прямоугольные.
2. Разбиваем на некоторое кол-во малых прямоугольников. Одного вложения дерева думаю мне хватит
3. Дальше уже можно для каждого малого прямоугольника считывать нужные данные, в том числе метку объекта например Handle.
4. Дальше по точке получаем нужный прямоугольник и обрабатываем объекты которые содержатся в этом прямоугольнике, а не все.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Аналог SelectCrossingPolygon
« Ответ #4 : 08-02-2016, 11:29:04 »
RTree
1. Загружаем исходный набор в дерево
Код - Visual Basic [Выбрать]
  1.     Public Shared Function GetRect(nEnt As Entity) As Rectangle
  2.         If nEnt.Bounds IsNot Nothing Then
  3.             Dim wExt As Extents3d = nEnt.Bounds
  4.             Return New Rectangle(wExt.MinPoint.X, wExt.MinPoint.Y, wExt.MaxPoint.X, wExt.MaxPoint.Y, 0, 0)
  5.         Else
  6.             Return Nothing
  7.         End If
  8.     End Function
Код - Visual Basic [Выбрать]
  1.         Using acTrans As Transaction = cdb.TransactionManager.StartTransaction()
  2.             For Each ent As ObjectId In wLayoutBlock
  3.                 wEnt = ent.GetObject(OpenMode.ForRead)
  4.                 If Not IsDBNull(wEnt) Then
  5.                     Me.wTree.Add(TestShtamp.GetRect(wEnt), wEnt.ObjectId)              
  6.                 End If
  7.             Next
  8.             '
  9.            acTrans.Abort()
  10.         End Using
2. Ищем в дереве
wTree.Intersects(wSF.GetRectangle(ep))

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

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Аналог SelectCrossingPolygon
« Ответ #5 : 08-02-2016, 12:07:35 »
trir,
Спасибо.