Тема: Как выделить мультилинии, находящиеся в определенном слое?

надо выделить мультилинии, находящиеся в определенном слое. по отдельности выделяет (либо все мультилинии, либо все элементы слоя), а вместе - нет.
не могу понять, почему не работает

intType(0) = -4
intType(1) = 0
intType(2) = 0
intType(3) = -4
varType(0) = "<AND"
varType(1) = "MLine"
varType(2) = "Layer1"
varType(3) = "AND>"
Set objSS = ThisDrawing.SelectionSets.Add("Temp")
objSS.Select acSelectionSetAll, Filtertype:=intType, Filterdata:=varType

Re: Как выделить мультилинии, находящиеся в определенном слое?

Группы "AND" и "OR" употребляются в сложных ситуациях. В вашем случае достаточно просто расширить стандартный фильтр
Dim intType(0 to 1) As Integer
Dim VarType(0 to 1) As Variant
intType(0) = 0
intType(1) = 8
VarType(0) = "MLine"
VarType(1) = "1,2"

Re: Как выделить мультилинии, находящиеся в определенном слое?

Если с "AND" то вот так

varType(0) = -4
varType(1) = 0
[b]varType(2) = 8[/b]
varType(3) = -4
varData(0) = "<AND"
varData(1) = "MTEXT"
varData(2) = "Layer1"
varData(3) = "AND>"

Re: Как выделить мультилинии, находящиеся в определенном слое?

> bender
спасибо, теперь работает
а где можно почитать про эти коэффициенты?
в каких случаях что нужно ставить. в help к акаду не нашел

Re: Как выделить мультилинии, находящиеся в определенном слое?

Мне кажется что для этого нужно поизучать формат dxf а это в стандартном хелпе есть.

Re: Как выделить мультилинии, находящиеся в определенном слое?

> DVAD
Это не коэффициенты, это кода группы DXF. Посмотреть или в справке как предлагает > Сергей (2004-03-31 17:42:11). Или купить книжку и прочитать. Рекомендую Полещука, там хорошо написано.

Re: Как выделить мультилинии, находящиеся в определенном слое?

поднимем тему ещё раз....
скажите, а почему такой код работает:
    Dim gpCode(0 To 3) As Integer
    Dim dataValue(0 To 3) As Variant
    gpCode(0) = -4
    gpCode(1) = 0
    gpCode(2) = 2
    gpCode(3) = -4
    dataValue(0) = "<and"
    dataValue(1) = "INSERT"
    dataValue(2) = Blok_name
    dataValue(3) = "and>"
    ssetObj.Select acSelectionSetAll, Filtertype:=gpCode, filterdata:=dataValue
а такой нет:
    Dim gpCode(0 To 4) As Integer
    Dim dataValue(0 To 4) As Variant
    gpCode(0) = -4
    gpCode(1) = 0
    gpCode(2) = 2
    gpCode(3) = 410
    gpCode(4) = -4
    dataValue(0) = "<and"
    dataValue(1) = "INSERT"
    dataValue(2) = Blok_name
    dataValue(3) = curleaut.Name
    dataValue(4) = "and>"
    ssetObj.Select acSelectionSetAll, Filtertype:=gpCode, filterdata:=dataValue
Там что, на количество условий есть ограничение?
Blok_name - имя блока
curleaut.Name -имя лейаута

Re: Как выделить мультилинии, находящиеся в определенном слое?

вроде как сам нашел в чём дело...
не хочет принимать код 410 (код лейаута)
а как надо сделать, что бы выбрать все объекты (например определённые блоки) на одном лейауте, при условии , что они (блоки) есть на других лейаутах и не должны попасть в набор?

Re: Как выделить мультилинии, находящиеся в определенном слое?

Попробуй так:

Public Function SelSet(Optional sBlockName As String = "*")
Dim objSelSet As AcadSelectionSet
Dim sSelSetName As String
Dim flType() As Integer
Dim flData() As Variant
  sSelSetName = "tempSelSet"
  On Error Resume Next
  ThisDrawing.SelectionSets.Item(sSelSetName).Clear
  ThisDrawing.SelectionSets.Item(sSelSetName).Delete
  Set objSelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
  On Error GoTo 0
  ReDim flType(2)
  ReDim flData(2)
  flType(0) = 0: flData(0) = "INSERT"
  flType(1) = 2: flData(1) = BlockName
  flType(2) = 410: flData(2) = "layout1"
  objSelSet.Select acSelectionSetAll, , , flType, flData
End Function

P.S. На VBA не работаю, так что корректность кода гарантировать не могу.
P.P.S. Посмотри в справке - там вроде были примеры корректные.

Re: Как выделить мультилинии, находящиеся в определенном слое?

не...
всёравно не принимает 410-й код...
    gpCode(0) = 410
    gpCode(1) = 0
    gpCode(2) = 2
    gpCode(3) = 8
    dataValue(0) = curleaut.Name
    dataValue(1) = "INSERT"
    dataValue(2) = Blok_name
    dataValue(3) = "Defpoints"
    ssetObj.Select acSelectionSetAll, , , gpCode, dataValue
без него работает... только выбирает блоки по всем листам..
может их дальше отсортировать проще будет? хотя в свойствах объектов не могу найти свойство про лейаут...

Re: Как выделить мультилинии, находящиеся в определенном слое?

> ssn
Код 410 для VBA - запретная тема, нет такого в VBA
Просто выбирай как в твоем первом случае,
потом в цикле определяй, какой из лэйаутов
является хозяином входящего в набор объекта,
по типу OwnerID->ObjectID, если условие
не удовлетворяется, удаляешь объект из
набора через RemoveItems
Если не сможешь сам, помогу
~'J'~

Re: Как выделить мультилинии, находящиеся в определенном слое?

> Fatty
Но в DXF Reference же указан этот код... Или я чео-то не учитываю?

Re: Как выделить мультилинии, находящиеся в определенном слое?

> Кулик Алексей aka kpblc
А ты сам проверь, будет у тебя работать?
У меня никогда не работал
~'J'~

Re: Как выделить мультилинии, находящиеся в определенном слое?

> Кулик Алексей aka kpblc
Кстати не веришь мне, смотри что говорят асы:
Filtering selection set with 410 dxf code
Re: Frank Oquendo
Known bug. You can't use 410. There are several workarounds. If you want
items in model space or paper space, you can filter on group code 67.
You can also just grab everything and check its OwnerID property ...

Re: Как выделить мультилинии, находящиеся в определенном слое?

> Fatty
Я лучше поверю на слово :) Все равно в VBA почти не работаю, так, иногда балуюсь.

Re: Как выделить мультилинии, находящиеся в определенном слое?

ага.. спасибо, а тоя думал может чего не догоняю..
где то тут я видел про OwnerID->ObjectID
не найду, ещё разок побеспокою

Re: Как выделить мультилинии, находящиеся в определенном слое?

> ssn
Чтоб ты долго не мучался, посмотри два примера:

Option Explicit
Public Sub GetSelectionInLayout(oSset As AcadSelectionSet, layoutName As String)
' by Fatty T.O.H () 2007 * all rights removed
     Dim oLayout As AcadLayout, _
         i As Integer, _
         j As Integer, _
         oID As Long, _
         objArray() As AcadEntity
     Set oLayout = ThisDrawing.Layouts(layoutName)
     oID = oLayout.Block.ObjectID
     For i = 0 To oSset.Count - 1
          If oSset.Item(i).OwnerID <> oID Then
               ReDim Preserve objArray(j)
               Set objArray(j) = oSset.Item(i)
               j = j + 1
          End If
     Next
     oSset.RemoveItems objArray
End Sub
''~~~~~~~~select multilines in the particular layout~~~~~~~''
Sub test1()
     Dim oSset As AcadSelectionSet
     Dim setName As String, i As Integer
     Dim laytName As String
     Dim dxfcode(0 To 1) As Integer
     Dim dxfdata(0 To 1) As Variant
     dxfcode(0) = 0
     dxfdata(0) = "MLINE"
     dxfcode(1) = 67
     dxfdata(1) = 1
     setName = "$Mlines$"
     laytName = "Layout1"
     'Make sure selection set does not exist
     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.Select acSelectionSetAll, , , dxfcode, dxfdata
     MsgBox "There are in the paper space : " & oSset.Count & vbCr & _
            "multilines selected"
     GetSelectionInLayout oSset, laytName
     MsgBox "There are : " & oSset.Count & " multilines" & vbCr & _
            "selected in layout " & Chr(34) & laytName & Chr(34)
End Sub
''~~~~~~~~~~~select multilines in model space~~~~~~~~''
Sub test2()
     Dim oSset As AcadSelectionSet
     Dim setName As String, i As Integer
     Dim dxfcode(0 To 1) As Integer
     Dim dxfdata(0 To 1) As Variant
     dxfcode(0) = 0
     dxfdata(0) = "MLINE"
     dxfcode(1) = 67
     dxfdata(1) = 0
     setName = "$Mlines$"
     'Make sure selection set does not exist
     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.Select acSelectionSetAll, , , dxfcode, dxfdata
     MsgBox "There are in the model space : " & oSset.Count & vbCr & _
            "multilines selected"
End Sub

~'J'~