Тема: Вывод информации о блоке

Здравствуйте.

Мне необходимо выводить информацию о блоке: имя блока, координаты точки привязки, слой, на котором этот блок находиться. С именем блока - все понятно, а вот с остальным возникли трудности. Есть ли какие-нибудь методы для получения данной информации?

Re: Вывод информации о блоке

Сергей Боков пишет:

Мне необходимо выводить информацию о блоке

Куда выводить?

Re: Вывод информации о блоке

А в справке посмотреть?

Ты говоришь про вхождения блока.

Точка вставки - InsertionPoint
Слой - Layer

Re: Вывод информации о блоке

Александр Ривилис пишет:

Куда выводить?

Я так понял в этом проблемы нет.

Нужно справку прочитать, потом форум, а потом вопросы задавать.

(изменено: Сергей Боков, 23 ноября 2010г. 15:12:12)

Re: Вывод информации о блоке

Александр Ривилис пишет:

Куда выводить?

вообще в листбокс

Вильдар пишет:

А в справке посмотреть?

Ты говоришь про вхождения блока.

Точка вставки - InsertionPoint Слой - Layer

смотрел, для AcadBlock не нашел метода или свойства возвращающего ни слой, ни точку привязки.

Так получаю список блоков, и записываю их имена в массив

Public blocks As AcadBlocks
Public sBlock As AcadBlock

Private Sub UserForm_Initialize()
Dim i As Integer
Set blocks = ThisDrawing.blocks
blockCount = blocks.count
ReDim lArray(blockCount - 1)
For i = 0 To blockCount - 1
lArray(i) = blocks(i).Name
Next i
ComboBox1.List = lArray
End Sub

Так, в зависимости от того какой блок выбран, вывожу его имя в листбокс

Private Sub ComboBox1_Change()
ListBox1.Clear
index = ComboBox1.ListIndex
Set sBlock = blocks(index)
ListBox1.AddItem ("Block name" + sBlock.Name)
End Sub

автокад - 2008

Re: Вывод информации о блоке

насчёт слоев, я уже хотел делать так: получаю список всех слоев, и начинаю просматривать примитивы на слое, если нахожу примитив типа блок, то вывожу имя блока и имя слоя. Но что т мне так не хочется делать, криво как-то:(

(изменено: Вильдар, 23 ноября 2010г. 15:26:23)

Re: Вывод информации о блоке

Сергей Боков пишет:

смотрел, для AcadBlock не нашел метода или свойства возвращающего ни слой, ни точку привязки.

Фу-ты, AcadBlock это описание блока, а когда этот блок вставляется например в пространство модели получается вхождение блока AcadBlockReference.

Тебе наверное нужно просмотреть все вхождения блока в блоке модели (ModelSpace)?!
Перебирай все объекты в ModelSpace и отбирай AcadBlockReference, и считывай точки вставки и слои и т.п.

dim ent as AcadEntity
dim blRef as AcadBlockReference

For Each ent in ThisDrawing.ModelSpace
   If Type Of ent is AcadBlockReference Then
      set blRef = ent
      ListBox1.AddItem (blRef.Name + blRef.Layer) 
   End If 
Next

Набил от руки, могут быть обшибки.

Уточни, что требуется. Инфа о всех блорках чертежа, или о всех используемых блоках (вставленных например в модель).

Re: Вывод информации о блоке

Вильдар пишет:

Набил от руки, могут быть обшибки.

спасибо, сейчас попробую

Вильдар пишет:

Уточни, что требуется. Инфа о всех блорках чертежа, или о всех используемых блоках (вставленных например в модель).

в задании не указано, поэтому думаю что о всех

Re: Вывод информации о блоке

Вот что в результате получилось:

Dim ent As AcadEntity
Dim count As Integer
Dim index As Integer
Dim entColl() As AcadBlockReference

Private Sub ComboBox1_Change()
ListBox1.Clear
index = ComboBox1.ListIndex
ListBox1.AddItem ("Имя блока: " + entColl(index + 1).Name)
ListBox1.AddItem ("Слой: " + entColl(index + 1).Layer)
ListBox1.AddItem ("Координаты точки привязки:")
ListBox1.AddItem ("X: " & entColl(index + 1).insertionPoint(0))
ListBox1.AddItem ("Y: " & entColl(index + 1).insertionPoint(1))
ListBox1.AddItem ("Z: " & entColl(index + 1).insertionPoint(2))

End Sub

Private Sub UserForm_Initialize()
Dim i As Integer
i = 0
count = 0

For Each ent In ThisDrawing.ModelSpace
   If TypeOf ent Is AcadBlockReference Then
       count = count + 1
   End If
Next

ReDim entColl(count)

For Each ent In ThisDrawing.ModelSpace
   If TypeOf ent Is AcadBlockReference Then
     i = i + 1
    Set entColl(i) = ent
    ComboBox1.AddItem (entColl(i).Name)
   End If
Next

End Sub

Re: Вывод информации о блоке

Неудачно ты дважды пробегаешься по модели.
Я обычно массивами не заморачиваюсь, а коллекциями (Collection).
Т.е. вместо

Dim entColl() As AcadBlockReference

Я делаю

Dim blRefColl() As New Collection

И не нужно переопределять массив динамический.

Возможно это вредный совет!

Re: Вывод информации о блоке

Вильдар пишет:

И не нужно переопределять массив динамический.

Возможно это вредный совет!

это полезный совет:)

(изменено: Вильдар, 23 ноября 2010г. 18:57:17)

Re: Вывод информации о блоке

Я не проф.программист (а на vba других и нет  :D ),
Что удобней, тем и пользуюсь.