Тема: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

добрый день проффесионалы!
мне по работе срочно нужно решить одну задачу.
мне нужно выбрать большое количество объектов в один selection set потом распределить их по имени объекта напиример полилинии в  poliline и так далее.
то есть мне нужно переместить конкретные Itemi из одного selection set в другой. я не смог справиться с additems и removeitems. заранее Вам очень благодарен.
с уважением Саша

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Саша
Для образцу:

Option Explicit
Sub SortSelByObjName()
Dim sset As AcadSelectionSet
Dim lwpset As AcadSelectionSet
Dim lnset As AcadSelectionSet
Dim txtset As AcadSelectionSet
Dim mtxset As AcadSelectionSet
Dim blkset As AcadSelectionSet
Dim crcset As AcadSelectionSet
Dim obj(0) As AcadObject
Dim ent As AcadEntity
Dim lwp As AcadLWPolyline
Dim ln As AcadLine
Dim txt As AcadText
Dim mtx As AcadMText
Dim blk As AcadBlockReference
Dim crc As AcadCircle
For Each sset In ThisDrawing.SelectionSets
On Error Resume Next
sset.Delete
Next
If Err Then
Err.Clear
End If
On Error GoTo 0
'//
Set sset = ThisDrawing.PickfirstSelectionSet
sset.Clear
sset.SelectOnScreen
'//
With ThisDrawing.SelectionSets
Set lwpset = .Add("Lwplines")
Set lnset = .Add("Lines")
Set txtset = .Add("Texts")
Set mtxset = .Add("Mtexts")
Set blkset = .Add("Blocks")
Set crcset = .Add("Circles")
End With
'//
For Each ent In sset
If TypeOf ent Is AcadLWPolyline Then
Set obj(0) = ent
lwpset.AddItems obj
ElseIf TypeOf ent Is AcadLine Then
Set obj(0) = ent
lnset.AddItems obj
ElseIf TypeOf ent Is AcadText Then
Set obj(0) = ent
txtset.AddItems obj
ElseIf TypeOf ent Is AcadMText Then
Set obj(0) = ent
mtxset.AddItems obj
ElseIf TypeOf ent Is AcadBlockReference Then
Set obj(0) = ent
blkset.AddItems obj
ElseIf TypeOf ent Is AcadCircle Then
Set obj(0) = ent
crcset.AddItems obj
Else
' do nothing
End If
Next
'//
MsgBox "Total: " & sset.Count & vbCr & _
String(12, "_") & vbCr & vbCr & _
"Plines: " & vbTab & lwpset.Count & vbCr & _
"Lines: " & vbTab & lnset.Count & vbCr & _
"Texts: " & vbTab & txtset.Count & vbCr & _
"Mtexts: " & vbTab & mtxset.Count & vbCr & _
"Blocks: " & vbTab & blkset.Count & vbCr & _
"Circles: " & vbTab & crcset.Count, , "SELECTED:"
'
' rest code goes here
'
' clean up selections
sset.Clear
lwpset.Clear
lnset.Clear
txtset.Clear
mtxset.Clear
blkset.Clear
crcset.Clear
End Sub

Добавь типы объектов по ситуации, соответсtвенно
и наборы тоже
~'J'~

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

Вот еще вариант. Здесь яснее видна работа с динамическим массивом:

Sub SelSet()
    Dim ss As AcadSelectionSet
    On Error Resume Next
    ThisDrawing.SelectionSets("sasha").Delete
    Set ss = ThisDrawing.SelectionSets.Add("sasha")
    ss.Clear
    ss.Select acSelectionSetAll
    Dim n As Integer
    n = ss.Count
    Dim vEntity As AcadEntity
    ReDim dinArray(n) As AcadEntity
    Dim i As Integer
    i = 0
    For Each vEntity In ss
        If TypeOf vEntity Is AcadLWPolyline Then
            Set dinArray(i) = vEntity
            i = i + 1
        End If
    Next vEntity
    ReDim Preserve dinArray(i - 1) As AcadEntity
    Dim ssPL As AcadSelectionSet
    ThisDrawing.SelectionSets.Item("sashaPL").Delete
    Set ssPL = ThisDrawing.SelectionSets.Add("sashaPL")
    ssPL.Clear
    ssPL.AddItems (dinArray)
End Sub

> Fatty
Может не стОит так лихо рубить все наборы в рисунке? Возможно кто-то ими пользуется.

For Each sset In ThisDrawing.SelectionSets
On Error Resume Next
sset.Delete
Next

Я бы предпочел уничтожать их поименно:

On Error Resume Next
With ThisDrawing.SelectionSets
    .Item("Lwplines").Delete
    .Item("Lines").Delete
    .Item("Texts").Delete
    .Item("Mtexts").Delete
    .Item("Blocks").Delete
    .Item("Circles").Delete
    Set lnset = .Add("Lwplines")
    Set lnset = .Add("Lines")
    Set txtset = .Add("Texts")
    Set mtxset = .Add("Mtexts")
    Set blkset = .Add("Blocks")
    Set crcset = .Add("Circles")
End With

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

Спасибо Вам за помощь я думаю уже разберусь только одно проблема с именами блоков.
там сотня блоков и мне нужно создать массив который будет содержать только индивидуальный список их имен. мне нужно будет потом вызывать каждый имя по отдельности из этого массива и создвать selection set по их именам и собирать их. просто нужно сделать так чтобы в массиве не было дубликатов имен.
я буду очень благодарен если вы поможете с массивом разобраться.
заранее благодарен Вам
Саша

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Саша
Для создания множества уникальных элементов
лучше всего пользоваться коллекциями или
словарями. См. Help по VBA
и еще посмотри вздесь:
C:\Program Files\AutoCAD 200X\Sample\VBA\attext.dvb
~'J'~

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Саша
Для образца: собираем информацию в коллекцию,
потом конвертируем ее в динамический массив

Option Explicit
Sub GetAllBlocks()
Dim oSset As AcadSelectionSet
Dim fcode(0) As Integer
Dim fdata(0) As Variant
Dim dxfCode, dxfData
Dim oBlkRef As AcadBlockReference
Dim bName As String
Dim countColl As New Collection
Dim n As Long, i As Long
Dim oEnt(0) As AcadObject
On Error GoTo Err_Control
fcode(0) = 0
fdata(0) = "insert"
dxfCode = fcode: dxfData = fdata
'//
On Error Resume Next
Set oSset = ThisDrawing.SelectionSets.Add("$SelBlocks$")
If Err.Number <> 0 Then
Set oSset = ThisDrawing.SelectionSets.Item("$SelBlocks$")
Err.Clear
End If
On Error GoTo 0
' select all blocks
'oSset.Select acSelectionSetAll, , , dxfcode, dxfdata
' or select on screen
oSset.SelectOnScreen dxfCode, dxfData
'//
If Not oSset Is Nothing Then
Do While oSset.Count > 0
bName = oSset.Item(0).Name
'//
For i = oSset.Count - 1 To 0 Step -1
Set oBlkRef = oSset.Item(i)
'//
If StrComp(oBlkRef.Name, bName, vbTextCompare) = 0 Then
n = n + 1
Set oEnt(0) = oBlkRef
oSset.RemoveItems (oEnt)
End If
'//
Next i
'//
Dim tmp(1)
tmp(0) = bName: tmp(1) = n
countColl.Add tmp, bName
n = 0
Loop
End If
'//
' convert collection into dynamic array
If countColl.Count > 0 Then
ReDim countArr(0 To countColl.Count - 1, 0 To 1)
For i = 1 To countColl.Count
countArr(i - 1, 0) = countColl.Item(i)(0)
countArr(i - 1, 1) = countColl.Item(i)(1)
Next i
End If
'// Test:
Dim msg As String
msg = ""
For i = 0 To UBound(countArr, 1)
msg = msg & vbCr & "Blocks " & countArr(i, 0) & " : " & vbTab & countArr(i, 1)
Next i
'//
MsgBox msg, vbInformation, "Count Blocks"
'//
Exit_Here:
ThisDrawing.SelectionSets.Item(ThisDrawing.SelectionSets.Count - 1).Delete
Exit Sub
'//
Err_Control:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
Resume Exit_Here
End Sub

~'J'~

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

Вот более простой способ получить коллекцию из неповторяющихся строк (имен блоков). Вставить вместо цикла:
Do While oSset.Count > 0
- - - - - - - - - - - -
Loop
и т.д.

 On Error Resume Next
 - - - - - - - - - - - -
    Dim i As Integer
    For i = 0 To (oSset.Count - 1)
       bName = oSset.Item(i).Name
       countColl.Add bName, [b]bName[/b]
    Next i

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> LeonidSN
Ага, а после этого тебе надо будет снова циклом
прогонять эту коллекцию, чтобы получить количество
вхождений блоков, не уверен, что это лучше
~'J'~

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Fatty
А почему нет? Так даже получается лучше структурированный код, и можно использовать свои заготовки:

Sub GetAllBlocks()
- - - - - - - - - - - - - - -
   For i = 1 To countColl.Count
        oSset.Clear
        Set oSset = GetSelSet(countColl(i))'а что с ними делать дальше не ясно...
   Next i
End Sub
Private Function GetSelSet(bName As String) As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  Dim intDXF(3) As Integer
  Dim varVal(3) As Variant
  On Error Resume Next
  ThisDrawing.SelectionSets("Test_Sel").Delete
  Set objSelSet = ThisDrawing.SelectionSets.Add("Test_Sel")
  Dim intType(0 To 3) As Integer
  Dim varData(0 To 3) As Variant
  intType(0) = -4: varData(0) = "<AND"
  intType(1) = 0: varData(1) = "INSERT"
  intType(2) = 2: varData(2) = bName
  intType(3) = -4: varData(3) = "AND>"
  objSelSet.Select acSelectionSetAll, Filtertype:=intType, filterdata:=varData
  Set GetSelSet = objSelSet
  Set objSelSet = Nothing
End Function

Давай спросим Сашу, что ему больше понравилось?
А если серьезно, то я не собирался решать полностью задачу (которую Саша обрисовал прямо скажем не очень...), а просто поделился приемом, чтобы показать что в данном случае можно обойтись без явного сравнения строк -

If StrComp(oBlkRef.Name, bName, vbTextCompare) = 0 Then

VBA сделает это за нас.

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

друзья я очень польщен Вашим отношением к моей проблеме!!!
все выше указанное я использую в различных вариантах с блоками.
большая благодарность Вам за такие примеры
я наверника сделаю использую метод собрания всех в selection set потом образую динамический массив, введу первый элемент объект (его название) потом последуюшие буду сранивать с элементами дин массива и врезультате получиться то что мне нужно.
я думаю это получится используя все ваши примеры.
я надеюсь после того как получится у меня будет возможность поставить его на всеобщее использование посетителям сайта.
большая благодарность
Саша

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

Добрый вечер знатоки
у меня появилась проблема с удалением из элемента динамического массива.
я написал код сравнения первого числа со всеми остальными потом второго с остальными.
проблема появиласть тогда когда я захотел удалить например третье число которое равно с первым и тем самым уменьшить размер массива и
и соответственно число дальнейших сравнений.
как мне поступить при этом ?
заранее благодарен за помощь
Саша

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Саша
Лучше начни новую тему, потому что вопрос
не соответствует названию ветки
И проверь что ты пишешь, не перепутал чего часом?
~'J'~

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

> Саша
Саша, есть правило форума: одна тема - один вопрос, то-есть, если появился новый вопрос, открывай новую тему. Мы все заинтересованы в соблюденни правил поскольку они помогают держать форум на плаву. Присоединяйся...

Re: СОРТИРОВКА ВЫДЕЛЕННЫХ ОБЪЕКТОВ ПО SELECTION SET

Уважаемые знатоки!
я извиняюсь за то что не знал правила !
вчера гуляя по интернету по VB сайтам я набрел на Collection и изучив его более или менее я смог решит свою задачу.
но знания по динамическим массивам я использую в будущем.
больщая благодарность за помощь
Саша