Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

Глава из книги "AutoCAD. Язык макрокоманд
и создание кнопок" Владимира Света.

Перед вами отрывки из моей книги об Автокаде. Книга предназначается для тех, кто хочет расширить свои знания об Автокаде, автоматизировать процесс черчения, сделать его простым, дружественным и быстрым, кто хочет создать свои собственные кнопки-инструменты. Буду благодарен за критику, отзывы и пожелания. Мой адрес vosvet@juno.com

Владимир Свет

DIESEL

1. Строка состояния.

DIESEL и AutoCAD LT

Язык программирования 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ке состояния что-нибудь другое.


Рис 1. Строка состояния (Status Line)

Испытаем способности DIESEL в математике - попросим его сложить два числа, 3 и 8.

Вызываем Modemacro
  Enter 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 работает, получают мощный инструмент для расширения возможностей системы)

2. Перевод объекта в текущий слой

В полной версии AutoCAD, в меню Express есть команда Laycur. Она переводит объекты в текущий слой. Для AutoCAD LT эта команда недоступна, но мы попытаемся найти ей замену. Изменить слой объекту означает изменить его свойство. Для этого служит команда Properties (Окносв), вызывающая соответствующее диалоговое окно. Можно ли воспользоваться командой Properties (Окносв) с командной строки и без вызова диалогового окна? В главе 12 будут показаны несколько способов открытия диалогового окна Properties (Свойства). Один из них это набор на клавиатуре аббревиатуры Ch. (Это сокращение показано на рис. 1.8 и 1.9). Но сокращение Ch произошло от команды Change (Изменить). Есть и такая не часто употребляемая в AutoCAD команда. Набор на клавиатуре Change или, что то же, -Ch вызывает в командной строке (и без выхода диалогового окна!) запрос:
  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, они входят туда без ограничений.

3. Длина дуги

Иногда возникает необходимость узнать длину дуги. В этом случае проще всего обратиться к команде 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 зайдет значение ее длины. Отсюда несложно создать логику кода:

  1. Превращение дуги в полилинию командой Pedit (Полред)
  2. Команда List (Cписок), или Area (Площадь)
  3. Команда Dimangular (Рзмугловой)
  4. Редактирование размерного текста
  5. Возврзщение полилинии в дугу
Здесь просматривается несколько серьезных препятствий:

Последнее препятствие обойти несложно: команда Dimangular (Рзмугловой) имеет опцию Text (Текст) применение которой позволяет работать в командной строке, без вывода на экран редактора текста. Мелькание окна AutoCAD Text Window (Текстовое окно AutoCAD) также можно решить, если заглянуть вперед, в раздел 15.5. А как же быть с полинией? Не создавать же две отдельные кнопки, одну для измерения простых дуг, а другую для дуг, выполненных полилинией. Существует функция под названием If, перевод которой "если". Логика этой функции, применительно к нашей задаче, такова: если это простая дуга, надо перевести ее в полилинию, измерить и затем возвратить обратно в дугу. Если это полилиния, измерить ее и оставить таковой. Задача серьезно усложняется и, чтобы не залезать глубоко в дебри языков программирования, попробуем поискать другое решение. Не найдется ли другой команды, кроме List (Список) или Area (Площадь) выдающей длину дуги и независимой от того, является ли дуга полилинией или нет? Система помощи Help, увы, помочь не смогла. Из предложенных ею трех команд ни одна не подошла. Но чертежник-практик может припомнтиь, что при применении команды Lengthen (Увеличить), в командной строке появляется измеренное значение длины объекта. Ну конечно, если длину объекта надо изменить, то предварительно пользователь имеет право увидеть ее существующее значение! Проверьте команду на примере простой дуги и дуги полилинии. В обоих случаях в командой строке есть текущая длина дуги. Если команду прервать клавишей <Enter> или , значение длины дуги все равно успеет войти в системную переменную Perimeter. И не надо усложнять задачу и вводить функцию If (Если). А вот система помощи Help подкачала. К перечню из трех команд, после которых меняется значение системной переменной Perimeter, следовало бы добавить и четвертую команду Lengthen (Удлинить). Не помешало бы и примечание, что для команд Area, DBlist или List надо, чтобы измеряемый объект был полилинией (или сплайном), а для команды Lengthen безразлично, полилиния это, или простая линия, или дуга.

Может быть, в Autodesk прочитают эту книгу и исправят оплошность к выходу следующей версии.

Итак, меняем логику команды:
  1. Команда Lengthen (Удлинить). После выделения дуги, команда прерывается нажатием
  2. Команда Dimangular (Рзмугловий), в которой на запрос выбора объекта можно ввести символ @ (последняя, использованная командой Lengthen (Удлинить), точка). Здесь же вводится опция Text (Текст), позволяющая вписать значение нового текста в командной строке без вызова редактора текста
  3. Ввод нового текста, полученного из системной переменной Perimeter, при помощи известной функции DIESEL Getvar.
Код команды:
  ^C^C_Lengthen;\;_Dimangular;@;_Text;$m=$(Getvar,Perimeter);\  [9-8]

Команда работает, измеряя как простые дуги, так и дуговые сегменты полилинии, но выдает результат с точностью до 8-го знака! То есть, с максимально возможной точностью и не зависящей от установок в диалоговом окне Drawing units (Чертежные единицы).

Опять препятствие. Но загрублять результат мы уже научились. В разделе 8.7 была рассмотрена….



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko