![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
| Глава из книги "AutoCAD. Язык макрокоманд и создание кнопок" Владимира Света. |
Перед вами отрывки из моей книги об Автокаде. Книга предназначается для тех, кто хочет расширить свои знания об Автокаде, автоматизировать процесс черчения, сделать его простым, дружественным и быстрым, кто хочет создать свои собственные кнопки-инструменты. Буду благодарен за критику, отзывы и пожелания. Мой адрес vosvet@juno.com
Владимир Свет
Язык программирования DIESEL был впервые введен AutoCAD R12. DIESEL это аббревиатура от Direct Interpretively Evaluated String Expression Language. В вольном переводе можно объяснить как прямая интерпретация содержания текстовой строки. Это язык текстовой строки. Результат обработки строки также выводится в виде строки и может быть воспринят AutoCAD дословно. Если DIESEL выдал слово "Line", AutoCAD поймет это слово дословно, то есть воспроизведет команду Line (Отрезок).
Выражения DIESEL всегда предваряются специальным знаком $. (Этим знаком обозначается американская денежная единица ? доллар). Откройте окно Customize (Адаптация) и посмотрите на запись макроса стандартных команд Copy (Копировать), Move (Перенести) и некоторых других. Здесь можно увидеть типичные выражения DIESEL. Как и в языке LISP, количество открытых и закрытых скобок должно быть равным. Элементы выражения здесь разделяются, в отличие от LISP, запятой, а не пробелом, что похоже на выражение функции калькулятора.
Введем при помощи DIESEL новые данные в строку состояния ? Status Line. Эта строка расположеня в самой нижней части экрана AutoCAD. Ее левая часть по умолчанию не заполнена, поэтому ничего необычного не видно. Этой частью строки управляет системная переменная Modemacro.
Наберите на клавиатуре:Modemacro Введите текст: Do not forget to walk your dog. Не забудь погулять с собакой.
В левой части строки состояния появилась эта надпись, рис.1. Теперь она будет напоминать о ваших обязанностях до тех пор, пока AutoCAD не будет закрыт, даже если вы погуляли со своей собакой. Или, пока вы не напишите в стрoке состояния что-нибудь другое.

Испытаем способности DIESEL в математике - попросим его сложить два числа, 3 и 8.
Вызываем ModemacroEnter new value for Modemacro, or . for none <"Do not forget to walk your dog">: $(+,3,8)
В маленьком окошке в левой части строки появилось число 11. Также уверенно DIESEL может выполнять вычитание, умножение и деление, используя для этого символы, соответственно, " - ", " * ", " / ". Количество аргументов в математических выражениях не должно превышать 9. Этот талант DIESEL может быть использован. А пока продолжим упражнения со стрoкой состояния, потому что из нее можно извлечь определенную пользу.
Рассмотрим одну из функций DIESEL Getvar. Введите в командной строке:ModemacroВ ответ на приглашение наберите:
$(Getvar,Textstyle) [1]
В левой части строки состояния вы увидите имя текущего текстового стиля. Измените его (падающее меню Format -> Text Style…(Формат->Текстовые стили...), или введите Style (Стиль) в командной строке). В строке состояния текстовой стиль обновился. Значит, эта строка живая. Она может отражать текущие изменения системных переменных. Добавим сюда и высоту текста. Если используется несколько текстовых стилей и разные высоты текста, удобно иметь на экране текущие установки. Действительно, в панели инструментов Object Properties (Свойства объектов) есть четыре окошка, где показаны текущие значения Layer (Слой), Color (Цвет), Linetype (Тип линии), Lineweight (Вес линии). В панели инструментов Dimension (Размеры) и некоторых других также есть такие окошки, в которых можно контролировать текущие установки. А для текстового стиля такого окошка нет. Но мы его получили в строке состояния.
Вызовите ModemacroЗаполним командную строку:
$(Getvar,Textstyle) $(Getvar,Textsize) [2]
Пробел между двумя выражениями можно не ставить, но тогда оба значения вызываемых системных переменных, имя текстового стиля и высота текста, сольются. Нажмите <Enter>. В строке состояния теперь вышли текущие значения текстового стиля и высоты текста.
Примечание:В AutoCAD 2004 есть новая (по сравнению с предыдущими версиями) панель инструментов Styles (Стили), в которой можно контролировать текстовые и размерные стили.
При помощи системной переменной Modemacro можно вложить в строку состояния любую информацию, находящуюся в системных переменных. Чуть позже мы воспользуемся этим неожиданным открытием, а пока вернемся к нашим Homerun.
(Далее читатель продолжает тему, начатую в предыдущих главах на базe сквозного примера под названием Homerun. Мы здесь опустим часть текста. Скажем только, что, используя несложные выражения DIESEL, можно учесть коэффициент масштабирования и, имея в библиотеке всего один внемасштабный элемент, вставлять его в чертежи любого масштаба. В примере есть также полилиния, ширина которой автоматически настраивается под нужный масштаб и текстовой стиль, универсальный для любого масштаба. Ниже будет создан также универсальный размерный стиль. Пользователи AutoCAD LT, где DIESEL работает, получают мощный инструмент для расширения возможностей системы)
Select objects: 1 found Укажите объекты 1 найден Select objects: Specify change point or [Properties]: Укажите точку или [Свойства]:Нас интересуют именно свойства, поэтому вводим P. Далее появляются новые опции:
Enter property to change [Color/Elev/Layer/LType/LtScale/LWeight/Thickness]: Введите свойства для изменения...: Нас интересует слой (Layer) La Enter new layer name <xxxx> Dims Введите имя нового слоя <xxxx> Dims
Вот и ключ к решению проблемы. Можно поменять некоторые свойства объекта, в том числе слой, с командной строки и без выхода диалогового окна, а значит провести это изменение автоматически.
Остается ввести имя текущего слоя, которое хранится в системной переменной Clayer. При помощи функции DIESEL Getvar можно извлечь это имя, если воспользоваться выражением:
$M=$(Getvar,Clayer);Код команды, переводящий единичный объект в текущий слой, получается таким:
^C^C_Change;\;_Properties;_La;$M=$(Getvar,Clayer);; [5]Для перевода ряда объектов в текущий слой можно поступить двояко:
*^C^C_Change;\;_Properties;_La;$M=$(Getvar,Clayer);; [6]Или:
^C^C_Select;\_Change;_Pr;;_Properties;_La;$M=$(Getvar,Clayer);; [7](В предыдущих главах достаточно подробно рассказывается, как собираются макрокоманды. Здесь, в отрывке, смысл вышеприведенных кодов могут показаться непонятным. Но введите любую из этих записей в окно "Macro associated with this button" диалогового окна Customize (Адаптация), и новая кнопка будет работать.)
Разница между [6] и [7] заключается в следующем. В первом случае при выделении объекта он тут же переводится в текущий слой, но команда Pan (Пан), если ее необходимо применить для выделения следующего объекта, превращается в менее удобную команду -Pan (-Пан). Подробнее об этом говорилось в разделе 3.2. Кроме того, для выхода из команды, надо нажимать клавишу <Esc>.
Во втором случае команда Pan (Пан) работает традиционно, но выбор объектов следует заканчивать стандартным нажатием ПК мыши.
При извлечении при помощи функции DIESEL Getvar текстовых строк, как в этом случае, есть одно существенное ограничение: в строке не должно быть пробелов. Если в имени слоя, которое является текстовой строкой (String), есть пробел, команда не будет работать. Поэтому надо заменить все пробелы в именах слоев, например, знаком подчеркивания "_". Интересно, что при вводе строк, имеющих пробелы, в стоку состояния при помощи Modemacro, они входят туда без ограничений.
Иногда возникает необходимость узнать длину дуги. В этом случае проще всего обратиться к команде List (Список) или Properties (Окносв). Но что делать, если надо проставить размер длины дуги? Ведь в стандартном наборе панели инструментов Dimension (Размеры) команды для измерения длины дуги нет. Можно поступить таким образом: измерить угол, образованный дугой, при помощи команды Dimangular (Рзмугловой), проставить угловой размер (в градусах) и затем полученный размерный текст отредактировать, заменив на результат измерения, выданный командой List (Список). В принципе, это несложно сделать вручную, для чего даже не надо выписывать на бумажку длину дуги с текстового окна AutoCAD Text Window (Текстовое окно AutoCAD), которое вызывается клавишей <F2>. Достаточно воспользоваться "горячими клавишами" <Ctrl> + <C> и перенести результат в окно редактирования текста, где нажать <Ctrl> + <V>. Здесь может появиться небольшая ручная работа по округлению результата, если не требуется точность, заложенная в диалоговом окне Drawing Units (Чертежные единицы).
Но если измерения дуг и простановка их длин не разовая операция, а многократно повторяемая, следует автоматизировать этот процесс. Здесь надо решить две задачи:Вторая задача, в свою очередь, порождает сопутствующую: надо добиться того, чтобы окно радактора текста не появлялось на экране. Будем решать задачи по мере их появления.
Итак, где взять длину дуги? Раз она показана в справочном окне AutoCAD Text Window (Текстовое окно AutoCAD) при взятии команды List (Список), значит, хранится в какой-то системной переменной. Эта переменная называется Perimeter. Справочная система Help выдает по этой переменной следующие сведения:
Тип - Real, реальное число. Сохраняет последнее значение периметра, подсчитанное командами Area (Площадь), DBlist (База данных) и List (Список). Оказывается, к дуге, если последняя выполнена полилинией, можно применить команду Area (Площадь) При этом подсчитывается площадь, образованная собственно дугой и условной линией, соединяющей начальную и конечную точку этой дуги, а также длина дуги. Команда List (Список) выдает эти же сведения, также как и команда DBlist, но последняя выдает информацию обо всех объектах чертежа и вызывать ее для получения длины одного только объекта неразумно.
Таким образом, если взять команду List (Список), выделив искомую дугу, но превращенную предварительно в полилинию, в системную переменную Perimeter зайдет значение ее длины. Отсюда несложно создать логику кода:
Последнее препятствие обойти несложно: команда Dimangular (Рзмугловой) имеет опцию Text (Текст)
применение которой позволяет работать в командной строке, без вывода на экран редактора текста.
Мелькание окна AutoCAD Text Window (Текстовое окно AutoCAD) также можно решить, если заглянуть
вперед, в раздел 15.5. А как же быть с полинией? Не создавать же две отдельные кнопки, одну для
измерения простых дуг, а другую для дуг, выполненных полилинией. Существует функция под названием
If, перевод которой "если". Логика этой функции, применительно к нашей задаче, такова: если это
простая дуга, надо перевести ее в полилинию, измерить и затем возвратить обратно в дугу. Если
это полилиния, измерить ее и оставить таковой. Задача серьезно усложняется и, чтобы не залезать
глубоко в дебри языков программирования, попробуем поискать другое решение. Не найдется ли другой
команды, кроме List (Список) или Area (Площадь) выдающей длину дуги и независимой от того, является
ли дуга полилинией или нет? Система помощи Help, увы, помочь не смогла. Из предложенных ею трех
команд ни одна не подошла. Но чертежник-практик может припомнтиь, что при применении команды
Lengthen (Увеличить), в командной строке появляется измеренное значение длины объекта. Ну
конечно, если длину объекта надо изменить, то предварительно пользователь имеет право увидеть
ее существующее значение! Проверьте команду на примере простой дуги и дуги полилинии. В обоих
случаях в командой строке есть текущая длина дуги. Если команду прервать клавишей <Enter> или
Может быть, в Autodesk прочитают эту книгу и исправят оплошность к выходу следующей версии.
Итак, меняем логику команды:^C^C_Lengthen;\;_Dimangular;@;_Text;$m=$(Getvar,Perimeter);\ [9-8]
Команда работает, измеряя как простые дуги, так и дуговые сегменты полилинии, но выдает результат с точностью до 8-го знака! То есть, с максимально возможной точностью и не зависящей от установок в диалоговом окне Drawing units (Чертежные единицы).
Опять препятствие. Но загрублять результат мы уже научились. В разделе 8.7 была рассмотрена….
Copyright © Сайт поддержки пользователей САПР