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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 415
  • Карма: 95
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
  • Карма: 26
  • 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# мне кажется, вот на это не обращал внимания, как так?? А потом вспоминаю и понимаю, что, если бы мне тогда пришлось обращать на это внимание, то было бы сложно и не совсем понятно.
Я за теорию, которая идет в ногу с практикой, конечно, за этот счет сжирается немножко качество кода, но, считаю, понимание приходит эффективней.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #16 : 18-08-2016, 11:50:30 »
Я думаю, что если в этой теме будет обсуждение уроков и предложение более оптимального кода - это будет очень полезно читающим тему и особенно новичкам в программировании.
Так уже есть. :) А еще это заставит меня слишком серьезно подходить к записи следующих.  :( :D

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #17 : 18-08-2016, 12:14:31 »
Да я ж не настаиваю :) Ну так, в качестве затравки, с прицелом на будущее :) Я-то вообще ничего не снимаю / не пишу / не публикую.
Off-Topic: показать
Ну серьезно, ну кому будет интересна задача "для объектов TEXT и MTEXT в строку загнать их координату Z"? :)
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #18 : 18-08-2016, 16:28:58 »
Алексей Кулик,
Off-Topic: показать

Ну серьезно, ну кому будет интересна задача "для объектов TEXT и MTEXT в строку загнать их координату Z"?
Мне кажется, это интересно, а генпланистам так и вовсе!:)

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #19 : 18-08-2016, 16:56:11 »
8 Размещение кода и организация его вызова при помощи псевдонимов
В данном видео поясняется, как автоматически подгружать свой .dvb проект в AutoCAD, а также показывается создание псевдонима на процедуру VBA при помощи файла .lsp.


Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:ib ()
  2.         (command "vbarun" "InsertBlock")
  3.         (princ)
  4. )


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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #20 : 18-08-2016, 17:04:28 »
Я, конечно, прошу прощения, но lisp-код из #19 в русских версиях работать не будет: http://autolisp.ru/2010/03/04/localization/
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #21 : 18-08-2016, 17:09:34 »
Я, конечно, прошу прощения, но lisp-код из #19 в русских версиях работать не будет: http://autolisp.ru/2010/03/04/localization/
Так! Стоп. Если бы это была другая команда, то да, но не "vbarun".
У меня, как раз, русская версия.


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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #22 : 18-08-2016, 17:11:17 »
Я, конечно, прошу прощения, но lisp-код из #19 в русских версиях работать не будет: http://autolisp.ru/2010/03/04/localization/
Не проси прощения. VBARUN - он и по-русски VBARUN.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #23 : 18-08-2016, 17:21:42 »
Ок, уговорили :)
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #24 : 18-08-2016, 18:11:34 »
9 Организация вызова кода при помощи кнопки
В данном видеоуроке показан алгоритм создания кнопки, ссылающейся на процедуру VBA.


Поле "Макросы": ^C^C-vbarun;InsertBlock;

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

  • ADN Club
  • ****
  • Сообщений: 415
  • Карма: 95
Re: Видеоуроки AutoCAD VBA
« Ответ #25 : 19-08-2016, 15:59:29 »
Поле "Макросы": ^C^C-vbarun;InsertBlock;
Когда пользовался VBA, то свои макросы в память при старте не грузил, а вызывал по требованию, т.е на кнопку вешал что-то типа: ^C^C-vbarun "C:/VBA Macro/MyMacro.dvb!Module1.Example"

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #26 : 19-08-2016, 16:10:12 »
Boxa.Shu, в таком варианте у тебя модуль должен быть по определенному пути. Ну или как минимум в путях поддержки. Да и про безопасность и доверенность каталогов тоже забывать низя ;)
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #27 : 19-08-2016, 16:30:20 »
Когда пользовался VBA, то свои макросы в память при старте не грузил, а вызывал по требованию, т.е на кнопку вешал что-то типа: ^C^C-vbarun "C:/VBA Macro/MyMacro.dvb!Module1.Example"
Согласен, плюс в том, что макрос не грузится в память при старте. Но вопрос, так ли это существенно?
Во всяком случае, это второй вариант. И теперь каждый для себя может выбрать.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #28 : 22-08-2016, 18:15:57 »
Жду некоторого отклика, чтобы продолжить записывать уроки. В ближайшее время планирую рассказать про таблицы. Если у кого-то есть предложения по тематическому развитию курса, то буду признателен за участие: замечания и предложения.

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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #29 : 22-08-2016, 18:58:30 »
Жду некоторого отклика, чтобы продолжить записывать уроки.
Сейчас еще сезон отпусков. Да и лишь небольшой процент форумчан использует для разработки VBA (этот раздел на девятом месте по популярности). Так что отклик может быть не так быстро.
Убеди начинающих программировать под AutoCAD, что из всех вариантов API и языков программирования им следует выбирать VBA. Ну или хотя бы в чем ты видишь преимущества VBA над другими средствами разработки. Ну и возможно в чем ты видишь его ограниченность - ведь не зря ты "мигрировал" на C# и AutoCAD .NET API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #30 : 23-08-2016, 00:36:36 »
Сейчас еще сезон отпусков. Да и лишь небольшой процент форумчан использует для разработки VBA (этот раздел на девятом месте по популярности). Так что отклик может быть не так быстро.
Ничего страшного, я и не тороплюсь.
Убеди начинающих программировать под AutoCAD, что из всех вариантов API и языков программирования им следует выбирать VBA.
Согласен, пожалуй, следовало записать урок, почему следует начинать именно с VBA.
Ну и возможно в чем ты видишь его ограниченность - ведь не зря ты "мигрировал" на C# и AutoCAD .NET API.
Про ограниченность VBA только если в видеоуроках по c#.  ;)

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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #31 : 24-08-2016, 11:53:37 »
Обсуждение отделил в отдельную тему: Обсуждение видеоуроков AutoCAD VBA
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #32 : 24-08-2016, 11:58:25 »
Максим Маркевич, внести исправления в стартовый пост темы - укажи ссылку на обсуждение.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #33 : 24-08-2016, 12:19:25 »
Максим Маркевич, внести исправления в стартовый пост темы - укажи ссылку на обсуждение.
Сделано. Попытался даже немного расклассифицировать, какие вопросы можно поднимать здесь, а какие там.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #34 : 25-08-2016, 04:50:06 »
Для тех, кто до сих пор не понял, зачем манипулировать блоками AutoCAD при помощи VBA, я подготовил подборочку видео-демонстраций. Делал все это по молодости (около года назад  :D). Возможно, кого-нибудь вдохновит на подвиги.





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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #35 : 01-09-2016, 02:54:06 »
10. Использование документации на примере создания таблицы
В данном видеоуроке поясняется, для чего нужна документация и где ее найти, а также как, например, создать таблицу в VBA при помощи документации (по сути, краткое руководство о том, как найти нужный пример).


Код - Visual Basic [Выбрать]
  1. 'Создание таблицы
  2. Sub Table()    Dim pt(2) As Double
  3.     Dim MyTable As AcadTable
  4.    
  5.     'Вставляем таблицу в чертеж в точку pt(0,0,0)
  6.    Set MyTable = ThisDrawing.ModelSpace.AddTable(pt, 5, 5, 10, 30)
  7.    
  8.     'Двойной клик по "колесику"
  9.    ZoomExtents
  10.  
  11. End Sub

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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #36 : 05-09-2016, 12:58:24 »
Обсуждение начинать или не начинать изучение программирования с BASIC (VBA) перенёс сюда: http://adn-cis.org/forum/index.php?topic=7314.0

В этой теме только видеоуроки AutoCAD VBA

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #37 : 27-09-2016, 00:46:27 »
11. AutoCAD VBA. Достучаться до MathCAD через API
В данном видео рассказывается о том, как считать инфу из Mathcad без буферного Excel (через Mathcad API), о плюсах и минусах данного метода.


Код - Visual Basic [Выбрать]
  1. 'Подключение к MathcadAPI
  2. Sub MathcadAPI()
  3.  
  4.     'Декларируем переменные
  5.    Dim MathAP As Mathcad.Application
  6.     Dim MathWs As Mathcad.Worksheets
  7.     Dim MathW As Mathcad.Worksheet
  8.    
  9.     'Устанавливаем переменные
  10.    Set MathAP = CreateObject("Mathcad.Application")
  11.     MathAP.Visible = True
  12.     Set MathWs = MathAP.Worksheets
  13.     Set MathW = MathWs.Open("m:\mathcad.xmcd")
  14.    
  15.     'Считываем переменные из Mathcad
  16.    a = MathW.GetValue("a")
  17.     b = MathW.GetValue("b")
  18.        
  19.     'Выводим переменные для проверки
  20.    MsgBox "a=" & a & "   " & "b=" & b
  21.        
  22. End Sub

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #38 : 28-09-2016, 11:11:52 »
12. AutoCAD VBA. Стоит ли начинать программирование с VBA
В видео собраны плюсы и минусы, которые я вижу при работе с VBA. Также упомянута мысль, которая обсуждалась вот здесь. По сути, предоставлена пища для ума и выбора, а также высказано личное мнение.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 1999
  • Карма: 160
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Видеоуроки AutoCAD VBA
« Ответ #39 : 28-09-2016, 13:08:23 »
По части минусов, в качестве информации к размышлению, довожу до сведения свой печальный опыт использования VBA...

Главная причина, по которой я когда-то ушёл с VBA заключалась в том, что в какой-то момент времени я не смог полноценно продолжать развивать свой проект, написанный на VBA под MS Access 2003-2007. Расскажу поподробней...

Созданный когда-то мною проект представлял собой набор файлов MS Access, разделённых на клиентскую и серверную части. Клиентские представляли собой набор визуальных интерфейсов для работы с контентом, хранящимся в базе данных. Эти клиентские файлы находились на машинках пользователей. На сервере лежал основной файл, хранящий в себе базу данных. Программка задумывалась как приложение, позволяющее вести весь процесс строительства (компания занималась ремонтом как зданий, так и отдельных квартир) с нуля до сдачи под ключ. За пару лет в этом приложении (монолитом) было реализовано следующее:
1. Создана сметная программа, со своей базой данных по различным механизмам, оборудованию, материалам, перечням работ, расченками с привязкой по месяцам и коэффициентам перерасчёта.
2. Смету всегда можно было экспортировать в MS Excel. При этом все ячейки документа содержали в себе формулы, группировки строк и столбцов, а так же дополнительные листы с выборкой всех материалов и механизмов.
3. На основании сметы в программе можно был создавать формы КС-2 и КС-3 (выполнение), а так же акты приёмки работ. Результат так же экспортировался в Excel с полным набором формул, с дополнительными листами, содержащими материалы и механизмы, задействованные в ходе этого выполнения (по аналогии со сметами).
4. В программе присутствовал контроль того, чтобы не было превышения объемов работ и перерасходов материала. Если такое превышение или перерасход требовались, то в проге создавалась заявка руководству о необходимости такого превышения и оно обосновывалось. Заявка попадала руководству (которое так же пользовалось клиентом приложения) и в случае одобрения (руководство жало на кнопку "одобрить") формировался акт о перерасходе и можно было на указанный объём превышать затраты материалов (или объём работ).
5. В той же программе, после того, как смета была создана, она сначала попадала в отдел снабжения, который проверял адекватность единичных расценок по каждой позиции сметы (т.к. именно снабженец потом закупает материалы). Если все расценки, указанные в смете, соответствуют реальным, то снабженец жал кнопку "одобрено" и смета далее летела по сети к руководству. Руководство смотрело смету и одобряло либо забраковывало её (отправляло на доработку). Формы кс-2 и кс-3 программа разрешала создавать только после одобрения руководством исходной сметы. Ежели снабженец находил в смете расценки, с которыми не был согласен, то он выдавал свои замечания, помечая свой вариант расценки и отправлял это обратно, на доработку в сметный отдел.

По ходу развития проекта, мне время от времени нужно было вносить изменения в исходный код VBA, что-то изменяя или, как правило, добавляя новый функционал, о котором просили пользователи. Так же приходилось вносить правки в графический интерфейс, т.е. в формочки (диалоговые окна), на которых находились визуальные контролы, такие как кнопки, списки, текстовые поля, чекбоксы и т.п.

Вот когда программка была мною написана на VBA до указанной выше стадии, вдруг начались проблемы... К этому моменту программа уже вовсю использовалась около трёх лет. Компания была небольшой, пользовались программой около 10 человек.

С некоторых пор я заметил следующее:

В редакторе VBA, если я пытался поставить курсор мышки в конкретном диапазоне строк исходного кода в конкретном модуле, то я получал аварийное завершение MS Access. Т.е. у меня в коде были такие места, которые я в дальнейшем не мог править, т.к. банальная попытка установить курсор на строку кода, подлежащую редактированию, приводило к краху MS Access. Похожая ситуация вдруг появилась в некоторых редакторах форм: попытка подвинуть какой-то контрол (драг-дропом) или изменить его размер, так же приводило к аварийному завершению  MS Access. Т.е. это происходило не везде, но только в определённых местах и всегда (с некоторых пор).

Сначала у меня появилось таких "артефактов" два (где-то через пару лет после создания проекта). Я просто запомнил эти проблемные места и в дальнейшем старался избегать их. Но со временем я заметил, что подобные "артефакты" стали появляться и в др. местах (причём очень важных), где не столь давно их не было... Я не понимал в чём дело, пытался выполнять экспорт клиентов и сервера и сохранять в др. версии MS Access, но обозначенные проблемы не исчезали. Я полагаю, что это был какой-то баг не самого VBA, но баг редактора VBA, который был встроен в MS Access. А поскольку в др приложениях используются тот же самый редактор VBA, то существует опасность того, что подобное поведение я могу словить и при программировании на VBA в др. продуктах, таких как MS Office. Я долго искал решение обозначенной мною выше проблемы на различных форумах, но так и не нашёл его.

Это была серьёзная проблема, т.к. программа уже по полной использовалась в компании. Нельзя было просто взять и выбросить её в ведро, т.к. слишком много на ней уже было завязано. Оставалось только продолжать использовать её в том виде, в котором она была на тот момент, прекратив её развитие. Для меня это был весьма ощутимый удар, т.к. в эту программу я вложил очень много сил. Собственно всё это было разработано мною в одиночку... И тут такой "сюрприз" оттуда, откуда не ждал...

Стало совершенно очевидно, что в виду обозначенных выше проблем продолжать развивать приложение в MS Acces не имеет смысла. Редактор VBA работает как чёрный ящик. Я не мог заглянуть в него, дабы понять в чём дело. Нужно было переходить на что-то более открытое и безопасное, где подобные грабли не могли бы возникнуть. Т.е. нужно переходить на что-то такое, где я бы имел возможность открывать свои исходники в банальном текстовом редакторе (при необходимости) и вносить в него правки. Для себя я решил, что больше никогда не буду писать на VBA что-то сложное, да и вообще, по возможности буду стараться избегать писать на нём, дабы избежать появления обозначенных выше проблем.

Я пошёл к руководству, рассказал о проблеме и предложил оставить текущую версию как есть и начать писать др. автономную программу, не являющуюся надстройкой над MS Access. Руководство дало добро.

В то время, помимо VBA, я имел лишь небольшой опыт работы с AutoLISP (даже не Visual LISP). Поэтому такие слова как C, C++, .NET, C# и т.п. мне мало о чём говорили. Я знал только то, что C и C++ "очень сложные языки, на изучение которых потребуется порядочно времени и сил".

В то время я думал, что ".net" - это что-то связанное с сетью. Но погуглив узнал, что это не так. Так же почитал в интернете, что изучать какой-нибудь .net-язык гораздо проще, чем изучать C\C++. Я так же прочитал, что многие программисты из существовавших на тот момент .net-языков предпочтение отдавали C#. Поэтому я стал выбирать между VB.NET и C#. Я так же видел, что книг и статей с примерами кода гораздо больше по C#, чем по VB.NET. Кроме того, посмотрев примеры кода VB.NET я сделал для себя вывод, что это совершенно др. язык (ибо кода я не понял), отличный от VBA и имеющий с ним лишь некоторое синтаксическое сходство. После того, как я один вечер почитал основы по C#, я понял, что его синтаксис мне нравится гораздо больше, чем синтаксис VBA и VB.NET (это помимо того, что обучающих мануалов по C# было так же значительно больше чем по VB.NET). Так я принял решение, что уходить с VBA буду на C#.

Затем в нашей стране наступил кризис. У компании возникли существенные проблемы с заказами и она стала разваливаться (там уже руководству было не до моих программ)...

Потом я наблюдал метания автодеска - то "срочно уходите с vba", то "можете ещё некоторое время посидеть на vba", что так же не было плюсом в копилку VBA...

Вот таким был мой печальный опыт использования VBA.

Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 230
  • Карма: 24
Re: Видеоуроки AutoCAD VBA
« Ответ #40 : 14-10-2016, 12:54:19 »
расскажи про AcFocusCtrl.dll

Оффлайн RedAlex

  • ADN OPEN
  • Сообщений: 1
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #41 : 16-10-2016, 08:00:34 »
Добрый день,

Пытаюсь повторить ваш урок:
&index=2

После того как ввожу "Dim AP As Excel"  и ставлю точку, не возникает предложение завершить "Application", набрав вручную текст, после F5, сообщается ошибка: User-defined type not defined, как исправить данную ошибку?

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #42 : 16-10-2016, 10:47:48 »
RedAlex, привет! Там необходимо добавить ссылку (см. пост).

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #43 : 16-10-2016, 10:50:28 »
расскажи про AcFocusCtrl.dll
Я почти не работал с Windows Forms в VBA.
А что тебя, конкретно, интересует? Работа с немодальными окнами?

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #44 : 17-10-2016, 14:37:24 »
13. AutoCAD VBA. Печать форматов
Данный урок является предисловием к трем последующим и демонстрирует варианты печати в AutoCAD при помощи VBA.

Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 230
  • Карма: 24
Re: Видеоуроки AutoCAD VBA
« Ответ #45 : 19-10-2016, 13:18:03 »
Цитировать
А что тебя, конкретно, интересует? Работа с немодальными окнами?
Меня не интересует, просто там ещё то колдунство - новичкам будет полезно и выглядит эффектно
Цитировать
Я почти не работал с Windows Forms в VBA.
Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBA

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #46 : 26-10-2016, 20:32:03 »
Меня не интересует, просто там ещё то колдунство - новичкам будет полезно и выглядит эффектно
Можем с тобой скооперироваться - сделать подобный урок. Если есть желание, то го в скайп/лс обсудим.
Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBA
Я начал создавать окошки сразу при помощи WPF (уже в C#).

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #47 : 29-10-2016, 02:44:09 »
14. AutoCAD VBA. Печать с выбором рамки
Разобран 1-й из выделенных мной в предыдущем уроке способов (он же самый неудобный, но необходимый для дальнейшего понимания).

Код - Visual Basic [Выбрать]
  1. '1. Печать в пдф при помощи выбора нижней левой и верхней правой точек
  2. Sub PlotByPoints()
  3.  
  4.     ' Декларируем
  5.    Dim Layout As AcadLayout
  6.     Dim pt1 As Variant, pt2 As Variant
  7.    
  8.     ' Устанавливаем
  9.    Set Layout = ThisDrawing.ActiveLayout
  10.    
  11.     ' Получаем первую точку рамки
  12.    pt1 = ThisDrawing.Utility.GetPoint(, "Выберите нижний левый угол")
  13.     ' Переводим координаты из WCS в DCS
  14.    pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  15.     ReDim Preserve pt1(0 To 1)   ' Приводим массив к 2д виду, удаляем z координату
  16.    
  17.     ' Получаем вторую точку
  18.    pt2 = ThisDrawing.Utility.GetPoint(, "Выберите правый верхний угол")
  19.     ' Переводим координаты из WCS в DCS
  20.    pt2 = ThisDrawing.Utility.TranslateCoordinates(pt2, acWorld, acDisplayDCS, False)
  21.     ReDim Preserve pt2(0 To 1)   ' Приводим массив к 2д виду, удаляем z координату
  22.    
  23.     ' Обновим текущую плот-информацию
  24.    Layout.RefreshPlotDeviceInfo
  25.            
  26.     ' Настройка печати
  27.    Layout.ConfigName = "DWG to PDF.pc3"
  28.     Layout.CanonicalMediaName = "ISO_full_bleed_A1_(594.00_x_841.00_MM)"
  29.     Layout.CenterPlot = True
  30.     Layout.PlotRotation = ac90degrees
  31.     Layout.StandardScale = acScaleToFit
  32.     Layout.StyleSheet = "acad.ctb"
  33.    
  34.     ' Устанавливаем рамки окошка
  35.    Layout.SetWindowToPlot pt1, pt2
  36.     Layout.PlotType = acWindow
  37.    
  38.     ' Отправляем на печать
  39.    ThisDrawing.Regen acAllViewports
  40.     ThisDrawing.Plot.PlotToDevice
  41.    
  42. End Sub
  43.  
« Последнее редактирование: 30-10-2016, 13:24:52 от Максим Маркевич »

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #48 : 16-11-2016, 02:01:16 »
15. AutoCAD VBA. Печать по блоку формата
Разобран 2-й из выделенных мной способов (печать по конкретному блоку). Весь нюанс состоит в определении координат точек, которые являются границами печати.

Код - Visual Basic [Выбрать]
  1. ' 2. Печать по конкретному блоку формата
  2. Sub PlotByBlock()
  3.    
  4.     ' Декларируем переменные
  5.    Dim objEnt As AcadEntity
  6.     Dim objBRef As AcadBlockReference
  7.     Dim pt1 As Variant
  8.     Dim pt2(0 To 1) As Double
  9.  
  10.     ' Создаем выбор рамкой
  11.    On Error Resume Next
  12.     ThisDrawing.SelectionSets("SS").Delete
  13.     Set ss = ThisDrawing.SelectionSets.Add("SS")
  14.     ss.SelectOnScreen
  15.        
  16.     ' Работаем, если имя блока А1
  17.    For Each objEnt In ss
  18.     If objEnt.ObjectName = "AcDbBlockReference" Then
  19.     Set objBRef = objEnt
  20.         If objBRef.EffectiveName = "A1" Then
  21.             pt1 = objBRef.insertionPoint
  22.             pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  23.             ReDim Preserve pt1(0 To 1)
  24.             pt2(0) = pt1(0) + 841
  25.             pt2(1) = pt1(1) + 594
  26.         End If
  27.     End If
  28.     Next
  29.    
  30.     'Вызываем процедуру печати
  31.    Plot pt1, pt2
  32.    
  33. End Sub
  34.  
  35. Sub Plot(pt1 As Variant, pt2 As Variant)
  36.  
  37.     ' Декларируем
  38.    Dim Layout As AcadLayout
  39.          
  40.     ' Устанавливаем
  41.    Set Layout = ThisDrawing.ActiveLayout
  42.        
  43.     Layout.RefreshPlotDeviceInfo
  44.            
  45.     ' Настройка печати
  46.    Layout.ConfigName = "DWG to PDF.pc3"
  47.     Layout.CanonicalMediaName = "ISO_full_bleed_A1_(594.00_x_841.00_MM)"
  48.     Layout.CenterPlot = True
  49.     Layout.PlotRotation = ac90degrees
  50.     Layout.StandardScale = acScaleToFit
  51.     Layout.StyleSheet = "acad.ctb"
  52.    
  53.     ' Устанавливаем рамки и тип окошка
  54.    Layout.SetWindowToPlot pt1, pt2
  55.     Layout.PlotType = acWindow
  56.    
  57.     ' Отправляем на печать
  58.    ThisDrawing.Regen acAllViewports
  59.     ThisDrawing.Plot.PlotToDevice
  60.    
  61. End Sub
« Последнее редактирование: 16-11-2016, 03:33:08 от Максим Маркевич »

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #49 : 16-11-2016, 02:04:46 »
16. AutoCAD VBA. Пакетная печать блоков-форматов
Разобран 3-й из выделенных мной способов (пакетная печать блоков). Весь нюанс состоит в "зацикливании" печати.

Код - Visual Basic [Выбрать]
  1. ' 3. Пакетная печать конкретных блоков-форматов
  2. Sub PlotByBlocks()
  3.  
  4.     Dim objEnt As AcadEntity
  5.     Dim objBRef As AcadBlockReference
  6.     Dim pt1 As Variant
  7.     Dim pt2(0 To 1) As Double
  8.     Dim i As Integer
  9.    
  10.     ' Создаем выбор рамкой
  11.    On Error Resume Next
  12.     ThisDrawing.SelectionSets("SS").Delete
  13.     Set ss = ThisDrawing.SelectionSets.Add("SS")
  14.     ss.SelectOnScreen
  15.        
  16.     ' Работаем, если имя блока А1
  17.    i = 0
  18.     For Each objEnt In ss
  19.     If objEnt.ObjectName = "AcDbBlockReference" Then
  20.     Set objBRef = objEnt
  21.         If objBRef.EffectiveName = "A1" Then
  22.             pt1 = objBRef.insertionPoint
  23.             pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  24.             ReDim Preserve pt1(0 To 1)
  25.             pt2(0) = pt1(0) + 841
  26.             pt2(1) = pt1(1) + 594
  27.             i = i + 1
  28.             PolyPlot "c:\Users\evthi\Desktop\Тест" + CStr(i), pt1, pt2
  29.         End If
  30.     End If
  31.     Next
  32.    
  33. End Sub
  34. Sub PolyPlot(strFileName As String, pt1 As Variant, pt2 As Variant)
  35.  
  36.     ' Декларируем
  37.    Dim Layout As AcadLayout
  38.          
  39.     ' Устанавливаем
  40.    Set Layout = ThisDrawing.ActiveLayout
  41.        
  42.     Layout.RefreshPlotDeviceInfo
  43.            
  44.     ' Настройка печати
  45.    Layout.ConfigName = "DWG to PDF.pc3"
  46.     Layout.CanonicalMediaName = "ISO_full_bleed_A1_(594.00_x_841.00_MM)"
  47.     Layout.CenterPlot = True
  48.     Layout.PlotRotation = ac90degrees
  49.     Layout.StandardScale = acScaleToFit
  50.     Layout.StyleSheet = "acad.ctb"
  51.    
  52.     ' Устанавливаем рамки и тип окошка
  53.    Layout.SetWindowToPlot pt1, pt2
  54.     Layout.PlotType = acWindow
  55.    
  56.     ' Отправляем на печать
  57.    ThisDrawing.Regen acAllViewports
  58.     ThisDrawing.Plot.PlotToFile strFileName
  59.        
  60. End Sub
« Последнее редактирование: 16-11-2016, 03:44:26 от Максим Маркевич »

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Re: Видеоуроки AutoCAD VBA
« Ответ #50 : 17-11-2016, 07:27:29 »
Максим Маркевич, спасибо что прикладываете код, а то видео на форуме не очень хорошего качества. Смотреть лучше в Youtube на Вашем канале. Успехов Вам в Вашем труде. Я Вам говорю СПАСИБО!

Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #51 : 17-11-2016, 12:23:18 »
Максим Маркевич, спасибо что прикладываете код, а то видео на форуме не очень хорошего качества.
На здоровье. Кстати, я не вижу разницы между форумом и ютубом:

Смотреть лучше в Youtube на Вашем канале. Успехов Вам в Вашем труде. Я Вам говорю СПАСИБО!
Пожалуйста. Очень приятно!
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 11
  • Skype: pashin.evgeniy
Re: Видеоуроки AutoCAD VBA
« Ответ #52 : 17-11-2016, 13:19:48 »
На здоровье. Кстати, я не вижу разницы между форумом и ютубом:

А у меня видео с низким качеством почему-то. Буквы плохо было видно. Но тут можно качеством видео управлять. Окей, буду здесь смотреть.

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #53 : 17-11-2016, 13:49:25 »
Обсуждение в теме http://adn-cis.org/forum/index.php?topic=7282.0 !
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #54 : 07-01-2017, 21:45:26 »
17. AutoCAD VBA. Задачка для продвинутых
Решение конкретной задачи, которая была сформулирована здесь.


Код - Visual Basic [Выбрать]
  1. Sub InsertBlocksFromExcel()
  2.     Dim AP As Excel.Application
  3.     Dim WB As Excel.Workbook
  4.     Dim ws As Excel.Worksheet
  5.     Dim ar(50) As Integer
  6.     Dim n As Integer
  7.     Dim blockRef As AcadBlockReference
  8.     Dim name As String
  9.     Dim insertPoint(0 To 2) As Double
  10.        
  11.     Set AP = Excel.Application
  12.     Set WB = AP.Workbooks.Open("c:\Users\evthi\Desktop\Тестовый эксель.xlsx")
  13.     Set ws = WB.Worksheets("Лист1")
  14.    
  15.     n = 0
  16.     'Пробегаемся по всем строчкам таблицы
  17.    For i = 3 To 31
  18.         'Если 1й и 2й столбцы пустые то в массив записываем номер следующей строки
  19.        'это и будет строчка с нашими марками
  20.        If Cells(i, 1) = "" And Cells(i, 2) = "" Then
  21.             ar(n) = i + 1
  22.             n = n + 1
  23.         End If
  24.     Next
  25.            
  26.     'Пробегаемся по нашему массиву, в котором лежат номера строк марок
  27.    For i = LBound(ar) To n
  28.         insertPoint(0) = CDbl(Cells(ar(i), 3))
  29.         insertPoint(1) = CDbl(Cells(ar(i), 4))
  30.         insertPoint(2) = CDbl(Cells(ar(i), 5))
  31.         name = Cells(ar(i), 2)
  32.        
  33.             'Пробегаемся по всем экземплярам
  34.            For j = ar(i) + 1 To ar(i + 1) - 2
  35.                 On Error GoTo ES:
  36.                
  37.                 'Вставляем блок
  38.                Set blockRef = ThisDrawing.ModelSpace.InsertBlock(insertPoint, "Тестовый", 1, 1, 1, 0)
  39.                 insertPoint(0) = insertPoint(0) + 1000#
  40.                
  41.                         'Работа с динамическими свойствами
  42.                        If blockRef.IsDynamicBlock = True Then
  43.                             Props = blockRef.GetDynamicBlockProperties
  44.                             For Index = LBound(Props) To UBound(Props)
  45.                                 Set prop = Props(Index)
  46.                                     If prop.PropertyName = "Расстояние1" Then
  47.                                     prop.Value = Cells(j, 1) * 1
  48.                                     End If
  49.                             Next
  50.                         End If
  51.                         'Работа с атрибутами
  52.                        If blockRef.HasAttributes = True Then
  53.                             att = blockRef.GetAttributes
  54.                             For Index = LBound(att) To UBound(att)
  55.                                 If att(Index).TagString = "МАРКА" Then
  56.                                 att(Index).TextString = name
  57.                                 End If
  58.                             Next
  59.                         End If
  60.                        
  61.             Next
  62.     Next
  63.    
  64. 'В случае ошибки попадаем сюда
  65. ES:
  66.     AP.Quit
  67.    
  68. End Sub
  69.  
« Последнее редактирование: 08-01-2017, 00:03:33 от Максим Маркевич »

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Видеоуроки AutoCAD VBA
« Ответ #55 : 02-02-2017, 14:10:55 »
Сначала спасибо за тему, Максим!
Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBA
Я начал создавать окошки сразу при помощи WPF (уже в C#).
Я правильно понял, что из кода VBA вызывается форма, сделанная в C# WPF, и затем данные введенные в той форме снова возвращаются в VBA?

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #56 : 02-02-2017, 16:28:45 »
Я правильно понял, что из кода VBA вызывается форма, сделанная в C# WPF, и затем данные введенные в той форме снова возвращаются в VBA?
На здоровье. :)
Нет, не совсем так. Суть в том, что "формочки" мне реально в жизни понадобились, когда я уже начал писать на C#.
Если пишешь на VBA, то и формочки нужно создавать в VBA, при помощи WinForms.

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Видеоуроки AutoCAD VBA
« Ответ #57 : 02-02-2017, 16:58:05 »
Если пишешь на VBA, то и формочки нужно создавать в VBA, при помощи WinForms.
Это понятно. Но Вы же понимаете, что формочки WinForms - это очень-очень жиденько по сравнению с WPF. Ситуация у меня такая. Было сделано окно в WPF для надстройки в Ревит. Но с Ревитом незаладилось - руководство охладело к этой затее. Возможно, данное приложение буду переделывать в VBA. Хочется использовать уже сделанную работу в части интерфейса. Повторить в WinForms невозможно. Может есть у кого какие-то решения такой проблемы?

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Видеоуроки AutoCAD VBA
« Ответ #58 : 02-02-2017, 17:15:08 »
Это понятно. Но Вы же понимаете, что формочки WinForms - это очень-очень жиденько по сравнению с WPF. Ситуация у меня такая. Было сделано окно в WPF для надстройки в Ревит. Но с Ревитом незаладилось - руководство охладело к этой затее. Возможно, данное приложение буду переделывать в VBA. Хочется использовать уже сделанную работу в части интерфейса. Повторить в WinForms невозможно. Может есть у кого какие-то решения такой проблемы?
C# - решение твоей проблемы. Ну или VB.NET, что нежелательно, но проще после VBA.

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Видеоуроки AutoCAD VBA
« Ответ #59 : 02-02-2017, 17:56:28 »
C# - решение твоей проблемы. Ну или VB.NET, что нежелательно, но проще после VBA.
Это понятно. Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #60 : 17-07-2017, 18:38:34 »
Я отделил сообщения в отдельную тему: Пакетная печать блоков-форматов в PDF  на LISP
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн shaftler

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #61 : 01-11-2017, 18:12:28 »
Добрый день!
Подскажите, возможно ли при пакетной печати выводить печатаемые блоки не в отдельные файлы, а в один файл на отдельные листы? Если да, то как?
Благодарю за понимание.

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #62 : 01-11-2017, 18:39:54 »
Ну вроде бы весь код открыт... Наверняка можно разобраться (просто я на VBA не пишу). Может быть, дело в настройках виртуального плоттера.
Все, что сказано - личное мнение.

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

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

Оффлайн shaftler

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #63 : 01-11-2017, 18:49:50 »
Ну вроде бы весь код открыт... Наверняка можно разобраться (просто я на VBA не пишу). Может быть, дело в настройках виртуального плоттера.
Я немного знаю VBA но вот с автокадом совсем не знаком, все больше в екселе приходилось. Спасибо что подсказали направление поиска. Если вдруг кто-то сталкивался с этим вопросом буду благодарен за любую информацию.

Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #64 : 26-12-2017, 11:20:22 »
Всем добрый день.
Раньше не замечал проблему в VBA скрипте: «Получение данных для блока AutoCAD из документа Excel» проблема заключается в следующем: При подключении AutoCAD к Excel-ю работает с тел листом на котором был завершён сеанс или сохранен файл на открытом листе, скрипт почему-то не открывает необходимый лист в Excel-е для получения необходимых данных из AutoCAD-а.
Кто-нибудь сталкивался с данной ситуацией? (Если да, то что делали?).

VBA код:
Код - 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.         'Устанавливаем связь с Excel
  8.        Set AP = Excel.Application
  9.         Set WB = AP.Workbooks.Open("m:\Excel.xlsx")
  10.         Set WS = WB.Worksheets("Лист1")  
  11.         'Считываем данные
  12.        ....
  13.         ....
  14.         'Выводим в AutoCAD
  15.        MsgBox dlina & " = " & a
  16.        
  17.         'Закрываем Excel
  18.        AP.Quit
  19.      
  20.     End Sub

Видео с проблемой:


Примечание: AutoCAD 2013(x64)+Windows 7(x64)

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #65 : 26-12-2017, 11:34:34 »
Как вариант - обращаться не по имени, а по номеру листа.
Может быть, проблема вообще в самом Excel. Версия какая?
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #66 : 26-12-2017, 11:35:26 »
P.S. Я бы не использовал раннее связывание и максимально ушел в сторону позднего. Код писать становится менее удобно, но результат будет более устойчивым.
Все, что сказано - личное мнение.

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

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

Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #67 : 26-12-2017, 11:38:12 »
Microsoft Office 2013

Обращение по номеру листа тоже не срабатывает.

Возможно, как вариант не проходит VBA код (строка номер 10)

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #68 : 26-12-2017, 11:49:17 »
А в самом Excel'e сработает код наподобие
Код - Visual Basic [Выбрать]
  1. Option Explicit
  2.  
  3. Public Sub test()
  4.   Dim ws As Worksheet
  5.  
  6.   Set ws = ThisWorkbook.Sheets(1)
  7.   ws.Activate
  8. End Sub
?
Все, что сказано - личное мнение.

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

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

Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #69 : 26-12-2017, 11:55:20 »
Нет код не сработал


Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #70 : 26-12-2017, 12:01:05 »
В Excel-е код сработал.
Код - Visual Basic [Выбрать]
  1.     Option Explicit
  2.      
  3.     Public Sub test1()
  4.       Dim ws As Worksheet
  5.      
  6.       Set ws = ThisWorkbook.Sheets(1)
  7.       ws.Activate
  8.     End Sub

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #71 : 26-12-2017, 12:02:58 »
... и активировался первый лист?
Все, что сказано - личное мнение.

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

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

Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #72 : 26-12-2017, 12:03:31 »
Да
 :)

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #73 : 26-12-2017, 12:17:54 »
В таком случае я бы делал примерно так:
Код - Visual Basic [Выбрать]
  1. Option Explicit
  2.  
  3. Public Sub test()
  4. Dim oExcel As Object
  5. Dim oWbook As Object
  6. Dim oSheet As Object
  7.   Set oExcel = GetOrCreateObject("Excel.Application")
  8.   oExcel.Visible = True
  9.   Set oWbook = oExcel.Workbooks.Open("d:\êíèãà1.xlsx")
  10.   Set oSheet = oWbook.Sheets(3)
  11.   oSheet.Activate
  12.   ' ...
  13.  oExcel.Quit
  14. End Sub
  15.  
  16. Private Function GetOrCreateObject(AppName As String) As Object
  17. Dim oRes As Object
  18. On Error GoTo lCreateObject
  19.   Set oRes = GetObject(, AppName)
  20.   Set GetOrCreateObject = oRes
  21.   Exit Function
  22. lCreateObject:
  23.   Set oRes = CreateObject(AppName)
  24.   Set GetOrCreateObject = oRes
  25.   Exit Function
  26. End Function
  27.  
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #74 : 26-12-2017, 12:18:20 »
Активирую лист и делаю Excel видимым только для иллюстративных целей.
Все, что сказано - личное мнение.

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

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

Оффлайн ediczr2012

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #75 : 26-12-2017, 12:30:31 »
Спасибо.  Все работает как нужно.  :)

Рабочий вариант:  « Ответ #73 : 26-12-2017, 12:17:54 »

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

  • Administrator
  • *****
  • Сообщений: 773
  • Карма: 121
Re: Видеоуроки AutoCAD VBA
« Ответ #76 : 26-12-2017, 12:32:20 »
Что именно? Последний вариант кода?
Все, что сказано - личное мнение.

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

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

Оффлайн ales11

  • ADN OPEN
  • Сообщений: 1
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #77 : 17-09-2018, 12:48:51 »
17. AutoCAD VBA. Задачка для продвинутых
Решение конкретной задачи, которая была сформулирована здесь.
Максим, добрый день. Вы привели прекрасный пример со вставкой блоков с атрибутами из Excel. Подскажите пожалуйста, как добавить в Ваш код VBA такой параметр как видимость динамического блока (понятно, что считывание будет происходить с того же файла Excel, где в отдельной колонке будут название "видимости" каждого вставляемого блока). Заранее благодарен за ответ. 

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

  • ADN Club
  • ****
  • Сообщений: 415
  • Карма: 95
Re: Видеоуроки AutoCAD VBA
« Ответ #78 : 18-09-2018, 07:52:59 »
Подскажите пожалуйста, как добавить в Ваш код VBA такой параметр как видимость динамического блока (понятно, что считывание будет происходить с того же файла Excel, где в отдельной колонке будут название "видимости" каждого вставляемого блока). Заранее благодарен за ответ. 
Посмотрите в районе 46-й строки указанного кода, посмотрите в отладчике какие значения есть у параметра видимости и все станет очевидно.

Off-Topic: показать

Библиотека экспорта и импорта атрибутов и динамических свойств блоков Автокада в csv файл, для правки этих свойств во внешних программах : https://github.com/BoxaShu/dynIN_dynOUT