Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 5:

Работа с объектами AutoCAD

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Ввод данных пользователем

В интерактивном режиме часто требуется предоставить пользователю возможность ввести какие-либо данные. Связь процедуры с пользователем в AutoLISP осуществляет ряд функций с префиксом GET . Основные из этих функций приведены в таблице.

Функция Описание
GETDIST Возвращает расстояние между двумя точками, указанными пользователем
GETINT Возвращает целое число
GETREAL Возвращает действительное число
GETSTRING Возвращает текстовую константу

Часто нужно приостановить выполнение процедуры, чтобы ввести значения или указать точку на объекте. Для этого в тело процедуры можно включить функцию PAUSE . Например, в команде (command "circle" pause "30") сделана пауза. Пользователь должен указать координаты центра, а затем программа создаст окружность с радиусом 30.

Задание 5.4

Получение данных от пользователя

Обратите внимание на функцию ENTSEL . Она представляет собой упрощенный вариант функции SSGET . Функция используется для выделения пользователем одного объекта. Она возвращает имя сущности и точечную пару, содержащую координаты указанной точки. Следовательно, после использования функции ENTSEL с помощью функции CAR можно получить имя сущности для функции ENTGET .

В процедуре Вы встретитесь с параметром Т функции GETSTRING . Если он не равен nil , то при вводе данных допускаются пробелы. Таким образом, с помощью этого аргумента пользователь может вводить текстовые константы, состоящие из нескольких слов. Без него AutoLISP интерпретировал бы пробел как нажатие клавиши ENTER .

  1. Откройте новый чертеж на основе шаблона acadiso.dwt .
  2. Откройте новый файл в редакторе Visual LISP . Сохраните его как User.lsp в папке AutoCAD2010\Support .
  3. Наберите код процедуры:

    (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))
    
  4. Отформатируйте и отредактируйте код процедуры. Загрузите его в чертеж.
  5. С помощью команд TEXT или DTEXT создайте фрагмент текста. Запустите функцию CHGMYTEXT . В ответ на приглашения наберите высоту и новый текст. AutoCAD изменит содержание и высоту текста.

Процедура работает следующим образом.

  1. В первой строке объявляются функция и три переменные.
  2. Во второй строке функция ENTSEL просит пользователя выделить один объект. Она возвращает имя сущности и координаты указанной точки. Функция CAR получает имя сущности и передает его в качестве параметра функции ENTGET . Эта функция по имени сущности извлекает из базы данных список групп с параметрами текста. Этот список присваивается переменной src_object .
  3. В третьей строке выводится приглашение задать новую высоту текста и это значение, введенное пользователем, присваивается переменной new_ht .
  4. В четвертой строке выводится приглашение задать новый текст и это значение, введенное пользователем, присваивается переменной new_str .
  5. В пятой строке старая высота текста заменяется новой высотой. Функция SUBST заменяет все вхождения некоторого значения другим значением. Первый параметр указывает, чем заменять, второй - что заменять, третий - где заменять. Коды групп: 40 - высота текста, 1 - текстовое значение. Значение переменной new_ht представляется числом, которое названо пользователем как высота текста. Для замены в списке данных нужна точечная пара, т.е. два элемента - код группы и высота текста. Поэтому здесь применяется функция CONS . Она добавляет свой первый параметр в начало списка, который указан вторым параметром: (cons 40 new_ht) . Функция ASSOC извлекает из списка src_object точечную пару, состоящую из кода группы 40 и значения высоты старого текста. Новый список данных с измененной высотой текста присваивается переменной src_object .
  6. В шестой строке переменной src_object присваивается новый список данных с измененным текстом. Операции аналогичны описанным в п.5.
  7. В седьмой строке текст модифицируется в соответствии с обновленными параметрами списка, который хранит переменная src_object .
  8. Оператор (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

Отладка процедуры.

  1. Загрузите процедуру, созданную в задании 5.4. Начертите на экране окружность и запустите функцию CHGMYTEXT . В ответ на приглашение выделите окружность. В ответ на следующие приглашения укажите высоту и напишите текст. Радиус окружности изменится. Но вы же хотели получить не этот результат. Значит, программа работает некорректно.
  2. Измените процедуру так, как показано ниже. Затем загрузите ее в чертеж. Опробуйте ее выполнение по отношению к окружности и тексту.

    ;Изменение высоты текста и его содержимого
    (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 . Она применяется для сравнения списков.

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия