Як використовувати Лісп, опублікований на форумі, контент-платформа

Володимир Азарко aka VVA

Ви знайшли корисний для себе код на Ліспі і хочете його використовувати. Можна виділити 3 етапи:

    збереження програмного коду на своєму комп'ютері завантаження файлу під час запуску програми

Примітка: AutoLISP програми можуть бути запущені тільки на повній версії Автокад, вони не працюють під AutoCAD LT. (Крім випадків завантаження додаткових додатків типу LT Extender і йому подібних, які спеціально розроблені для запуску lisp і (або) arx додатків в середовищі AutoCAD LT.)

Збереження програмного коду на своєму комп'ютері

За допомогою курсору виділяємо цей код і копіюємо його в буфер обміну, натиснувши праву кнопку миші і вибравши пункт Копіювати (або Ctrl + C).
Запускаємо "Блокнот" і вставляємо наш код за допомогою меню Правка >> Вставити (або Ctrl + V):

(Defun C: OFF2 (/ d obj ent adoc * error * undo lays Flag)

(Defun * error * (msg) (vla-EndUndoMark adoc))

(Vl-load-com) (setq adoc (vla-get-activedocument (vlax-get-acad-object))

lays (vla-get-layers adoc)) (vla-StartUndoMark adoc) (setvar "CMDECHO" 0)

(If (null * OFF2 *) (setq * OFF2 * (abs (getvar "OFFSETDIST"))))

(If (zerop * OFF2 *) (setq * OFF2 * 1)) (setq d (getvar "UNDOCTL"))

(Cond ((= d 0) (vl-cmdf "_.UNDO" "_All"))

((= D 3) (vl-cmdf "_.UNDO" "_Control" "_All"))

(T nil)); _ end of cond

(Princ "\ n Величина зміщення <")(princ *OFF2*)(princ ">: ")

(Initget 6) (if (null (setq d (getdist))) (setq d * OFF2 *))

(Setq * OFF2 * d undo 0 Flag t)

(Initget "Undo Скасуй Г J Exit Вихід У D _Undo Undo Undo Undo Exit Exit Exit Exit")

(Setq obj (entsel (strcat "\ n Виберіть об'єкт ["

(If (not (zerop undo)) "Відміни /" "")

"Вихід] <выход>: ")))

(Cond ((= obj "Undo") (if (not (zerop undo)) (progn

(Vl-cmdf "_UNDO" "_B") (setq undo (1 undo))) (alert "Нічого більше скасовувати")))

((= Obj "Exit") (setq Flag nil))

((Null obj) (if (= (getvar "ERRNO") 52) (setq Flag nil) (princ "*** Мимо ***")))

(T (setq ent (vlax-ename-> vla-object (car obj)))

(Cond ((= (vla-get-lock (vla-item lays (vla-get-layer ent))): vlax-true)

(Alert "На блокованому шарі!"))

((Vlax-method-applicable-p ent 'Offset) (vl-cmdf "_UNDO" "_M") (setq undo (1+ undo))

(Vla-offset ent d) (vla-offset ent (- 0 d)))

(T (alert "Неможливо створити об'єкт, подібний даному")))))

(Initget "Undo Скасуй Г J Exit Вихід У D _Undo Undo Undo Undo Exit Exit Exit Exit"))

(Princ "\ nНаберіте в командному рядку OFF2"))


Після того як вставили код в записник, ми повинні мати щось на зразок цього:


Як використовувати Лісп, опублікований на форумі, контент-платформа

Завантаження lisp файлу

Далі, запускаємо Автокад і вибираємо Сервіс >> АвтоЛІСПа >> Завантажити (Tools >> AutoLISP >> Load) або набираємо в командному рядку _appload.
Ми повинні побачити діалогове вікно як представлено нижче:

Як використовувати Лісп, опублікований на форумі, контент-платформа

Використовуйте наступну послідовність, щоб завантажити off2.lsp:

1. Перейдіть до папки, куди Ви зберегли lisp файл.

2. Виберіть файл, який Ви хочете завантажити зі списку.

3. Натисніть кнопку Завантажити.
(Якщо все пройшло вдало, Ви повинні побачити напис "off2.lsp успішно завантажено")

4. Натисніть кнопку Закрити для завершення команди.

Команда або функція?


Для початку необхідно визначитися, що у нас: команда або функція?
Трохи теорії.
В описі практично будь-якого коду є такий рядок, як


і потім після неї чогось там написано. Так ось те, що там написано і є ім'я функції.
Якщо першими символами є C :. то функція готова до виклику з командного рядка. Якщо такого немає, то викликати функцію треба, укладаючи її ім'я в круглі дужки.
Наприклад, є функція

(Defun c: test ()<Что-то делаем 1>)


Її викликати (за умови, що вона довантажуючи) з командного рядка можна безпосередньо:

І будуть виконані дії <Что-то делаем 1>
А ось таку:

(Defun test ()<Чего-то делаем 2>)


Тепер ваш lisp повинен працювати без помилок.

Що таке це (vl-load-com)?

Ця функція завантажує велику кількість функцій, що входять в розширення AutoLisp, що дозволяє працювати з об'єктами, властивостями, методами і подіями ActiveX. Ознакою необхідності завантаження розширення AutoLisp є наявність в тексті Вашої програми функцій, що починаються з префіксів vla- (наприклад vla- get-activedocument), vlax- (наприклад vlax- get-acad-object), vl- (наприклад vl- catch-all- apply) і vlr- (наприклад vlr- pers).
У будь-якому випадку ніколи не завадить додати (vl-load-com) в початок файлу, щоб уникнути подібних помилок.

Організація бібліотеки Лісп файлів.

Що робити, якщо набралася достатня кількість файлів? Кожен раз набирати _appload для завантаження того чи іншого додатка? Найбільш ефективним буде організація своєї бібліотеки. Для початку домовимося, що всі наші файли будемо складати в одну папку. Наприклад, D: \ MyLisp. Пропишемо цю папку в шляхах доступу Автокада. Для цього вибираємо Сервіс >> Налаштування (Tools >> Options) або набираємо в командному рядку _options. Переходимо на закладку Файли (Files) і розкриваємо список Шлях доступу до допоміжних файлів (Support File Search Path).
Ми повинні побачити діалогове вікно, як наведено нижче:

Як використовувати Лісп, опублікований на форумі, контент-платформа

Використовуйте наступну послідовність, щоб прописати папку в шляхах доступу:

1. Натисніть кнопку Додати.

2. Натисніть кнопку Огляд і виберіть цільову папку (в нашому випадку, D: \ MyLisp)

3. Шлях до папки повинен з'явитися в діалоговому вікні.

4. Натисніть кнопку OK для завершення команди.

^ C ^ C (if (null C:<команда>) (Load "<файл>"));<команда>;

^ C ^ C (if (null C: OFF2) (load "off2")); OFF2;

Якщо є необхідність завантажувати свої lsp файли при відкритті креслення, то потрібно додати необхідні файли в список автозаргузкі.
Запускаємо Автокад і вибираємо Сервіс >> АвтоЛІСПа >> Завантажити (Tools >> AutoLISP >> Load) або набираємо в командному рядку _appload.
У діалоговому вікні тиснемо на кнопку Додатки поруч з зображення портфеля

Як використовувати Лісп, опублікований на форумі, контент-платформа

У наступному діалоговому вікні тиснемо на кнопку Додати і вказуємо на необхідні файли.

Як використовувати Лісп, опублікований на форумі, контент-платформа

Вони повинні з'явитися в списку додатків.
Тепер перераховані файли будуть завантажуватися щоразу при відкритті малюнка.
Важливо розуміти, що (принаймні в повній версії AutoCAD) завантаження додатків, поміщених в автозавантаження (Startup Suite), як правило, виконується в усі профілі і сесії AutoCAD'a.
Крім того, є ще один момент. Якщо існує 2 або більше файлів, в яких описані функції з однаковими іменами, виконуватися буде та, яка завантажилася останньої. Оскільки передбачити, в якій послідовності буде виконуватися завантаження додатків, неможливо, подібних ситуацій слід уникати.