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

ADN Club => AutoCAD .NET API => Тема начата: Volody1983 от 07-02-2016, 22:45:32

Название: Аналог SelectCrossingPolygon
Отправлено: Volody1983 от 07-02-2016, 22:45:32
Добрый день!
Может кто подскажет есть какой-либо API для получения перечня объектов проходящих через указанную точку или область (polygon). Например нужно отловить все полилинии проходящие через заданную область или точку. В настоящий момент использую SelectCrossingPolygon для решения этой задачи, но для использования нужно, чтоб было все видно на мониторе, а также если вызывать SelectCrossingPolygon например более 1000 раз в разных областях то получается очень медленно.
Название: Re: Аналог SelectCrossingPolygon
Отправлено: Дима_ от 07-02-2016, 23:17:43
Автокадных Api нет. Чтоб было быстро можно "руками", ищите на этом сайте по слову R-Tree.
Название: Re: Аналог SelectCrossingPolygon
Отправлено: trir от 08-02-2016, 09:12:49
Загружаем все интересные объекты в дерево, а потом ищем в дереве
Название: Re: Аналог SelectCrossingPolygon
Отправлено: Volody1983 от 08-02-2016, 11:18:10
Спасибо. Суть алгоритма если я правильно понял в исключении множественной итерации по всем элементам чертежа, буду пробовать.
Я себе представляю примерно так:
1. Получаем границы чертежа, например прямоугольные.
2. Разбиваем на некоторое кол-во малых прямоугольников. Одного вложения дерева думаю мне хватит
3. Дальше уже можно для каждого малого прямоугольника считывать нужные данные, в том числе метку объекта например Handle.
4. Дальше по точке получаем нужный прямоугольник и обрабатываем объекты которые содержатся в этом прямоугольнике, а не все.
Название: Re: Аналог SelectCrossingPolygon
Отправлено: trir от 08-02-2016, 11:29:04
RTree (http://sourceforge.net/projects/cspatialindexrt/)
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))
Название: Re: Аналог SelectCrossingPolygon
Отправлено: Volody1983 от 08-02-2016, 12:07:35
trir,
Спасибо.