Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г

.pdf
Скачиваний:
182
Добавлен:
09.04.2015
Размер:
9.06 Mб
Скачать

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))

502

Глава 14

Шаг 2: загрузка и запуск программы Visual LISP

Выберите команду Save или Save As из меню File и сохраните файл программы под именем deltext.lsp. Чтобы загрузить созданную программу, выберите команду Load Text in Editor из меню Tools или щелкните на кнопке Load active edit window, которая находится на панели инструментов Tools. В окне консоли Visual LISP появится сообщение об успешной загрузке данной программы. Если в программе будут обнаружены какиелибо ошибки, на экране появится соответствующее сообщение. Чтобы запустить программу, введите имя функции (deltext) в строку приглашения консоли после знака _$ и нажмите клавишу <Enter>. Не забывайте, что имя функции необходимо указывать в круглых скобках. Выполнив описанные действия, перейдите в программу AutoCAD, выбрав команду Activate AutoCAD из меню Window. Вы увидите, что все текстовые объекты, расположенные на заданном слое чертежа, удалены.

Функция sslength

Функция sslength определяет количество объектов, которые содержатся в массиве выбранных элементов, и возвращает целое число, соответствующее количеству найденных объектов. Функция sslength имеет следующий формат:

(sslength набор_выбора)

где

набор_выбора — массив выбранных элементов.

Примеры

(setq

ss1

(ssget))

ss1))

Возвращает целое число, соответствующее количеству

(setq

num

(sslength

объектов, содержащихся в заданном массиве ss1

(setq

ss2

(ssget "1"))

Возвращает число объектов (1), содержащихся в мас-

(setq

num

(sslength

ss2))

сиве выбранных элементов ss2. Массив ss2 определен

 

 

 

 

как последний объект данного чертежа

Функция ssname

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

(ssname набор_выбора индекс)

где

набор_выбора — заданный массив выделенных элементов;

индекс — номер объекта, содержащегося в заданном массиве выделенных элементов.

Пример

(setq ss1 (ssget)) (setq index 0)

(setq entname (ssname ss1 index))

Возвращает имя первого объекта, содержащегося в массиве выделенных элементов ss1

Примечание

Если индекс равен 0, функция ssname возвращает имя первого объекта, содержащегося в массиве выделенных элементов. Если индекс равен 1, функция возвращает имя второго объекта, и т.д.

Visual LISP: редактирование базы данных чертежа

503

Функция ssadd

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

(ssadd имя_объекта набор_выбора)

Когда функция ssadd используется без аргументов, создается новый массив, не содержащий ни одного члена. При использовании имен записи (параметров имя_объекта) создается массив, состоящий из одного члена.

Пример

(setq all(ssget)) Selection objects: All Selection set = 30

В этом примере создается массив с именем All, содержащий ряд определенных объектов, например, две окружности.

Теперь мы попробуем ввести в массив выбранных объектов еще одну окружность.

(setq b(entsel))

Select objects: Выберите окружность, используя один из существующих методов выбора объектов.

(<entity name: 1ffo5a0> (10.977 4.99 0)) (setq c(car b))

entity name: 1ffo5a0 (setq d(ssadd c all)) (command "erase" all "")

В существующий массив будет добавлена еще одна окружность.

Функция ssdel

Функция ssdel дает возможность пользователю удалить объект или запись из массива выбранных объектов. Она работает примерно так же, как функция ssadd. Функция ssdel имеет следующий формат:

(ssdel имя_объекта набор_выбора)

Пример

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

(setq all(ssget)) Select objects: All (setq b(entsel))

Select objects: Выберите окружность, которую вы хотите удалить, используя один из методов выделения объектов.

(<entity name: 1ffo5a0> (2.455 5.99 0)) (setq c(car b))

entity name: 1ffo5a0 (setq d(ssdel c all)) selection set = 36 (command "erase" all "")

При выполнении этой команды будут стерты только две окружности, так как одна окружность была удалена из текущего набора.

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)

508 Глава 14

Шаг 5

Элемент (40 . 0.3) содержит код (40), назначенный текстовым объектам, и числовое значение, определяющее высоту текста (0.3). Чтобы изменить высоту текста, необходимо заменить значение (0.3) каким-нибудь другим значением. Для решения этой задачи формируется новый список, который затем назначается переменной conlist. Процесс формирования и присвоения списка описывается в строке 11 (setq conlist (cons (car oldlist) newht)). Например, если значение, присвоенное переменной newht, равно 0.5, новый элемент будет иметь вид (40 . 0.5). Для проверки значения переменной conlist используется следующая команда:

Command: !conlist (40 . 0.5)

Шаг 6

Завершив формирование нового элемента, введите его в исходный список ent, используя для этого функцию subst. Эта операция осуществляется при выполнении строки 12 (setq newlisst (subst conlist oldlist ent)). Для проверки значения переменной newlist используется следующая команда:

Command: !newlist

((-1.< Object name: 60000018> (0 . "TEXT") (8 . "0") (10 4.912227 5.36301 0.0) (40 . 0.5) (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))

Шаг 7

Последний этап — обновление базы данных чертежа. Для выполнения этой операции используется функция entmod, показанная в строке 13 (entmod newlist) этой программы.

Функции, используемые для извлечения данных

Функция entnext

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

(entnext <имя объекта>)

Функция entlast

Функция entlast возвращает имя последнего неудаленного объекта, извлекая его из базы данных. Эта функция имеет следующий формат:

entlast

Функция entsel

Функция entsel дает возможность пользователю выбрать один из объектов базы данных.

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

510

Глава 14

 

 

(setq ent (entget name))

12

 

(setq oldlist (assocc 40 ent))

13

 

(setq conlist (cons (car oldlist) newht))

14

 

(setq newlist (subst conlist oldlist ent))

15

 

(entmod newlist)

16

 

(setq index (1 + index))

17

 

)

18

 

(setvar "cmdecho" 1)

19

)

(princ)

20

 

21

Пояснения

Строка 7

(setq ss1 (ssget "x" (list (cons 0 "text"))))

Функция ssget "X" выбирает текстовые объекты из базы данных чертежа. Затем функция setq присваивает набор выбранных объектов переменной ss1.

Строка 8

(setq index 0)

Функция setq присваивает переменной index значение 0. Впоследствии эта переменная используется для выбора различных объектов.

Строка 9

(setq num (sslenght ss1))

Функция sslenght определяет количество объектов, содержащихся в наборе ss1. Затем функция setq присваивает полученное значение переменной num.

Строка 10

(repeat num

Функция repeat повторит процедуру, определенную в этой функции, num раз.

Шаг 2: загрузка и запуск программы Visual LISP

Выберите команду Save или Save As из меню File и сохраните файл программы под именем chgtext2.lsp. Чтобы загрузить созданную программу, выберите команду Load Text in Editor из меню Tools или щелкните на кнопке Load active edit window, которая находится на панели инструментов Tools. Для того чтобы запустить программу, введите имя функции (chgtext2) в строку приглашения консоли после знака _$ и нажмите клавишу <Enter>. Не забывайте, что имя функции необходимо указывать в круглых скобках. Выполнив эти действия, вы автоматически перейдете в окно графического редактора, а в командной строке появится приглашение на ввод высоты текста. После того как вы введете высоту текста и нажмете клавишу <Enter>, высота всех текстовых объектов изменится.

Пример 5

Напишите программу Visual LISP, с помощью которой вы сможете изменить высоту текста выделенных текстовых объектов, находящихся на чертеже.

Соседние файлы в папке Книги_AutoCad_2