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

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

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

Оффлайн qaaz07

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

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



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

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

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

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

Оффлайн qaaz07

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

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

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

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

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

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

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

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

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

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

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

  • ADN Club
  • ***
  • Сообщений: 237
  • Карма: 24
  • 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
  • *****
  • Сообщений: 514
  • Карма: 80
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #98 : 08-01-2017, 21:54:08 »
я не вспомнил, как решал подобные вещи, когда писал на VBA, поэтому оставил символическую размерность в 50.
ReDim Preserve
не решит задачку? :)
Все, что сказано - личное мнение.

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

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

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

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