Работа с объектами AutoCAD
Ввод данных пользователем
В интерактивном режиме часто требуется предоставить пользователю возможность ввести какие-либо данные. Связь процедуры с пользователем в AutoLISP осуществляет ряд функций с префиксом GET . Основные из этих функций приведены в таблице.
Функция | Описание |
---|---|
GETDIST | Возвращает расстояние между двумя точками, указанными пользователем |
GETINT | Возвращает целое число |
GETREAL | Возвращает действительное число |
GETSTRING | Возвращает текстовую константу |
Часто нужно приостановить выполнение процедуры, чтобы ввести значения или указать точку на объекте. Для этого в тело процедуры можно включить функцию PAUSE . Например, в команде (command "circle" pause "30") сделана пауза. Пользователь должен указать координаты центра, а затем программа создаст окружность с радиусом 30.
Задание 5.4
Получение данных от пользователя
Обратите внимание на функцию ENTSEL . Она представляет собой упрощенный вариант функции SSGET . Функция используется для выделения пользователем одного объекта. Она возвращает имя сущности и точечную пару, содержащую координаты указанной точки. Следовательно, после использования функции ENTSEL с помощью функции CAR можно получить имя сущности для функции ENTGET .
В процедуре Вы встретитесь с параметром Т функции GETSTRING . Если он не равен nil , то при вводе данных допускаются пробелы. Таким образом, с помощью этого аргумента пользователь может вводить текстовые константы, состоящие из нескольких слов. Без него AutoLISP интерпретировал бы пробел как нажатие клавиши ENTER .
- Откройте новый чертеж на основе шаблона acadiso.dwt .
- Откройте новый файл в редакторе Visual LISP . Сохраните его как User.lsp в папке AutoCAD2010\Support .
-
Наберите код процедуры:
(defun c:chgmytext (/ src_object new_ht new_str) (setq src_object (entget (car (entsel)))) (setq new_ht (getreal "\nКакова новая высота текста?")) (setq new_str (getstring T "Новый текст:")) (setq src_object (subst (cons 40 new_ht) (assoc 40 src_object) src_object)) (setq src_object (subst (cons 1 new_str) (assoc 1 src_object) src_object)) (entmod src_object) (princ))
- Отформатируйте и отредактируйте код процедуры. Загрузите его в чертеж.
- С помощью команд TEXT или DTEXT создайте фрагмент текста. Запустите функцию CHGMYTEXT . В ответ на приглашения наберите высоту и новый текст. AutoCAD изменит содержание и высоту текста.
Процедура работает следующим образом.
- В первой строке объявляются функция и три переменные.
- Во второй строке функция ENTSEL просит пользователя выделить один объект. Она возвращает имя сущности и координаты указанной точки. Функция CAR получает имя сущности и передает его в качестве параметра функции ENTGET . Эта функция по имени сущности извлекает из базы данных список групп с параметрами текста. Этот список присваивается переменной src_object .
- В третьей строке выводится приглашение задать новую высоту текста и это значение, введенное пользователем, присваивается переменной new_ht .
- В четвертой строке выводится приглашение задать новый текст и это значение, введенное пользователем, присваивается переменной new_str .
- В пятой строке старая высота текста заменяется новой высотой. Функция SUBST заменяет все вхождения некоторого значения другим значением. Первый параметр указывает, чем заменять, второй - что заменять, третий - где заменять. Коды групп: 40 - высота текста, 1 - текстовое значение. Значение переменной new_ht представляется числом, которое названо пользователем как высота текста. Для замены в списке данных нужна точечная пара, т.е. два элемента - код группы и высота текста. Поэтому здесь применяется функция CONS . Она добавляет свой первый параметр в начало списка, который указан вторым параметром: (cons 40 new_ht) . Функция ASSOC извлекает из списка src_object точечную пару, состоящую из кода группы 40 и значения высоты старого текста. Новый список данных с измененной высотой текста присваивается переменной src_object .
- В шестой строке переменной src_object присваивается новый список данных с измененным текстом. Операции аналогичны описанным в п.5.
- В седьмой строке текст модифицируется в соответствии с обновленными параметрами списка, который хранит переменная src_object .
- Оператор (princ ) в восьмой строке завершает процедуру. Без аргументов princ возвращает пустую строку. Иначе в командную строку будет выводиться результат работы последнего оператора.
Задание 5.5
В приведенной ниже программе заданному объекту присваивается тот же слой, что и другому объекту. Выполняется копирование свойств объекта. Методика, примененная здесь для копирования слоев объектов, может быть применена для изменения любых других свойств объектов AutoCAD .
;;; Копирование слоя выделенного объекта ;;; и присвоение слоя другим объектам (defun c:matchlayer (/ src_object mysset counter cur_ent_layer) ;; приглашение пользователю (princ "\n***Выделите исходный объект***") (if (setq src_object (car (entsel))) ; выделить объект (progn ; считывание слоя ; выбранного объекта (setq src_layer (assoc 8 (entget src_object))) ;; приглашение пользователю (princ "\n***Выделите объекты для копирования слоя***") ;; выделение нескольких объектов ;; с помощью функции ssget (if (setq mysset (ssget)) ; анализ выделенных объектов (progn ; если объекты выделены, выполнить следующее (setq counter 0) (while (< counter (sslength mysset)) (setq cur_ent (entget (ssname mysset counter))) (setq ent_layer (assoc 8 cur_ent)) (entmod (subst src_layer ent_layer cur_ent)) (setq counter (+ counter 1)) ) ;_ конец WHILE ) ;_ конец PROGN (princ "\nНи одного объекта не выделено") ) ;_ конец if ) ;_ завершение функции PROGN для выделения объектов ;; сообщение пользователю, если не выделен исходный объект (princ "\nВы не выделили исходный объект") ) ;_ конец оператора IF (princ) ) ;_ конец функции c:matchlayer
В этой процедуре вначале определяется имя выделенного объекта с помощью функции (CAR (ENTSEL)) . Затем функция ENTGET выбирает сам объект по его имени и передает как параметр функции ASSOC . Эта функция выбирает слой объекта в группе с кодом 8 и формирует точечную пару код-имя слоя. Функция SETQ присваивает значение точечной пары переменной src_layer .
На следующем шаге процедура получает от пользователя набор выделенных объектов с помощью функции SSGET . Этот набор присваивается переменной mysset . Далее в цикле идет перебор объектов набора. Для каждого из объектов функции выполняют одинаковые действия:
- SSNAME выясняет имя, ENTGET получает список параметров, который присваивается переменной cur_ent ;
- ASSOC извлекает из списка параметров точечную пару 8-имя слоя, которая присваивается переменной ent_layer ;
- SUBST заменяет в переменной cur_ent текущее значение слоя ent_layer на значение слоя объекта-источника src_layer ;
- ENTMOD модифицирует объект по обновленному списку данных.
Выделение объекта источника происходит в теле оператора IF . Если объект не выделен, то блок "если ложно" выводит сообщение об ошибке: "Вы не выделили исходный объект". Аналогично для набора выводится сообщение: "Ни одного объекта не выделено".
Задание 5.6
- Загрузите процедуру, созданную в задании 5.4. Начертите на экране окружность и запустите функцию CHGMYTEXT . В ответ на приглашение выделите окружность. В ответ на следующие приглашения укажите высоту и напишите текст. Радиус окружности изменится. Но вы же хотели получить не этот результат. Значит, программа работает некорректно.
-
Измените процедуру так, как показано ниже. Затем загрузите ее в чертеж. Опробуйте ее выполнение по отношению к окружности и тексту.
;Изменение высоты текста и его содержимого (defun c:chgmytext (/ src_object new_ht new_str) (terpri) (setq src_object (entget (car (entsel)))) (if (equal (assoc 0 src_object) '(0 . "TEXT")) (progn (princ "Какова новая высота текста? ") (setq new_ht (getreal)) (princ "Введите новый текст: ") (setq new_str (getstring)) (setq src_object (subst (cons 40 new_ht) (assoc 40 src_object) src_object) ) (setq src_object (subst (cons 1 new_str) (assoc 1 src_object) src_object) ) (entmod src_object) );_ конец progn (princ "Вы должны выделить текстовый объект.") );_ конец оператора if (princ) );_ конец процедуры c:chgmytext
В процедуре применена новая функция проверки на равенство EQUAL . Она применяется для сравнения списков.