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

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

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

Оффлайн trir

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • 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
  • Карма: 29
  • 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
  • Карма: 29
  • 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.
Это понятно. Спасибо.