Тема: Почему не работает??? Help

Sub ÍàáîðÏðèìèòèâîâ()
    Dim MySelSet As AcadSelectionSet
    Set MySelSet = ThisDrawing.SelectionSets("MySet")
    ReDim MyObjSet(0 To ThisDrawing.ModelSpace.Count - 1) As AcadEntity
    Dim X As Integer
    X = 0
    Dim I As Integer
    With ThisDrawing.ModelSpace
    Do
        If .Item(X).ObjectName = "AcDbPolyline" And .Item(X).Layer Like "Category*" Then
        Set MyObjSet(I) = .Item(X)
        I = I + 1
        End If
        X = X + 1
    Loop Until X = ThisDrawing.ModelSpace.Count
    End With
    ReDim Preserve MyObjSet(0 To I) As AcadEntity
    MySelSet.AddItems MyObjSet
End Sub

Re: Почему не работает??? Help

Что-то с именем процедуры не в порядке. Использована кириллица?
Кроме того при повторном запуске не будет создан набор ("MySet"), как уже существующий в чертеже.
А вообще, если хочешь получить вразумительный ответ выкладывай побольше информации - сообщение об ошибке, версия ACAD и т.п.

Re: Почему не работает??? Help

Имя процедуры с использованием кирилицы. AutoCad2007. Ошибка Пустой указатель на объект.

Re: Почему не работает??? Help

Sub MySub()
    Dim MySelSet As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets("MySet").Delete
    Set MySelSet = ThisDrawing.SelectionSets("MySet")
    Dim MyObjSet() As AcadEntity
    ReDim MyObjSet(0 To (ThisDrawing.ModelSpace.Count - 1)) As AcadEntity
    Dim X As Integer
    X = 0
    Dim i As Integer
    MySelSet.Clear
    With ThisDrawing.ModelSpace
        Do
            If ((.Item(X).ObjectName = "AcDbPolyline") And (.Item(X).Layer Like "Category*")) Then
                Set MyObjSet(i) = .Item(X)
                i = i + 1
            End If
            X = X + 1
        Loop Until (X = (ThisDrawing.ModelSpace.Count - 1))
    End With
    ReDim Preserve MyObjSet(0 To i) As AcadEntity
    MySelSet.AddItems MyObjSet
End Sub

Re: Почему не работает??? Help

Спасибо за помощь! Буду пробовать ...

Re: Почему не работает??? Help

> LeonidSN
Как я уже писал выше Огромное спасибо !!! но к сожалению модуль не работает, куча скобок не решили проблему ... вся загвоздка была здесь ReDim Preserve MyObjSet(0 To i) As AcadEntity
а надо ReDim Preserve MyObjSet(0 To i - 1) As AcadEntity  .... и всего то ...

Re: Почему не работает??? Help

> Игорь
Игорь, насколько я понимаю, вы вполне в состоянии провести отладку кода и найти ошибку, а этот ваш пост был вызван какими-то временными обстоятельствами. Ну так и ладушки!
По поводу скобок. Они решают не проблему работоспособности кода а проблему его удобочитаемости.
Успехов!

Re: Почему не работает??? Help

P.S. Конечно же я свой код тестировал и он нормально работал...
Даже не знаю, что добавить.

Re: Почему не работает??? Help

> LeonidSN
Моё уважение! Но модуль не работает по двум причинам: первую я озвучил выше, а вторую сделали Вы -
ThisDrawing.SelectionSets("MySet") вот здесь, ссылка на удалённый набор ...

Re: Почему не работает??? Help

> Игорь
Просмотрел трезвым взглядом.
Единственная ошибка , вместо -

Set MySelSet = ThisDrawing.SelectionSets("MySet")

должно быть -

Set MySelSet = ThisDrawing.SelectionSets.[b]Add("MySet")[/b]

(как он сработал ранее, ума не приложу...)
На всякий случай выкладываю код полностью:

Sub MySub()
    Dim MySelSet As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets("MySet").Delete
    Set MySelSet = ThisDrawing.SelectionSets.Add("MySet")
    Dim MyObjSet() As AcadEntity
    ReDim MyObjSet(ThisDrawing.ModelSpace.Count)
    Dim X As Integer
    Dim i As Integer
    X = 0
    i = 0
    With ThisDrawing.ModelSpace
        Do
            If ((.Item(X).ObjectName = "AcDbPolyline") And (.Item(X).Layer Like "Category*")) Then
                Set MyObjSet(i) = .Item(X)
                i = i + 1
            End If
            X = X + 1
        Loop Until (X = ThisDrawing.ModelSpace.Count)
    End With
    ReDim Preserve MyObjSet(0 To i) As AcadEntity
    MySelSet.AddItems MyObjSet
End Sub

Re: Почему не работает??? Help

> LeonidSN
с этой вот штукой любой код работает
On Error Resume Next

Re: Почему не работает??? Help

> LeonidSN
но в любом случае тебе мой respect ....

Re: Почему не работает??? Help

> LeonidSN
Правильно будет

ReDim Preserve MyObjSet(0 To [b]i - 1[/b]) As AcadEntity

Если ...i, то последний (i-тый) эл-т массива будет не инициализирован (Nothing).

Re: Почему не работает??? Help

Во искупление своих грехов предлагаю другой, более быстрый способ набора примитивов:

Sub SetByFilter()
    Dim MySelSet As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets("MySet").Delete
    Set MySelSet = ThisDrawing.SelectionSets.Add("MySet")
    On Error GoTo 0
    Dim gpCode(0 To 3) As Integer
    Dim dataValue(0 To 3) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "LWPOLYLINE"
    gpCode(2) = 8: dataValue(2) = "Category"
    gpCode(3) = -4: dataValue(3) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    MySelSet.Select acSelectionSetAll, , , groupCode, dataCode
End Sub

Re: Почему не работает??? Help

> LeonidSN
И это есть правильно!

Re: Почему не работает??? Help

> LeonidSN
Объясните ПЛЗ для чего первый и последний элементы двух массивов???? что за -4 и для чего And> ???

Re: Почему не работает??? Help

Посмотри в Help'е раздел: Add Complexity to Your Filter List Conditions