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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Что такое массив объектов чертежа AutoCAD на VBA?

Что такое массив объектов чертежа AutoCAD на VBA?

Ответ
Поиск в этой теме
Непрочитано 03.03.2022, 11:18 #1
Что такое массив объектов чертежа AutoCAD на VBA?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Что такое массив объектов чертежа AutoCAD на VBA? Похоже это просто ссылка на блок, причем блок с непонятными свойствами.
Почему свойства массива такие скудные в просмотровщике объектов на VBA (посмотрите картинку)?
Как узнать из скольки копий состоит массив?
Где взять ссылку на один экземпляр элементов массива?

Миниатюры
Нажмите на изображение для увеличения
Название: Свойства массива в VBA.png
Просмотров: 60
Размер:	20.1 Кб
ID:	245750  

Просмотров: 3496
 
Непрочитано 03.03.2022, 11:37
#2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Что такое массив объектов чертежа AutoCAD
Анонимный блок с навешанными на него реакторами / событиями.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2022, 11:46
#3
МишаИнженер


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


А где можно почитать про эти реакторы/события?
МишаИнженер вне форума  
 
Непрочитано 03.03.2022, 12:02
#4
Кулик Алексей aka kpblc
Moderator

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


А на фига это? Определить, выбран анонимный блок, вхождение дин.блока или дин. массива не сложно (как пример на лиспе: https://autolisp.ru/2021/02/11/primi...tivnyj-massiv/ ). А там уже найти описание блока и посчитать количество его примитивов - вопрос на полстроки кода.
P.S. На VBA не пишу и писать не собираюсь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2022, 13:10
#5
МишаИнженер


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


Мне надо посчитать число блоков-символов хомутов, стягивающих две сетки. Некоторые блоки символов-хомутов я начертил массивами вдоль длинных сторон сетки. В некоторых местах расставил эти блоки поштучно. У меня есть программа подсчета числа блоков в выделенных объектах:
Код:
[Выделить все]
Public Function ВычислитьЧислоПовторовОбъектов(blnПризнВыдОбъектов As Boolean)
'Функция вычисляет число повторов выделенного блока
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim objОбъект As AcadObject, objВыдОбъект As AcadObject
Dim lngНомОбъекта As Long, vp As Variant, lngКолвоПовторов As Long
Dim objSelection As AcadSelectionSet, 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)
         glngОтвет = MsgBox("Завершить выполнение программы?", vbYesNo, gstrНазваниеПрограммы)
         If glngОтвет = 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)
      glngОтвет = MsgBox("Продолжать выделять объект?", vbYesNo, gstrНазваниеПрограммы)
      If glngОтвет = vbNo Then End
      Err.Clear
      GoTo ВыделитьОбъект
   End If
   If Not TypeOf objВыдОбъект Is AcadBlockReference Then GoTo ВыделитьОбъект
   
'Подсчитаем число повторов блока в чертеже
On Error GoTo ОбработкаОшибок
   For lngНомОбъекта = 0 To vСписокОбъектов.Count - 1
      Set objОбъект = vСписокОбъектов(lngНомОбъекта)
      If TypeOf objОбъект Is AcadBlockReference Then
         If objОбъект.Name = objВыдОбъект.Name Then
            objОбъект.Highlight True
            lngКолвоПовторов = lngКолвоПовторов + 1
         End If
      End If
   Next lngНомОбъекта
   
'Выведем сообщение о выполненной работе
   Sheets("Позиции").Range("ЧислоБлоков") = lngКолвоПовторов
   Call ПоказатьExcel(objAcadDoc)
   If blnПризнВыдОбъектов Then
      glngОтвет = MsgBox("Было выделено " & vСписокОбъектов.Count & " объектов, среди них " & lngКолвоПовторов & " копий блока """ & _
      objВыдОбъект.Name & """" & vbLf & vbLf & _
      "Вернуться в AutoCAD?", vbInformation + vbYesNo, gstrНазваниеПрограммы)
   Else
      glngОтвет = MsgBox("В чертеже " & objAcadDoc.ModelSpace.Count & " объектов, среди них " & lngКолвоПовторов & " копий блока """ & _
      objВыдОбъект.Name & """" & vbLf & vbLf & _
      "Вернуться в AutoCAD?", vbInformation + vbYesNo, gstrНазваниеПрограммы)
   End If
   If glngОтвет = vbYes Then Call ПоказатьAutoCAD(objAcadDoc)
   
   Exit Function
ОбработкаОшибок:
   glngОтвет = MsgBox("При получении количества повторов объекта произошла ошибка!" & vbLf & vbLf & _
          "Номер ошибки = " & Err.Number & vbLf & vbLf & _
          "Название ошибки: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbExclamation + vbYesNo, gstrНазваниеПрограммы)
   If glngОтвет = vbNo Then End
   Resume Next
End Function
Но среди выделенных объектов теперь попадаются массивы которые выглядят как блоки. И даже в свойствах этих блоков нет числа экземпляров массивов. Даже простое количество не получается получить из этих блоков-массивов. Поэтому программа не может посчитать полное число хомутов, выводит число только штучных хомутов.
Как получить число элементов в массиве на VBA?
В качестве примера: посчитайте программой число блоков "ХомутСетки_План" для сеток С-1, 2, 3 в прикрепленном файле
Вложения
Тип файла: dwg
DWG 2007
Примеры сеток с хомутами.dwg (3.35 Мб, 19 просмотров)

Последний раз редактировалось МишаИнженер, 03.03.2022 в 13:22.
МишаИнженер вне форума  
 
Непрочитано 03.03.2022, 13:25
#6
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


Сохранится, расчленить массив, потом посчитать блоки из которых он состоит, закрыть без сохранения и открыть снова.
veb86 вне форума  
 
Автор темы   Непрочитано 03.03.2022, 13:26
#7
МишаИнженер


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


А как понять что данный блок это массив?
МишаИнженер вне форума  
 
Непрочитано 03.03.2022, 13:31
1 | #8
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


Фильтром выделить можно. Массив это не блок, это массив (прямоугольный), массив (круговой) и по траектории. Они у меня показаны как разные примитивы в автокаде
veb86 вне форума  
 
Автор темы   Непрочитано 03.03.2022, 13:38
#9
МишаИнженер


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


Я в названии темы в сообщении №1 показал на картинке свойства массива в VBA. Это простой BlockReference - ссылка на блок. По сути блок или ссылка. Конечно можно зайти в блок по этой ссылке и поискать там блоки "ХомутСетки_План". Эта идея хорошая! Попробую сегодня сделать. Спасибо!
МишаИнженер вне форума  
 
Непрочитано 03.03.2022, 13:40
#10
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,587


Цитата:
Сообщение от veb86 Посмотреть сообщение
Сохранится, расчленить массив, потом посчитать блоки из которых он состоит, закрыть без сохранения и открыть снова.
Зачем? Можно же в определении блока посмотреть количество элементов, отсеяв их по типу... т.е. смотреть AcadBlock а не AcadBlockReference
Boxa вне форума  
 
Непрочитано 03.03.2022, 13:52
#11
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


Цитата:
Сообщение от Boxa Посмотреть сообщение
Зачем? Можно же в определении блока посмотреть количество элементов, отсеяв их по типу... т.е. смотреть AcadBlock а не AcadBlockReference
Я предложил быстрый вариант. Быстрый вариант не всегда хороший.
А так конечно, лучше программно зайти внутрь и все посчитать внутри. К блокам я обращался, а к массивам нет. Если это одно и тоже то круто
veb86 вне форума  
 
Непрочитано 03.03.2022, 14:00
#12
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
А как понять что данный блок это массив?
Проверить наличие определенного словаря в описании блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2022, 14:52
#13
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,270
Отправить сообщение для doctorraz с помощью Skype™


Это
https://help.autodesk.com/view/OARX/...s_MInsertBlock
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 03.03.2022, 15:06
1 | #14
Кулик Алексей aka kpblc
Moderator

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


Нет, это не MINSERT
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.03.2022, 17:47
#15
МишаИнженер


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


Попробовал 2 способа:
1) Прочитать содержимое блока-массива с названием "U2388"
2) Взорвать ссылку на блок-массив и проверить полученные объекты
И при обоих способах в блоке-массиве содержатся блоки с именем "U37" вместо "ХомутСетки_План"
Так что найти блоки-хомуты в блоках-массивах не получается обоими способами
Однако если кнопкой взорвать массив, то в чертеже появляются блоки не U37 а нормальные блоки "ХомутСетки_План".
Откуда AutoCAD знает что блок U37 это "ХомутСетки_План"?
Можно ли самому проверить это соответствие в программе VBA?
МишаИнженер вне форума  
 
Непрочитано 03.03.2022, 23:05
#16
Кулик Алексей aka kpblc
Moderator

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


Разницу между Name и EffectiveName надо объяснять?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.03.2022, 04:26
#17
МишаИнженер


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


Да, мне это очень интересно! И напишите ссылку где можно об этом с пользой почитать!
МишаИнженер вне форума  
 
Непрочитано 04.03.2022, 07:52
#18
Кулик Алексей aka kpblc
Moderator

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


В поисковиках забанили?

https://www.google.com/search?channe...+effectivename

https://help.autodesk.com/view/ACD/2...5-B9D88011DEB5

И поставь себе оффлайн-справку
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Что такое массив объектов чертежа AutoCAD на VBA?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tekla 2018i. Как получить массив всех объектов чертежа? smolskiy-pmi Tekla 1 01.03.2019 07:46
Autocad 2014 + СПДС-модуль проблема с заполнением таблиц и выделением объектов zRaFiNaDz Прочее ПО от Autodesk 2 27.10.2017 16:33
Почему при открытом чертежа открывается еще один AutoCad? 1Sasha1 AutoCAD 2 18.04.2012 11:30
При заливке объектов в AutoCAD 2011 виснет система nikofleks AutoCAD 2 06.07.2010 11:28
Внедрение / связь инородных объектов с AutoCAD Reka AutoCAD 8 07.12.2009 16:55