Тема: Фильтр

Посмотрите пожайлуста полный код и что он делает, потому что код Леонида не совсем то, что мне нужно:
Public Sub Poisk_01()
     Dim ss As AcadSelectionSet
     With ThisDrawing.SelectionSets
             While .Count > 0
          .Item(0).Delete
          Wend
          Set ss = .Add("$Blocks$")
     End With
     Dim fType(2) As Integer
     Dim fData(2) As Variant
     fType(0) = 0: fType(1) = 2: fType(2) = 67
     fData(0) = "INSERT": fData(1) = "П11-(211)": fData(2) = 0 '<--"П11-(211)" это имя блока
''ВОТ ТУТ КАК РАЗ И ДОЛЖНЫ ВКЛЮЧАТЬСЯ ФИЛЬТРЫ
If (07_PODSCHET.FILTER№1.Value) Then
Call Vibor1
ElseIf (07_PODSCHET.FILTER№2.Value) Then
Call Vibor2
ElseIf (07_PODSCHET.FILTER№1.Value) And (07_PODSCHET.FILTER№2.Value) Then
Call Vibor3
End If
ss.Select acSelectionSetAll, , , fType, fData
            07_PODSCHET.П11_2х1х1.Caption = ss.Count
     ss.Delete
End Sub
'А ЭТО САМИ ФИЛЬТРЫ
Sub Vibor1()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(k) = 8 'DXF-код имени слоя
fData(k) = "Слой1"
End Sub
Sub Vibor2()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(2) = 8 'DXF-код имени слоя
fData(2) = "Слой2"
End Sub
Sub Vibor3()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(k) = 8 'DXF-код имени слоя
fData(k) = "Слой1, Слой2"
МНЕ БЫ ОЧЕНЬ ХОТЕЛОСЬ ЧТОБЫ ОН РАБОТАЛ ТАК:
БЕЗ ФЛАЖКОВ ОН БЫ ИСКАЛ В ПРОСТРАНСТВЕ ЛИСТА (ЧТО ОН СОБСТВЕННО И ДЕЛАЕТ УЖЕ)
С ПЕРВЫМ ФЛАЖКОМ - ИСКАЛ ПО СЛОЮ "СЛОЙ1"
СО ВТОРЫМ -  ИСКАЛ ПО СЛОЮ "СЛОЙ2"
С ПЕРВЫМ И ВТОРЫМ ФЛАЖКОМ - ПО ДВУМ СЛОЯМ "СЛОЙ1" И "СЛОЙ2"
End Sub

Re: Фильтр

Если на  CheckBox1 поставлен флажок, то включается первый фильтр. Если на  CheckBox2 поставлен флажок, то включается второй фильтр. Это все понятно!!!
А как сделать так, чтобы при включение двух флажков включались оба фильтра одновременно и поиск шел бы и по СЛОЙ1 и по СЛОЙ2???
If  CheckBox1  = True Then
'Добавляем фильтр СЛОЙ1
k = k + 1
fType(k) = 8   '  DXF-код имени слоя
fData(k) = "Слой1"
End If
If  CheckBox  = True Then
'Добавляем фильтр СЛОЙ2
k = k + 1
fType(k) = 8   '  DXF-код имени слоя
fData(k) = "Слой2"
End If
ss.Select acSelectionSetAll, , , fType, fData
РЕЗУЛЬТАТ.Caption = ss.Count
     ss.Delete

Re: Фильтр

Private Sub btnOK_Click()
Dim fData() As Variant, fType() As Integer
  ReDim fData(0): ReDim fType(0)
  fType(0) = 8
  If chkLayerName1.Value Then
    fData(0) = "Слой1"
  End If
  If chkLayerName2.Value Then
    If Not (IsEmpty(fData(0))) Or fData(0) <> "" Then
      fData(0) = "Слой1,Слой2"
    Else
      fData(0) = "Слой2"
    End If
  End If
Dim ss As AcadSelectionSet, ssName As String
  ssName = "$temp$"
  On Error Resume Next
  ThisDrawing.SelectionSets.Item(ssName).Clear
  ThisDrawing.SelectionSets.Item(ssName).Delete
  Err.Clear
  Set ss = ThisDrawing.SelectionSets.Add(ssName)
  On Error GoTo 0
  ss.Select acSelectionSetAll, , , fType, fData
  MsgBox ss.Count
  Me.Hide
End Sub

Re: Фильтр

Никак не получается внедрить ваш код в тело моей программы...В чем же ошибка???
Public Sub Poisk_01()
Dim ss As AcadSelectionSet
     With ThisDrawing.SelectionSets
             While .Count > 0
          .Item(0).Delete
          Wend
          Set ss = .Add("$Blocks$")
     End With
     Dim fType(2) As Integer
     Dim fData(2) As Variant
     fType(0) = 0: fType(1) = 2: fType(2) = 67
     fData(0) = "INSERT": fData(1) = "П11-(211)": fData(2) = 0 '<--"П11-(211)" это имя блока
                      ' Private Sub btnOK_Click()
                      ' Dim fData() As Variant, fType() As Integer
                      ' ReDim fData(0): ReDim fType(0)
  fType(0) = 8
If №_07_PODSCHET.FILTER_№1.Value Then
   fData(0) = "Слой1"
   End If
  If №_07_PODSCHET_OPOR.FILTER_KTP_№2.Value Then
  If Not (IsEmpty(fData(0))) Or fData(0) <> "" Then
  fData(0) = "Слой1,Слой2"
  Else
  fData(0) = "Слой2"
  End If
End If
'Dim ss As AcadSelectionSet, ssName As String
ssName = "$temp$"
On Error Resume Next
                                                      ThisDrawing.SelectionSets.Item(ssName).Clear
                                                    ThisDrawing.SelectionSets.Item(ssName).Delete
Err.Clear
Set ss = ThisDrawing.SelectionSets.Add(ssName)
On Error GoTo 0
                      ' ss.Select acSelectionSetAll, , , fType, fData
                      ' MsgBox ss.Count
                      ' Me.Hide
                      ' End Sub
ss.Select acSelectionSetAll, , , fType, fData
            №_07_PODSCHET.П11_2х1х1.Caption = ss.Count
     ss.Delete
End Sub

Re: Фильтр

Может я Вам не совсем понятно объяснила и ввела Вас в заблуждение.
Ну в общем я нажимаю кнопку и поиск ведется по всему листу. Если ставлю галочку напротив первого, то включается первый фильтр. Если напротив второго - второй фильтр. А вот сразу два фильтра не получается включить!

Re: Фильтр

Для начала: избавиться от символов типа № (а также русских) в именах переменных. Во-вторых, а есть ли вообще в файле блоки, отвечающие указанным требованиям?

Re: Фильтр

Да, и вот еще. 67-я группа по идее показывает "владельца". Судя по справке:

Absent or zero indicates entity is in model space. 1 indicates entity is in paper space (optional)

То есть, во-первых (точнее, уже в-третьих), значение 0 - это только в пространстве модели; а, в-четвертых, эта группа является опциональной и может быть пропущена.

Re: Фильтр

1) Я уберу русские символы и символ "№";
2) В чертеже есть блоки, отвечающие этим требованиям;
3)Вы имели ввиду убрать эту строку из кода???
fType(0) = 0: fType(1) = 2: fType(2) = 67

Re: Фильтр

В общем при нажатом первом флажке поиск идет по Слой1, а при нажатом втором поиск идет сразу по Слой1 и  Слой2 (даже при ненажатом первом)!!!
В общем я совсем запуталась...

Re: Фильтр

Просто как пример структурирования кода:

Private Sub CmdOK_Click()
    If (Me.CheckBox1.Value) Then
        Call Select1
    ElseIf (Me.CheckBox2.Value) Then
        Call Select2
    ElseIf (Me.CheckBox1.Value) And (Me.CheckBox2.Value) Then
        Call Select3
    Else
        Call Select4
    End If
End Sub
Private Sub Select1()
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    gpCode(0) = 0
    dataValue(0) = "Circle"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub
'- - - - - - - - - - - - - - - -  - -- - - - -
Private Sub vSelect(groupCode As Variant, dataCode As Variant)
    Dim ss As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets.Item("MySet").Delete
    Set ss = ThisDrawing.SelectionSets.Add("MySet")
    Dim mode As Integer
    mode = acSelectionSetAll
    ss.Select mode, , , groupCode, dataCode
    MsgBox ss.Count
End Sub

Re: Фильтр

Вы прислали хороший пример, но к сожалению фильтр не работает!!!
КОД В МОДУЛЕ НАХОДИТСЯ
Sub poisk()
ТУТ КОД ПО ПОИСКУ БЛОКОВ
В НЕМ ВКЛИНИВАЕТСЯ ФИЛЬТР
If (PODSCHET.FILTER1.Value) Then
Call Vibor1
ElseIf (PODSCHET.FILTER2.Value) Then
Call Vibor2
ElseIf (PODSCHET.FILTER1.Value) And (PODSCHET.FILTER2.Value) Then
Call Vibor3
End If
End Sub
Sub Vibor1()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(k) = 8
fData(k) = "Слой1"
End Sub
Sub Vibor2()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(2) = 8
fData(2) = "Слой2"
End Sub
Sub Vibor3()
     Dim fType(2) As Integer
     Dim fData(2) As Variant
k = k + 1
fType(k) = 8
fData(k) = "Слой1, Слой2"
End Sub

Re: Фильтр

Я по всякому пробовала... Не получается.
Господа профессионалы подскажите пожайлуста!!!
Я уверена для вас это не составит особого труда!!
Заранее спасибо!!!

Re: Фильтр

> Дарья
А где ты полученный фильтр используешь? В твоем коде он просто создается (как-то очень странно), но не используется.
Замени в коде LeonidSN:

    gpCode(0) = 0
    dataValue(0) = "Circle"

на

    gpCode(0) = 8
    dataValue(0) = "Слой1,Слой2" ' имя слоя или список слоев разделенный запятыми

Re: Фильтр

1) Уберите CAPSLOCK - бьет по глазам.
2) Научитесь пользоваться тегами
[code]
текст программы
[/code]
Иначе очень трудно читать код.
3) Фильтры которые создаются в подпрограммах никак не используются в основной программе(т.е. fType и fData из подпрограмм негде не используются в основной программе)

Re: Фильтр

Почему не работает, Александр уже написал.> Александр Ривилис (2008-03-07 12:22:24).
Интересно другое. Что Вы хотите добиться вот этим:

If (07_PODSCHET.FILTER№1.Value) Then
Call Vibor1
ElseIf (07_PODSCHET.FILTER№2.Value) Then
Call Vibor2
ElseIf (07_PODSCHET.FILTER№1.Value) And (07_PODSCHET.FILTER№2.Value) Then
Call Vibor3
End If

Ну и когда у Вас вот этот Vibor3 будет выполняться?

Re: Фильтр

> Дарья
С праздником, конечно, но... Но ведь как не слышала. Сказано же - убирать спецсимволы из имен переменных. И чего делает FILTER№1?
Мой код, который я показывал - работал корректно, проверял на ACAD 2005, ACAD 2006, ACAD 2008. Еще один работающий вариант: http://depositfiles.com/files/3980642

Re: Фильтр

> BP
Vibor3 должен выполняться когда включен флажок 1 и флажок 2 одновременно

Re: Фильтр

> Дарья
Тогда последний IF должен быть первым!

Re: Фильтр

> Дарья
Во-во. Об том и спичь.

> Александр Ривилис

Re: Фильтр

Ну вот поменяла местами, а все равно когда включены два флажка одновременно подсчет идет только по "Слой1"...
If (PODSCHET.FILTER1.Value) And (PODSCHET.FILTER2.Value) Then
k = k + 1
fType(k) = 8 'DXF-код имени слоя
fData(k) = "Слой1, Слой2"
ElseIf (PODSCHET.FILTER1.Value) Then
k = k + 1
fType(k) = 8 'DXF-код имени слоя
fData(k) = "Слой1"
ElseIf (PODSCHET.FILTER2.Value) Then
k = k + 1
fType(2) = 8 'DXF-код имени слоя
fData(2) = "Слой2"
End If

Re: Фильтр

> Кулик Алексей aka kpblc
Странный аккаунт http://depositfiles.com/files/3980642. Не могу скачать.

Re: Фильтр

> Дарья

Command: (setq ss (ssget "_X" '((8 . "Слой1, Слой2")))) <Selection set: 77>
Command: (sslength ss) [b]1[/b]
Command: (setq ss (ssget "_X" '((8 . "Слой1,Слой2")))) <Selection set: 79>
Command: (sslength ss) [b]2[/b]

Вывод: убери пробел после запятой в фильтре!

Re: Фильтр

Ура!!! Получилось наконец!!!
Спасибо огромное всем, кто помог!!!
Поздравляю всех мужчин с прошедшим мужским праздником 23 февраля. СПАСИБО!

Re: Фильтр

> Дарья
код Леонида не совсем то, что мне нужно:
Уверен, это именно то, что вам нужно. Может просто мало написал... Освоить построение программы, ее архитектуру важнее чем научиться работать с отдельными элементами предметной области, в нашем случае - с элементами AutoCAD.
Давайте попробуем сделать все как положено:
Форма у нас, как я понимаю, уже имеется. И на ней есть кнопка OK а также CheckBox1 и CheckBox1. Форму я бы назвал как-нибудь так:
F_MyForm.
Теперь вставим два модуля с именами:
M_Consant
M_Main.
В код формы поместим такую процедуру:

Private Sub CmdOK_Click()
    If (Me.CheckBox1.Value) Then
        Call Select1
    ElseIf (Me.CheckBox2.Value) Then
        Call Select2
    ElseIf (Me.CheckBox1.Value) And (Me.CheckBox2.Value) Then
        Call Select3
    Else
        Call Select4
    End If
End Sub

В модуль M_Consant в секцию (General)(Declarations) поместим след. код -

Public Const SET_NAME As String = "MySet"
Public Const BLOCK_NAME As String = "MyBlock"
Public Const LAYER_1 As String = "MyLayer1"
Public Const LAYER_2 As String = "MyLayer2"

В модуль M_Main поместим след. код -

Option Explicit
'---------------------------------------------------
Public Sub Select1()
    Dim gpCode(5) As Integer
    Dim dataValue(5) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 67: dataValue(1) = 1
    gpCode(2) = 0: dataValue(2) = "INSERT"
    gpCode(3) = 2: dataValue(3) = M_Constant.BLOCK_NAME
    gpCode(4) = 8: dataValue(4) = M_Constant.LAYER_1
    gpCode(5) = -4: dataValue(5) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub
Public Sub Select2()
    Dim gpCode(5) As Integer
    Dim dataValue(5) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 67: dataValue(1) = 1
    gpCode(2) = 0: dataValue(2) = "INSERT"
    gpCode(3) = 2: dataValue(3) = M_Constant.BLOCK_NAME
    gpCode(4) = 8: dataValue(4) = M_Constant.LAYER_2
    gpCode(5) = -4: dataValue(5) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub
Public Sub Select3()
    Dim gpCode(6) As Integer
    Dim dataValue(6) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 67: dataValue(1) = 1
    gpCode(2) = 0: dataValue(2) = "INSERT"
    gpCode(3) = 2: dataValue(3) = M_Constant.BLOCK_NAME
    gpCode(4) = 8: dataValue(4) = M_Constant.LAYER_1
    gpCode(5) = 8: dataValue(5) = M_Constant.LAYER_2
    gpCode(6) = -4: dataValue(6) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub
Public Sub Select4()
    Dim gpCode(4) As Integer
    Dim dataValue(4) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 67: dataValue(1) = 1
    gpCode(2) = 0: dataValue(2) = "INSERT"
    gpCode(3) = 2: dataValue(3) = M_Constant.BLOCK_NAME
    gpCode(4) = -4: dataValue(4) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub
Private Sub vSelect(groupCode As Variant, dataCode As Variant)
    Dim ss As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets.Item(M_Constant.SET_NAME).Delete
    Set ss = ThisDrawing.SelectionSets.Add(M_Constant.SET_NAME)
    Dim mode As Integer
    mode = acSelectionSetAll
    ss.Select mode, , , groupCode, dataCode
    MsgBox ss.Count
End Sub

И попробуйте мне сказать, что эта конструкция не работает!
Еще пара слов попутно.
Для работы программы (в нашем случае) неважно в каком порядке расположены условия в конструкции:
If () then
-----
ElseIf
------
End if
Располагайте их так, чтобы вам было легче читать код.
Я выбрал более лаконичный вариант, чтобы избежать трудно воспринимаемых выражений типа:

If Not (IsEmpty(fData(0))) Or fData(0) <> "" Then

Re: Фильтр

Прошу прощения, напутал.
Следует заменить пару процедур:

Private Sub CmdOK_Click()
    If (Me.CheckBox1.Value) And (Not (Me.CheckBox2.Value)) Then
        Call Select1
    ElseIf (Me.CheckBox2.Value) And (Not (Me.CheckBox1.Value)) Then
        Call Select2
    ElseIf (Me.CheckBox1.Value) And (Me.CheckBox2.Value) Then
        Call Select3
    Else
        Call Select4
    End If
End Sub
'-----------------------------
Public Sub Select3()
    Dim gpCode(8) As Integer
    Dim dataValue(8) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 67: dataValue(1) = 1
    gpCode(2) = 0: dataValue(2) = "INSERT"
    gpCode(3) = 2: dataValue(3) = M_Constant.BLOCK_NAME
    gpCode(4) = -4: dataValue(4) = "<OR"
    gpCode(5) = 8: dataValue(5) = M_Constant.LAYER_1
    gpCode(6) = 8: dataValue(6) = M_Constant.LAYER_2
    gpCode(7) = -4: dataValue(7) = "OR>"
    gpCode(8) = -4: dataValue(8) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    Call vSelect(groupCode, dataCode)
End Sub