Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г
.pdf
Visual LISP: редактирование базы данных чертежа |
501 |
Функция ssget "X" может содержать несколько критериев отбора, что позволяет выбирать объекты определенного типа. Например, чтобы выбрать все линейные объекты, имеющиеся на слое OBJECT, необходимо установить два критерия отбора. Во-первых, эти объекты должны быть линейными, а во-вторых, они должны находиться на слое OBJECT.
(ssget "X" (list (cons 0 "LINE")(cons 8 "OBJECT")))
Групповые коды функции ssget "X"
В следующей таблице приведены групповые коды AutoCAD, которые могут использоваться с функцией ssget "X":
Групповой код |
Выполняемая функция |
0 |
Тип объекта |
2 |
Имя, используемое при обращении к блоку |
3 |
Имя текущего стиля DIMSTYLE размерного элемента |
6 |
Имя типа линии |
7 |
Имя текстового стиля |
8 |
Имя слоя |
38 |
Угол возвышения |
39 |
Толщина |
62 |
Количество цветов |
66 |
Атрибуты |
210 |
Направление выдавливания в трехмерной системе координат |
Пример 2
Напишите программу Visual LISP, с помощью которой вы сможете удалить все текстовые объекты, находящиеся на определенном слое чертежа. Для выделения текстовых объектов, отвечающих заданному критерию, используйте функцию ssget с опцией filter (ssget "X"). Предполагается, что на указанном слое уже начерчены некоторые объекты.
Шаг 1: написание программы Visual LISP
Откройте окно Visual LISP, выбрав команду Tools AutoLISP Visual LISP Editor или введя выражение VLIDE в командную строку. Затем откройте текстовый редактор Visual LISP, выбрав команду New File из меню File. В окно редактора введите текст программы, приведенный в следующем абзаце.
Ниже представлен листинг программы Visual LISP для примера 2.
;Эта программа позволяет удалить все текстовые объекты, ;находящиеся на заданном слое чертежа.
;
(defun deltext () (setvar "cmdecho" 0)
(setq layer (getstring "\n Enter layer name: "))
(setq ss1 (ssget "x" (list (cons 8 layer) (cons 0 "text")))) (command "erase" ss1 "")
(command "redraw") (setvar "cmdecho" 1) (princ))
504 Глава 14
Функция entget
Функция entget извлекает список данных из имени объекта. Имя объекта может быть получено с помощью функции ssname. Функция entget имеет следующий формат:
(entget имя_объекта)
где
• имя_объекта — имя объекта, полученного с помощью функции ssname.
Пример
(setq ss1 (ssget)) (setq index 0)
(setq entname (ssname ss1 index)) (setq entlist (entget entname))
Это выражение возвращает список параметров первого объекта, содержащийся в переменной entname, и присваивает его переменной entlist.
Функция assoc
Функция assoc находит определенный код в списке параметров объекта и возвращает элемент, содержащий этот код. Функция assoc имеет следующий формат:
(assoc код список_объекта)
где
•код — объектный код AutoCAD;
•список_объекта — список параметров данного объекта.
Пример
(setq ss1 (ssget)) (setq index 0)
(setq entname (ssname ss1 index)) (setq entlist (entget entname)) (setq entasso (assoc 0 entlist))
Это выражение возвращает элемент, ассоциированный с объектным кодом 0, из списка, который определяется переменной entlist.
Функция cons
Функция cons формирует новый список из данных элементов или списков. Эта функция имеет следующий формат:
(cons первый_элемент второй_элемент)
где
•первый_элемент — первый элемент или список;
•второй_элемент — второй элемент или список.
Примеры
(cons |
'x |
'y) |
|
возвращает (X .Y) |
(cons |
'(x |
y) |
'z) |
возвращает ((X .Y) Z) |
(cons |
'(x |
y |
z) '(0.5 5.0)) |
возвращает ((X Y Z) 0.5 5.0) |
Visual LISP: редактирование базы данных чертежа |
505 |
Функция subst
Функция subst заменяет элементы списка новым элементом. Это дает вам возможность заменить один или несколько элементов, находящихся в одном списке. Функция subst имеет следующий формат:
(subst новый_элемент старый_элемент список)
где
•новый_элемент — новый элемент, который заменит существующие элементы;
•старый_элемент — элементы, которые вы хотите заменить;
•список — имя списка параметров объекта или список.
Пример
(setq entlist '(x y x))
(setq newlist (subst '(z) '(x) entlist)
Это выражение возвращает (x y z); функция subst заменяет переменную x, имеющуюся в списке параметров объекта (entlist), на переменную z.
Функция entmod
Функция entmod обновляет содержимое чертежа, вводя измененный список параметров в базу данных чертежа. Эта функция имеет следующий формат:
(entmod список_объекта)
где
• список_объекта — имя измененного списка параметров.
Пример 3
Напишите программу Visual LISP, с помощью которой вы сможете изменить высоту текстового объекта. Эта программа должна также вывести приглашение, позволяющее определить новую высоту текста.
Шаг 1: разработка алгоритма программы
Исходные данные
•Новая высота текста
•Текстовый объект
Выходные данные
• Текст, имеющий новую высоту текста
Процесс обработки данных
1.Выберите текстовый объект; используя функцию ssname, получите имя выбранного объекта.
2.Используя функцию entget, извлеките список параметров объекта.
3.С помощью функции assocc выберите из списка параметров элемент, ассоциированный с объектным кодом 0.
4.Используя функцию cons, сформируйте новый элемент, имеющий новую высоту текста.
506Глава 14
5.С помощью функции subst введите новый элемент в исходный список.
6.Обновите базу данных чертежа, используя функцию entmod.
Шаг 2: написание программы Visual LISP
Откройте окно Visual LISP, выбрав команду Tools AutoLISP Visual LISP Editor или введя выражение VLIDE в командную строку. Затем откройте текстовый редактор Visual LISP, выбрав команду New File из меню File. В окно редактора введите текст программы, приведенный в следующем абзаце. Перед вами листинг программы Visual LISP для примера 3.
;Эта программа изменяет высоту выделенного текста. ;За каждый прогон программы можно изменить высоту ;только одного текстового фрагмента.
;
(defun chgtext1 () (setvar "cmdecho" 0)
(setq newht (getreal "\n Enter new text height: ")) (setq ss1 (ssget))
(setq name (ssname) ss1 0)) (setq ent (entget name)) (setq oldlist (assocc 40 ent))
(setq conlist (cons (car oldlist) newht)) (setq newlist (subst conlist oldlist ent)) (entmod newlist)
(setvar "cmdecho" 1) (princ)
)
Шаг 3: загрузка и запуск программы Visual LISP
Выберите команду Save или Save As из меню File и сохраните текстовый файл под именем chgtext1.lsp. Чтобы загрузить созданную программу, выберите команду Load Text in Editor из меню Tools или щелкните на кнопке Load active edit window, которая находится на панели инструментов Tools. В окне консоли Visual LISP появится сообщение об успешной загрузке данной программы. Если в программе будут обнаружены какие-либо ошибки, на экране появится соответствующее сообщение. Чтобы запустить программу, введите имя функции (chgtext1) в строку приглашения консоли после знака _$ и нажмите клавишу <Enter>. (Не забывайте, что имя функции следует указывать в круглых скобках.) Выполнив описанные действия, вы автоматически перейдете в окно графического редактора, а в командной строке появится приглашение на ввод высоты текста и выбор редактируемого объекта. Выделите текстовый объект и нажмите клавишу <Enter>. Вы увидите, что высота текста изменилась.
Поиск и редактирование базы данных
Чтобы изменить объекты, имеющиеся на чертеже, вы должны разобраться в структуре базы данных и понять способы, используемые для обработки данных. Познакомившись с основными концепциями, вы сможете легко редактировать базу данных и объекты чертежа. Ниже приведено пошаговое описание процесса, выполняемого при изменении высоты выделенного текстового объекта. Допустим, вы хотите отредактировать текстовую строку
Visual LISP: редактирование базы данных чертежа |
507 |
“CHANGE TEXT”, начерченную на листе. Высота текста равна 0,3 единицы. Перед тем как приступить к выполнению описанных действий, загрузите программу Visual LISP из примера 3 и запустите ее, присваивая переменным соответствующие значения.
Шаг 1
Используя функцию ssget или ssget "X", выделите текст и присвойте полученные данные переменной ss1. AutoCAD создаст набор, который может состоять из одного или нескольких выделенных объектов. В строке 7 (setq ss1 (ssget)), содержащейся в программе для примера 3, набор объектов присваивается переменной ss1. Для проверки этой переменной используется следующая команда:
Command: !ss1 <Selection set: 2>
Шаг 2
Созданный набор может состоять из нескольких объектов, поэтому прежде чем вносить какие-либо изменения, выбранные объекты необходимо разделить. Это может быть сделано с помощью функции ssname, которая позволяет извлечь имя объекта. Для определения объекта, имя которого извлекается функцией ssname, используется числовой индекс. Например, если индекс равен 0, функция ssname извлечет имя первого объекта, если индекс равен 1, функция извлечет имя второго объекта, и т.д. В восьмой строке программы (setq name (ssname ss1 0)) функция ssname извлекает имя первого объекта и присваивает его имени переменной. Для проверки имени переменной используется следующая команда:
Command: !name
<Object name: 60000018>
Шаг 3
С помощью функции enget извлеките список параметров объекта. В девятой строке программы (setq ent (entget name)) значение списка присваивается переменной ent. Для проверки значения этой переменной используется следующая команда:
Command: !ent
((-1.< Object name: 60000018> (0 . "TEXT") (8 . "0") (10 4.912227 5.36301 0.0) (40 . 0.3) (1 . "CHANGE TEXT") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "standard") (71 . 0) ) (72 . 1) (11 6.51227 5.36302 0.0) (210 0.0 0.0 1.0))
Список параметров содержит всю информацию о выделенном текстовом объекте (т.е. о строке CHANGE TEXT), но вам необходимо изменить только высоту текста. Таким образом, вы должны идентифицировать элемент, содержащий информацию, относящуюся к высоте текста (40 . 0.3), а затем выделить его из списка.
Шаг 4
Для выделения элемента, ассоциированного с кодом 40 (т.е. с высотой текста), используется функция assocc. В выражении (setq oldlist (assocc 40 ent)), содержащемся в десятой строке программы, используется функция assocc, которая выделяет значение и присваивает его переменной oldlist. Для проверки значения этой переменной используется следующая команда:
Command: !oldlist (40 . 0.3)
Visual LISP: редактирование базы данных чертежа |
509 |
Эта функция имеет следующий формат:
(entsel [подсказка])
Приглашение является необязательным.
Пример 4
Напишите программу Visual LISP, которая позволит вам изменить высоту всех текстовых объектов, имеющихся на чертеже. Программа должна выводить приглашение, с помощью которого вы сможете ввести новую высоту текста.
Шаг 1: создание блок-схемы
Блок-схема, показанная на рис. 14.1, описывает алгоритм создаваемой программы Visual LISP.
Рис. 14.1. Блок-схема программы для примера 4
Шаг 2: написание программы Visual LISP
Откройте окно Visual LISP, выбрав команду Tools AutoLISP Visual LISP Editor или введя выражение VLIDE в командную строку. Затем откройте текстовый редактор Visual LISP, выбрав команду New File из меню File. В окно редактора введите текст программы, приведенный в следующем абзаце. Номера строк не являются частью программного кода, а используются только для ссылок.
;Эта программа изменяет высоту всех текстовых |
1 |
;объектов, имеющихся на чертеже. |
2 |
; |
3 |
(defun chgtext2 () |
4 |
(setvar "cmdecho" 0) |
5 |
(setq newht (getreal "\n Enter new text height: ")) |
6 |
(setq ss1 (ssget "x" (list (cons 0 "text")))) |
7 |
(setq index 0) |
8 |
(setq num (sslenght ss1)) |
9 |
(repeat num |
10 |
(setq name (ssname) ss1 index)) |
11 |
