Видеоуроки AutoCAD VBA

Автор Тема: Видеоуроки AutoCAD VBA  (Прочитано 174461 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Видеоуроки AutoCAD VBA
« : 17-08-2016, 15:44:12 »
Всем привет! Меня зовут Максим Маркевич, инженер-проектировщик строительных конструкций (КЖ, КМ). Долгое время автоматизировал свою работу в AutoCAD при помощи VBA. Поэтому сейчас решил записать серию уроков по этой теме. В данных уроках не столько рассматриваются аспекты программирования, сколько решение конкретных задач для AutoCAD.
А именно:
  • Связка с Excel
  • Связка с Mathcad
  • Программная манипуляция блоками
  • Создание полей
  • Создание таблиц
и многое другое…
Курс отлично подойдет для новичков в этом деле.
Плейлист курса, содержащий все видеоматериалы
P.S.: Хотелось бы отметить, что курс записывается в режиме реального времени, поэтому можно оставлять комментарии (предложения и замечания). По самым интересным запросам будут записаны отдельные уроки.

В данной теме допускается поднимать вопросы, связанные с тематическим развитием курса, полезной модификацией кода, предложением иных путей решения конкретных задач видеоуроков.
А вот обсуждение видеоуроков (любые вопросы типа "у меня не работает", "в этом месте выдает ошибку" и прочее) будет происходить вот здесь, дабы не захламлять основную тему.
« Последнее редактирование: 10-10-2017, 00:32:06 от Александр Ривилис »

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #1 : 17-08-2016, 16:02:29 »
1. Введение
Несколько слов о том, почему  стоит изучать VBA и в каких случаях это упрощает жизнь.
Написание и запуск первого кода.

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #2 : 17-08-2016, 16:05:01 »
2. Достучаться до Excel
В данном уроке объясняется, как при помощи редактора VBA получить информацию из Excel.



Код - Visual Basic [Выбрать]
  1. Sub ExcelToAutocad()
  2.     ' Для того, чтобы автокад понимал такой тип переменных, как Excel.Application, Excel.Workbook и Excel.Worksheet
  3.    ' необходимо в редакторе VBA выбрать Tools - References и добавить Microsoft Excel *.* Type Library
  4.    Dim AP As Excel.Application
  5.     Dim WB As Excel.Workbook
  6.     Dim WS As Excel.Worksheet
  7.  
  8.     'Устанавливаем связь с Excel
  9.    Set AP = Excel.Application
  10.     Set WB = AP.Workbooks.Open("m:\Excel.xlsx")
  11.     Set WS = WB.Worksheets("Лист1")
  12.  
  13.     'Считываем данные
  14.    dlina = Cells(1, 1)
  15.     a = Cells(1, 2)
  16.  
  17.     'Выводим в AutoCAD
  18.    MsgBox dlina & " = " & a
  19.    
  20.     'Закрываем Excel
  21.    AP.Quit
  22.  
  23. End Sub
« Последнее редактирование: 17-08-2016, 17:27:33 от Максим Маркевич »

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #3 : 17-08-2016, 16:14:41 »
3. Достучаться до Mathcad
В видеоуроке объясняется, как получить информацию из Mathcad (в данном случае, все равно, используется некий буферный Excel, поэтому такой метод немножко костыль, но костыль вполне рабочий).

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #4 : 18-08-2016, 00:07:23 »
4. Вставка блока
В данном видео объясняется, как программно вставить блок в AutoCAD.

Код - Visual Basic [Выбрать]
  1. Sub InsertBlock()
  2.     Dim blockRef As AcadBlockReference
  3.     Dim name As String
  4.     Dim pp As Variant
  5.  
  6.     'В случае ошибки переходим к следующему действию
  7.     On Error Resume Next
  8.  
  9.     'Получаем точку вставки блока
  10.    pp = ThisDrawing.Utility.GetPoint(, "Укажите точку вставки блока:")
  11.  
  12.     'Имя блока
  13.    name = "Тестовый"
  14.  
  15.     'Вставка блока
  16.    Set blockRef = ThisDrawing.ModelSpace.InsertBlock(pp, name, 1, 1, 1, 0)
  17.  End Sub

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #5 : 18-08-2016, 00:14:09 »
5. Изменение динамических свойств блока
В данном видео объясняется, как программно вставить в чертеж AutoCAD динамический блок с измененными свойствами.

Код - Visual Basic [Выбрать]
  1. Sub InsertBlock()
  2.     Dim blockRef As AcadBlockReference
  3.     Dim name As String
  4.     Dim pp As Variant
  5.    
  6.     'В случае ошибки переходим к следующему действию
  7.    On Error Resume Next
  8.  
  9.     'Получаем точку вставки блока
  10.    pp = ThisDrawing.Utility.GetPoint(, "Укажите точку вставки блока:")
  11.  
  12.     'Имя блока
  13.    name = "Тестовый"
  14.  
  15.     'Вставка блока
  16.    Set blockRef = ThisDrawing.ModelSpace.InsertBlock(pp, name, 1, 1, 1, 0)
  17.  
  18.     'Получение динамических свойств блока
  19.    If blockRef.IsDynamicBlock = True Then
  20.         Props = blockRef.GetDynamicBlockProperties
  21.             For Index = LBound(Props) To UBound(Props)
  22.                 Set prop = Props(Index)
  23.                     If prop.PropertyName = "Длина" Then
  24.                         prop.Value = 40#
  25.                     ElseIf prop.PropertyName = "Ширина" Then
  26.                         prop.Value = 33#
  27.                     End If
  28.             Next
  29.     End If
  30. End Sub

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #6 : 18-08-2016, 00:17:53 »
6 Изменение атрибутов блока
В данном видео объясняется, как программно вставить в чертеж AutoCAD динамический блок с измененным атрибутом, то есть с измененной текстовой строкой атрибута.

Код - Visual Basic [Выбрать]
  1. Sub InsertBlock()
  2.     Dim blockRef As AcadBlockReference
  3.     Dim name As String
  4.     Dim pp As Variant
  5.    
  6.     'В случае ошибки переходим к следующему действию
  7.    On Error Resume Next
  8.  
  9.     'Получаем точку вставки блока
  10.    pp = ThisDrawing.Utility.GetPoint(, "Укажите точку вставки блока:")
  11.  
  12.     'Имя блока
  13.    name = "Тестовый"
  14.  
  15.     'Вставка блока
  16.    Set blockRef = ThisDrawing.ModelSpace.InsertBlock(pp, name, 1, 1, 1, 0)
  17.  
  18.     'Получение динамических свойств блока
  19.    If blockRef.IsDynamicBlock = True Then
  20.         Props = blockRef.GetDynamicBlockProperties
  21.             For Index = LBound(Props) To UBound(Props)
  22.                 Set prop = Props(Index)
  23.                     If prop.PropertyName = "Длина" Then
  24.                         prop.Value = 40#
  25.                     ElseIf prop.PropertyName = "Ширина" Then
  26.                         prop.Value = 33#
  27.                     End If
  28.             Next
  29.     End If
  30.  
  31.     'Получение атрибутов
  32.    If blockRef.HasAttributes = True Then
  33.         att = blockRef.GetAttributes
  34.             For i = LBound(att) To UBound(att)
  35.                 If att(i).TagString = "АТРИБУТ" Then
  36.                     att(i).TextString = "Кекс"
  37.                 End If
  38.             Next
  39.     End If
  40. End Sub

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #7 : 18-08-2016, 00:24:05 »
7 Связка AutoCAD и Excel через блок
Видеоурок, в котором подводится итог по связке AutoCAD и Excel.

Код - Visual Basic [Выбрать]
  1. Sub InsertBlock()
  2.     Dim blockRef As AcadBlockReference
  3.     Dim name As String
  4.     Dim pp As Variant
  5.     Dim AP As Excel.Application
  6.     Dim WB As Excel.Workbook
  7.     Dim WS As Excel.Worksheet
  8.  
  9.     'В случае ошибки переходим к следующему действию
  10.    On Error Resume Next
  11.  
  12.     'Подключаемся к Excel
  13.    Set AP = Excel.Application
  14.     Set WB = AP.Workbooks.Open("m:\Excel.xlsx")
  15.     Set WS = WB.Worksheets("Лист1")
  16.  
  17.     'Получаем точку вставки блока
  18.    pp = ThisDrawing.Utility.GetPoint(, "Укажите точку вставки блока:")
  19.  
  20.     'Имя блока
  21.    name = "Тестовый"
  22.  
  23.     'Вставка блока
  24.    Set blockRef = ThisDrawing.ModelSpace.InsertBlock(pp, name, 1, 1, 1, 0)
  25.  
  26.     'Получение динамических свойств блока
  27.    If blockRef.IsDynamicBlock = True Then
  28.         Props = blockRef.GetDynamicBlockProperties
  29.             For Index = LBound(Props) To UBound(Props)
  30.                 Set prop = Props(Index)
  31.                     If prop.PropertyName = "Длина" Then
  32.                         prop.Value = Cells(1, 2) * 1
  33.                     ElseIf prop.PropertyName = "Ширина" Then
  34.                         prop.Value = Cells(2, 2) * 1
  35.                     End If
  36.             Next
  37.     End If
  38.  
  39.     'Получение атрибутов
  40.    If blockRef.HasAttributes = True Then
  41.         att = blockRef.GetAttributes
  42.             For i = LBound(att) To UBound(att)
  43.                 If att(i).TagString = "АТРИБУТ" Then
  44.                     att(i).TextString = Cells(3, 2)
  45.                 End If
  46.             Next
  47.     End If
  48. End Sub

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #8 : 18-08-2016, 01:23:36 »
Код - Visual Basic [Выбрать]
  1. prop.Value = Cells(1, 2) * 1
А зачем здесь умножение на единицу?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #9 : 18-08-2016, 01:39:59 »
А зачем здесь умножение на единицу?
Потому что Cells(1, 2) получено из Excel - это строка. А prop.Value не присвоишь строку в VBA.
Можно было бы сделать так:
Код - Visual Basic [Выбрать]
  1. prop.Value = CDbl(Cells(1, 2))
или вот так:
Код - Visual Basic [Выбрать]
  1. Dim buf As Double
  2. buf = Cells(1, 2)
  3. prop.Value = buf
Или схитрить с умножением на единицу, как сделано в моем примере.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #10 : 18-08-2016, 01:43:41 »
Ох уж этот VBA. Не люблю я такого смешения типов. Я бы предпочел бы использовать Cdbl.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #11 : 18-08-2016, 01:48:01 »
Ох уж этот VBA. Не люблю я такого смешения типов. Я бы предпочел бы использовать Cdbl.
Согласен с Вами. Мне тоже очень нравится та культура, которой сейчас меня учит C#.
После 1.5 месяца проб C# мне страшно смотреть свои коды VBA.
Просто прикинул, что умножение на единицу - самый простой вариант для начинающих, поэтому решил не усложнять.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Видеоуроки AutoCAD VBA
« Ответ #12 : 18-08-2016, 08:42:22 »
Я бы рассказал о методике позднего связывания (вместо раннего, использованного в #2 и неявно указанного в #7, ее преимуществах и недостатках. А также методе отладки и вариантах написания кода.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Видеоуроки AutoCAD VBA
« Ответ #13 : 18-08-2016, 09:06:28 »
Потому что Cells(1, 2) получено из Excel - это строка. А prop.Value не присвоишь строку в VBA.
Можно было бы сделать так:

Код - Visual Basic [Выбрать]
  1.     prop.Value = CDbl(Cells(1, 2))

или вот так:
Код - Visual Basic [Выбрать]
  1.     Dim buf As Double
  2.     buf = Cells(1, 2)
  3.     prop.Value = buf
Или схитрить с умножением на единицу, как сделано в моем примере.
А если в ячейки не число? или не только число?
Стоило сразу нормально делать и парой комментариев все прояснить?
Понятно, что нормального TryParse в vba нет, но хоть Val то использовать можно?
Код - Visual Basic [Выбрать]
  1.     prop.Value = CDbl(Val(Cells(1, 2)))

Вот по этому VBA и раздражает, пропустил пару команд, а интерпретатор там сам их допишет, по своему разумению конечно, и ищи где косяк вкрался, Хуже только в php...


Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #14 : 18-08-2016, 11:40:03 »
Я бы рассказал о методике позднего связывания (вместо раннего, использованного в #2 и неявно указанного в #7, ее преимуществах и недостатках.
Опять же я подумал, что лучше сделать вариант, который проще/понятнее.
Я прикинул, что будет понятнее вариант раннего связывания:
Код - Visual Basic [Выбрать]
  1. Dim AP As Excel.Application
чем вариант позднего связывания:
Код - Visual Basic [Выбрать]
  1. Dim AP As Object
который имеет преимущества, по сути, только тогда, когда ты не знаешь с какой версией Excel будешь работать.
А также методе отладки и вариантах написания кода.
Думаю, до этого дойдет. Буду смотреть по откликам и запросам.
А если в ячейки не число? или не только число?
Стоило сразу нормально делать и парой комментариев все прояснить?
Не ну Val() внутри CDbl() это совсем перестраховка. Ведь человек, который будет это делать ссылается на ячейку, в которой лежит число. Ну не будет там "43 яблока". Вполне можно было обойтись отдельно Val(), если уж на то пошло:
Код - Visual Basic [Выбрать]
  1. prop.Value = Val(Cells(1, 2))
Алексей Кулик, Boxa.Shu,  ну послушайте, я пишу для человека, который получит первые результаты и окрыленный полезет в книжку читать и разбираться.. Пока что я не могу охватить все. У меня даже нет еще урока про типы данных. Когда составляю план уроков, то в первую очередь вспоминаю, что мне, в свое время, и в какой последовательности было бы мегаполезно получать. Я очень ценю Ваши советы и не пытаюсь тут оправдаться, просто поясняю, чем руководствуюсь. Возможно, стоило предварительно создать тему, в которой все неравнодушные обсудили бы последовательность и содержание уроков, но что-то я не подумал о таком, а просто начал записывать.
Вот по этому VBA и раздражает, пропустил пару команд, а интерпретатор там сам их допишет, по своему разумению конечно, и ищи где косяк вкрался, Хуже только в php...
Но ведь именно поэтому с его и проще начинать, потому что он сам немножко додумает. Когда я сейчас перехожу на c# мне кажется, вот на это не обращал внимания, как так?? А потом вспоминаю и понимаю, что, если бы мне тогда пришлось обращать на это внимание, то было бы сложно и не совсем понятно.
Я за теорию, которая идет в ногу с практикой, конечно, за этот счет сжирается немножко качество кода, но, считаю, понимание приходит эффективней.