VLisp параметрический чертеж

Автор: | 05.02.2018

Содержание задания
Формирование пакетного файла
Преобразование пакетного файла в VLISP приложение
VLISP приложение для параметрического чертежа
Создание пользовательской команды
Создание панели инструментов с кнопкой пользователя
Обеспечение ввода параметров через диалоговое окно

Содержание задания

Для одного из вариантов  разработать  программное приложение построения прокладки по заданным параметрам и обеспечить при этом соответствующий интерфейс (кнопка пиктограммы, диалоговое окно).

Для выполнения задания необходимо выполнить следующие шаги:

  1. Разработать пакет команд (скрипт) формирования чертежа прокладки.
  2. Модифицировать пакет команд в программу на языке VLISP
  3. Расширить возможности программы таким образом, чтобы независимые параметры прокладки (размеры) были переменными.
  4. Создать пользовательскую панель инструментов с пиктограммой, которая вызывает программу построения прокладки.
  5. Обеспечить, чтобы параметры прокладки вводились с помощью диалогового окна.

Ниже представлен пример выполненного чертежа  вместе с  интерфейсной частью к нему.

 Формирование пакетного файла

В системе AutoCAD предусмотрены два режима работы – диалоговый и пакетный.

В диалоговом режиме изображения создаются введением команд и системных переменных – как с клавиатуры, так и с помощью кнопок меню, пиктограмм и диалоговых окон. Введение координат точек, расстояний, а также идентификация элементов чертежа обычно выполняются с помощью курсора, управляемого мышью.

В пакетном режиме команды AutoCAD (и их опции) автоматически считываются из файла. Файл-пакет (ещё его называют сценарий, скрипт или пакет команд) формируется из последовательности символов, которые нужно было бы ввести в окно команд при выполнении задачи в диалоговом режиме. Указание координат точек и расстояний, а также идентификация элементов осуществляется с помощью чисел.

Для новичка лучший способ формирования пакета – изучение работы с AutoCAD непосредственно через окно команд и последующее копирование введенных с клавиатуры символов в файл. Пользователь обычно запускает команды AutoCAD опосредовано – c помощью пиктограмм и не всегда знает имя команды. Восполнить этот пробел можно через подсказку, когда курсор подводится к кнопке пиктограммы. В подсказке указывается функция команды и ее имя. Абсолютные координаты точек, перед их вводом с клавиатуры, можно узнать по отслеживаемым координатам курсора.

Введите имя команды (CIRCLE) с клавиатуры и нажмите клавишу Enter. На первый запрос команды  введите через запятую координаты центра окружности и нажмите клавишу Enter. На следующий запрос команды (с предложением ввести значение радиуса, или поменять дальнейший диалог) введите букву d (большая буква из имени опции Diameter) и нажмите клавишу Enter. Введите значение диаметра окружности и нажмите клавишу Enter.

Откройте клавишей F2 текстовое окно, выделите текст диалога с командой и запомните его в буфере обмена. Запустите редактор VisualLISP (кнопками меню Управление>Прилож…>Редактор VisualLISP) и создайте в нем новый файл. Вставьте в файл  текст из буфера обмена и отредактируйте его, оставив только то, что сами вводили . Количество пробелов в отредактированном тексте должно соответствовать количеству нажатий клавиши Enter (или Пропуск) при работе с командой в диалоговом режиме. В неанглоязычной версии AutoCAD перед англоязычным названием команды или опции необходимо ставить символ «_».

Аналогично записываются и другие команды. Программный код сохраняется в файле с расширением  .scr. Запускается скрипт кнопками меню Управление > Прилож…>Выполнить сценарий.

Файлы сценариев не могут взаимодействовать с диалоговыми окнами, поэтому все команды должны быть выполнены через командную строку AutoCAD. Тире перед командой подавляет вызов диалоговых окон. Так, например, если ввести команду LINETYPE, на экране появится диалоговое окно “Диспетчер типов линий”, если же ввести -LINETYPE (через тире), в окно команд будет выведен  набор опций.

Ниже приводится пакет команд (файл My.scr) для построения окружности с центровыми линиями.

Файл My.scr

LINETYPE S bylayer
LWEIGHT bylayer
CIRCLE 110,200 D 50
LWEIGHT 0.15
XLINE 110,200 110,230 140,200
CIRCLE 110,200 D 60
OSNAP Nearest
TRIM 131,221
110,235 110,165 145,200 75,200
ERASE 131,221

Преобразование пакетного файла в VLISP приложение

VLISP приложение (файл My.lsp) создается на основе файла My.scr преобразованием команд в VLISP выражения.

Файл My.lsp

(command "LINETYPE" "s" "bylayer" "")
(command "LWEIGHT" "bylayer")
(command "CIRCLE" '(110 200) "D" 50)
(command "LINETYPE" "s" "center" "")
(command "LWEIGHT" 0.15)
(command "XLINE" '(110 200) '(110 230) '(140 200) "")
(command "CIRCLE" '(110 200) "D" 60)
(command "OSNAP" "Nearest")
(command "TRIM" (entlast) ""
'(110 235) '(110 165) '(145 200) '(75 200) "")
(command "ERASE" '(131 221) "")

Запускается программа кнопками меню Управление > Прилож…> Загрузить приложение.

Программа (выражение) VLISP – это список из аргументов, первый аргумент которого – функция, остальные аргументы – параметры этой функции:

(f arg1 arg2 ... argN).

В качестве аргументов функции могут выступать вложенные списки, например:

(- 5 (* 2 2)).

Рассмотрим, как интерпретируется это выражение. Для этого используем окно консоли. На приглашение $ вводится выражение VLISP, запускается оно нажатием клавиши Enter.

Список анализируется VLISP-системой слева направо. Если встречается закрывающая скобка, VLISP завершает анализ списка, выполняет функцию и передаёт возвращаемое значение для использования на старшем уровне вложенности списков.

Для запуска команд AutoCAD используется функция command, например:

(command "CIRCLE" '(125 160) "d" 40)

В этом примере функции command передаются 4 аргумента. Текстовые аргументы CIRCLE и d  определяют соответственно имя команды и опцию, они обрамляются двойными кавычками. Точка (центр окружности) определяется как список из двух аргументов – (125 160). Функция command выполняет действие (на поле чертежа появляется окружность) и ничего не возвращает (nil). Обратите внимание на знак апострофа перед списком. Если его не поставить, то результат интерпретации списка будет следующим:

ошибка: неверная функция: 125

Ошибка вызвана тем, что Лисп-система всегда пытается интерпретировать первый элемент списка как имя функции. Но, если перед списком ставится знак ‘ (апостроф), то возвращается список без интерпретации.

А как быть в том случае, если аргументами списка являются переменные или выражения для расчета и, следовательно, требуется проинтерпретировать выражение. В этом случае апостроф не ставится, а применяется функция list, например:

(command "CIRCLE" (list XP YP) "d" 40)

В пакетном файле имело значение количество вводимых пробелов, они определяли ввод команды или ее опций, выход из команды и т.п. В выражениях VLISP количество пробелов между аргументами функции не имеет значения, их заменили разделительные знаки (скобки, двойные кавычки). Если требуется ввести дополнительный пробел, например – для выхода из команды LINE на запрос ввода очередной точки, используется пустой текстовый символ «», например:

(command "LINE" '(125 160) '(130 100) "")

В пакетном файле идентификация примитива выполняется координатами точки, в VLISP выражении на последний примитив можно еще ссылаться функцией (entlast).

VLISP приложение для параметрического чертежа

Для создания программы, обеспечивающей построение графического изображения по параметрам, модифицируем VLISP приложение (файл My.lsp) под использование переменных.

Файл Myprm.lsp

(defun prm ()
; Исходные установки
(command "LAYER" "s" "0" "")
(command "LINETYPE" "s" "bylayer" "")
(command "LWEIGHT" "bylayer")
(command "OSNAP" "Nearest")
; Ввод параметров
(setq D (getreal "\ninput D1 <50>: "))
(if (= D nil) (setq D 50.0))
(setq L (getreal "\ninput L <18>: "))
(if (= L nil) (setq L 40.0))
; Определение положения объекта
(setq P (getpoint "\nукажите центр: "))
(setq XP (car P) YP (cadr P))
;Основной чертеж
(command "CIRCLE" P "d" D)
(setq L1 (entlast))
(command "XLINE" "v"  (list (+ XP  (- L (/ D 2))) YP) "")
(command "TRIM" (entlast) "" (list (+ XP (/ D 2)) YP) "")
(command "TRIM" L1 ""  (list (+ XP  (- L (/ D 2))) (+ YP D))
(list (+ XP  (- L (/ D 2))) (- YP D))"")
; Центровые линии
;(command "LINETYPE" "s" "center" "")
(command "LWEIGHT" 0.15)
(command "LINE" (list (- XP (/ D 2) 5) YP) (list (+ XP (/ D 2)) YP) "")
(command "LINE" (list XP (- YP (/ D 2) 5))(list XP (+ YP (/ D 2) 5)) "")
;Нанесение размеров
;(command "LAYER" "s" "размеры" "")
(command "LINETYPE" "s" "bylayer" "")
(command "LWEIGHT" "bylayer")
(command "DIMDIAMETER"  (list (- XP 5) (- YP (/ D 2))) "" "")
(command "OSNAP" "Intersec")
(command "DIMLINEAR"  (list (- XP (/ D 2)) YP)
(list (+ XP (- L (/ D 2))) YP)
(list (+ (- XP (/ D 2)) (/ L 2)) (+ YP (/ D 2) 10)) "" )
)

Функция defun объединяет выражения программы от первой открывающей скобки  до последней закрывающей в одно определение пользовательской функции с именем prm. Теперь для запуска программы кроме загрузки файла необходимо выполнить вызов этой функции с командной строки: (prm).

Функция getreal возвращает вводимое с командной строки значение и оно сохраняется в аргументе (переменной) функции setq. При нажатии на клавишу Enter (выбор значения по умолчанию) переменной присваивается значение nil, дальнейшая проверка обеспечит явное присвоение переменной значения по умолчанию.

Функция getpoint запрашивает ввод точки на графическом экране и возвращает список из координат точки (центра окружности). Функции car и cadr достают из него, соответственно, координаты  X  и Y. Относительно них в программе определяется положение других элементов рисунка.

Создание пользовательской команды

С помощью функции defun и прибавлением префикса С: к имени функции можно добавлять новые команды в систему AutoCAD, например, можно определить имя команды PRM:

(defun С:PRM()
тело функции
)

Команда PRM также как и функция (prm) может запускаться с командной строки после загрузки VLISP приложения (файл Myprm.lsp)

Создание панели инструментов с кнопкой пользователя

Вызываем окно «Адаптация пользовательского интерфейса» кнопками меню Управление >  Пользовательский интерфейс  и создаем новую панель.

В том же окне в списке команд создаем новую команду. Для нее выполняем рисунок пиктограммы и определяем макрос, в котором прописываем загрузку файла Myprm.lsp и запуск функции prm.

^C^C – в начале макроса, аналогично двойному нажатию Esc на клавиатуре. Эта операция должна отменить любые другие команды, которые выполнялись перед вашим макросом.

После закрытия окна на поле чертежа появляется новая панель с кнопкой для новой команды.

Обеспечение ввода параметров через диалоговое окно

При создании программных систем стремятся, чтобы описание данных, по возможности, было отделено от описания управляющих процедур. Это позволяет легко структурировать данные. От возможности отделения данных и их организации в существенной степени зависит и сложность программ.

Отделение данных от управляющих процедур обусловило создание новых языков, обеспечивающих описание данных.  Так, для того, чтобы описать пользовательское диалоговое окно в AutoCAD появился язык DCL (Dialog Control Language). Этот язык позволяет с помощью атрибутов (свойств) описать диалоговое окно вместе с его элементами. Язык DCL не содержит управляющих процедур, управление диалоговым окном осуществляется через VLISP функции, которые обеспечивают доступ к свойствам элементов окна и управление ними.

Подобный подход напоминает создание веб-сайтов, когда интерфейс определяется в файлах html, а логика приложения – в коде javascript.

Ниже приводится описание на языке DCL диалогового окна с одним графическим и двумя текстовыми окнами.

Файл Mydlg.dcl

dw : dialog
{
label= "Определение параметров прокладки";
:text {label="Введите параметры прокладки";}
: image {
color = -16; //цв. фона гр. экрана
width = 10;
aspect_ratio = 3.0;
key = "KG";  // ключ для связи с управляющей программой
}
:edit_box { // кнопка ввода числовых значений и текста
edit_width=15; // допустимое для ввода количество символов
label="Введите D";
width=9; // количество символов в окне кнопки
key="KD"; // ключ для связи с управляющей программой
mnemonic="D"; // горячая клавиша для активизации окна
}
:edit_box {
edit_width=15;
label="Введите L";
width=9;
key="KL";
mnemonic="L";
}
ok_cancel;  //по умолчанию ключи  "accept" для кнопки OK и "cancel" для кнопки Отмена
}

Файл Mydlg.dcl создается в VLISP редакторе. Вы можете просмотреть диалоговое окно в отладочном режиме. Для этого активизируйте кнопки меню Сервис > Инструменты интерфейса> Просмотр DCL из VLISP редактора.

Обратите внимание, что в описании каждого элемента в DCL файле есть атрибут key – ключ (идентификатор) для связи с управляющей программой. Значение этого атрибута должно соответствовать значению параметра в функциях, которые управляют этим элементом.

Фрагмент VLISP-программы, управляющей диалоговым окном, представлен ниже:

Файл Mydlg.lsp

(defun C:dlg ()
;инициализация параметров
(setq D 50.0 L 40.0)
(setq dcl_id (load_dialog "E:/tmp/Mydlg.dcl"))
(if (not(new_dialog "dw" dcl_id))
(exit) ;выйти, если ошибка (if nil).
)
; Определяются и устанавливаются параметры изображения-слайда
(start_image "KG")  ;параметр-ключ "KG" для связи с элементом в DCL файле
(mode_tile "KG" 4)
(setq x (dimx_tile "KG"))
(setq y (dimy_tile "KG"))
(slide_image 0 0 x y "E:/tmp/Myimg") ;загружается файл Myimg.sld 
(end_image)
; Устанавливается значение подокон диалогового окна
;параметры-ключи "KD", "KL", "accept", "cancel" для связи с элементами в DCL файле
(set_tile "KD" (rtos D 2 1))
(set_tile "KL" (rtos L 2 1))
(mode_tile "KD" 2) ; устанавливаетcя фокус к подокну с ключом KD
(action_tile "KD" "(setq D (atof $value))") ;связать действие:
(action_tile "KL" "(setq L (atof $value))") ; присвоить
(action_tile ;связать действия:(Setq n 1)(Done_dialog)
"accept" ;c ключом "accept" кнопки OK.
"(Setq n 1) (Done_dialog)") ;Присвоить n=1 и закончить диалог.
(action_tile ;связать действия:(Setq n 0)(Done_dialog)
"cancel" ;c ключом "cancel" кнопки Cancel.
"(Setq n 0) (Done_dialog) ") ;Присвоить n=1 и закончить диалог.
(start_dialog) ; начать диалог(выполняются все функции)
(unload_dialog dcl_id) ;выгрузить DCL-файл
(if (= n 1) (prm)) ;Если n=1 запустить функцию (prm).
)
(defun prm ()
; Исходные установки
(command "LAYER" "s" "0" "")
(command "LINETYPE" "s" "bylayer" "")
(command "LWEIGHT" "bylayer")
(command "OSNAP" "Nearest")
; Ввод параметров
; (setq D (getreal "\ninput D1 <50>: "))
; (if (= D nil) (setq D 50.0))
; (setq L (getreal "\ninput L <18>: "))
; (if (= L nil) (setq L 40.0))
; Определение положения объекта
(setq P (getpoint "\nукажите центр: "))
(setq XP (car P) YP (cadr P))
…

В файл Mydlg.lsp (по сравнению с Myprm.lsp) добавлена функция-команда DLG, которая обеспечивает запуск программы и управление диалоговым окном. В конце описания этой функции выражение (if (= n 1) (prm)) запускает функцию prm, которая рисует прокладку. В функции prm убрали выражения, которые обеспечивают инициализацию переменных D и L. Эти переменные передаются в функцию prm из функции DLG как глобальные переменные.

Изображение,  которое появляется в диалоговом окне, фиксируется в AutoCAD командой MSLIDE.  Команда создает файл с расширением  *.sld.

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *