Тема: GetEntity

Помогите пожалуйста разобраться!!
Как я поняла этот метод возвращает свойства объекта (это я поняла из кратких объяснений в справке)???
Надо выбрать объект на экране:

ThisDrawing.Utility.GetEntity temp, sPoint

и после выбора выдадутся его свойства.

У меня ситуация заключается в том, что я в цикле перебираю все объекты:

For Each Obj In ThisDrawing.ModelSpace

нахожу объект с нужным ключом (Икс дата)

Obj.GetXData "Provod", xtypeOut, xdataOut

и теперь нужно получить параметры этого объекта (как это делает метод GetEntity, координаты, точку вставки и т.п.).
Подскажите пожалуйста как это сделать???

Re: GetEntity

Метод GetEntity тебе тут совершенно не нужен. Тебе нужно выяснить какой тип примитива в Obj (отрезок, полилиния, вставка блока и т.д.), привести его к нужному, а затем использовать соответствующие методы объекта.

Re: GetEntity

Ну это же обычные массивы :

For i = 0 to Ubound(xdataout)
Debug.Print xdataout(i)
Next

~'J'~

Re: GetEntity

> Александр
Ривилис
к примеру найденна полилиния и нужно найти все ее координаты (типа pl.Coordinates). При использовании метода GetEntity координаты высвечиваются (в окне Local) в виде массива.

>fixo
А причем тут икс дата??? Я хочу найти параметры объекта, например координаты найденной полилинии.
А это

Obj.GetXData "Provod", xtypeOut, xdataOut 

нужно чтобы найти объект с икс датой и с ключом "Provod". Это типа фильтр такой. В икс дате содержатся другие данные!!!

Re: GetEntity

Скажу проще:
я пытаюсь в цикле найти полилинию и после того, как найду мне надо узнать ее координаты ;)

Re: GetEntity

> fixo
>Александр Ривилис
Зацените мою стрепню ;)  :)

Sub tuy()
Dim pl As AcadLWPolyline
For Each Obj In ThisDrawing.ModelSpace
Obj.GetXData "Provod", xtypeOut, xdataOut

    If IsArray(xdataOut) Then
        
        If Obj.ObjectName = "AcDbPolyline" Then
        MsgBox "Вот она"
        Set pl = Obj
        zx = pl.Coordinates
        End If
    End If

Next
End Sub

Re: GetEntity

Сначала я нашла среди кучи объектов нужную полилинию с икс датой и с ключом "Provod"

Obj.GetXData "Provod", xtypeOut, xdataOut 

А это условие включается если у объекта есть икс дата (массив данных)

If IsArray(xdataOut) Then

А это условие удостоверяется, что объект является действительно полилинией (не дает проскочить другим объектам, если они по случайности получили ключ "Provod")

If Obj.ObjectName = "AcDbPolyline" Then

:)

Re: GetEntity

Я не пишу на VBA, но могу предположить, что все сделано почти правильно. Есть три типа полилиний и три класса: 3DPolyline, LightWeightPolyline и Polyline. Причем два последних легко переходят друг в друга (точнее Polyline в LightWeightPolyline)

Re: GetEntity

> Дарья
Тарахова
Чтобы сократить время выбора, можно использовать SelectionSet
Как вариант:

Sub TuyB()
Dim ss As AcadSelectionSet
Dim FilterType(0 To 1) As Integer 'DXF-коды фильтров
Dim FilterData(0 To 1) As Variant 'Значения DXF-кодов
Dim objPolyLine As AcadLWPolyline

'Выбираем полилинии на чертеже в соответствии с фильтром
FilterType(0) = 0: FilterData(0) = "LWPOLYLINE"
FilterType(1) = 1001: FilterData(1) = "Provod"
On Error Resume Next
    ThisDrawing.SelectionSets.Item("tuy").Delete
    Set ss = ThisDrawing.SelectionSets.Add("tuy")
On Error GoTo 0
ss.Select acSelectionSetAll, , , FilterType, FilterData
'Делаем с выбранными полилиниями то, что нам нужно, например:
Debug.Print "Число полилиний, соответствующих запросу: " + CStr(ss.Count)
For Each objPolyLine In ss
    Debug.Print objPolyLine.Coordinates(0)
Next

End Sub

Re: GetEntity

> Mikha
Интересно!!! А насколько работа с набором увеличивает скорость выполнения кода???

P.S.:
Я сейчас как раз модернизирую свое приложение. Раньше оно обсчитывало весь алгоритм минут за 5, а теперь за 10 секунд ;)

Re: GetEntity

> Дарья
Тарахова
Время выбора примитивов при использовании методов объекта SelectionSet в разы меньше простого перебора элементов (особенно при большом количестве объектов в чертеже). Во-первых, перебор осуществляется с помощью VBA, а во-вторых, используется простейшей алгоритм последовательной проверки каждого элемента на соответствие некоторому условию отбора. Методы SelectionSet являются встроенными, написаны точно не на VBA, и в них использованы более совершенные алгоритмы сортировки и поиска, поэтому они и быстрее. Но к сожалению в них можно использовать далеко не все DXF-коды, и тогда приходится самому разрабатывать алгоритм поиска нужных объектов.
А насколько быстрее тот или иной алгоритм зависит от конкретных условий.

Re: GetEntity

SelectionSet - метод известный, им можно легко и быстро выбрать, к примеру, все полилинии с определенным цветом или слоем. А вот, к примеру, примитивы с наличием определенных расширенных данных, -можно? Или блоки с наличием определенных атрибутов?

P.S. Дарья, вовремя ты переключилась на C#... Автокад 2010 VBA уже не поддерживает, и все макросы, "нажитые непосильным трудом", бесполезны. Можно, правда, отдельно с сайта Автодеска подгрузить VBA-шный модуль, но тенденция очевидна... В будущем, видимо, поддержки VBA не будет вовсе (если, конечно, левая нога директора Автодеска не передумает  :D)

Re: GetEntity

AlexV пишет:

P.S. Дарья, вовремя ты переключилась на C#... Автокад 2010 VBA уже не поддерживает, и все макросы, "нажитые непосильным трудом", бесполезны. Можно, правда, отдельно с сайта Автодеска подгрузить VBA-шный модуль, но тенденция очевидна... В будущем, видимо, поддержки VBA не будет вовсе (если, конечно, левая нога директора Автодеска не передумает )

Да уж, это очень серьезная проблема!!!! Что за дурацкие эксперементы в этой компании происходят???
То интерфейс испоганили в 2009 Автокаде, то ВБА хотят совсем убрать.... Ерундой занимаются одним словом!!!
Что касается модуля, то я его уже скачала.
Наша организация еще не скоро перейдет на 2010 Автокад. Мы тормазнулись на 2008.

Жаль бедный ВБА, прямо слезы наворачиваются :cry:  Такой хороший язык... Его бы доработать бы, а не рубить под корень!!!!

Re: GetEntity

Дарья, куда пропала? У тебя ящик изменился?

Re: GetEntity

О том, что VBA не планируют поддерживать в Автокаде, я писал на старом форуме еще 2 года тому назад