Работа через COM API (макросы VBA) с выносками СПДС

Пользователь выделяет объекты на чертеже через стандартный метод SelectOnScreen Возвращается набор SelectionSet(там разные объекты могут быть, не только СПДС)В этом наборе есть выноски – объекты СПДС. Но они в этом наборе видятся как прокси объекты. А мне надо работать далее с выделенными выносками – текст, координаты.

Есть вариант обратиться к объектам СПДС через сервер СПДС: Server.Query. Но это вообще все объекты чертежа.

Подскажите пожалуйста, как из выбранного пользователем набора обратиться к объектам СПДС в vba excel?

Public ThisDrawing  As Object
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Sub        : method_ss - перебор ячеек таблицы!
'* Created    : 18-06-2025 15:57
'* Author     : VBATools
'* Contacts   : https://vk.com/vbatools
'* Copyright  : VBATools.ru
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Sub        : method_ss - добавьте описание!
'* Created    : 18-06-2025 15:57
'* Author     : VBATools
'* Contacts   : https://vk.com/vbatools
'* Copyright  : VBATools.ru
'* Modified   : Date and Time       Author              Description
'* Updated    : 18-06-2025 15:57    VBATools
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Sub IterCels()
    Dim intType(0)  As Integer
    Dim varDat(0)   As Variant
    Dim objSelSet   As Object
    Dim objNanoCAD  As Object

    Set SPDS = CreateObject("McCOM2.Server")
    On Error Resume Next
    Set objNanoCAD = GetObject(, "AutoCAD.Application")
    If Err.Number <> 0 Then
        Err.Number = 0
        Debug.Print Err.Number
        Set objNanoCAD = GetObject(, "nanoCAD.Application")
        If Err.Number <> 0 Then
            MsgBox "Не запущен CAD"
            Exit Sub
        End If
    End If
    On Error GoTo 0
    Dim ObjMC       As Variant    'McCOM2.SymFrame
    Dim objAK       As Variant
    Set ThisDrawing = objNanoCAD.ActiveDocument
    intType(0) = 0
    varDat(0) = "SPDSTABLE2"

    Set objSelSet = vbdPowerSet("seTEST")
    objSelSet.Select 5, , , intType, varDat
    Debug.Print "spdstable-" & objSelSet.Count
    For Each objAK In objSelSet
        'Stop
        Set acadTable = SPDS.Object(objAK)    'имеем полный доступ к свойствам СПДС в АК _
                                              но в нане "method not implemented under this platform"

        For i = 1 To acadTable.ColCount
            For j = 1 To acadTable.RowCount
                Set cel0 = acadTable.Cell(i, j)
                Set fr = cel0.Format
               'fr.TextAngle = 90
        '  fr.Enabled = False
               
                Debug.Print "DisplayText: " & acadTable.Cell(j, i).DisplayText & " " & "Text: " & acadTable.Cell(j, i).Text
            Next
        Next
        Set cel = acadTable.Cell(1, 3)

        txt = cel.DisplayText

        With acadTable.Cell(i + 1, j + 1)
            sText = .DisplayText

        End With
    Next
End Sub
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Function   : vbdPowerSet - добавьте описание!
'* Created    : 18-06-2025 16:02
'* Author     : VBATools
'* Contacts   : https://vk.com/vbatools
'* Copyright  : VBATools.ru
'* Argument(s):         Description
'*
'* strName As String :
'*
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Public Function vbdPowerSet(strName As String) As Object    'AcadSelectionSet
    Dim objSelSet   As Object    ' AcadSelectionSet
    Dim objSelCol   As Object    ' AcadSelectionSets
    Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
        If objSelSet.Name = strName Then
            objSelSet.Delete
            Exit For
        End If
    Next
    Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
    Set vbdPowerSet = objSelSet
End Function


@kpblc
есть в справке по McCOm2
еще есть у @kpblc ObjectId в McObjectId

в селсет есть фильтры, используй их, что бы в набоор попадало только нужное

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

1 лайк

Угу, только они с объектами СПДС могут и не срабатывать. У меня по крайней мере в какой-то момент в лиспе не срабатывали (и плевать на регистр было).

На старых нано именно через фильтры спдс и собирал ибо перекидывать объекты платформы в мультикад его слишком долго учили
На вебеа, тыж в курсе в лисп я не умею

Спасибо!

Вот оно:

Set spdsObj = SPDS.Object(objAK)

Теперь в spdsObj имеем полноценный объект SPDSсо всеми свойствами, полученный из выделенного объекта АК.