Создание набора выделенных объектов — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Создание набора выделенных объектов

2021-06-30 36
Создание набора выделенных объектов 0.00 из 5.00 0 оценок
Заказать работу

С помощью функции SSGET (Selection Set Get - получение набора выделения) можно создать набор выделения. Именно эта функция выводит знакомое приглашение Select objects. Наиболее часто с наборами объектов используются следующие функции:

Функция Описание
SSGET Получает набор выделения от пользователя
SSLENGTH Возвращает число объектов в наборе
SSNAME Возвращает имя сущности заданного объекта в наборе по двум параметрам: по имени набора и номеру объекта в наборе

Пример

Построим две окружности и четыре отрезка. Затем присвоим переменной mysset выделенный набор:

Command: (setq mysset (ssget)) ↵Select objects: Specify opposite corner: 6 foundSelect objects:↵<Selection set: d>

Проверим количество объектов в наборе mysset:

Command: (sslength mysset) ↵6

Извлечем имя сущности нулевого элемента набора mysset:

Command: (SSNAME MYSSET 0) ↵<Entity name: 7ef921d8>

Получим данные об этом объекте

Command: (entget (ssname mysset 0)) ↵((-1. <Entity name: 7ef921d8>) (0. "LINE") (330. <Entity name: 7ef90cf8>) (5. "16B") (100. "AcDbEntity") (67. 0) (410. "Model") (8. "0") (100. "AcDbLine") (10 -30.0 0.0 0.0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0))Command:

Задание 5.3

Построение объектов разного типа. Распечатка типов

Постройте на экране отрезок, окружность, полилинию, прямоугольник и текст.

В новом файле AutoLISP наберите следующий код:

(defun c:listsset (/ mysset counter)(setq mysset (ssget))(setq counter 0)(while (< counter (sslength mysset))(terpri)(princ (cdr (assoc 0 (entget (ssname mysset counter)))))(setq counter (+ counter 1)))(princ))

Сохраните файл как Mysset. lsp в \AutoCAD2007\Support. Загрузите его.

В командной строке введите команду listsset.

В ответ на приглашение выделите все объекты чертежа. Программа выведет следующий текст:

Command: listsset↵Select objects: all↵5 foundSelect objects:↵MTEXTLWPOLYLINELWPOLYLINELINECIRCLE

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

В первой строке объявляется функция и две переменных: mysset и counter.

Во второй строке переменной mysset присваивается набор выделенных пользователем объектов по запросу функции SSGET.

В третьей строке счетчик counter устанавливается в нуль.

В четвертой строке начинается цикл WHILE. Вначале функция SSLENGTH определяет количество элементов в наборе mysset. Затем задается условие выполнения цикла: показания счетчика должны быть меньше количества элементов в наборе. Другими словами, должны быть обработаны все объекты набора.

В пятой строке стоит функция TERPRI - перевод строки.

В шестой строке описаны пять операторов, работа которых выводит содержимое списка на экран. Вначале функция SSNAME определяет имя объекта с номером COUNTER в наборе mysset. Затем с помощью функции ENTGET процедура получает список данных на объект. Далее функция ASSOC извлекает из списка имя объекта из группы с кодом 0. В результате имеется точечная пара, где первым элементом является код группы, а вторым элементом является имя объекта. Функция CDR возвращает лишь нужное нам имя объекта, пропуская первый элемент списка. Функция PRINC выводит результат на экран.

В седьмой строке значение счетчика увеличивается на 1. Цикл повторяется для следующего объекта.

В восьмой строке цикл WHILE закрывается.

В девятой строке стоит оператор корректного завершения процедуры.

Скобка в десятой строке ограничивает тело функции.

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

В интерактивном режиме часто требуется предоставить пользователю возможность ввести какие-либо данные. Связь процедуры с пользователем в 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. Наберите код процедуры:

4. (defun c:chgmytext (/ src_object new_ht new_str)5. (setq src_object (entget (car (entsel))))6. (setq new_ht (getreal "\nКакова новая высота текста?"))7. (setq new_str (getstring T "Новыйтекст:"))8. (setq src_object (subst (cons 40 new_ht) (assoc 40 src_object) src_object))9. (setq src_object (subst (cons 1 new_str) (assoc 1 src_object) src_object))10.(entmod src_object)11.(princ))

12. Отформатируйте и отредактируйте код процедуры. Загрузите его в чертеж.

13. С помощью команд 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. Измените процедуру так, как показано ниже. Затем загрузите ее в чертеж. Опробуйте ее выполнение по отношению к окружности и тексту.

3.;Изменение высоты текста и его содержимого4. (defun c:chgmytext (/ src_object new_ht new_str)5. (terpri)6. (setq src_object (entget (car (entsel))))7. (if (equal (assoc 0 src_object) '(0. "TEXT"))8. (progn9. (princ "Какова новая высота текста? ")10.(setq new_ht (getreal))11.(princ "Введите новый текст: ")12.(setq new_str (getstring))13.(setq src_object (subst (cons 40 new_ht) (assoc 40 src_object) src_object)14.)15.(setq src_object (subst (cons 1 new_str) (assoc 1 src_object) src_object)16.)17.(entmod src_object)18.);_ конец progn19.(princ "Вы должны выделить текстовый объект.")20.);_ конец оператора if21.(princ)22.);_ конец процедуры c:chgmytext

В процедуре применена новая функция проверки на равенство EQUAL. Она применяется для сравнения списков.


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.