Тема: Фильтр в SelectionSet
Нужно выбрать в selectionset полилинии с определенными высотами, подскажите, как это можно сделать?
поиск не помог :(
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Фильтр в SelectionSet
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Нужно выбрать в selectionset полилинии с определенными высотами, подскажите, как это можно сделать?
поиск не помог :(
А чем плохо просто перебрать все элементы в цикле For Each и проверить высоту? Что есть высота полилинии - толщина?
> Владимир
Вообще-то в терминологии 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'~
Elevation - все верно, не уточнил
for each не проблема перебрать, но это выполняется очень долго, там порядка 50000 линий
задача именно в том, чтобы отобрать фильтром все полилинии с определенными elevation в selectionset, разница во времени - порядки
сами линии отобрал, не нашел код для фильтра по elevation
код 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
А так (без проверки)?
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>"
проблема в том, что выдается ошибка при 38 коде,
без него выбираются все полилинии без учета высот по слоям нормально
ошибка такая
invalid procedure call or argument err.number = 5
> Владимир
Код 38 не работает, если бы работал я б
сразу тебе выложил, хотя в лиспе работает
как часы
~'J'~
есть у кого мысли как это можно сделать?
собственно, необходимость использования selSet простая - быстрая работа
задача - проверка на пересечение всех полилиний(если высоты разные, то принять что тоже пересекаются), тупым перебором доходит до 12 часов, а это очень долго
Fatty]Код 38 не работает, если бы работал я б
сразу тебе выложил, хотя в лиспе работает
как часы
А код на Lisp-е можно посмотреть?
> 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'~
Не вижу выбора больше/меньше по нужному параметру (38). Или я ошибаюсь?
> 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'~
Fatty, огромное тебе спасибо
взял за основу твой код, и переписал VBA макрос на Лисп, теперь работает
а совместное исользование VBA и LISP оказалось непродуктивным, слишком много подводных камней и ограничений
PS Это первый опыт написания на ЛИСП
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Фильтр в SelectionSet
Форум работает на PunBB, при поддержке Informer Technologies, Inc