Тема: Как получить доступ к выделенным объектам на чертеже?

здравствуйте!

с автокадовской объектной моделью только знакомлюсь. нужно сделать вроде бы элементарное - через VBA получить выделенные пользователем объекты на экране. но с налета не получилось.
с VBA работаю давно в разных офисных приложениях. практически везде есть объект типа Selection - набор текущих выделенных элементов на экране. в автокаде не смог найти чего то подобного.
подскажите, как получить набор выбранных объектов имеено на экране (например простой текст)?

Re: Как получить доступ к выделенным объектам на чертеже?

И поиском Вы тоже пользоваться не умеете?
https://www.caduser.ru/forum/search.html

Re: Как получить доступ к выделенным объектам на чертеже?

9rey пишет:

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

Методами VBA никак, чтобы это сделать
нужно использовать VisualLisp и вызывать VBA модуль
функцией (vla-runmacro...)
так что измени логику программы или выделяй объекты
специфическим фильтром по координатам , слоям , типам и тд

(изменено: Anatoly, 20 июня 2013г. 11:43:44)

Re: Как получить доступ к выделенным объектам на чертеже?

Обработка предварительного выбора

Re: Как получить доступ к выделенным объектам на чертеже?

О чем я и толковал

Re: Как получить доступ к выделенным объектам на чертеже?

Boxa Shu, ну че за наивные вопросы то? конечно посмотрел. не то. читай внимательно - ГОТОВЫЙ набор. а не создавать программно.

Anatoly, fixo, спасибо. но мне нужен именно VBA - обращаюсь к объекту Autocad.Application из другого офисного приложения, соответсвенно VBA.

Anatoly, поизучаю инфу по твоей ссылке, но чувствую что мутно всё. не ожидал от автокада такой подлянки))

Re: Как получить доступ к выделенным объектам на чертеже?

9rey пишет:

не ожидал от автокада такой подлянки))

Попробуй обходной путь, без проверок

Public Sub testPickfirst()
Dim ss As AcadSelectionSet

Set ss = ThisDrawing.ActiveSelectionSet
  ReDim ssobjs(0 To ss.Count - 1) As AcadEntity
    Dim I
    For I = 0 To ss.Count - 1
        Set ssobjs(I) = ss.Item(I)
    Next
    Dim newset As AcadSelectionSet
    Set newset = ThisDrawing.SelectionSets.Add("newset")

    newset.AddItems ssobjs

     MsgBox newset.Count

End Sub

Re: Как получить доступ к выделенным объектам на чертеже?

fixo, огромное спасибо за пример! но, почему то работает только первый запуск макроса. далее я меняю на чертеже набор элементов, но макрос выдает старый набор. как его обнулить и сформировать заново? вот я переделал код немного, но новый набор не создается.

Sub cad()
    Dim acad As Object, acaddocs As AutoCAD.AcadDocuments, acaddoc As AutoCAD.AcadDocument
    Dim i As Long
    Dim ss As AcadSelectionSet
    Dim newset As AcadSelectionSet
    
    Set acad = GetObject(, "Autocad.Application")
    Set acaddocs = acad.Documents
    Set acaddoc = acaddocs.Item(0)
    
    On Error Resume Next
    Err.Clear
    Set newset = acaddoc.SelectionSets("newset")
    If Err.Number = 0 Then
        newset.Delete
    End If
    On Error GoTo 0
    
    Set ss = acaddoc.ActiveSelectionSet
    ReDim ssobjs(0 To ss.Count - 1) As AcadEntity
    
    For i = 0 To ss.Count - 1
        Set ssobjs(i) = ss.Item(i)
    Next
    
    Set newset = acaddoc.SelectionSets.Add("newset")

    newset.AddItems ssobjs

    MsgBox newset.Count
End Sub

(изменено: fixo, 21 июня 2013г. 17:20:15)

Re: Как получить доступ к выделенным объектам на чертеже?

Ну, это совсем базовый вопрос
Всегда удаляй выбор из базы документа
в конце программы, навскидку примерно так

Option Explicit

Public Sub testPickfirst()
Dim ss As AcadSelectionSet

Set ss = ThisDrawing.ActiveSelectionSet
Dim setname As String
setname = "newSet"
Dim newset As AcadSelectionSet

          With ThisDrawing.SelectionSets
          Set newset = .Add(setname)
          
  ReDim ssobjs(0 To ss.Count - 1) As AcadEntity
    Dim i
    For i = 0 To ss.Count - 1
        Set ssobjs(i) = ss.Item(i)
    Next

    newset.AddItems ssobjs

     MsgBox newset.Count
     
.Item(setname).Delete
End With

End Sub

Теперь можешь выполнять макрос
сколько нужно

Re: Как получить доступ к выделенным объектам на чертеже?

тогда ответь, чем твое

.Item(setname).Delete

отличается от моего:

Set newset = acaddoc.SelectionSets("newset") 
newset.Delete

я тоже пытаюсь удалить, но у меня при этом не работает удаление набора.

Re: Как получить доступ к выделенным объектам на чертеже?

Вместо

newset.Delete

попробуй

acaddoc.SelectionSets.Item("newset").Delete

Re: Как получить доступ к выделенным объектам на чертеже?

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

Re: Как получить доступ к выделенным объектам на чертеже?

Хорошо что есть где попробовать,
я-то не работаю совсем, поэтому в Автокаде
совсем ничего не понимаю
:)

Re: Как получить доступ к выделенным объектам на чертеже?

Как не пытался.. не получилось заставить код работать.. Выдает ошибку:
"Subscript out of range"
Ругается на строчку:
ReDim ssobjs(0 To ss.Count - 1) As AcadEntity

Помогите пожалуйста разобраться в проблеме. Может быть и вправду без лиспа не обойтись?