Тема: Фильтр в SelectionSet

Нужно выбрать в selectionset полилинии с определенными высотами, подскажите, как это можно сделать?
поиск не помог :(

Re: Фильтр в SelectionSet

А чем плохо просто перебрать все элементы в цикле For Each и проверить высоту? Что есть высота полилинии - толщина?

Re: Фильтр в SelectionSet

> Владимир
Вообще-то в терминологии AutoCAD я что-то
не нахожу типа "с определенными высотами",
очевидно имеется в иду свойство Elevation?
Коли так, попробуй:

Option Explicit
Sub SetElev()
     Dim oSset As AcadSelectionSet
     Dim oEnt As AcadEntity
     Dim oPline As AcadLWPolyline
     Dim fcode(0) As Integer
     Dim fData(0) As Variant
     Dim dxfcode, dxfdata
     Dim i As Integer
     Dim setname As String
     Dim dblElev As Double
     fcode(0) = 0
     fData(0) = "LWPOLYLINE"
     dxfcode = fcode
     dxfdata = fData
     setname = "$Elevation$"
     For i = 0 To ThisDrawing.SelectionSets.Count - 1
          If ThisDrawing.SelectionSets.Item(i).Name = setname Then
               ThisDrawing.SelectionSets.Item(i).Delete
               Exit For
          End If
     Next i
     Set oSset = ThisDrawing.SelectionSets.Add(setname)
     oSset.Clear
     oSset.Select acSelectionSetAll, , , dxfcode, dxfdata
     MsgBox "Selected: " & oSset.Count & " polylines"
     dblElev = CDbl(InputBox(vbCrLf & vbCrLf & "Enter Polyline Elevation:", _
     "Parameter Input"))
     Dim remObj() As AcadEntity
     For Each oEnt In oSset
          Set oPline = oEnt
          If oPline.Elevation <> dblElev Then
          ReDim Preserve remObj(i)
              Set remObj(i) = oPline
              i = i + 1
          End If
    Next
oSset.RemoveItems remObj
MsgBox "Still in the selection set: " & vbCr & oSset.Count & _
" polylines with elevation " & dblElev
     ThisDrawing.Regen acActiveViewport
End Sub

~'J'~

Re: Фильтр в SelectionSet

Elevation - все верно, не уточнил
for each не проблема перебрать, но это выполняется очень долго, там порядка 50000 линий
задача именно в том, чтобы отобрать фильтром все полилинии с определенными elevation в selectionset, разница во времени - порядки
сами линии отобрал, не нашел код для фильтра по elevation

Re: Фильтр в SelectionSet

код 38 смотри в хелпе по DXF кодам

Re: Фильтр в SelectionSet

код 38 пробовал, не работает
либо не так пробовал
вот код
                intTypeTemp(0) = 0 ' тип
                varDataTemp(0) = "LWPOLYLINE"
                intTypeTemp(1) = -4 ' начало условия
                varDataTemp(1) = "<or"
                intTypeTemp(2) = 8 ' слой
                varDataTemp(2) = "Poly1"
                intTypeTemp(3) = 8 ' слой
                varDataTemp(3) = "Poly2"
                intTypeTemp(4) = 8 ' слой
                varDataTemp(4) = "Poly3"
                intTypeTemp(5) = -4 ' конец условия
                varDataTemp(5) = "or>"
                intTypeTemp(6) = -4 ' тип
                varDataTemp(6) = "<and"
                intTypeTemp(7) = -4 ' тип
                varDataTemp(7) = ">="
                intTypeTemp(8) = 38 ' тип
                varDataTemp(8) = MinElevation
                intTypeTemp(9) = -4 ' тип
                varDataTemp(9) = "<="
                intTypeTemp(10) = 38 ' тип
                varDataTemp(10) = MaxElevation
                intTypeTemp(11) = -4 ' тип
                varDataTemp(11) = "and>"
objSelSetTemp.Select acSelectionSetAll, FilterType:=intTypeTemp, FilterData:=varDataTemp

Re: Фильтр в SelectionSet

А так (без проверки)?

intTypeTemp(0) = -4:    varDataTemp(0) = "<and"
intTypeTemp(1) = 0:     varDataTemp(1) = "LWPOLYLINE"
intTypeTemp(2) = -4:    varDataTemp(2) = "<or"
intTypeTemp(3) = 8:     varDataTemp(3) = "Poly1,Poly2,Poly3" '"Poly*"
intTypeTemp(4) = -4:    varDataTemp(4) = "or>"
intTypeTemp(5) = -4:    varDataTemp(5) = ">="
intTypeTemp(6) = 38:    varDataTemp(6) = MinElevation
intTypeTemp(7) = -4:    varDataTemp(7) = "<="
intTypeTemp(8) = 38:    varDataTemp(8) = MaxElevation
intTypeTemp(9) = -4:    varDataTemp(9) = "and>"

Re: Фильтр в SelectionSet

проблема в том, что выдается ошибка при 38 коде,
без него выбираются все полилинии без учета высот по слоям нормально
ошибка такая
invalid procedure call or argument err.number = 5

Re: Фильтр в SelectionSet

> Владимир
Код 38 не работает, если бы работал я б
сразу тебе выложил, хотя в лиспе работает
как часы
~'J'~

Re: Фильтр в SelectionSet

есть у кого мысли как это можно сделать?
собственно, необходимость использования selSet простая - быстрая работа
задача - проверка на пересечение всех полилиний(если высоты разные, то принять что тоже пересекаются), тупым перебором доходит до 12 часов, а это очень долго

Re: Фильтр в SelectionSet

[Re: пишет:

Fatty]Код 38 не работает, если бы работал я б
сразу тебе выложил, хотя в лиспе работает
как часы

А код на Lisp-е можно посмотреть?

Re: Фильтр в SelectionSet

> BP
Сохрани код как файл ES.lsp
после загрузки файла набрать в
командной строке ES
Опции выбора притивов:
А - выбрать все
S - выбрать любым способом на экране
Далее в конце кода опции на удаление
Y - удалить набор выбора
N - не удалять
Наобум значение Elevation установлено
равным 123.456, измени в коде на свое
конкретное

;;ES.lsp
;; Пример выбора полилиний по значению
;; свойста Elevation
;; для демонстрационных целей
(defun C:ES (/ ans elist en i ss);objects selection by its elevation value
(initget "All Select")
(setq ans (getkword "\nChoose the objects selection method [A]ll or [S]elect on screen <S> "))
(if (not ans)(setq ans "Select"))
(if (eq "All" ans)
    (setq ss (ssget "_X"  (list (cons -4 "<AND")
              (cons 0 "LWPOLYLINE")
              (cons -4 "<AND")
              (cons -4 "=")
              (cons 38 123.456);<--certain elevation, change by suit
              (cons -4 "AND>")
              (cons -4 "AND>"))))
  (setq ss (ssget (list (cons -4 "<AND")
              (cons 0 "LWPOLYLINE")
              (cons -4 "<AND")
              (cons -4 "=")
              (cons 38 123.456);<--certain elevation, change by suit
              (cons -4 "AND>")
              (cons -4 "AND>"))))
    )
  (if ss
  (progn
    (sssetfirst nil ss)
    (setq i -1)
    (repeat(sslength ss)
      (setq en (ssname ss (setq i (1+ i)))
        elist (entget en));(entget (car (entsel))))
      (if (assoc 62 elist)
    (entmod (subst (cons 62 151)(assoc 62 elist) elist))
    (entmod (append elist (list (cons 62 151)))))
      (entupd en))
    (alert "Do someting with this\nselection set what you need")
    (sssetfirst nil nil)
    (initget "Yes No")
    (setq ans (getkword "\nDo you want to delete selected objects? [Y]es or [N] <Y> "))
    (if (not ans)(setq ans "Yes"))
    (if (eq "Yes" ans)
        (command "._erase" ss "")
      )
    )
  )
    (princ)
    )
(princ "\n\t\t***\tВ командной строке введите ES для выполнения\t")
(princ)

~'J'~

Re: Фильтр в SelectionSet

Не вижу выбора больше/меньше по нужному параметру (38). Или я ошибаюсь?

Re: Фильтр в SelectionSet

> BP
Я и не задавался этой целью, в этом листинге
выбор только тех, что имеют Elevation = 123.456
А если для условий больше/меньше, то где-то так:

  (setq ss (ssget (list (cons -4 "<AND")
        (cons 0 "LWPOLYLINE")
        (cons -4 "<AND")
        (cons -4 "<OR")
        (cons -4 ">=")
        (cons 38 MinValue)
        (cons -4 "<=")
        (cons 38 MaxValue)
        (cons -4 "OR>")
        (cons -4 "AND>")
        (cons -4 "AND>"))))

Пишу прямо здесь, могу ошибиться
~'J'~

Re: Фильтр в SelectionSet

Fatty, огромное тебе спасибо
взял за основу твой код, и переписал VBA макрос на Лисп, теперь работает
а совместное исользование VBA и LISP оказалось непродуктивным, слишком много подводных камней и ограничений
PS Это первый опыт написания на ЛИСП