Одними из важнейших элементов Автокада в последнее время стали динамические блоки. Они открывают широкие возможности по адаптации Автокад. И хотя существующие динамические блоки уже решают многие современные задачи проектирования, всегда хочется создать что-то уникальное, своё. Что-то, что будет решать ваши специфические задачи.
В этом уроке мы создадим свой простой динамический блок, а в следующем рассмотрим возможности управления динамический блоком из LISP программы
Давайте создадим свой динамический блок выноски с надписями. См. Рис. 1.
Рис. 1. Динамический блок выноски с надписями.
Блок будет иметь два атрибута – две надписи.
И три ручки управления:
1 – меняет положение всего блока;
2 – меняет длину выносной линии, изменяя положение полки и надписей;
3 – меняет длину полки.
Размер выноски зависит от размера объекта, для которого она предназначается. Я в качестве объекта взял куб со сторонами 300.
Нарисуете две линии.
Выделите их и нажмите на кнопку « Создать блок ». См. Рис. 2.
Рис. 2. Создание блока.
Откроется окно: « Определение блока »
Задайте имя блока.
Укажите базовую точку .
Поставьте галочки перед надписями «Аннотативный» и «Открыть в редакторе блоков» и нажмите «ОК» . См. Рис. 3.
Рис. 3. Определение блока.
Откроется редактор блоков.
Давайте создадим атрибут для верхней надписи.
На ленте перейдите на вкладку « Вставка »
Нажмите на кнопку « Задание атрибутов ». Откроется окно « Определение атрибута ». См. Рис. 4.
Рис. 4. Определение атрибута.
В поле «Тег:» напишите txt1 >.
В поле «Подсказка:» верхний >
В поле «Высота текста:» 50 >
Нажмите « ОК » и вставьте атрибут сверху полки. См. Рис. 5.
Рис. 5. Определение атрибута.
Аналогично создаем атрибут для нижней надписи.
В результате получим. См. Рис. 6.
Рис. 6. Блок с атрибутами.
Перейдите на вкладку « Редактор блоков ».
Создайте Точечный параметр , который будет управлять расположение надписей и полки. См. Рис. 7.
Рис. 7. Точечный параметр.
Выделите параметр: Положение1 .
Нажмите . Откроется окно « Свойства ».
Напротив пункта: «Цепочка операций» поставьте Да
Напротив пункта: «Число ручек» поставьте 0
Рис. 8. Свойства точечного параметра «Положение1».
Перейдите на вкладку « Операции ».
На запрос: «Выберите параметр» — укажите параметр « Положение1 »
На запрос: «Выберите объекты» — укажите надписи и полку .
Нажмите Enter >. См. Рис. 9.
Рис. 9. Операция «Перемещение».
Перейдите на вкладку « Параметры ».
Создайте Полярный параметр (от нижней точки к верхней), который будет управлять длиной и положением выносной линии. См. Рис. 10.
Рис. 10. Полярный параметр.
Выделите параметр: Расстояние1 .
В окне «Свойства» напротив пункта: « Число ручек » поставьте 1 .
Рис. 11. Свойства полярного параметра «Расстояние1».
Перейдите на вкладку « Операции ».
Выберите: « Полярное растяжение ».
На запрос: «Выберите параметр» — укажите параметр « Расстояние1 ».
На запрос: «Укажите точку параметра» — укажите точку пересечения отрезков .
На запрос: «Укажите первый угол рамки растяжения» — укажите нижнюю точку рамки.
На запрос: «Противоположный угол» — укажите верхнюю точку рамки.
Рис. 12. Операция «Полярное растяжение».
На запрос: «Выберите объекты» — укажите выносную линию и параметр Положение1. Нажмите Enter >.
На запрос: «Укажите объекты только для поворота» «Выберите объекты» — Нажмите Enter >.
Давайте протестируем, что у нас получилось.
На ленте нажмите на кнопку: Тестировать блок.
Выделите блок. Должны быть видны две ручки. См. Рис. 13.
Рис. 13. Тестирование блока.
Нижняя ( 1 ) – перемещает весь блок.
Верхняя ( 2 ) – меняет положение полки.
После того, как Вы поэкспериментировали, на ленте нажимаем на кнопку: Закрыть окно тестирования блока .
Длина надписей в нашем динамическом блоке может быть разной. Поэтому, давайте добавим Линейный параметр (справа налево), который будет менять длину нашей полки. См. Рис. 14.
Рис. 14. Линейный параметр.
Выделите параметр: Расстояние2 .
В окне «Свойства» напротив пункта: « Число ручек » поставьте 1.
Рис. 15. Свойства линейного параметра «Расстояние2»
Перейдите на вкладку « Операции ».
На запрос: «Выберите параметр» — укажите параметр « Расстояние2 ».
На запрос: «Укажите точку параметра» — укажите правую точку полки .
На запрос: «Укажите первый угол рамки растяжения» — укажите первый угол .
На запрос: «Противоположный угол» — укажите второй угол.
Важно : рамка не должна заходить за середину полки . См. Рис. 16.
Рис. 16. Операция «Растянуть».
На запрос: «Выберите объекты» — укажите полку . Нажмите Enter >.
Далее наведите курсор мыши на значок Перемещения и нажмите на правую кнопку мыши. Появится контекстное меню.
Выбираем пункт: « Набор объектов для операции ». Затем: « Изменения набора объектов ». См. Рис. 17.
Рис. 17. Изменения набора объектов.
На запрос: «Выберите объект для добавления в набор операций» — укажите параметр Расстояние2 и нажмите Enter >. См. Рис. 18.
Рис. 18. Добавление параметра «Расстояние2».
Протестируйте блок. Теперь у блока можно менять и длину полки.
Завершите тестирования блока.
На ленте нажмите на кнопку: « Сохранить блок »
Появится окно, в котором выбираем « Сохранить изменения ». См. Рис. 19.
Рис. 19. Сохранить изменения.
Затем закрываем редактор блоков .
Давайте проверим, как работает блок:
На ленте, нажимаем на кнопку: « Вставить ».
В поле имя, выбираем « Vyn » и нажимаем ОК . См. Рис. 20.
Рис. 20. Вставка блока.
На запрос в командной строке «Точка вставки» — укажите любую точку в рабочем окне Автокад.
На запрос «Введите значения атрибутов» «Вставить верхний» — введите « text1 » и нажмите Enter >.
На запрос «Вставить нижний» — введите « text2 » и нажмите Enter >.
В результате у нас должен был получится блок изображенный на Рис. 21.
Рис. 21. Динамический блок: выноска с надписями.
Сохраните свой блок на диск.
Выделите бло к и нажмите на кнопку: « Запись блока на диск ». Откроется окно Запись блока на диск
Убедитесь, что в поле имени блока выбран нужный блок ( Vyn ).
Выберите путь сохранения блока ( D:MyLispVyn.dwg ). и нажмите ОК .
Рис. 22. Запись блока на диск.
Скачать динамический блок (Размер файла: 30 kB)
(Если Вы скачали динамический блок.
Часто используемые блоки, для быстрого доступа к ним, можно разместить на палитре инструментов.
На ленте перейдите на вкладку « Вид ».
Нажмите на кнопку « Инструментальные палитры ». Откроются « Палитры инструментов ». См. Рис. 23.
Рис. 23. Палитра инструментов.
Давайте создадим свою палитру.
Для этого поместите курсор мыши на любую палитру инструментов и нажмите на правую кнопку мыши.
Появиться контекстное меню, в котором выбираем пункт « Создать палитру ». См. Рис. 24.
Рис. 24. Создание новой палитры.
Вместо названия « Новая палитра » введите « Му ».
Теперь, для того чтобы поместить наш блок в палитру:
Поместите на него курсор мыши, нажмите левую кнопку мыши и не отпуская ее перетащите блок в палитру и там отпустите. См. Рис. 25.
Рис. 25. Перетащите блок на палитру.
В палитре «My» появиться новый блок . См. Рис. 26.
Рис. 26. Блок на палитре.
Теперь Вы можете вставлять ваш блок на любом чертеже. Для этого нужно открыть палитру «My» и перетащить из нее нужный блок в рабочее окно Автокад.
На этом наш урок окончен.
В следующем уроке мы рассмотрим пример управления динамическим блоком из LISP программы.
Пишите в комментариях:
Все ли у Вас получилось в этом уроке?
Была ли для Вас полезной информация, данная в этом уроке?
На какие вопросы, Вы хотели бы, получить ответы в следующих уроках?
Я с удовольствием отвечу на ваши вопросы.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
Динамические блоки в Автокаде открывают для пользователя новый уровень автоматизации проектирования, повышают производительность и настроение.
Урок «Динамические блоки в Автокаде» является заключительным в изучении создания блока рамки чертежа (см. здесь) и заполнения его данными с помощью атрибутов (см. тут).
Создание динамических блоков в Автокаде
Итак, продолжаем прокачивать наш блок-рамку чертежа для Автокада, и теперь сделаем так, чтоб можно было изменить размер с формата А3 на А4, А2, А1, А0 да и вообще какой понадобится. В нашем динамическом блоке можно будет не просто растянуть или сжать рамку, но и сохранить стандартные размеры.
В общем, приступайте и делайте внимательно, делай как я и все получится:
1. Скачайте и откройте файл с подготовленным блоком рамки чертежа формата А3, кликнув здесь.
2. Перейдите в режим редактирования блока (если затрудняетесь см. здесь). Далее, на палитре вариаций блоков слева кликните по кнопке «Линейный», что на вкладке «Параметры» и укажите крайние нижние точки.
3. Аналогично создайте вертикальный линейный параметр, указав крайние правые точки. Таким образом, мы создали динамические параметры, для которых укажем действия растяжения, а пока по клику правой клавиши переименуйте Расстояние1 и Расстояние2 на Ширина и Высота соответственно.
4. Перейдите на вкладку «Операции» и кликните по кнопке «Растянуть» и далее внимательно в соответствии с запросами в строке состояния и рисунком:
– кликом укажите параметр «Ширина»;
– укажите правую точу параметра (та за которую будет растягиваться блок) , кликнув мышью в правой части рамки;
– выделите рамкой область растягивания;
– Секущей рамкой (справа налево) выделите объекты растягивания.
Закончите действие нажатием клавиши Enter.
5. Аналогично назначьте блоку операцию «Растянуть» для динамического параметра «Высота». Следите за тем, чтоб штамп рамки полностью попадал в область растягивания, а выделение объектов выполнялось секущей рамкой как на рисунке.
Точка параметра должна быть как на рисунке верхняя правая.
6. Теперь наш блок стал динамический, и мы можем его растягивать по ширине и высоте, в чем можем убедиться после нажатия кнопки «Тестировать блок»
Круто ведь. Вернитесь в окно редактирование блока, закрыв вкладку окна тестирования блока, и давайте сделаем последний штрих, сохраним стандартные размеры рамки чертежа.
7. Вернитесь на вкладку «Параметры», кликните по кнопке «Выбор» и укажите точку вставки как на рисунке.
8. Переименуйте параметр «Выбор1» в «Формат листа».
9. На вкладке «Операции» кликните по кнопке «Выбор» и укажите параметр «Формат листа», после чего появится окно «Таблица выбора свойств».
10. Добавьте свойства, выделив параметры «Ширина» и «Высота» для рамки чертежа.
11. Последний рывок, заполните ячейки данными форматов А4, А3, А2, А1, А0.
Аллилуйя, закрываем редактор блока с сохранением всех изменений.
12. Выделяем наш динамический блок рамки чертежа и выбираем из списка требуемый формат.
И кайфуем… Теперь можно переименовать блок «Рамка А3» на просто «Рамка».
Динамические блоки AutoCAD скачать
Ну вот, познакомились с динамическими блоками в Автокаде, дело интересное и полезное. В рамках урока охватить все инструменты и параметры для работы с динамическими блоками не удалось, но думаю направление и принципы работы для самостоятельного изучения вполне наглядные.
В заключении можете бесплатно скачать динамический блок рамки чертежа, если у вас возникли сложности, кликнув здесь.
Полезно. Как заменить одни объекты чертежа на другие читайте здесь .
Создать динамический блок в Автокаде. Видеоурок
Если остались вопросы после просмотра видеоурока по созданию динамического блока в Автокаде, оставляйте их ниже…
В пятой части цикла, посвященного разработке плагинов под AutoCAD, я расскажу про создание простых блоков и размещение их на чертеже.
Если при работе с чертежом возникает необходимость создания однотипных объектов, то лучше всего делать это с помощью механизма блоков — именованных групп объектов, которые ведут себя как единый объект. Общие сведения о блоках можно получить здесь.
Важно уметь четко разграничивать два понятия: определение блока и вхождение блока. Подробное описание различий приведено здесь (англ.) и тут (rus). Вкратце изложу суть: когда мы создаем новый блок, AutoCAD помещает его описание в специальную таблицу блоков. Это описание называется определением блока (block definition). Определение блока существует исключительно в таблице блоков и на чертеже не отображается. Непосредственно на поле чертежа AutoCAD помещает вхождение блока (block reference) — ссылку на определение блока. При изменении определения блока все вхождения блока повторяют эти изменения. Далее в статье я иногда буду опускать первое слово («определение» или «вхождение») и писать просто «блок».
В процессе общения с Autocad я сталкивался с двумя видами блоков: обычными и динамическими. Главная особенность вторых — возможность задать их элементам некоторые «настраиваемые» параметры (например, длину линии в блоке или угол ее наклона). Главный минус динамических блоков в том, что их невозможно создать средствами .NET API.
Про динамические блоки я расскажу в другой раз. А пока посмотрим, как можно работать с обычными блоками.
Для начала давайте создадим блок непосредственно в AutoCAD. Программирования здесь не будет — но умение создать блок вручную полезно для того, чтобы быть в состоянии хотя бы приблизительно оценить результат работы плагина. Подробности процесса — под спойлером.
Итак, во-первых необходимо добавить на чертеж элементы, которые мы будем объединять в блок. Для начала добавим в блок простую окружность.
В командной строке AutoCAD выполним команду CIRCLE, затем укажем центр и радиус. На чертеже появится окружность:
Выделим окружность и выполним команду BLOCK. На экране появится меню создания блока. К аналогичному результату приведет нажатие кнопки «Create» на панели «Block»:
Зададим блоку имя, выставим единицы измерения «Unitless» и снимем флажок «Open in Block Editor», после чего нажмем «ОК»:
После этого AutoCAD попросит указать на чертеже точку, которая будет являться для блока базовой. Обычно в качестве этой точки задают центр блока или его нижний левый угол. Укажем в качестве базовой точки центр окружности.
Мы завершили создание блока. Первое вхождение блока будет добавлено на чертеж автоматически и заменит собой элементы, из которых был создан этот блок. Чтобы добавить на чертеж несколько вхождений созданного блока, можно использовать команду INSERT или одноименную кнопку на панели «Block»:
После выполнения команды или нажатия на кнопку на экране появится окно вставки блока:
Выбираем в списке нужный блок, нажимаем «OK», указываем точку вставки — и блок появляется на чертеже. В том, что это именно блок, можно убедиться, выделив объект и посмотрев на окно свойств:
Для редактирования блоков используется редактор, который вызывается командой BEDIT или соответствующей кнопкой на панели «Block»:
После выполнения команды или нажатия на упомянутую кнопку на экране появится окно выбора определения блока:
В этом окне необходимо выбрать определение, которое мы будем редактировать, и нажать «OK». После этого AutoCAD откроет редактор блоков. Пробежимся по самым, на мой взгляд, важным кнопкам панели редактора:
- Save Block — сохранить все сделанные изменения. После закрытия редактора блоков все вхождения блока, размещенные на чертеже, будут обновлены в соответствии с изменениями определения блока.
- Authoring Palettes — показать или скрыть окно атрибутов. Это окно пригодится при работе с динамическими блоками.
- Point — в этом выпадающем подменю находится пункт «Basepoint», с помощью которого можно задать блоку новую базовую точку.
- Close Block Editor — закрыть редактор блоков. Все несохраненные изменения будут потеряны.
Внутри редактора можно добавлять к определению блока новые объекты и удалять ненужные. Редактирование блока происходит аналогично редактированию обычного чертежа.
На этом краткий экскурс в создание блоков в AutoCAD завершен. Можно переходить к коду. 🙂
Пример создания простого блока
Этот раздел базируется на соответствующем посте в блоге Kean Walmsley (наш пример по сравнению с первоисточником будет заметно облегчен). Мы будем создавать простейший блок, состоящий из полилинии, окружности и блока текста.
Кстати, раз уж зашел разговор про колбасные обрезки…
За последние пару лет (боже, как время-то летит!) произошло много всего хорошего. В частности, Самая Лучшая И Величайшая Компания В Мире все-таки выпустила бесплатную профессиональную версию Visual Studio.
Да, Visual Studio Community Edition занимает больше места, чем Express, и интерфейс у нее чуть посложнее — но рано или поздно у разработчика обычно возникает необходимость работы с дополнениями IDE, а они в Express-версиях не поддерживаются. Такие дела.
Пример из жизни: автор этих строк весело писал плагин в VS Express, и ничто не предвещало беды… пока не встала задача добавить программу установки (msi-файл, который создается с помощью технологии Wix). В итоге весь код инсталлятора пришлось писать в Notepad++, ежеминутно сверяясь с документацией, и компилировать вручную.
А в Visual Studio Professional можно было бы просто подключить плагин для работы с Wix и делать все прямо в IDE — с подсказками, автодополнением кода и компиляцией прямо в проекте. Можно. Было бы…
В общем, если вы работаете в компании, у которой не больше 250 ПК и годовой доход менее $1 000 000, то очень рекомендую при наличии пары-тройки лишних, бессмысленных часов жизни потратить их на установку этого продукта и далее работать с ним.
Если же бессмысленных часов в вашей жизни нет, то осознайте, что все — тлен, жизнь — боль, а влачить свое существование без установленной Visual Studio Community Edition — значит лишь увеличивать энтропию этого мира.
Чтобы создать блок и поместить его вхождение на чертеж, необходимо сделать следующее:
- Создать в таблице блоков новую запись (определение блока).
- Добавить в определение блока необходимые геометрические объекты.
- Добавить на чертеж вхождение блока.
Итак, приступим.
Я уже не буду подробно останавливаться на таких мелких особенностях создания плагина, как подключение внешних ссылок, запрет CopyLocal , указание версии .NET и тому подобное — это неоднократно обговаривалось в прошлых постах цикла. В этом примере нам потребуются ссылки на библиотеки AcMgd и AcDBMgd. Кода будет немного; сразу приведу его весь, а потом разберем детали.
Теперь давайте разбираться, что происходит в коде.
Вначале мы проводим подготовительные операции: получаем ссылки на документ, его БД и свойство Editor , задаем имя нового блока и начинаем транзакцию. Ничего нового в этом нет, кроме разве что свойства Editor .
Разыскать подробную информацию по классу Editor я с ходу не смог. Буду рад, если кто-то из более знающих людей подскажет ссылку на вменяемое описание этого класса и его методов (или хотя бы где его найти в ObjectARX Reference). В этом примере класс Editor используется только для вывода сообщения о том, что блок с таким именем уже существует в БД. В AutoCAD это сообщение выглядит так:
Внутри транзакции мы действуем по алгоритму, изложенному в начале этого подраздела.
На первом шаге мы создаем новую запись в таблице блоков, для чего:
- открываем таблицу блоков (запрашиваем доступ на запись, поскольку будем вносить изменения);
- проверяем, нет ли в таблице блока с таким именем (при попытке создать блок с именем, которое уже есть в таблице блоков, мы получим исключение eDuplicateRecordName , которое нам совершенно не нужно);
- создаем новое определение блока;
- задаем созданному определению блока имя;
- добавляем созданное определение блока в таблицу блоков и в транзакцию.
На втором шаге мы добавляем к созданной записи необходимые геометрические примитивы. У нас их будет три: полилиния, окружность и текст.
Добавление на чертеж полилинии и окружности разбиралось в предыдущей статье; с текстом все происходит аналогично. Добавление к блоку графического объекта обычно происходит в три приема:
- создается необходимый объект;
- задаются свойства этого объекта;
- созданный объект добавляется в определение блока и в транзакцию.
Это применимо как к полилинии и окружности, так и к тексту. Какая часть кода за какой пункт отвечает — вполне очевидно. Почитать подробнее про добавление текста на чертеж можно здесь (англ.) и тут (rus).
На третьем шаге мы добавляем вхождение созданного блока на чертеж. Порядок действий тут такой:
- открывается на запись пространство модели;
- создается новое вхождение блока;
- созданное вхождение блока добавляется на пространство модели и в транзакцию.
Остановимся чуть подробнее на конструкторе класса BlockReference , используемом при создании нового вхождения блока. Данный конструктор принимает два параметра: точку размещения блока (с этой точкой будет совмещена базовая точка вхождения блока) и ID определения блока. Иными словами, мы должны сообщить AutoCAD, какой блок мы хотим увидеть и где. В нашем примере в качестве точки размещения блока указано начало координат ( Point3d.Origin ), а ID определения блока мы сохранили еще на первом шаге, при создании этого определения.
Использование блоков, уже имеющихся в таблице блоков документа
Если в предыдущем примере выполнить команду HabrCommand, а затем удалить с чертежа появившийся блок и выполнить команду HabrCommand еще раз, то мы увидим сообщение «A block with the name „pvtBlock“ already exists», и на чертеже ничего не появится. Чтобы использовать ранее созданное определение блока, нужно узнать ObjectID этого определения. В нашем случае код можно переписать так:
Если теперь выполнить команду HabrCommand, затем удалить с чертежа появившийся блок и повторно выполнить команду HabrCommand, то на чертеже вновь появится вхождение нашего блока. При этом нового определения блока создано не будет — плагин возьмет запись, которая уже имеется в таблице блоков.
В рассмотренном примере я для разнообразия использовал метод UpgradeOpen() , который довольно часто фигурирует в примерах и документации. Давайте разберем, как он работает.
Если в первом примере мы сразу открывали таблицу блоков на запись ( OpenMode.ForWrite ), то теперь мы вначале открываем ее только на чтение ( OpenMode.ForRead ). Этого нам хватит, чтобы просмотреть таблицу и выяснить, содержится ли в ней блок с нашим именем. Если такой блок найдется, то мы можем прочитать его ObjectID , для чего нам опять-таки хватит доступа только на чтение. Если же блока с нашим именем в таблице нет, то нам нужно его добавить, и для этого уже потребуется доступ на запись. Чтобы получить такой доступ, используется метод UpgradeOpen() — после вызова этого метода мы можем работать с таблицей блоков, как будто открыли ее с уровнем доступа OpenMode.ForWrite .
Изменение позиции вставки блока
В каком месте чертежа появится блок, заранее предсказать невозможно зависит от двух вещей:
- от базовой точки, заданной в определении блока;
- от точки вставки, заданной во вхождении блока.
В нашем примере базовая точка расположена в центре блока.
Заметим, что при создании определения блока мы нигде не задавали базовую точку в явном виде — в подобном случае AutoCAD считает, что базовой точкой является начало координат. В нашем примере «центр» фигуры был специально подобран так, чтобы он совпал с центром координат.
Изменить базовую точку определения блока можно вручную с помощью редактора блоков (как это сделать, говорилось в первом разделе поста) или средствами .NET API. В последнем случае для этой цели используется свойство Origin класса BlockTableRecord . В качестве примера давайте перенесем базовую точку определения блока в нижний левый угол. Для этого после указания имени блока зададим свойство Origin :
Числа -50 и -125 — это минимальные координаты нашего блока по осям X и Y соответственно (такие координаты имеет нижняя левая вершина полилинии, образующей внешнюю границу нашего блока).
Теперь разберемся с точкой вставки блока. Она задается для каждого вхождения блока и показывает, где после вставки блока окажется его базовая точка. Это свойство задается в конструкторе класса BlockReference — например, так:
Блок сдвинулся опять.
Точку вставки блока можно также изменить с помощью свойства Position класса BlockReference :
Эффект будет таким же, как и при задании точки непосредственно в конструкторе класса BlockReference .
Использование блоков внутри блока
Мы тут все любим блоки, так что давайте-ка добавим пару блоков в наш блок, чтобы упростить чертеж, пока мы упрощаем чертеж.
Добавление блока в определение блока не представляет никакой сложности. Главная особенность заключается в том, что если уж мы добавляем в блок не геометрический примитив, а вхождение вспомогательного блока, то нам обязательно нужно позаботиться о том, чтобы определение этого вспомогательного блока имелось в таблице блоков документа.
Комментировать здесь, по большому счету, нечего: мы просто добавляем в таблицу блоков определение вспомогательного блока, а затем создаем вхождение вспомогательного блока и задаем ему координаты точки вставки.
В качестве несложного самостоятельного упражнения читателям предлагается выполнить покраску элементов блока и приведение их размеров и расположения в соответствие с Приказом № 1500.
Зачем применять блоки?
Основных причин две… Начнем со второй.
Вторая причина
Когда на чертеже содержится большое количество однотипных объектов, использование блоков здорово сокращает размер файла чертежа. Прочувствовать это нам поможет следующий код:
Код весьма незамысловат: имеется две процедуры — drawFigure(double x, double y) и drawBlock(double x, double y) . Первая отрисовывает в заданной точке набор фигур, в точности повторяющий наш блок, а вторая создает в заданной точке вхождение нашего блока.
Далее следуют две команды — HabrCommand_DrawFigures и HabrCommand_DrawBlocks. Первая отрисовывает на чертеже 10 000 наборов фигур, вторая — 10 000 вхождений блока.
Десять тысяч наборов фигур:
Десять тысяч вхождений блока:
Запустим AutoCAD, выполним первую команду, сохраним чертеж. Затем закроем AutoCAD и повторим аналогичную процедуру для второй команды. В итоге получим два dwg-файла. Сравним их размеры.
Файл с наборами фигур:
Файл с вхождениями блока:
Первая причина
Некоторое увеличение размера файла чертежа — это нехорошо, но не так уж и страшно: Россия большая, места хватит всем. Однако есть проблемы и посерьезнее.
Представим, что в вышеупомянутый Приказ №1500 внесли дополнение, жестко регламентирующее расположение пуговицы на погоне, и нам нужно перенести на всех погонах окружность несколько выше от текущего положения.
Если мы использовали блоки, то задача решается в несколько строк кода: мы просто откроем определение блока, найдем там окружность и сдвинем ее центр в нужную точку. Поскольку все вхождения блока ссылаются на одно и то же определение, после выполнения команды все они обновятся автоматически.
Маленькая деталь: AutoCAD действительно обновит все вхождения блоков, однако чтобы это увидеть, необходимо выполнить команду REGEN:
Безусловно, подобную операцию можно провернуть и в случае геометрических фигур, а не вхождений блоков, однако тогда придется работать уже со всем чертежом и менять координаты центра окружности не один раз, а десять тысяч. Тестов я не проводил, но думаю, что эта процедура займет несколько больше времени, чем редактирование определения блока.
С другой стороны, каждая монета имеет аверс и реверс, а использование блоков накладывает свои ограничения.
Например, если потребуется заменить лейтенантский погон, расположенный в одиннадцатой строке и сорок втором столбце, на капитанский, то при использовании блоков никаким нормальным способом мы это сделать не сможем.
Придется либо создавать новый блок для капитана, либо дорисовывать звездочки вручную, либо прибегать к каким-нибудь дополнительным извращениям.
Краткий вывод (куда ж без него-то): использование блоков может сэкономить массу сил и времени, но применять их надо обоснованно, при наличии необходимости.
На этом я, пожалуй, завершусь. В следующий раз расскажу про поиск и редактирование объектов на чертеже. Как всегда, буду рад любым отзывам, замечаниям и предложениям — в комментариях или ЛС.