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

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

Извлечение атрибутов блока в определенном порядке

Ответ
Поиск в этой теме
Непрочитано 20.08.2019, 09:03
Извлечение атрибутов блока в определенном порядке
Raylond
 
Регистрация: 05.02.2016
Сообщений: 19

Доброго времени суток.
Появилась задача, к которой не знаю как подойти.
Имеется чертеж с большим количеством блоков с атрибутами, значения которых уникальны в рамках этого чертежа.
Необходимо ускорить следующий процесс: поочередное копирование атрибутов этих блоков в произвольном порядке в файл Excel.
При работе через извлечение данных - все получается, но в произвольном порядке.
По сути нужно реализовать следующее - тыкнул на блок -> значение атрибута записалось в ячейку открытого файла эксель и ячейка сдвинулась вправо, тыкнул на следующий -> операция повторилась.
Можно ли это сделать через макросы или еще каким-то образом?
Подскажите пожалуйста в какую сторону воевать.
Заранее спасибо.
Просмотров: 12015
 
Непрочитано 20.08.2019, 11:29
#21
trir


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


Это всё делается через БД: Map 3D, FDO
жалко только, что FDO не рисует 3D/4D объекты
trir вне форума  
 
Непрочитано 20.08.2019, 11:36
#22
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Raylond Посмотреть сообщение
Мне собственно и интересно, на чем это можно сделать. Как Вы понимаете, профиль мой далек от программирования, но тот же эксель использую очень активно. VBA собирался осваивать как раз для развития тех вещей, которые делаю в экселе.
Но задача, описанная в теме - приоритетная.
Если ее реально реализовать через VBA - это прекрасно. Из пушки по воробьям стрелять нет никакого желания.
Ну так реализуйте)

1. В экселе ALT-F11 - вызываете редактор VBA
2. В меню Tools/Referenses находите и подключаете AutoCAD 20xx Type Library
3. В коде макроса Excel:

Код:
[Выделить все]
Dim lAcadApp As AcadApplication
Set lAcadApp = GetObject(, "AutoCAD.Application")
Dim lCurrDoc As AcadDocument
Set lCurrDoc = lAcadApp.ActiveDocument
И далее переменная lCurrDoc будет аналогом ThisDrawing в многочисленных примерах кода VBA для акада в инете.

----- добавлено через ~2 мин. -----
p.s. И попросите администрацию форума (через красный значок-треугольник) перенести тему в раздел "Программирование". К динблокам она никакого отношения не имеет)

И если знаете английский, то подчерпнете много интересного из книги

Последний раз редактировалось Сергей812, 20.08.2019 в 12:05.
Сергей812 вне форума  
 
Непрочитано 20.08.2019, 11:58
#23
maratovich


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


Цитата:
Сообщение от Raylond Посмотреть сообщение
Именно п.3 хочется ускорить. На данный момент человек ручками выбирает блок, копирует из него атрибут "имя", переходит в эксель и вставляет в ячейку. Считаем - минимум 4 действия.
Приложите пример чертежа с блоками и пример таблички в экселе.
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Автор темы   Непрочитано 20.08.2019, 12:15
#24
Raylond


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


Цитата:
Сообщение от maratovich Посмотреть сообщение
Приложите пример чертежа с блоками и пример таблички в экселе.
Прилагаю. Исходник в dwg и приблизительный итог, который хотелось бы получить
Вложения
Тип файла: dwg
DWG 2007
Блоки трасс.dwg (113.0 Кб, 23 просмотров)
Тип файла: xlsx Итог.xlsx (11.1 Кб, 18 просмотров)
Raylond вне форума  
 
Непрочитано 20.08.2019, 12:28
#25
maratovich


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


Цитата:
Сообщение от Raylond Посмотреть сообщение
приблизительный итог, который хотелось бы получить
Да, тут только руками указывать в каком порядке получать. Полным автоматом не получится.
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 20.08.2019, 12:38
#26
trir


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


Цитата:
Да, тут только руками указывать в каком порядке получать. Полным автоматом не получится.
нужно строить граф и обходить все ветви
trir вне форума  
 
Автор темы   Непрочитано 20.08.2019, 13:22
#27
Raylond


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


Цитата:
Сообщение от maratovich Посмотреть сообщение
Да, тут только руками указывать в каком порядке получать. Полным автоматом не получится.
В любом случае руками, я и не хочу это полностью автоматизировать. Может неправильно объяснил - задача только лишь ускорить этот процесс. В начале предложили через attout делать. И оно работает. И очень похоже на то, что нужно. Но получается я создаю для каждой ветви новый файл и потом их тяжело обрабатывать.

Пытаюсь разобраться с VBA.. Конечно с наскока без знаний тут тяжело.
Raylond вне форума  
 
Непрочитано 20.08.2019, 13:29
#28
VitalyAF


 
Регистрация: 19.07.2005
Россия
Сообщений: 3,224


Цитата:
Сообщение от Raylond Посмотреть сообщение
Пытаюсь разобраться с VBA.. Конечно с наскока без знаний тут тяжело.
Я т.д., что для VBA 1000 объектов много, и на нескольких сотнях уже будут тормоза.
VitalyAF вне форума  
 
Автор темы   Непрочитано 20.08.2019, 13:38
#29
Raylond


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


Цитата:
Сообщение от VitalyAF Посмотреть сообщение
Я т.д., что для VBA 1000 объектов много, и на нескольких сотнях уже будут тормоза.
Насколько я понимаю, VBA будет обрабатывать только те объекты, которые будут выбраны (по аналогии с attout). Их для каждой позиции будет не так много.
Raylond вне форума  
 
Непрочитано 20.08.2019, 14:04
#30
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Raylond Посмотреть сообщение
Пытаюсь разобраться с VBA.. Конечно с наскока без знаний тут тяжело.
книжку из п.21 смотрите) Там и справка, и примеры сразу.

Цитата:
Сообщение от Raylond Посмотреть сообщение
VBA будет обрабатывать только те объекты, которые будут выбраны
метод GetEnity - выбираете блоки-кабели в той последовательности, в который они должны быть представлены на листе. Даже COM-интерфейс (если из экселя работать) успеет за ручным вводом - если сотрудники у вас по 100+ объектов в сек не выбирают, конечно)
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.08.2019, 14:19
#31
Raylond


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


Спасибо всем большое. Буду изучать. Тему попросил перенести.
Raylond вне форума  
 
Непрочитано 20.08.2019, 15:03
#32
Melx


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


Цитата:
Сообщение от Raylond Посмотреть сообщение
Куда-то делось сообщение... Прикладной смысл таков. Я проектирую системы электроснабжения очень немаленьких объектов. Одной из задач является раскладка огромного числа кабелей.
Есть такой способ - прокладка методом трасс. Смысл в том, что каждому физическому отрезку кабельной трассы (куча металлоконструкций, на которых лежат кабели) присваивается уникальный номер. Далее для каждого кабеля перечисляются эти номера в порядке физической прокладки кабеля. Что реализовано сейчас:
1. Рисуется чертеж с кабельными трассами. Каждый участок выполнен динамическим блоком с изменяемой длиной. Имеет уникальный атрибут номера.
2. Через извлечение данных формируется таблица с перечнем этих трасс и соответствующими длинами.
3. Человек, раскладывающий кабели создает таблицу в экселе и начинает для каждого кабеля по очереди заполнять графы таблицы: в первом столбце - маркировка кабеля (тоже уникальная), в последующих столбцах - пресловутые отрезки трассы в соответствии с п.1;
4. Далее через костыли и подпорки обрабатываются данные в экселе, формируется кабельный журнал, считается длина и есть еще ряд планов по развитию этого безобразия.

Именно п.3 хочется ускорить. На данный момент человек ручками выбирает блок, копирует из него атрибут "имя", переходит в эксель и вставляет в ячейку. Считаем - минимум 4 действия.

Для информации - количество участков трасс - тысячи, количество кабелей - иногда десятки тысяч.
На форуме четыре решения по трассам и КЖ:
https://forum.dwg.ru/showthread.php?t=128427
https://forum.dwg.ru/showthread.php?t=57484
https://forum.dwg.ru/showthread.php?t=141086&page=3
https://forum.dwg.ru/showthread.php?t=138086

Начать думаю стоит с их разбора.
Melx вне форума  
 
Непрочитано 20.08.2019, 16:28
#33
VitalyAF


 
Регистрация: 19.07.2005
Россия
Сообщений: 3,224


Цитата:
Сообщение от Raylond Посмотреть сообщение
Насколько я понимаю, VBA будет обрабатывать только те объекты, которые будут выбраны
Я проводами в Autocad MEP занимаюсь с 2000-го года, ~19-ть лет на всех Autocad начиная с 2000-ой версии, так вот могу доложить,
что относительно небольшой объект - 9-ти этажное здание ~350 комм. портов еле-еле шевелится только! на маркировке кабелей и портов.
Причём каждый этаж в отдельном файле... В голом акаде пытаться делать это - безумие...
Я вас предупредил, а дальше дело ваше...
VitalyAF вне форума  
 
Автор темы   Непрочитано 20.08.2019, 16:57
#34
Raylond


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


Именно из-за проблемы тормозов четыре решения форума мне не очень подходят.
У нас над объектом может работать приличное количество проектировщиков.
Соответственно раскладки кабелей, как правило, выполняются по системам.
То есть массив данных в связке Автокад-эксель в процессе раскладки одного кабельного журнала не очень большой.
А потом средствами СУБД вообще без участия автокада можно обрабатывать общий массив данных из большого количества разных кабельных журналов. Подключать дополнительные библиотеки со сведениями о сечениях, диаметрах и массах кабелей, анализировать заполняемость кабельных металлоконструкций и т.д.
У нас сейчас основной объем делается вообще вручную. Поэтому сверхзадач не ставлю. Нужно прорабатывать постепенно.
Raylond вне форума  
 
Непрочитано 20.08.2019, 17:08
#35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Raylond Посмотреть сообщение
Нужно прорабатывать постепенно.
логично, потихоньку уменьшать затраты подручной местной автоматизацией - чтобы появилась возможность двигаться дальше. Но сам подход неправильный, если планируете все-таки не стандартными средствами акада обходится, а переходить на программные. Для программного способа кабель-блок вообще не нужен, тем более если планируете использовать СУБД. Сильно упрощенно написал в этом посте.
Сергей812 вне форума  
 
Непрочитано 20.08.2019, 17:14
1 | #36
maratovich


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


Raylond
Если не получится освоить программирование - вот программа, которая показана на видео.
Сделано с минимальными требованиями за минимальный срок.
Вложения
Тип файла: zip AtriBlocksetup.zip (3.16 Мб, 126 просмотров)
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Автор темы   Непрочитано 20.08.2019, 18:21
#37
Raylond


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


Цитата:
Сообщение от maratovich Посмотреть сообщение
Raylond
Если не получится освоить программирование - вот программа, которая показана на видео.
Сделано с минимальными требованиями за минимальный срок.

Спасибо огромное. Как минимум возьму за основу если получится разобраться.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но сам подход неправильный,
Возможно, но пока приходится обходится тем, на что хватает опыта и мозгов
Raylond вне форума  
 
Непрочитано 20.08.2019, 19:16
1 | #38
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Голый функционал (Excel->COM->Acad):
1. Заполнение начинается с активной ячейки листа в момент вызова макроса.
2. ESC прерывает программу.
3. Программа прощает один промах при выборе объекта, но два промаха (или правой кнопки мыши) подряд приводит к переходу к новому кабелю (строке).
4. Версия и разрядность акада не играет роли, подключать ничего дополнительно не надо в Reference.
5. Нет проверки подключения к акаду - когда будете дорабатывать - дополните.
6. Код дополнил подробными комментариями - может еще кто-нибудь примкнет в наш клан программистов-самоучек, посмотрев - как несложно все это делается в базовых вещах)

Код:
[Выделить все]
Option Explicit

' Декларируем API функцию (64-битный офис, для 32-битного нужно будет поправить)
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As LongPtr) As Integer


' Получение атрибутов в указанном порядке
Public Sub GetAttrs()
  ' Получаем ссылку на акад
  Dim lAcadApp As Object
  Set lAcadApp = GetObject(, "AutoCAD.Application")
  ' Получаем ссылку на активный документ
  Dim lCurrDoc As Object
  Set lCurrDoc = lAcadApp.ActiveDocument
  ' Получаем активный лист книги
  Dim lActiveSheet As Worksheet
  Set lActiveSheet = ThisWorkbook.ActiveSheet
  ' Получаем адрес активной стартовой ячейки
  Dim lStartCell As Range
  Set lStartCell = lActiveSheet.Application.ActiveCell
  ' Индексы строки и столбца
  Dim lIndRow As Long: lIndRow = lStartCell.Row
  Dim lIndColumn As Long: lIndColumn = lStartCell.Column
  ' Объявляем переменные
  Dim lAcadEnt As Object, lPick As Variant
  Dim lAcadBR As Object, lIsNewRow As Boolean
  Dim lAttrs As Variant, I1 As Integer
  On Error Resume Next
  ' Переключаемся на акад
  AppActivate lAcadApp.Caption
  ' Запрашиваем блоки в бесконечном цикле
  Do While (True)
    ' Если акад готов к общению
    If (lAcadApp.GetAcadState.IsQuiescent) Then
      ' Запрашиваем очередной блок-кабель
      lCurrDoc.Utility.GetEntity lAcadEnt, lPick, vbCr & "Выберите кабель:"
      ' Проверка - если ничего не было выбрано или отмена
      If (Err.Number <> 0) Then
        ' Сбрасываем обработчик
        Err.Clear
        ' Если была нажата Esc
        If (GetAsyncKeyState(&H1B)) Then
          lCurrDoc.Utility.Prompt vbCr & "Работа завершена"
          Exit Do
        Else
          If (lIsNewRow) Then
            ' Переходим на начало следующего кабеля (строки)
            lIndRow = lIndRow + 1
            lIndColumn = lStartCell.Column
            lIsNewRow = False
          Else
            ' Взводим флаг признака возможной новой строки
            lIsNewRow = True
          End If
        End If
      Else
        lIsNewRow = False
        ' Пытаемся привести к вставке блока
        Set lAcadBR = lAcadEnt
        ' Если не получилось
        If (lAcadBR Is Nothing) Then
          lCurrDoc.Utility.Prompt vbCr & "Выбран не блок!"
        Else
          ' Если блок имеет атрибуты
          If (lAcadBR.HasAttributes) Then
            ' Получаем массив атрибутов
            lAttrs = lAcadBR.GetAttributes
            ' В цикле по полученному массиву атрибутов
            For I1 = LBound(lAttrs) To UBound(lAttrs)
              ' Если найден искомый атрибут
              If (lAttrs(I1).TagString = "Номер_трассы") Then
                ' Заносим значение атрибута на лист экселя
                lActiveSheet.Cells(lIndRow, lIndColumn).Value = lAttrs(I1).TextString
                ' Смещаемся на новый столбец
                lIndColumn = lIndColumn + 1
                ' Выходим из цикла по атрибутам
                Exit For
              End If
            Next I1
          End If
        End If
      End If
    End If
  Loop
  ' Очищаем ссылки на COM-объекты
  Set lCurrDoc = Nothing
  Set lAcadApp = Nothing
End Sub
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.08.2019, 19:25
#39
Raylond


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Голый функционал (Excel->COM->Acad):
На такую помощь даже не рассчитывал. Спасибо еще раз большое. За подробные комментарии отдельно.
Raylond вне форума  
 
Непрочитано 20.08.2019, 19:25
#40
VitalyAF


 
Регистрация: 19.07.2005
Россия
Сообщений: 3,224


Raylond
Слушайте, десятки тысяч кабелей, видимо гигантские объёмы, наверно крупный город или столица?
Соответственно контора солидная... Спрашивается, почему acad, да ещё голый?
Как вы собираетесь трассы, жгуты рисовать с пом. дин. блоков, откуда длины возьмете,
на 10-ках тыс. кабелей и просчёты длин будут исчисляться 10-ками бухт!
На практике длины корректируются до последнего момента, даже на автомате трудно посчитать...
Не пробовали намекнуть начальникам про специальный софт? ...
VitalyAF вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечение атрибутов блока в определенном порядке

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фиксированная ориентация атрибутов блока при повороте блока hwd AutoCAD 19 02.11.2022 10:27
Назначение свойств атрибутов блока без attsync Кулик Алексей aka kpblc Программирование 9 15.08.2017 06:32
Неудаляемый слой в атрибуте блока. Смысл синхронизации атрибутов? АлексЮстасу AutoCAD 4 04.06.2016 01:59
Сбой подсказок атрибутов динамического блока gool Динамические блоки 5 26.10.2011 09:29
Извлечение атрибутов блока и вставка атрибутов в формулу andery AutoCAD 38 15.06.2009 02:39