Тема: AcadSelectionSet для ручной модификации

Dim vSS As AcadSelectionSet
Есть заполненный vSS, как его элементы выделить для ручной модификации, подобно тому как мы выделяем объекты мышью.

Re: AcadSelectionSet для ручной модификации

Неужели это никто не реализовывал?

Re: AcadSelectionSet для ручной модификации

vSS.Highlight True

Оно?

Re: AcadSelectionSet для ручной модификации

В Lisp: (sssetfirst)
В VBA: AutoCAD.Application.ActiveDocument.PickfirstSelectionSet - но это свойство read-only, так что врядли тебе удастся им воспользоваться в данном случае.

Re: AcadSelectionSet для ручной модификации

> kpblc
нет
_________
нужно сделать вот что то наподобие вот этого

vSS.Highlight True
ThisDrawing.SendCommand "(sssetfirst (ssget ""_P"") ) "

но чтоб это не была красивая потделка, как у меня, т.е. после этого, чтоб я мог делать все что мне нужно, например удалить, перместить, но в ручную, программно я знаю как :).

Re: AcadSelectionSet для ручной модификации

Сейчас борюсь с этим же...не могу свой программный набор сделать активным для SendCommand. На "(sssetfirst (ssget ""_P"") ) " пишет "нет предыдущего набора", хотя они все подсвечены. Я понимаю, что подсвечены и выбраны это разные вещи.

Re: AcadSelectionSet для ручной модификации

> Ольга
Если объекты уже выбраны, то:

(ssget)

вернет набор без лишних запросов. Или по другому:

(sssetfirst nil (ssget))

Если нет выбора - будет запрос, но только первый раз, а после будет возвращать каждый раз новые наборы с одними и теми же объектами, хотя подсветка сохранится...

Re: AcadSelectionSet для ручной модификации

> Ольга
Кстати, есть свойство документа
ActiveSelectionSet
может оно?

Re: AcadSelectionSet для ручной модификации

> Евгений Елпанов
Это обратное действие от того что необходимо. Оно заполняет vSS теми объектами которые селектированны, на чертеже.

Re: AcadSelectionSet для ручной модификации

Нет, объекты я создала на чертеже, и в процессе создания, необходимые  положила в свой SelectionSet. Для команд sendcommand берет из ActiveSelectionSet.

Re: AcadSelectionSet для ручной модификации

Так и не могу ничего сделать, извращаюсь как могу: запускаю то VBA, то VLISP, неужели никому не надо было?? перенести (повернуть и тд) только что отрисованные объекты на VBA весь набор, что бы пользователь с помощью мышки мог ввести данные на экране(в VLISP пользуюсь pause)

Re: AcadSelectionSet для ручной модификации

Мне надо, Великие Гуру поможите нам, если Вы существуете ;)

Re: AcadSelectionSet для ручной модификации

Посмотрите на vbamaker.narod.ru - там есть несколько кодов, по-моему, которые работают с ActiveSelectionSet. Только странно - а зачем использовать SendCommand, если можно попробовать работать через штатные свойства и методы объектов?

Re: AcadSelectionSet для ручной модификации

ну как можно через штатные свойста и методы перенести весь набор?? туда куда укажет пользователь?

Re: AcadSelectionSet для ручной модификации

Я тоже голову сломал, пытаясь подсветить созданный SelectionSet по аналогии QSelect-а.:/

Re: AcadSelectionSet для ручной модификации

Аналогично! Интересует эта проблемма! Тоже необходимо выделить объекты программно.
Для чего?
Да потому что некоторые объекты не имеют методов, которые можно произвести врудную.
Например у 3DSolid нет метода Explode. А выделив объекты, над ними можно делать все, что возможно сделать вручную.
Так что пока ломаем голову над этим вопросом.

Re: AcadSelectionSet для ручной модификации

Нашел!!!
Измываясь над _select, обнаружил ее родственницу _PSELECT (есть иконка на окне properties рядом с qselect). Команда в отличие от _SELECT после выбора еще и подсвечивает его грипсами для модификации! Самое странное, что в хелпе эта команда НИКАК и НИГДЕ не фигурирует(!?)
Хотя, скорее всего, многие местные корифеи знали о ее существовани, но, видимо не догадывались о ее полезности в VBA:). Например, теперь я могу, ни много - ни мало, построить свою аналогию QSELECT!

Re: AcadSelectionSet для ручной модификации

> Сидор Лютый
Терзают меня смутные подозрения что эта родственица
имеет фамилию PickFirstSelectionSet
~'J'~

Re: AcadSelectionSet для ручной модификации

Сомнения абсолютно безосновательны!:)
Это совсем другая тема.. PickFirstSelectionSet просто позволяет занести в SelectionSet объекты, выделенные ДО запуска макроса. И ведет себя этот selectionset так же, как и другие его собратья (по-свински:)), - ни с какими баранками не передаст себя назад в автокад для дальнейшей модификации..

Re: AcadSelectionSet для ручной модификации

Нашел наконец свою старую программку, которая использует совместную работу VBA & LISP, передавая значения (handle) через штатную системную переменную USERS1.
Набор A_SSet создается средствами VBA, а затем подсвечивается средствами LISP:

'VBA - part
'-------------------------------------------------------
Private Sub Grips(A_SSet As AcadSelectionSet)
'создание пустого набора средствами LISP:
    ThisDrawing.SendCommand "CreateSet" & vbCr
'заполнение "лисповского" набора примитивами из A_SSet:
    Dim EntHandle As String
    Dim OldName As String
    Dim sysVarName As String
    sysVarName = "USERS1"
'сохранение настройки USERS1:
    OldName = ThisDrawing.GetVariable("USERS1")
    Dim i As Integer
    For i = 0 To (A_SSet.Count - 1)
        EntHandle = A_SSet.Item(i).Handle
        ThisDrawing.SetVariable sysVarName, EntHandle
        ThisDrawing.SendCommand "FullSet" & vbCr
    Next i
'подсветка примитивов из набора:
     ThisDrawing.SendCommand "GripsSet" & vbCr
'обработка набора командой PROPERTIES:
    ThisDrawing.SendCommand "PROPERTIES" & vbCr
'восстановление предыдущей настройки USERS1:
    ThisDrawing.SetVariable sysVarName, OldName
End Sub
;;LISP - part
;;-------------------------------------------------------
;;создание набора примитивов
(defun C:CreateSet (/)
  (setq SelSet_LN (ssadd))
)
;;CreateSet
;;заполнение набора примитивами по их меткам
(defun C:FullSet (/ EntHandle)
  (setq EntHandle (getvar "USERS1"))
  (ssadd (handent EntHandle) SelSet_LN)
)
;;CreateSet
;;подсветка примитивов набора
(defun C:GripsSet (/)
  (sssetfirst nil SelSet_LN)
)
;;GripsSet
;;снятие подсветки
(defun C:UnGripsSet (/)
  (sssetfirst nil)
  (setq SelSet_LN nil)
)
;;UnGripsSet  

Re: AcadSelectionSet для ручной модификации

А вот пример через VBA. Написал для выделения объектов указанного типа в указанном слое. (Указываете какой-нибудь объект и по его имени и слою выделяются остальные)

Option Explicit
'Выделение объектов по типу и слою
'by Алексей Громов
Sub SelByName()
Dim Etalon As AcadEntity
Dim PPoint As Variant
Dim ss As AcadSelectionSet
Dim SSet As AcadSelectionSet
Dim EtName As String
Dim EtLay As String
Dim FType(3) As Integer
Dim FData(3) As Variant
Dim SETS As AcadSelectionSets
Dim ASpace As AcActiveSpace
On Error Resume Next
Set SETS = ThisDrawing.SelectionSets
Call SSCheck("SS01")
ThisDrawing.Utility.GetEntity Etalon, PPoint, "Выбрать по:"
If Etalon Is Nothing Then
    Exit Sub
End If
Select Case Etalon.EntityName
    Case "AcDb3dPolyline"
        EtName = "polyline"
    Case "AcDb2dPolyline"
        EtName = "polyline"
    Case "AcDbPolyline"
        EtName = "lwpolyline"
    Case "AcDbBlockReference"
        EtName = "insert"
    Case "AcDbAlignedDimension"
        EtName = "dimension"
    Case "AcDbRotatedDimension"
        EtName = "dimension"
    Case Else
        EtName = Replace(Etalon.EntityName, "AcDb", "")
End Select
EtLay = Etalon.Layer
ASpace = (Not ThisDrawing.ActiveSpace) + 2
FType(0) = 0
FData(0) = EtName
FType(1) = 8
FData(1) = EtLay
FType(2) = 67
FData(2) = ASpace
FType(3) = 100
FData(3) = Etalon.ObjectName
Set SSet = SETS("SS01")
SSet.Select acSelectionSetAll, , , FType, FData
ThisDrawing.SendCommand "_pselect" & vbCr & "p" & vbCr & vbCr
End Sub
Function SSCheck(SSNM As String)
    Dim SelSet As AcadSelectionSet
    Dim CheckFlag As Boolean
    CheckFlag = False
        For Each SelSet In ThisDrawing.SelectionSets
            If SelSet.Name = SSNM Then
                CheckFlag = True
            End If
        Next SelSet
        If CheckFlag = False Then
            ThisDrawing.SelectionSets.Add (SSNM)
        Else
            ThisDrawing.SelectionSets(SSNM).Clear
        End If
End Function

На всех кадовских объектах не тестировал, писал для себя.. Так что при необходимости эту часть можно будет дополнить:

Select Case Etalon.EntityName
.
.
.
End Select

Функция в конце нужна для проверки SelectionSet-а на существование, т.к. обычная связка

For Each SelSet In ThisDrawing.SelectionSets
    If SelSet.Name = "SS01" Then
        SelSet.Delete
        Exit For
    End If
Next SelSet

у меня почему-то периодически сворачивает напрочь VBE и Автокад. А почему - не могу понять.

Re: AcadSelectionSet для ручной модификации

> Сидор Лютый
Особая благодарность за строку

ThisDrawing.SendCommand "_pselect" & vbCr & "p" & vbCr & vbCr

Re: AcadSelectionSet для ручной модификации

> SmeL
На 2006 ACAD данная строка у меня почему-то не работает, пишет, что нет такой команды.
Без Lisp видимо не обойтись, ниже привожу немного подправленный код, из вышеприведённых примеров, выбирает все объекты в пространстве модели:

Sub SelectToGRIP()
Dim AcadObj As AcadObject
Dim ArrayObj(0) As AcadObject
Dim SelGroupObjs As AcadGroup
   With ActiveDocument
      For Each SelGroupObjs In .Groups
         If UCase(SelGroupObjs.Name) = "$EXPSELGROUPOBJS_0A1H2F3B" Then SelGroupObjs.Delete: Exit For
      Next SelGroupObjs
      Set SelGroupObjs = .Groups.Add("$EXPSELGROUPOBJS_0A1H2F3B")
      For Each AcadObj In .ModelSpace
         Set ArrayObj(0) = AcadObj
         SelGroupObjs.AppendItems ArrayObj
      Next AcadObj
      Set AcadObj = Nothing
      .SendCommand _
        "(sssetfirst nil)" & _
        "(setq expsel(ssget))" & vbCr & _
        "_Group" & vbCr & "$EXPSELGROUPOBJS_0A1H2F3B" & vbCr & vbCr & _
        "(sssetfirst nil expsel)" & _
        "(princ)" & vbCr
   End With
   SelGroupObjs.Delete
   Set SelGroupObjs = Nothing
End Sub

Re: AcadSelectionSet для ручной модификации

Если AutoCAD русский или ещё какой тогда нужно так:
ThisDrawing.SendCommand "_pselect" & vbCr & "_p" & vbCr & vbCr

Re: AcadSelectionSet для ручной модификации

Доброго времени суток
Мой вопрос почти в тему:
У меня имеется некий код на VBA и приделанная к acad команда "_comm1" (типа черного ящика), которая не умеет нормально выбирать объекты (обрабатывает по двадцать-тридцать максимум объектов), но выполняет чрезвычайно важное действие.
Из VBA надо вызвать эту команду и в цикле подсовывать ей уже сформированный набор.
Примерно так:
ThisDrawing.SendCommand "_comm1" & vbCr & "_p" & vbCr & vbCr
Но для этого нужно свои объекты программно поместить в previous selection set. На VBA это вообще можно?