Исключающий фильтр в SelectOnScreen
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Исключающий фильтр в SelectOnScreen

Исключающий фильтр в SelectOnScreen

Ответ
Поиск в этой теме
Непрочитано 16.05.2008, 14:17 #1
Исключающий фильтр в SelectOnScreen
Mischa
 
Москва
Регистрация: 10.10.2007
Сообщений: 23

Здравствуйте. Вопрос такой. Возможно ли чтобы при работе SelectOnScreen отфильтровывались объекты лежащие на определённом слое? Если сделать этот слой замороженным не видно что выбирать. Если слой заблокировать объекты выбираются.
Просмотров: 4603
 
Непрочитано 16.05.2008, 14:37
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Да, можно. В примере ниже фильтарация по другим критериям, но принцип думаю будет понятен:
Код:
[Выделить все]
(defun demo (/ norm sel)
 (vla-clear (setq norm (vlax-3d-point '(0.0 0.0 1.0))
                  sel  (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
            )
 )
 (vla-selectonscreen
  sel
  (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 2)) '(-4 0 -4))
  (vlax-safearray-fill
   (vlax-make-safearray vlax-vbvariant '(0 . 2))
   '("<NOT" "3DSOLID,REGION" "NOT>")
  )
 )
 (vlax-for i sel (vla-put-normal i norm))
 (vla-clear sel)
 (princ)
)
Alaspher вне форума  
 
Автор темы   Непрочитано 16.05.2008, 15:04
#3
Mischa


 
Регистрация: 10.10.2007
Москва
Сообщений: 23


Спасибо. Но в лиспе я ничего не понимаю. Как это в VBA сделать?
Mischa вне форума  
 
Непрочитано 16.05.2008, 15:15
#4
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


У метода selectonscreen, второй и третий аргументы опциональные (но взаимосвязанные), это фильтр. Оба значения безопасные массивы, где в первом содержатся коды DXF спсков фильтра, а во втором - значения этих кодов. Сами списки аналогичны таковым для ssget, то есть фильтр из моего примера, для ssget выглядел бы так: '((4 . "<NOT") (0 . "3DSOLID,REGION") (4 . "NOT>")). Точную реализацию на VBA не напишу - владею им очень поверхностно.

Для фильтра исключающего слои, массивы должны быть примерно такими:
Код:
[Выделить все]
-4 8 -4
"<NOT" "Слой1,Слой2" "NOT>"

Последний раз редактировалось Alaspher, 16.05.2008 в 15:20.
Alaspher вне форума  
 
Непрочитано 16.05.2008, 23:37
#5
Sync02


 
Регистрация: 07.12.2007
Брест
Сообщений: 243


Можно включать в выбор объекты принадлежащие какому либо слою:
а код -4 вроде только для функции ssget, хотя не проверял
Код:
[Выделить все]
Dim ssetObj As AcadSelectionSet


    Set ssetObj = ThisDrawing.SelectionSets.Add("TEST_SSET")
    Dim codes(0) As Integer
    Dim layername(0) As Variant
    codes(0) = 8
    layername(0) = "Layer1"
    Dim groupCode As Variant
    Dim dataCode As Variant
    groupCode = codes
    dataCode = layername
    ' Add objects to a selection set by prompting user to select on the screen
    ssetObj.SelectOnScreen groupCode, dataCode
Sync02 вне форума  
 
Непрочитано 17.05.2008, 13:13
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


-4 в данном примере позволяет использовать исключающий фильтр, т.е., выбрать примитивы за исключением указанных в фильтре. При прямом выборе по простому фильтру он не нужен и в ssget
Alaspher вне форума  
 
Непрочитано 17.05.2008, 23:14
#7
Sync02


 
Регистрация: 07.12.2007
Брест
Сообщений: 243


или можно сделать проще ))
Код:
[Выделить все]
    For i = 0 To selectiosetObj.Count - 1
        If selectiosetObj.Item(i).Layer <> "исключаемый слой" Then
            'обработка всех объектов кроме находящихся на исключаемый слой
        End If
    Next i
Sync02 вне форума  
 
Непрочитано 18.05.2008, 01:08
#8
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Сохрани как образец

Код:
[Выделить все]
Option Explicit

Sub SelectAllButLayer()
    Dim oSset As AcadSelectionSet
    With ThisDrawing.SelectionSets
        While .Count > 0
            .Item(0).Delete
        Wend
        Set oSset = .Add("$Allbutthislayer$")
    End With
    Dim fcode(0 To 2) As Integer
    Dim fvalue(0 To 2) As Variant
    Dim dxfCode, dxfValue
    fcode(0) = -4: fvalue(0) = "<not"
    fcode(1) = 8: fvalue(1) = InputBox(vbCrLf & "Enter layer name:", "Layer")
    fcode(2) = -4: fvalue(2) = "not>"
    dxfCode = fcode: dxfValue = fvalue
    oSset.SelectOnScreen dxfCode, dxfValue
    MsgBox oSset.Count

End Sub
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 19.05.2008, 16:27
#9
Mischa


 
Регистрация: 10.10.2007
Москва
Сообщений: 23


Большое спасибо.
Mischa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Исключающий фильтр в SelectOnScreen



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужны фильтры слоев?Как ими пользоваться? Aysulu AutoCAD 43 17.04.2019 10:59
Фильтр слоёв pers2 AutoCAD 5 22.12.2009 13:20
Фильтр для 3D solid klopius AutoCAD 3 27.09.2006 12:07
Фильтр слоев Alexander_Liseev AutoCAD 7 01.03.2006 03:18
Можно ли в SSGET создать фильтр по расширенным данным? {Smirnoff} Программирование 2 25.04.2004 12:44