Обсуждение видеоуроков AutoCAD VBA

Автор Тема: Обсуждение видеоуроков AutoCAD VBA  (Прочитано 9105 раз)

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

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #90 : 06-01-2017, 18:51:31 »
Сейчас прочитала на форуме АВОК фразу Алексей Кулик, , "Хорошая постановка задачи - не меньше 70% решения. Если тебе надо разработать средство для решения, к примеру, такого:
"Позволить пользователю многократно вставлять блок, находящийся в библиотеке. Блок в момент вставки динамически отрисовывается рядом с курсором. Атрибуты блоков заполняются автоматически, на основании списка возможных. Библиотека блоков лежит локально, кроме текущего пользователя, к ней никто доступа не имеет"

Вот правда. И задача примерно та же. Решена была с помощью Excel-Lookup2.lsp/
Xотелось бы попробовать решить с помощью VBA.



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

  • Administrator
  • *****
  • Сообщений: 590
  • Карма: 90
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #91 : 06-01-2017, 21:11:29 »
Госспидя, я там уж сто лет не появлялся... :)
Если не использовать .NET / ObjectARX, то чуть ли не единственный способ - использвать команду "_.insert" с ожиданием ввода пользователем точки вставки блока. Ну или, если работа предполагается только в 2D, команды _.change
Все, что сказано - личное мнение.

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

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

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #92 : 06-01-2017, 21:33:47 »
Алексей Кулик,
Госспидя, я там уж сто лет не появлялся...
. Мы все помним! :)

"_.insert" - вплне даже прекрасная команда. Она тут подойдет, точка вставки блока - определена неизменно, при этом всё в 2D.
Но вот как позволить пользователю нажать кнопочку в автокаде - и он сам вставляет Х количество блоков, причем Атрибуты этого блока заполняются автоматически, не пойму.

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

  • Administrator
  • *****
  • Сообщений: 590
  • Карма: 90
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #93 : 06-01-2017, 21:39:13 »
ThisDrawing.ModelSpace.InsertBlock и далее все параметры вычисляемыми передавать :) И в каждом вхождении вычислять атрибуты и задавать им значения. В принципе ничего сложного не вижу...
Все, что сказано - личное мнение.

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

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

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #94 : 07-01-2017, 21:29:46 »
Задача от qaaz07 в моей интерпретации:
Есть блок в AutoCAD (см вложение), у которого есть параметр Расстояние1, атрибут МАРКА и в атрибуте ДЛИНА выводится через поле значение Расстояния1:

И есть файл EXCEL (см. вложение):

В этой табличке 3 марки, но их может быть и 50.
Каждой марке соответствует столько вхождений блоков, сколько идет после нее строчек с длиной экземпляра. Координаты первого экземпляра блока указаны в строчке с маркой, далее экземпляры идут с шагом 1000. Марки между собой разделены пустыми строками.
Результатом выполнения программного кода по вышеописанной таблице должно быть следующее (элементы, выделенные красным цветом, носят информативный характер):

Прошу помочь с написанием кода VBA, который делал бы вышеописанное. Заранее, спасибо.(с)qaaz07
В принципе ничего сложного не вижу...
Согласен на все 100.
Сегодня у меня добрались руки, но времени было не много, поэтому программный код можно/нужно шлифовать, тем не менее, задачка решена.
Извините, вам запрещён просмотр содержимого спойлеров.

Писать на VBA все сложней и сложней. Для себя понял, что не стоит записывать видеоуроки о языке, на котором уже не пишешь, поэтому заранее извиняюсь за возможные недочеты.
Но за функционал отвечаю  ;)
Также записал поясняющее видео:


Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #95 : 08-01-2017, 10:37:56 »
Ну чтож, неплохо!Максим Маркевич, , ты на высоте! Просто великолепно!В этой задаче действительно большой потенциал, и если у тебя в екселе уже есть целая VBA программа по расчету данных, а в автокад нужно перенести в общем то примитивные результаты расчета, то наверное VBA (наш устаревающий VBA) пойдет. Как я рада! :)! (я то даже английский толком не знаю, всю жизнь на руском автокаде), очень здорово, спасибо тебе огромное и дай Бог тебе развивать свой талант!

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

  • ADN Club
  • ****
  • Сообщений: 305
  • Карма: 47
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #96 : 08-01-2017, 20:36:07 »
Максим Маркевич, две пустые строчки прекращаем цикл... по поводу размерности массива, комментировать не буду.
Хотя, все это было не обсуждение видео урока, а решение конкретной задачи qaaz07, обычно это решается в других топиках и разделах.
Грустно, в итоге qaaz07, получила решение своего вопроса, но не получила навыков и знаний. Вот такой вот урок.

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #97 : 08-01-2017, 20:57:33 »
Максим Маркевич, две пустые строчки прекращаем цикл...
Да, можно было..
по поводу размерности массива, комментировать не буду.
Я особо не заморачивался. Честно говоря, сходу не вышло создать динамический массив типа
Код - Visual Basic [Выбрать]
  1. Dim ar() as Integer
и я не вспомнил, как решал подобные вещи, когда писал на VBA, поэтому оставил символическую размерность в 50.
программный код можно/нужно шлифовать
Грустно, в итоге qaaz07, получила решение своего вопроса, но не получила навыков и знаний. Вот такой вот урок.
Я понимаю суть каждого твоего слова. И сам не являюсь сторонником подобной помощи. Я совсем не хотел сделать медвежью услугу! Хотел дать понять, насколько интересные задачи можно решать при помощи VBA в AutoCAD. Возможно, это кого-то окрылит, по крайней мере, я очень на это надеюсь!!
Именно поэтому я попытался продемонстрировать, как нужно правильно формулировать задачи и не брался помогать на примерах от qaaz07.

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

  • Administrator
  • *****
  • Сообщений: 590
  • Карма: 90
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #98 : 08-01-2017, 21:54:08 »
я не вспомнил, как решал подобные вещи, когда писал на VBA, поэтому оставил символическую размерность в 50.
ReDim Preserve
не решит задачку? :)
Все, что сказано - личное мнение.

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

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

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #99 : 08-01-2017, 23:42:40 »
ReDim Preserve
не решит задачку?
ReDim + Redim Preserve решит задачку. Хотя вариантов, как обыграть ситуацию с размерностью массива, тьма. Примерный алгоритм такой:
1. Задаем динамический массив:
Код - Visual Basic [Выбрать]
  1. Dim ar() As Integer
2. Перед циклом задаем ему размерность:
Код - Visual Basic [Выбрать]
  1. ReDim ar(1)
3. В цикле меняем размерность после каждого "добавления":
Код - Visual Basic [Выбрать]
  1. ReDim Preserve ar(n)
PS. Я бы не заострял на этом внимание в данном примере. Вариантов много. И решение должно формироваться по необходимости. Можно было, вообще, в экселе ввести доп столбец со всей нужной инфой.

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

  • ADN Club
  • ****
  • Сообщений: 305
  • Карма: 47
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #100 : 09-01-2017, 07:15:10 »
Дался вам этот массив, я имел в виду, что в данном случае уместно использовать то, что называется связным списком или применительно к вба, коллекциями... что то типа Dim s As New Collection. Использование массива и реДим там дороговато будет...

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #101 : 23-01-2017, 18:58:01 »
Максим Маркевич, то есть примерно так? Но вот если я ставлю Option Explicit, то код не работает. Запрашивает i, j, index, но еще и Props =. Это как же его задать? И надо ли.
Насчет дороговато - Владимир Шу, если массив небольшой (а у меня так и есть), вполне пойдет этот вариант.




Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #102 : 23-01-2017, 19:00:29 »
Код - 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() 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("E:\Тестовый эксель.xlsx")
  13.     Set ws = WB.Worksheets("Лист1")
  14.    
  15.     n = 0
  16.      ReDim ar(1)
  17.     'Пробегаемся по всем строчкам таблицы
  18.    For i = 2 To 21
  19.         'Если 1й и 2й столбцы пустые то в массив записываем номер следующей строки
  20.        'это и будет строчка с нашими марками
  21.        If Cells(i, 1) = "" And Cells(i, 2) = "" Then
  22.             ar(n) = i + 1
  23.             n = n + 1
  24.             ReDim Preserve ar(n)
  25.         End If
  26.     Next
  27.            
  28.     'Пробегаемся по нашему массиву, в котором лежат номера строк марок
  29.    For i = LBound(ar) To n
  30.         insertPoint(0) = CDbl(Cells(ar(i), 3))
  31.         insertPoint(1) = CDbl(Cells(ar(i), 4))
  32.         insertPoint(2) = CDbl(Cells(ar(i), 5))
  33.                
  34.             'Пробегаемся по всем экземплярам
  35.            For j = ar(i) + 1 To ar(i + 1) - 2
  36.              On Error GoTo ES:
  37.                
  38.                 'Вставляем блок
  39.                Set blockRef = ThisDrawing.ModelSpace.InsertBlock(insertPoint, "Тестовый", 1, 1, 1, 0)
  40.                 insertPoint(0) = insertPoint(0) + 1000#
  41.                
  42.                         'Работа с динамическими свойствами
  43.                        If blockRef.IsDynamicBlock = True Then
  44.                             Props = blockRef.GetDynamicBlockProperties
  45.                             For Index = LBound(Props) To UBound(Props)
  46.                                 Set Prop = Props(Index)
  47.                                     If Prop.PropertyName = "Расстояние1" Then
  48.                                     Prop.Value = Cells(j, 1) * 1
  49.                                     End If
  50.                             Next Index
  51.                         End If
  52.                         'Работа с атрибутами
  53.                        If blockRef.HasAttributes = True Then
  54.                             att = blockRef.GetAttributes
  55.                             For Index = LBound(att) To UBound(att)
  56.                                 Set at = att(Index)
  57.                                     If at.TagString = "МАРКА" Then
  58.                                     at.TextString = CStr(Cells(j, 2))
  59.                                     End If
  60.                             Next Index
  61.                         End If
  62.                        
  63.             Next
  64.     Next
  65.    
  66. 'В случае ошибки попадаем сюда
  67. ES:
  68.     AP.Quit
  69.    
  70. End Sub
  71.  
  72.  
  73.  

Оффлайн Максим Маркевич

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 26
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #103 : 23-01-2017, 19:18:41 »
Максим Маркевич, то есть примерно так? Но вот если я ставлю Option Explicit, то код не работает. Запрашивает i, j, index, но еще и Props =. Это как же его задать?
Вот смотри, что ты делаешь.. Ты ставишь Option Explicit, тем самым запрещаешь VBA самому типизировать переменные, которые не объявлены.
Как раз, в моем коде i, j, index не объявлены.
То есть ты берешь в начале кода и делаешь нечто типа:
Код - Visual Basic [Выбрать]
  1. Dim i As Integer
  2. Dim j As Integer
ну и так далее..
И надо ли.
Ну, видимо, тебе надо. Зачем-то же ты ставишь Option Explicit.

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #104 : 23-01-2017, 19:48:16 »

Да, но Props = как задать? это же не переменная. то есть я пробовала задать i, j, index, но этого оказалось мало.