VBA. layout's block и аттрибуты
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. layout's block и аттрибуты

VBA. layout's block и аттрибуты

Ответ
Поиск в этой теме
Непрочитано 28.01.2013, 17:43 #1
VBA. layout's block и аттрибуты
Surrogate
 
Регистрация: 19.10.2009
Сообщений: 17

Еще один вопрос: Как обращаться к блокам на лэйаутах.

У меня есть документ в Акаде, в котором на каждом лэйауте есть блок. Мне нужна на каждом лэйауте подставить значения атрибута блока на значение из ячеек экселя.

Я имею некоторый опыт по программированию в Visio. Там есть аналог Layout - Page, аналог Block - Group shape.
Для обращения к шейпу (блоку) с именем "new" на первом листе активного документа используется код
Код:
[Выделить все]
ThisDocument.Pages(1).Shapes("new")
Почитал "AutoCAD 2004 VBA—A Programmer's Reference", и не смог там найти упоминаний как обратиться к блоку на заданном лэйауте.
Получается блоки принадлежат только к коллекции ThisDrawing ?
Код:
[Выделить все]
ThisDrawing.Blocks.Item(strName)
И никак нельзя обратиться программно к некоему блоку с заданным на конкретном лэйауте ?!
__________________
Просмотров: 10358
 
Непрочитано 28.01.2013, 17:48
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


По имени никак - т.к. их там может быть тысячи с одинаковым именем, если подразумевается, что он там один - берете все объекты листа и отфильтровываете все блоки с необходимым Вам именем.
з.ы.
Цитата:
ThisDrawing.Blocks.Item(strName)
А, Вы по ходу путаете вхождения блока и его описание - "стандартная" ошибка, поищите по форуму и разберитесь где кто.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.01.2013, 22:17
1 | #3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Можно получить имя Layout следующим образом,
простой пример, работает для любых типов объектов

Код:
[Выделить все]
Option Explicit
Public Function LayoutByObject(oEnt As AcadEntity) As AcadLayout
Dim oBlock As AcadBlock
Set oBlock = ThisDrawing.ObjectIdToObject(oEnt.OwnerID)
If Not oBlock Is Nothing And oBlock.IsLayout Then
Set LayoutByObject = oBlock.Layout
End If
End Function


Sub GetEntityLayout()
Dim pickPt
Dim oEnt As AcadEntity

ThisDrawing.Utility.GetEntity oEnt, pickPt, vbCrLf & "Select entity:"
If Not oEnt Is Nothing Then
Dim oLayout As AcadLayout
Set oLayout = LayoutByObject(oEnt)
MsgBox "LayoutName = " & oLayout.Name
End If
End Sub
Олег (jr.) вне форума  
 
Непрочитано 29.01.2013, 13:02
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Можно получить имя Layout следующим образом,
топикстартер спрашивает о другом.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 30.01.2013, 15:31
#5
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Я совсем запутался…
если GetEntity -то мне надо указывать объект (одно из вхождение блока мышью) ? или все-таки лучше использовать SelectionSet ?
__________________
Surrogate вне форума  
 
Непрочитано 30.01.2013, 16:25
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Surrogate Посмотреть сообщение
если GetEntity -то мне надо указывать объект (одно из вхождение блока мышью) ? или все-таки лучше использовать SelectionSet ?
Для начала определись какой тип объекта выбирать
набери в командной строке Автокада (скопируй отсюда):
Код:
[Выделить все]
(entget (car (entsel "\nВыбрать шейп: ")))
результат из командной строки скопируй и покажи здесь,
проще будет создать фильтр
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 30.01.2013, 17:15
#7
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Цитата:
Выбрать шейп: ((-1 . <Entity name: 7ffffb1f380>) (0 . "INSERT") (5 . "66708")
(102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 7ffffb1f390>) (102 . "}") (330
. <Entity name: 7ffffb1f330>) (100 . "AcDbEntity") (67 . 1) (410 . "СО-2") (8 .
"0") (100 . "AcDbBlockReference") (66 . 1) (2 . "*U57") (10 -4.85772 -4.85771
0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0)
(45 . 0.0) (210 0.0 0.0 1.0))
до блока добираться я научился
Код:
[Выделить все]
Dim bk As AutoCAD.AcadBlock
Set bk = AutoCAD.ActiveDocument.Blocks.Item(4)   ' по ID блока
Set bb = AutoCAD.ActiveDocument.Blocks.Item("Ramka") ' по имени блока

(картинка кликабельна)
а вот с вхождениями блока не ясно, судя по объектной модели BlockRef входит в коллекцию ModelSpace ! Или я чего-то не догоняю ?
__________________
Surrogate вне форума  
 
Непрочитано 30.01.2013, 17:49
#8
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Объект AcadBlockReference является (графической ) вставкой самого описания блока (AcadBlock)
То что графическое можно выбирать выбором или указанием (GetEntity)
По твоему скопированному тексту ясно что это блок и притом анонимный -
под кодом 2 его имя начинается на "`*U*"
Сам фильтр создашь или помочь?
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 30.01.2013, 18:13
#9
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Если не сложно, то помочь ! удалил блок, вставил новый такой же
Цитата:
Выбрать шейп: ((-1 . <Entity name: 7ffffb90690>) (0 . "INSERT") (330 . <Entity
name: 7ffffb1f330>) (5 . "D3D41") (100 . "AcDbEntity") (67 . 1) (410 . "СО-2")
(8 . "0") (370 . 9) (100 . "AcDbBlockReference") (66 . 1) (2 . "Рамка") (10 -4.93626 -4.82871 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0)
(50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
__________________

Последний раз редактировалось Surrogate, 17.11.2023 в 17:54. Причина: ссылки на фильтры
Surrogate вне форума  
 
Непрочитано 30.01.2013, 19:12
#10
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Попробуй, измени имя блока если знаешь, можешь посмотреть его в свойствах
из панели свойств
Код:
[Выделить все]
Option Explicit

Public Sub TestBlockSelection()
Dim blocks() As AcadBlockReference
Dim blkref As AcadBlockReference
Dim i
Dim extObjs() As AcadEntity
' block name to find within dynamic blocks:
Dim blkname As String
blkname = "win" ' if you know the block name to be found
' build filter
Dim fType(0 To 2) As Integer
Dim fData(0 To 2) As Variant
Dim dxfCode, dxfValue
fType(0) = 0: fData(0) = "INSERT"
fType(1) = 2: fData(1) = "`*U*," & blkname '' `*U* means anonymous blocks like *U29,*U123 etc, blkname is EffectiveName of block
fType(2) = 100: fData(2) = "{ACAD_XDICTIONARY" ' this filter is added by your data

dxfCode = fType: dxfValue = fData
     Dim oSset As AcadSelectionSet
     Dim ExtSset As AcadSelectionSet
          With ThisDrawing.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
          Set oSset = .Add("$BlockSset$")
          Set ExtSset = .Add("$BlockSsetExtracted$")
          End With

oSset.Select acSelectionSetAll, , , dxfCode, dxfValue
If oSset.Count = 0 Then
MsgBox "Nothing selected"
Exit Sub
Else
MsgBox "Selected " & oSset.Count & " blocks in the current document"
Dim blkColl As New Collection
End If
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
Dim oBlock As AcadBlock
Dim oLayout As AcadLayout
Dim bName As String

For Each oEnt In oSset
  Set oBlkRef = oEnt
 Debug.Print oBlkRef.OwnerID
 Dim obj As AcadBlock
 Set obj = ThisDrawing.ObjectIdToObject(oEnt.OwnerID)
If Not obj Is Nothing And obj.IsLayout Then
Set oLayout = obj.Layout
Debug.Print "Layout: " & oLayout.Name & " Name: " & oBlkRef.EffectiveName
End If

If oBlkRef.EffectiveName = "win" Then
ReDim Preserve extObjs(i) As AcadEntity
Set extObjs(i) = oBlkRef
i = i + 1
End If


Next oEnt
If Not IsNull(extObjs) Then
ExtSset.AddItems (extObjs)
End If
If ExtSset.Count > 0 Then
MsgBox "Found blocks ""win"": " & ExtSset.Count
End If

Err_Control:
If Err.Number <> 0 Then
MsgBox Err.Description
End If

End Sub
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 31.01.2013, 10:19
#11
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Олег (jr.),

к сожалению твой код не работает у меня
На работе я пользуюсь лицензионной сетевой версией автокада 2011, соответственно нет возможности поставить VBA Enabler…
Твой код я запускал из под Excel, предварительно заменив
Цитата:
Acad на AutoCAD.Acad
ThisDrawing на AutoCAD.ActiveDocument
после запуска отредактированного кода, Excel прекращает свою работу…
__________________
Surrogate вне форума  
 
Непрочитано 31.01.2013, 16:49
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Surrogate Посмотреть сообщение
На работе я пользуюсь лицензионной сетевой версией автокада 2011, соответственно нет возможности поставить VBA Enabler…
Тогда меня ставит в недоумение название топика,
причем тут тогда VBA?
На лиспе что ли нужно?
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 31.01.2013, 17:24
#13
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Я запускаю VBA из приложения Excel, т.к. в AutoCADe у меня нет VBA.

в лиспе не нужно, т.к. я хочу разобраться сам! в лиспе точно не получится самому разобраться, ибо я не знаю его…
попробую на поставить дома автокад с поддержкой ВБА. и отладить код там
__________________
Surrogate вне форума  
 
Непрочитано 31.01.2013, 17:56
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Surrogate Посмотреть сообщение
попробую на поставить дома автокад с поддержкой ВБА. и отладить код там
Возможно тогда нужно будет использовать позднее связывание
с Автокадом из Экселя... я пас, слишком долгая возня
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 31.01.2013, 18:10
#15
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


все равно спасибо за помощь !
__________________
Surrogate вне форума  
 
Непрочитано 31.01.2013, 18:30
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Забыл добавить, лучше используй Эксель из Автокада,
чем наоборот, поскольку легче получить данные из Экселя, закрыть его,
а потом делать выбор в Автокаде, иначе будут проблемы с
потерей фокуса на сам Автокад, тогда можно не использовать
позднее связывание а работать напрямую, примера такого под рукой нет
Олег (jr.) вне форума  
 
Непрочитано 31.01.2013, 19:10
#17
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Если >= ACAD 2011 - забей на VBA, ставь VS Express и изучай VB.Net
trir вне форума  
 
Непрочитано 31.01.2013, 19:33
#18
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Поддерживаю полностью
Олег (jr.) вне форума  
 
Непрочитано 31.01.2013, 22:59
#19
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Не поддерживаю полностью

Чтобы не создавать новую тему задам вопрос :
Внутри блока есть много примитивов и блоков, как создать фильтр на VBA, чтобы выбрать только блоки внутри блока ?
maratovich вне форума  
 
Непрочитано 31.01.2013, 23:36
#20
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Прямого фильтра тут не создашь, хотя можешь попробовать
(ssget "_X" (list (cons 0 "insert")(cons 102 "{BLKREFS}" ))))
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 01.02.2013, 01:06
#21
Surrogate


 
Регистрация: 19.10.2009
Сообщений: 17


Цитата:
Сообщение от maratovich Посмотреть сообщение
Не поддерживаю полностью

Чтобы не создавать новую тему задам вопрос :
Внутри блока есть много примитивов и блоков, как создать фильтр на VBA, чтобы выбрать только блоки внутри блока ?
внутри интересующего меня блока около 20 примитивов и один атрибут

Цитата:
Сообщение от trir Посмотреть сообщение
Если >= ACAD 2011 - забей на VBA, ставь VS Express и изучай VB.Net
Я сейчас пытаюсь освоить C#, VS 2010 Professional уже стоит
__________________
Surrogate вне форума  
 
Непрочитано 01.02.2013, 08:53
#22
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Прямого фильтра тут не создашь, хотя можешь попробовать
(ssget "_X" (list (cons 0 "insert")(cons 102 "{BLKREFS}" ))))
Спасибо за помощь, но нужно именно на VBA.
Цитата:
Сообщение от Surrogate Посмотреть сообщение
внутри интересующего меня блока около 20 примитивов и один атрибут
Это на первых порах, когда активно начнёшь использовать - появятся.
maratovich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. layout's block и аттрибуты



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пароль к VBA karp_b Программирование 24 29.08.2013 12:43
Почему при подключенных модулях VBA увеличивается время сохранения чертежа? МишаИнженер Программирование 15 28.04.2012 09:14
застревает файл при копировании, в чем дело? maximas AutoCAD 4 12.11.2010 10:34
Не могу расчленить объекты! msuab2004 AutoCAD 6 24.04.2009 00:17
3D Konstruktor для проектировщиков КМ. Дима_ Готовые программы 17 10.07.2008 10:03