Я не совсем понимаю, с чем она связана.Возможно, проблема с совместимостью проектов. Скажем, сначала dvb разрабатывался в 2015х64 / 2016х64, а потом его тупо, не проверяя никакие References, открыли в 2012.
Возможно, проблема с совместимостью проектов. Скажем, сначала dvb разрабатывался в 2015х64 / 2016х64, а потом его тупо, не проверяя никакие References, открыли в 2012.Дело в том, что сам dvb не распространяется. То есть ediczr2012 взял код с поста #4 и скопировал в свой проект, ну и в коде "Вставка блока" не нужны никакие References.
ну мы же не знаем полной истории.Немножко знаем/знаю.. Дело в том, что ediczr2012 написал мне сразу в лс, я не смог четко определить, в чем дело, поэтому предложил ему оставить вопрос в теме.
P.S. Вообще есть предложение - создать отдельную тему "Обсуждение видеоуроков по VBA для AutoCAD", чтобы не засорять этот топик (ну и перенести туда #31 и далее). Как идея?Мне кажется, идея очень крутая. Просто изначально Александр Ривилис предложил обсуждать уроки в той же теме, где и сами уроки. Но теперь я вижу, что вот я запишу, например, еще парочку и они уже будут немножко затеряны в этих страницах.
Подозреваю, что проблема связана с AutoCAD / VBA. Возможно требуется переустановка, возможно установка обновлений. Интересно, у ediczr2012 хоть что-то на VBA работает?Очень хороший вопрос. )
Вспомнил еще одну очень важную вещь - AutoCAD всех версий до 2014 использует VBA 6.1, которая только 32-разрядная. Если сам AutoCAD 64-разрядный (Windows 64-разрядная), то возникает масса коллизий, связанная с межпроцесным взаимодействием с разной разрядностью.А вот это вполне может быть причиной неработоспособности. Лично я начинал писать VBA на AutoCAD 2015x64 на Windows7x64. Соответственно, с тех пор менялось все в том же ключе: сейчас у меня AutoCAD 2017x64, a Windows10x64. И никогда я не ловил подобной ошибки. Вообще, никогда.
И никогда я не ловил подобной ошибкиГугл тоже практически ничего про такую ошибку не знает. На форуме Autodesk в разделе AutoCAD VBA такая ошибка встретилась только один раз для AutoCAD 2011 x64 в Windows 7: http://forums.autodesk.com/t5/visual-basic-customization/selectonscreen-win7-64bit-with-version-2011-acad/m-p/3156626/highlight/true#M95539
Лично я начинал писать VBA на AutoCAD 2015x64 на Windows7x64.Начиная с AutoCAD 2014 он использует VBA 7.1, который имеет ту же разрядность, что и сам AutoCAD: http://adn-cis.org/autocad-2014-dlya-razrabotchikov.html
Ну, 2009х64 тем не менее отработал корректно... Установленного 2012х64 нет, проверить не на чем :(Я проверил в AutoCAD 2012 SP2 x64. Код работает нормально, хотя очень тормозит перед запросом указания точки.
Переделанный код VBA:Это не решение вопроса с выбором точки вставки. Тем более, ты не можешь знать, где еще проявятся подобные штуки. Поэтому я бы посоветовал тебе задуматься над переходом на более свежий софт, в частности AutoCAD поновее.
Поддержку VBA ставить отдельно придетсяА вот это совсем не проблема. Скачал - установил.
А вот это совсем не проблема. Скачал - установил.Если это не глобальная проблема системы ediczr2012. Тут возможны варианты...
1. Если, к примеру, у нас несколько блоков, считывающих значения из Экселя, то как реализовать это в коде?Смотря, каким образом тебе нужно их вставлять. ZaurbekA, давай конкретный пример.
(то место, где мы задаем имя блока: name = "ИмяБлока")
2. Если изменяемых атрибутов несколько (вот тут - If att(i).TagString = "АТРИБУТ" Then), то мы просто несколько раз повторяем эту строку с разными тэгами?Да, конечно. Ты вот попробуй.
3. Мы разобрали пример того, как вставлять новый блок, а как изменять тот, который уже существует на чертеже?Нужно использовать селекшн сет:
4. В одной из тем тут на форуме ты упомянул о книге "autocad vba joe sutphin" - можно ли ее где-нибудь найти?Книга есть в общем доступе:
Смотря, каким образом тебе нужно их вставлять. ZaurbekA, давай конкретный пример.А, я, честно говоря, думал создать файл с блоками, например несколько схем рам с эпюрами (я преподаю строймех) и изменять из в соответствии с расчетами в Эксель.
Нужно использовать селекшн сет:Удивительно, но у меня получилось.
либо самостоятельно его разрабатывать.дык, я ж этого и боюсь! :-)
А, я, честно говоря, думал создать файл с блоками, например несколько схем рам с эпюрами (я преподаю строймех) и изменять из в соответствии с расчетами в Эксель.Придумай простую задачу (вот совсем простую с самыми простыми рамами), сделай скрины и грамотно ее сформулируй. Тогда я тебе смогу помочь!
А если вставлять, то, наверное, как в твоем уроке - InsertBlock. Или я не понял вопроса?
ЖБК и особенно в "Эпюре материалов" - до сих пор вспоминаю то удивление, которое ощутил при первом просмотре - мое искреннее восхищение!Спасибо. Я рад, что ты оценил.. Именно эпюру материалов. Конкретно в эпюре материалов - скорей сложный блок, чем сложный код (код примитивен).
если вдруг надумаешь делать уроки, я первый ученик буду - честноВидео уже есть, но это в лс. Не по теме.
понимаю заведомую глупость такой постановки вопроса (и суть), поскольку изучая что-то по-настоящему, хочется знать как можно больше и лучше, просто овладение именно этим багажом знаний на данный момент и есть для меня "больше и лучше")Понимаю твой вопрос и не считаю его глупым, хоть и советую тебе немного успокоиться и не суетиться. :)
Придумай простую задачу (вот совсем простую с самыми простыми рамами), сделай скрины и грамотно ее сформулируй. Тогда я тебе смогу помочь!Ок. Хотя, я изначально не правильно задал вопрос - я имел ввиду сделать что-то типа твоего ЖБК (где колонны, сечения, спецификации и прочее) и поэтому спросил: "а если блоков много?" - а надо было бы для начала разобраться, как ты это делал.
я имел ввиду сделать что-то типа твоего ЖБК (где колонны, сечения, спецификации и прочее) и поэтому спросил: "а если блоков много?".То, о чем ты сейчас говоришь, это один блок. 8)
Замечание к 14-ому уроку. Координаты точек окна для печати следует преобразовывать из UCS в DCS. Иначе в ряде случаев печатается совсем не это окно: http://adndevblog.typepad.com/autocad/2016/05/plot-to-window-extents-using-vba.htmlПринято и исправлено (прямо в посте). Лично у меня обозначенных проблем не возникало, но полностью согласен, что так правильно!
Попробуйте выполнить печать в PDF-файл со следующими параметрами и в строгой последовательности:
1. Убедитесь, что каноническое имя формата существует и соответствует тому, что указан в вашем коде (в моём случае он указан как UserDefinedMetric (420.00 x 1486.00мм))
2. Попробуйте выполнить печать в строгой последовательности, которая указана в моём коде:
p2(0) = 100 ' Значение из ячейки Excel
p2(1) = 100 ' Значение из ячейки Excel
Если создать новый чертёж и вставить код из урока №14 и не сохранять, то печать идёт. Даже вносил изменения в код и всё работало. Стоит только сохранить и закрыть, то при следующем запуске файла возникает эта проблема. Автокад мне достался по наследству.
Автокад мне достался по наследству.Кстати, что за Автокад? Какая версия, разрядность системы?
Вопросы:
1. Запускается ли макрос без ошибок?
2. Происходит ли печать Вашего объекта в PDF-файл?
3. Что отображается в PDF-файле? (если макрос работает) Можно в виде изображения.
Пожалуйста прочти у меня в подписи как следует форматировать код на форуме и в дальнейшем соблюдай это правило.
До сохранения макрос работает без ошибок. Печать выполняется, в файле PDF то что нужно. Автокад 2016 Х64Сделай скрин вот этого места:
До сохранения макрос работает без ошибок.
Спасибо всем за участие. Попробую переустановить. Правда получится не скоро уезжаю завтра.
При сохранении блоков «запись блока на диск» и при редактировании блока штриховка типа: «Ассоциативная – Аннотативная» слетает на обычную, в чем может быть причина?
Записал видео проблемы по штриховке в динамическом блоке.Ну ты, конечно, записал, так записал. ))
В общем, ребзя, кому интересна данная тема, если мы дружно позовем Александра Наумовича, то возможно он и даст дельный совет к Новому Году насчет предыдущего поста. ;)У меня не воспроизводится этот баг ни в AutoCAD 2016, ни в AutoCAD 2017 - оба со всеми обновлениями:
У меня не воспроизводится этот баг ни в AutoCAD 2016, ни в AutoCAD 2017 - оба со всеми обновлениями:Вот это поворот. У меня AutoCAD 2017 тоже со всеми обновлениями - русский.
У меня AutoCAD 2017 тоже со всеми обновлениями - русский.Не всеми:
Спасибо за обновления.Извините, вам запрещён просмотр содержимого спойлеров.
А если в ячейки не число? или не только число?извиняюсь не поняла как правильно цитировать).
Стоило сразу нормально делать и парой комментариев все прояснить?
У меня бывает и "43 яблока" и формула лежит в ячейке екселя. И нужно перенести все это в динамический блок Автокада. Как в этом случае быть?Брать строку и с ней работать!
И все таки:есть файл автокада с динамическим блоком с атрибутами. Атрибуты - текст, они расчитываются в екселе. Задача - перенести в автокад. Далее - расчитать количество копий данного блока - цифру взять из екселя. Далее Данный блок скопировать и каждой копии присвоить свои атрибуты, расчитанные в екселе. Реальна ли задача для VBA?Итак. Предлагаю не быть голословными. Тестовый пример, содержащий все твои проблемы в студию! Это должно быть нечто простое, при этом, такое, что даст ответ на все твои вопросы. Сформулируй задачу и мы вместе с ней разберемся!
Это должно быть нечто простое, при этом, такое, что даст ответ на все твои вопросы.Вот теперь представь человека, который в жизни не электрик и ничего подобного никогда не проектировал. Разве это "нечто простое"? :)
Реальна ли задача для VBA?Задача вполне решаемая для VBA, ничего сверхсложного нет!
Так как мне лично не совсем понятно, что нужно сделатьА непонятно, потому что я урезала файл ексель. Откройте скрытые строки файла, там еще 2 щита (их может быть 50).
Самое первое, что тебе нужно сделать, как я понял, это определить границы блоков щитов в экселе. То есть нужно понять с какой строчки начинается блок 1 и на какой он заканчивается, то же самое нужно проделать для всех блоков.Между блоками данных щита ВСЕГДА одна пустая строка.
Для этого ты декларируешь массив чисел и просто его заполняешь, пробегаясь по строчкам экселя.Так. Для данного блока "Ветка" для атрибута КАБЕЛЬ массив будет - колонка 2, строка с 6 по 11, для атрибута - ДЛИНА массив будет колонка 3, те же строки.
То есть используешь цикл For от нуля до последней строки экселя, если, например, 1-й и 2-й столбцы нулевые, то есть равны "", то значит следующая строчка - это начало щита, в другой раз при таком же условии - предыдущая строчка будет концом щита. Таким образом, ты определяешь границы - то есть у тебя будет массив, у которого границами первого щита будут элементы с номером 0 и 1, второго - элементы с номером 2 и 3 и т.д.
Пожалуй верно. Этот блок дала потому что он до боли знаком бо-ольшому количеству аудитории (и наверняка кто то уже изобрел этот велосипед).Лично мне он не знаком. Вообще, ни капельки. :)
Отложим и будем копировать просто линию с 2 атрибутами (это кабель в электрической однолинейке). До полного блока (если удастся справится с этой задачей) дойдет очередь и я обязательно выложу его здесь.Какую линию? Какие данные? Какой эксель? Что брать? Куда записывать? Куда вставлять?
А непонятно, потому что я урезала файл ексель. Откройте скрытые строки файла, там еще 2 щита (их может быть 50).Ну вот еще..
Если в строке 3 колонка 16 - то есть cell (3,16) есть цифра (номер щита), то массив начинается ВСЕГДА с 3+3 строки, то есть с в данном случае с 6 строки для любых атрибутов данного блока автокад. Для второго щита (а он будет в другом файле автокад), массив начинается с строки 16 (те же колонки 2 и 3).Хорошо. А в чем вопрос?
Итак "бежим" по столбцу 16, и проверяем, есть ли в ячейке число - номер щита. если есть, выделяем вниз строки полностью до первой пустой строки.Ничего мы не выделяем. Мы получаем информации и ее же обрабатываем!
Что значит обрабатываем блок щита:Лучше бы я этого не читал :)
1. создаем отдельный файл .dwg, с названием например по номеру блока щита "01" в той же папке, что и ексель из шаблона .dwt, в котором уже есть наш блок "Ветка". Ну а как иначе.
2. И вот тут надо копировать копировать наш блок ВЕТКА в автокаде нужное количество раз...
Расстояние 1 не важно. Можно вообще убрать.Да это для наглядности! Не суть!!
Важно скопировать столько раз с приращением 1000, сколько строк в блоке Тестовый1 (например) и при этом занести значения из этих строк в Атрибуты КАБЕЛЬ и ДЛИНА каждой копии блока. Например в колонке 1 будет не Расстояние1, а атрибут ДЛИНА. Н да задачка не из легких.Слушай, нет здесь кабелей!! Забудь про свои кабели! Понимаешь?
qaaz07, скажи, пожалуйста, данная задача отражает суть твоих проблем? Если нет, то в таком же ключе сформулируй свою!?
Понимаешь ли ты теперь, что я хотел от тебя, когда приводил сравнение с кирпичом?
Я к сожалению не программистЯ тоже не программист!! Но это ж не значит, что я не могу нормально задачу сформировать.
ну вот надо просто скопировать блок ВЕТКА столько разУ нас нет такого блока. >:( :D
Госспидя, я там уж сто лет не появлялся.... Мы все помним! :)
Задача от qaaz07 в моей интерпретации:
Есть блок в AutoCAD (см вложение), у которого есть параметр Расстояние1, атрибут МАРКА и в атрибуте ДЛИНА выводится через поле значение Расстояния1:
И есть файл EXCEL (см. вложение):
В этой табличке 3 марки, но их может быть и 50.
Каждой марке соответствует столько вхождений блоков, сколько идет после нее строчек с длиной экземпляра. Координаты первого экземпляра блока указаны в строчке с маркой, далее экземпляры идут с шагом 1000. Марки между собой разделены пустыми строками.
Результатом выполнения программного кода по вышеописанной таблице должно быть следующее (элементы, выделенные красным цветом, носят информативный характер):
Прошу помочь с написанием кода VBA, который делал бы вышеописанное. Заранее, спасибо.(с)qaaz07
В принципе ничего сложного не вижу...Согласен на все 100.
Максим Маркевич, две пустые строчки прекращаем цикл...Да, можно было..
по поводу размерности массива, комментировать не буду.Я особо не заморачивался. Честно говоря, сходу не вышло создать динамический массив типа
программный код можно/нужно шлифовать
Грустно, в итоге qaaz07, получила решение своего вопроса, но не получила навыков и знаний. Вот такой вот урок.Я понимаю суть каждого твоего слова. И сам не являюсь сторонником подобной помощи. Я совсем не хотел сделать медвежью услугу! Хотел дать понять, насколько интересные задачи можно решать при помощи VBA в AutoCAD. Возможно, это кого-то окрылит, по крайней мере, я очень на это надеюсь!!
я не вспомнил, как решал подобные вещи, когда писал на VBA, поэтому оставил символическую размерность в 50.ReDim Preserve
ReDim PreserveReDim + Redim Preserve решит задачку. Хотя вариантов, как обыграть ситуацию с размерностью массива, тьма. Примерный алгоритм такой:
не решит задачку?
Максим Маркевич, то есть примерно так? Но вот если я ставлю Option Explicit, то код не работает. Запрашивает i, j, index, но еще и Props =. Это как же его задать?Вот смотри, что ты делаешь.. Ты ставишь Option Explicit, тем самым запрещаешь VBA самому типизировать переменные, которые не объявлены.
И надо ли.Ну, видимо, тебе надо. Зачем-то же ты ставишь Option Explicit.
Да, но Props = как задать? это же не переменная. то есть я пробовала задать i, j, index, но этого оказалось мало.А что это, если не переменная?
А зачем же Вы исправили строку из примера в предыдущем сообщении
att = blockRef.GetAttributes ?
Хочу проверить ширину атрибута, что бы она не вылезала за рамки, и если вылезает уменьшить масштаб текста.Зачем для такого обращаться к InsertionPoint? Разве нет такого, как GetBoundnigBox? Ну, нечто типа
Зачем для такого обращаться к InsertionPoint? Разве нет такого, как GetBoundnigBox? Ну, нечто типа
Я выбираю атрибут постоянный, а это требует записи ".GetConstantAttributes".Но проверку
Но даже в непостоянных атрибутах данная запись выдает ошибку. С обычным текстом проходит. С атрибутом не проходит.Непонятно, так на каком месте все-таки происходит ошибка? Какая "данная запись"? В куске где про ConstantAttributes, или там где про "непостоянные"?
Если вы считаете иначе, можете предложить корректировки в коде.Я бы предложил убрать совсем кусок со строки 82. до 97., а строки 86, 87, 95 перенес бы в верхний цикл
Получилось решить проблему.А с нами поделиться?
Ошибку выдавала строка :LB(0)=att(i).InsertionPoint(0 с чем связана незнаю. Не удалось понятьТак же не получилось получить значения .TextAligmentPoint. Тоже ошибка была.1.
если приложили пример использования с атрибутами блокаНу, вот если из моего примера, то вот так заработало
Что нужно изменить? СпасибоИзменить нужно видимо строку:
Изменить нужно видимо строку:VBA я толком незнаю, а на что конкретней нужно поменять? Спасибо
VBA я толком незнаю, а на что конкретней нужно поменять? СпасибоТут не вопрос знания VBA, а вопрос знания того, какое каноническое имя для PDFCreator для локального имени "A1". Вот на это имя и нужно поменять.
Тут не вопрос знания VBA, а вопрос знания того, какое каноническое имя для PDFCreator для локального имени "A1". Вот на это имя и нужно поменять.Спасибо, буду разбираться
objPlot.SetLayoutsToPlot(layNames)
objPlot.PlotToDevice('Adobe PDF')
введение в код строчкиИ не должно было. Проблему должно было бы решить вот это:
Код - Visual Basic [Выбрать]
backgroundplot = 0
не решило проблему
для каждого листа открывается окошко и нужно вручную нажимать кнопку "Сохранить".Какое окошко? С запросом сохранения чертежа? Тогда сохрани его сам до запуска печати.
Какое окошко? С запросом сохранения чертежа? Тогда сохрани его сам до запуска печати.Сохранять печатаемый pdf файл
Код - Visual Basic [Выбрать]
Сохранять печатаемый pdf файлА вот это сообщение вряд ли можно убрать - его выдаёт драйвер печати. Если конечно это не сообщение о том, что такой файл уже существует. В этом случае его достаточно удалить до печати.
задача решается редактированием реестра https://stackoverflow.com/questions/2075104/bypass-adobe-pdf-printer-savefileas-prompt (https://stackoverflow.com/questions/2075104/bypass-adobe-pdf-printer-savefileas-prompt)Сохранять печатаемый pdf файлА вот это сообщение вряд ли можно убрать - его выдаёт драйвер печати. Если конечно это не сообщение о том, что такой файл уже существует. В этом случае его достаточно удалить до печати.
В чертежах форматы листов разные (A4, A3, A2x4 и тд), рамки форматов у меня из дин. блока с выбором размера формата. Что нужно прописать вместо EffectiveName = "A1", чтобы указывалось не имя блока, а значение выбора.
Но так как я незнаю vba, я не могу привязать этот код в свой.Так дело не пойдёт. Если не знаешь VBA, то изучи его.
Вообще подскажите как быстрее всего чертить однотипные чертежи но с разными размерами.Использовать динамические блоки.
Как скажем построить треугольник по 2 сторонам и углу между ними посредство VBA.Вспомнить школьные уроки по тригонометрии и по векторной алгебре.
Есть ли в видеоуроках такое.Посмотрите уроки...
Это будет VBA или автокад позволяет брать данные из внешних файлов.Вообще не понятно про что это предложение.
Есть таблица в экселе с 100 видами 12 ти угольниковТаблица в каком виде?
Таблица в каком виде?В каждой строке находятся все размеры (длины)
В каждой строке находятся все размеры (длины)Я сомневаюсь, что 12-угольник можно построить только по длинам.
1.Меня интересует можно ли в автокаде создать некое подобие библиотеки как в Компасе. т.е.выбрал нужную строку - фигура построилась.Я не знаю что такое в Компасе библиотека. В AutoCAD есть палитры инструментов. В них в частности можно добавлять блоки. Похоже следует начать с изучения AutoCAD, а потом уже пытаться под него программировать. Причем не пытаться дело так, как это сделано в других CAD-системах. У AutoCAD есть своя логика и идеология работы.
при помощи VBA построить любую фигуру например прямоугольник.Отлично. Как прямоугольник ориентирован? Строится в текущей системе координат или в мировой? Какие у него вообще должны быть параметры? Построение идет по 2 или по 3 точкам?
Мне нужно построть квадрат, но данные о стороне брать извне.
А мне нужно построить блок, взяв размеры извне.Определись что тебе нужно. Квадрат в AutoCAD можно построить десятком разных способов. Это и четыре отрезка, и замкнутая полилиния с 4-мы сегментами, и 3DFACE, и SOLID и т.д. и т.п.
Буду признателен. если сбросите код VBA или ссылку на него, который ХОТЬ ЧТО НИБУДЬ СТРОИТВот это строит квадрат при помощи облегченной полилинии. Запрашивается левый нижний угол и высота квадрата:
Я несмотря на свои 10 вопросов не получил ответ можно ли имея в экселе в ячейке а1 число 10 и запустив соответствующий макрос добиться построения квадрата в любой области чертежа со стороной 10 мм.Ты уроки вообще-то посмотрел? Видеоуроки AutoCAD VBA (http://adn-cis.org/forum/index.php?topic=7270.0)
В результате на печать выводится 1 лист pdf.Посмотрел код - он должен формировать столько pdf-файлов (не листов в файле, а именно файлов), сколько выбрано блоков с правильным именем.
Все верно, должно напечататься столько файлов pdf сколько выбрано блоков с именем указанном в коде. Так вот я выбираю например 3 блока, печатается 1 файл. И сколько бы я не выбрал одинаковых блоков- печатается только 1.Запусти под отладчиком и посмотри что происходит. Подозреваю, что у тебя BACKGROUNDPLOT не установлена в 0: https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2017/RUS/AutoCAD-Core/files/GUID-713029B7-B5AC-4860-BE2E-74878D418EA4-htm.html
метод isEmpty(). Но в автокаде он не работаетИзвините работает
Сделал по примерам код - ругается на строке Polyplot - compile error^ Wrong number of arguments or invalid property assignment - Подскажите что не такНу вообще-то у этой PolyPlot четыре аргумента, а ты передаёшь пять...
Делал по примеру - Ответ #146 в этой теме увиделНу я не могу гарантировать, что все примеры в этой теме 100% рабочие.
В листах было бы вообще замечательно если бы я смог програмно их создать и настроить под печать. Пока много одинаковых шаблонных файлов планируется создавать и хочу от проблемы распечатки уйти настроив сразу расстановку
и из эксель мне это проще делать меняя атрибуты
'On Error Resume Next - закомментировал- код отработал но Длина не берется
Подскажите если у дин блока имена .PropertyName - называются для обращения, то как обратится к атрибуту? какая там фраза?Эту фразу я не понял, но ты наверное говоришь про .TagString