Тема: AutoCAD блоки

Уважаемые знатоки, объясните пожалуйста в чем ошибка. У меня имеются множество блоков с атрибутами. В ручную, я выделяю рамкой несколько из них. Программно мне нужно определить какие из блоков выделены, для дальнейшего выравнивания по горизонтали атрибутов выделенных блоков и создания спецификации по атрибутам выделенных блоков.
Private Sub CommandButton6_Click()
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim intType(0) As Integer
Dim varData(0) As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
If objSelSet.Name = "Only" Then
objSelSet.Delete
Exit For
End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("Only")
intType(0) = 0
varData(0) = "INSERT" '"INSERT
objSelSet.SelectOnScreen intType, varData
Set SelectOnlyOnScreen = objSelSet
End Sub
Выдает. Почему?
Run-time error '-2145320932 (8021001c)' AutoCAD main window is invisible
С уважение Андрей

Re: AutoCAD блоки

ИМХО всю дорогу, потому как с VBA знаком не очень близко.
1. Добавить intType(1) = 66 и varData(1) = 1 - тогда будут выделяться только блоки с переменными атрибутами.
2. SelectOnlyOnScreen объявлена?
3. Судя по имени процедуры, ты пробуешь добраться до окна (точнее, набора объектов) када при незакрытой форме. Насколько мне известно, это так просто не сделать - форму то ли Hide надо делать, то ли вообще Unload...

Re: AutoCAD блоки

Чет название темы абсолютно не соответствует проблеме.. При чем здесь блоки-то?:)
А форме действительно надо сделать .Hide перед выполнением кода кнопки..

Re: AutoCAD блоки

А как нужно было объявить SelectOnlyOnScreen? Возможно выбранный мной метод ошибочный. Мне нужно программно определить какие из блоков уже выделены вручную, и получить программно доступ для выравнивания по горизонтали атрибутов этих выделенных блоков.
Извините за неточное название темы.
С уважением андрей.

Re: AutoCAD блоки

Ну к примеру, наверное, так:

Dim SelectOnlyInScreen As AcadSelectionSet

Сидор Лютый, поправь меня, а то пишу по памяти...

Re: AutoCAD блоки

Да, все верно здесь.
Просто SelectOnScreen не может выполниться, пока основная форма "висит" на экране (на счет модальности форм в каде не знаю, пока нет повода разобраться:). Например, в екселе можно работать в листе при открытой форме)
Нужно всего лишь в начале этой процедуры выполнить .Hide основной формы, а в конце снова .show

Re: AutoCAD блоки

Большое Вам спасибо за помощь!
С уважением Андрей.

Re: AutoCAD блоки

> Андрей
Я тут недавно делал что-то подобное может как
раз в твою тему, измени по ситуации

Option Explicit
Private Sub CommandButton1_Click()
Dim attArr() As AcadAttributeReference
Dim blkRef As AcadBlockReference
Dim attObj As AcadAttributeReference
Dim setObj As AcadSelectionSet
Dim fType(2) As Integer
Dim fData(2) As Variant
Dim unitObj As AcadEntity
Dim blkName As String
Dim i As Integer
Me.Hide
blkName = "PIKET" ''ListBox1.Text
fType(0) = 0
fData(0) = "Insert"
fType(1) = 66
fData(1) = 1
fType(2) = 2
fData(2) = blkName
Set setObj = vbdPowerSet("$AttSset$")
setObj.SelectOnScreen fType, fData
For Each unitObj In setObj
If TypeOf unitObj Is AcadBlockReference Then
Set blkRef = unitObj
attArr = blkRef.GetAttributes
For i = 0 To UBound(attArr)
Set attObj = attArr(i)
If attObj.Rotation <> 0# Then
attObj.Rotation = 0#
End If
Next i
End If
Next unitObj
CommandButton2.SetFocus
Me.Show
End Sub
Private Sub CommandButton2_Click()
Unload Me
End
End Sub
'' grabbed from smbd
Public Function vbdPowerSet(strName As String) As AcadSelectionSet
Dim objSelSet As AcadSelectionSet
Dim objSelCol As 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

Fatty
~'J'~

Re: AutoCAD блоки

Большое спасибо за помощь. Я уже разобрался.

Re: AutoCAD блоки

Здравствуйте! Наткнулась на вашу тему, ища на просторах интернета ответ на похожий вопрос.
Есть макрос для Autocad 2007, который хорошо работает в этой версии автокада. Но в Autocad 2012 макрос по началлу выполнялся, а затем стала появляться ошибка. Ошибка вскакивает, когда нажимаешь финишную кнопку (т.е. окно с формой заполнения данный выскакивает, данные заполнить можно, но при нажатии на кнопку "Принять" высвечивается ошибка Run-time error '-2145320932 (8021001c)' AutoCAD main window is invisible). Что может быть не так в коде?
Private Sub CommandButton2_Click()
    ZoomAll
    main.Oshibka = 0
      main.GetMainData
      main.GetSloiData
      main.GetObrasziData
      main.GetVodaData
      main.GetGrafZondirData
      main.GetGrafVihKernaData
    If main.Oshibka <> 0 Then Exit Sub
      main.MakeArraysBeautiful
      Data.Hide
      Unload Data
      SostavKolonki.Hide
      Unload SostavKolonki
      main.GetParamDraw
      main.CreateLayers
      main.DrawTable
      main.DrawMainData
      main.DrawSkale
      main.DrawSloi
      main.DrawVoda
      main.DrawObras
      main.DrawSkvazina
      main.DrawGrafikVihKerna
      main.DrawGrafik
      main.DrawRamka
      ZoomAll
     
      If MsgBox("Сохранить объект?", 4, "Сохранение объекта") = 6 Then
        main.ErrorLoadFile = 0
        main.SaveFile
        If main.ErrorLoadFile <> 0 Then
          MsgBox "Файл не сохранен", vbCritical
          Exit Sub
        Else
          main.ErrorLoadFile = 0
          main.WriteDataInFile
          If main.ErrorLoadFile <> 0 Then
            Exit Sub
          Else
            MsgBox "Файл сохранен в " & VBA.Chr(13) & main.ObjSaveFileName
          End If
        End If
      Else
    End If
     
End Sub