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

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

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

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #75 : 03-01-2017, 20:24:13 »
А если в ячейки не число? или не только число?
Стоило сразу нормально делать и парой комментариев все прояснить?
извиняюсь не поняла как правильно цитировать).

И все таки:есть файл автокада с динамическим блоком с атрибутами. Атрибуты - текст, они расчитываются в екселе. Задача - перенести в автокад. Далее - расчитать количество копий данного блока - цифру взять из екселя. Далее Данный блок скопировать и каждой копии присвоить свои атрибуты, расчитанные в екселе. Реальна ли задача для VBA?

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

  • Administrator
  • *****
  • Сообщений: 1093
  • Карма: 172
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #76 : 03-01-2017, 20:38:07 »
Сразу вопрос: а куда вставлять-то новые блоки? Откуда брать настройки вхождений?
И почему бы не попробовать attout / attin? Часть проблемы, я думаю, они помогут решить.
Все, что сказано - личное мнение.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #77 : 04-01-2017, 13:33:23 »
У меня бывает и "43 яблока" и формула лежит в ячейке екселя. И нужно перенести все это в динамический блок Автокада. Как в этом случае быть?
Брать строку и с ней работать!
И все таки:есть файл автокада с динамическим блоком с атрибутами. Атрибуты - текст, они расчитываются в екселе. Задача - перенести в автокад. Далее - расчитать количество копий данного блока - цифру взять из екселя. Далее Данный блок скопировать и каждой копии присвоить свои атрибуты, расчитанные в екселе. Реальна ли задача для VBA?
Итак. Предлагаю не быть голословными. Тестовый пример, содержащий все твои проблемы в студию! Это должно быть нечто простое, при этом, такое, что даст ответ на все твои вопросы. Сформулируй задачу и мы вместе с ней разберемся!

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #78 : 04-01-2017, 13:52:43 »
attout / attin все таки решат лишь малую часть задач. Приложу файлы. В автокаде есть блок Switch, у него есть атрибуты и видимости. Точка вставки для него определена неизменной. Допустим для первого вхождения х=94.928 y=219.4 z=100, для вторго - x=116.454, для третьего - x=137.98 и т.д. В екселе некоторый расчет (электрических щитов), состоящий из "блоков данных щита", разделенных одной строкой. В колонке 16 - номер блока щита. В колонке 18, начиная с 4 строки после номера блока щита идут уже атрибуты автокадовского блока. LINE1 - это колонка 18,LINE2 - это колонка 12... Макросом Максима Маркевича выгружю в автокадовский блок данные из 6 строки. А как проверить - есть ли в колонке 18 значение в следующей строке, (блока щита 1) данные? Если есть, то выполняем команду InsertBloc c координатами x=116.454. Доходим до пустой строки, щит закончился.
Или пойти с другого конца - макросом проверяем количество строк в блоке щита 1, далее ваполняем столько раз команду InsertBloc с заданными координатами.
Ну очень было бы хорошо автоматизировать этот процесс!

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #79 : 04-01-2017, 18:24:36 »
Это должно быть нечто простое, при этом, такое, что даст ответ на все твои вопросы.
Вот теперь представь человека, который в жизни не электрик и ничего подобного никогда не проектировал. Разве это "нечто простое"? :)
Я уже не первый раз пишу, ну придумайте вы "кирпич" с двумя атрибутами, ну быстрее же помогут на форуме!!!!
Так как мне лично не совсем понятно, что нужно сделать, то и писать я буду псевдокодом:
1. Самое первое, что тебе нужно сделать, как я понял, это определить границы блоков щитов в экселе. То есть нужно понять с какой строчки начинается блок 1 и на какой он заканчивается, то же самое нужно проделать для всех блоков.
Для этого ты декларируешь массив чисел и просто его заполняешь, пробегаясь по строчкам экселя.
То есть используешь цикл For от нуля до последней строки экселя, если, например, 1-й и 2-й столбцы нулевые, то есть равны "", то значит следующая строчка - это начало щита, в другой раз при таком же условии - предыдущая строчка будет концом щита. Таким образом, ты определяешь границы - то есть у тебя будет массив, у которого границами первого щита будут элементы с номером 0 и 1, второго - элементы с номером 2 и 3 и т.д.
2. Далее ты пробегаешься циклом по границам первого щита и смотришь, чтобы, например, в столбце 18 было не пустое значение, если оно не пустое, то вставляешь блок с нужными значениями. Все это будет выполняться в цикле без особых проблем. В цикле же задаешь приращение координат!
3. То же самое делаешь для остальных щитов.
Реальна ли задача для VBA?
Задача вполне решаемая для VBA, ничего сверхсложного нет!
Если хочешь помощи в виде кода, то, подготовь "кирпич" (это простой прямоугольный блок, например) с минимальный числом атрибутов, а также самый простой и понятный эксель. И распиши все так, чтобы не приходилось 10 раз перечитывать твое сообщение, уткнувшись в эксель, при этом я так и не разобрался - у меня остались вопросы, а сидеть и вникать - нет столько времени!.
Я вот уверен на 100%, если Вы сядете и попытаетесь четко сформулировать проблему, то более 50% Ваших вопросов отпадут!

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #80 : 05-01-2017, 11:38:13 »
Пожалуй верно. Этот блок дала потому что он до боли знаком бо-ольшому количеству аудитории (и наверняка кто то уже изобрел этот велосипед). Отложим и будем копировать просто линию с 2 атрибутами (это кабель в электрической однолинейке). До полного блока (если удастся справится с этой задачей) дойдет очередь и я обязательно выложу его здесь.

Так как мне лично не совсем понятно, что нужно сделать
А непонятно, потому что я урезала файл ексель. Откройте скрытые строки файла, там еще 2 щита (их может быть 50).
 
Самое первое, что тебе нужно сделать, как я понял, это определить границы блоков щитов в экселе. То есть нужно понять с какой строчки начинается блок 1 и на какой он заканчивается, то же самое нужно проделать для всех блоков.
Между блоками данных щита ВСЕГДА одна пустая строка.
И в колонке 16 ВСЕГДА только номер блока. То есть границы блока щита - это расстояние между цифрами в колонке 16.

Для этого ты декларируешь массив чисел и просто его заполняешь, пробегаясь по строчкам экселя.
Так. Для данного блока "Ветка" для атрибута КАБЕЛЬ массив будет - колонка 2, строка с 6 по 11, для атрибута - ДЛИНА массив будет колонка 3, те же строки.
при этом кол - во строк в блоке щита - это переменная, номера строк - переменная, номер блока щита - переменная.

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #81 : 05-01-2017, 12:14:51 »
То есть используешь цикл For от нуля до последней строки экселя, если, например, 1-й и 2-й столбцы нулевые, то есть равны "", то значит следующая строчка - это начало щита, в другой раз при таком же условии - предыдущая строчка будет концом щита. Таким образом, ты определяешь границы - то есть у тебя будет массив, у которого границами первого щита будут элементы с номером 0 и 1, второго - элементы с номером 2 и 3 и т.д.

Если в строке 3 колонка 16 - то есть cell (3,16) есть цифра (номер щита), то массив начинается ВСЕГДА с 3+3 строки, то есть с в данном случае с 6 строки для любых атрибутов данного блока автокад. Для второго щита (а он будет в другом файле автокад), массив начинается с строки 16 (те же  колонки 2 и 3).

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #82 : 05-01-2017, 17:05:55 »
Итак "бежим" по столбцу 16, и проверяем, есть ли в ячейке число - номер щита. если есть, выделяем вниз строки полностью до первой пустой строки. Это блок щита, обрабатываем его, потом переходим на последнюю найденную из выделенных +1 - получается строка нового блока, далее по кругу. 

Что значит обрабатываем блок щита:
1. создаем отдельный файл .dwg, с названием например по номеру блока щита "01" в той же папке, что и ексель из шаблона .dwt, в котором уже есть наш блок "Ветка". Ну а как иначе.
2. И вот тут надо копировать копировать наш блок ВЕТКА в автокаде нужное количество раз...  :-\

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #83 : 05-01-2017, 17:37:46 »
Пожалуй верно. Этот блок дала потому что он до боли знаком бо-ольшому количеству аудитории (и наверняка кто то уже изобрел этот велосипед).
Лично мне он не знаком. Вообще, ни капельки. :)
Отложим и будем копировать просто линию с 2 атрибутами (это кабель в электрической однолинейке). До полного блока (если удастся справится с этой задачей) дойдет очередь и я обязательно выложу его здесь.
Какую линию? Какие данные? Какой эксель? Что брать? Куда записывать? Куда вставлять?
А непонятно, потому что я урезала файл ексель. Откройте скрытые строки файла, там еще 2 щита (их может быть 50).
Ну вот еще..
Если в строке 3 колонка 16 - то есть cell (3,16) есть цифра (номер щита), то массив начинается ВСЕГДА с 3+3 строки, то есть с в данном случае с 6 строки для любых атрибутов данного блока автокад. Для второго щита (а он будет в другом файле автокад), массив начинается с строки 16 (те же  колонки 2 и 3).
Хорошо. А в чем вопрос?
Итак "бежим" по столбцу 16, и проверяем, есть ли в ячейке число - номер щита. если есть, выделяем вниз строки полностью до первой пустой строки.
Ничего мы не выделяем. Мы получаем информации и ее же обрабатываем!
Что значит обрабатываем блок щита:
1. создаем отдельный файл .dwg, с названием например по номеру блока щита "01" в той же папке, что и ексель из шаблона .dwt, в котором уже есть наш блок "Ветка". Ну а как иначе.
2. И вот тут надо копировать копировать наш блок ВЕТКА в автокаде нужное количество раз... 
Лучше бы я этого не читал :)
qaaz07, ты игнорируешь полностью все мои предложения о нормальном формировании задачи!! Я готов тебе помочь, но не в таком режиме.
Мне не хочется снова перечитывать все это и снова ничего не понимать. Поэтому я формулирую задачу за тебя!! А ты смотри и корректируй ее!!!
PS. Кстати, пока я ее формирую, я бы мог тебе уже помочь!!

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

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

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

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

Прошу помочь с написанием кода VBA, который делал бы вышеописанное. Заранее, спасибо.(с)qaaz07

qaaz07, скажи, пожалуйста, данная задача отражает суть твоих проблем? Если нет, то в таком же ключе сформулируй свою!
Понимаешь ли ты теперь, что я хотел от тебя, когда приводил сравнение с кирпичом?

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #85 : 05-01-2017, 18:05:21 »
Расстояние 1 не важно. Можно вообще убрать.

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #86 : 05-01-2017, 18:16:38 »
Важно скопировать столько раз с приращением 1000, сколько строк в блоке Тестовый1 (например) и при этом занести значения из этих строк в Атрибуты КАБЕЛЬ и ДЛИНА каждой копии блока. Например в колонке 1 будет не Расстояние1, а атрибут ДЛИНА. Н да задачка не из легких.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #87 : 05-01-2017, 18:23:06 »
Расстояние 1 не важно. Можно вообще убрать.
Да это для наглядности! Не суть!!
Важно скопировать столько раз с приращением 1000, сколько строк в блоке Тестовый1 (например) и при этом занести значения из этих строк в Атрибуты КАБЕЛЬ и ДЛИНА каждой копии блока. Например в колонке 1 будет не Расстояние1, а атрибут ДЛИНА. Н да задачка не из легких.
Слушай, нет здесь кабелей!! Забудь про свои кабели! Понимаешь?
У нас есть атрибут МАРКА, а будет там МАРКА1, КОТЫ, СОБАКИ - это не важно.
Вот у меня такое чувство, что ты напрямую на вопросы не отвечаешь!
Еще раз!
qaaz07, скажи, пожалуйста, данная задача отражает суть твоих проблем? Если нет, то в таком же ключе сформулируй свою!
Понимаешь ли ты теперь, что я хотел от тебя, когда приводил сравнение с кирпичом?
?

Оффлайн qaaz07

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #88 : 05-01-2017, 18:32:03 »
Ой, да Пардон, не кабели, а МАРКА) Я к сожалению не программист, ну вот надо просто скопировать блок ВЕТКА столько раз, сколько строк в блоке екселя и атрибуты взять из этих строк екселя. Все.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Обсуждение видеоуроков AutoCAD VBA
« Ответ #89 : 05-01-2017, 18:36:06 »
Я к сожалению не программист
Я тоже не программист!! Но это ж не значит, что я не могу нормально задачу сформировать.
ну вот надо просто скопировать блок ВЕТКА столько раз
У нас нет такого блока.  >:(  :D
Ладно, на сегодня я все. Как появится время, займусь своей/твоей задачей. Возможно, кто-то сможет помочь раньше.