| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как узнать имя блока из которого сделан массив на VBA?

Как узнать имя блока из которого сделан массив на VBA?

Ответ
Поиск в этой теме
Непрочитано 03.03.2022, 10:01 #1
Как узнать имя блока из которого сделан массив на VBA?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Как узнать имя блока из которого сделан массив на VBA?
В свойствах массива на VBA у меня есть строка: Name="*U2388"
Что это означает?

Последний раз редактировалось МишаИнженер, 03.03.2022 в 10:34.
Просмотров: 2098
 
Непрочитано 09.03.2022, 07:25
1 | #2
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


собственно свойство Name - это имя блока.
Name="*U2388" - это анонимный блок и нам а это намекает символ *
Как показал следственный эксперимент, "массив" это анонимный блок состоящий из анонимных блоков.
Таким образом, надо по имени блока массива найти его описание. Из него выцарапать внутренний анонимный блок и по его имени найти описание. И уже оттуда получим окончательное содержимое.
С другой стороны, если мы априори знаем что внутри этого массива, может хватить и свойства Count верхнего описания. Но если надо проверять содержимое то копаем на этаж ниже.

1. взял пустой чертеж, нарисовал линю, создал массив
2. (vlax-dump-object (vlax-ename->vla-object (car (entsel))) t) показал мне что это ObjectName (RO) = "AcDbBlockReference" с Name = "*U2"
нашел его описание (vlax-dump-object (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-Acad-Object))) "*U2") t) , увидел Count (RO) = 12
3. пошел ковырять первое вхождение (vlax-dump-object (vla-item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-Acad-Object))) "*U2") 0) t) и нашел там еще один ObjectName (RO) = "AcDbBlockReference" с Name = "*U1"... при перестановке индексов в item будет один тот же анонимный блок
4. ищем описание (vlax-dump-object (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-Acad-Object))) "*U1") t) и там уже Count (RO) = 1 - та самая исходная линия
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 09.03.2022, 08:41
1 | #3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,772


Как бы я делал (без кода):
  1. Получить указатель на блок
  2. Определить, что это массив, а не просто блок
  3. Войти в определение блока
  4. Найти первый элемент
  5. Найти нормальное имя блока
  6. Вернуть имя блока (ну и что там еще понадобиться может)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.03.2022, 12:47
#4
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Найти первый элемент
Найти нормальное имя блока
тут не хватает того что "первый элемент" окажется так же анонимным блоком и надо копать еще на этаж вниз до нормального блока
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 09.03.2022, 12:50
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Согласен
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Vladimir_Sergeevich
Пока что реализовал эту функцию в следующем виде:
Код:
[Выделить все]
Public Function ВычислитьЧислоПовторовОбъектов(blnПризнВыдОбъектов As Boolean)
'Функция вычисляет число повторов выделенного блока
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim objОбъект As AcadObject, objВыдОбъект As AcadObject
Dim I As Long, J As Long, vp As Variant, lngКолвоПовторов As Long
Dim objSelection As AcadSelectionSet, vСписокОбъектов As Variant
Dim objБлок As AcadBlock, vДопОбъекты As Variant
On Error Resume Next
'Получить объекты Excell и AutoCAD
   Call ПолучитьОбъектыExcellИAutoCAD(objПриложениеAutoCAD, objAcadDoc)

'Создадим список объектов чертежа
   If blnПризнВыдОбъектов Then
      Call ПоказатьAutoCAD(objAcadDoc)
      If ПризнакНаличияЭлементаВКоллекции("ВыделенныеОбъекты", objAcadDoc.SelectionSets, 2) Then
         objAcadDoc.SelectionSets("ВыделенныеОбъекты").Delete
      End If
      Set objSelection = objAcadDoc.SelectionSets.Add("ВыделенныеОбъекты")
      
On Error Resume Next
ВыделитьОбъекты:
      Call ПоказатьAutoCAD(objAcadDoc)
      objSelection.SelectOnScreen
      If Err.Number <> 0 Then
         Call ПоказатьExcel(objAcadDoc)
         glОтвет = MsgBox("Завершить выполнение программы?", vbYesNo, gsНазваниеПрограммы)
         If glОтвет = vbYes Then End
         Err.Clear
         GoTo ВыделитьОбъекты
      End If
On Error GoTo ОбработкаОшибок
      
      Set vСписокОбъектов = objSelection
   Else
      Set vСписокОбъектов = objAcadDoc.ModelSpace
   End If
   
'Получим свойства выделенного блока
ВыделитьОбъект:
On Error Resume Next
   Call ПоказатьAutoCAD(objAcadDoc)
   objAcadDoc.Utility.GetEntity objВыдОбъект, vp, "Выдели объект:"
   If Err.Number <> 0 Then
      Call ПоказатьExcel(objAcadDoc)
      glОтвет = MsgBox("Продолжать выделять объект?", vbYesNo, gsНазваниеПрограммы)
      If glОтвет = vbNo Then End
      Err.Clear
      GoTo ВыделитьОбъект
   End If
   If Not TypeOf objВыдОбъект Is AcadBlockReference Then GoTo ВыделитьОбъект
   
'Подсчитаем число повторов блока в чертеже
On Error GoTo ОбработкаОшибок
   For I = 0 To vСписокОбъектов.Count - 1
      Set objОбъект = vСписокОбъектов(I)
      If TypeOf objОбъект Is AcadBlockReference Then
         If objОбъект.Name = objВыдОбъект.Name Then
            objОбъект.Highlight True
            lngКолвоПовторов = lngКолвоПовторов + 1
         Else
            Set objБлок = objAcadDoc.Blocks(objОбъект.Name)
            For J = 0 To objБлок.Count - 1
               Set objОбъект = objБлок(J)
               If TypeOf objОбъект Is AcadBlockReference Then
                  If objAcadDoc.Blocks(objОбъект.Name)(0).Name = objВыдОбъект.Name Then
                     objОбъект.Highlight True
                     lngКолвоПовторов = lngКолвоПовторов + 1
                  End If
               End If
            Next J
         End If
      End If
   Next I
   
'Выведем сообщение о выполненной работе
   Sheets("Позиции").Range("ЧислоБлоков") = lngКолвоПовторов
   Call ПоказатьExcel(objAcadDoc)
   If blnПризнВыдОбъектов Then
      glОтвет = MsgBox("Было выделено " & vСписокОбъектов.Count & " объектов, среди них " & lngКолвоПовторов & " копий блока """ & _
      objВыдОбъект.Name & """" & vbLf & vbLf & _
      "Вернуться в AutoCAD?", vbInformation + vbYesNo, gsНазваниеПрограммы)
   Else
      glОтвет = MsgBox("В чертеже " & objAcadDoc.ModelSpace.Count & " объектов, среди них " & lngКолвоПовторов & " копий блока """ & _
      objВыдОбъект.Name & """" & vbLf & vbLf & _
      "Вернуться в AutoCAD?", vbInformation + vbYesNo, gsНазваниеПрограммы)
   End If
   If glОтвет = vbYes Then Call ПоказатьAutoCAD(objAcadDoc)
   
   Exit Function
ОбработкаОшибок:
   glОтвет = MsgBox("При получении количества повторов объекта произошла ошибка!" & vbLf & vbLf & _
          "Номер ошибки = " & Err.Number & vbLf & vbLf & _
          "Название ошибки: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbExclamation + vbYesNo, gsНазваниеПрограммы)
   If glОтвет = vbNo Then End
   Resume Next
End Function
Ключевой в поиске заданного блока является строка:
Код:
[Выделить все]
If objAcadDoc.Blocks(objОбъект.Name)(0).Name = objВыдОбъект.Name Then
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как узнать имя блока из которого сделан массив на VBA?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарушается видимость атрибутов при вставке вхождения блока в чертеж Joann88 AutoCAD 7 28.03.2021 14:52
Vba при попытке скопировать один массив в другой того же типа ошибка 13: type mismatched zenija2007 Программирование 5 07.07.2016 12:00
Как добавить в блок запись, доступную из всех экземпляров блока? valerik88 LISP 0 02.07.2016 17:36
C# .net переопределение динамического блока из внешнего файла bargool .NET 35 18.10.2011 16:03
Как программно узнать точку пересеч. линии с подприм. блока? kp+ AutoCAD 3 21.10.2005 10:46