Автозагрузка и выполнение процедур AutoLISP

Загрузите процедуры AutoLISP при запуске программы и выполняйте команды или функции во время работы с чертежом.

AutoCAD LT и программы на основе AutoCAD автоматически загружают содержимое трех определяемых пользователем файлов.

Определяемый пользователями файл Windows Mac OS
AutoCAD AutoCAD LT AutoCAD AutoCAD LT
acad.lsp -- --
acaddoc.lsp -- --
acadlt.lsp -- -- --
acadltdoc.lsp -- -- --
Файл MNL с текущим файлом адаптации -- --

По умолчанию загрузка файла acad.lsp или acadlt.lsp производится один раз в начале нового сеанса программы, в то время как загрузка файла acaddoc.lsp или acadltdoc.lsp производится для каждого документа (или чертежа). Это позволяет связать загрузку файла acad.lsp или acadlt.lsp с запуском приложения, а загрузку файла acaddoc.lsp или acadltdoc.lsp — с открытием документа (или чертежа). Описанный способ загрузки можно изменить, модифицировав значение системной переменной ACADLSPASDOC.

Если в одном из этих файлов определена специальная функция S::STARTUP, она автоматически исполняется сразу же после инициализации чертежа. Кроме того, перечень приложений для автоматической загрузки можно выбрать с помощью параметра ЗАГПРИЛ. В последнем случае редактирование файлов не требуется.

Файлы автозагрузки acad.lsp или acadlt.lsp и acaddoc.lsp или acadltdoc.lsp не поставляются с программными продуктами. При необходимости пользователь должен создать их самостоятельно.

Прим.: Начиная с программ на базе AutoCAD 2014, пользовательские приложения должны работать в безопасном режиме; в этом случае системной переменной SECURELOAD задано значение 1 или 2. При работе в режиме безопасности программа на основе AutoCAD ограничивается загрузкой и выполнением файлов, содержащих код из доверенных местоположений; доверенные местоположения определяются системной переменной TRUSTEDPATHS.

Автозагрузчик команд

При загрузке файла AutoLISP определения команд в файле занимают некоторый объем памяти, даже если команды не используются. Функция autoload языка AutoLISP позволяет сделать команду доступной без загрузки ее кода в память. Добавление следующих выражений в файл acaddoc.lsp или acadltdoc.lsp вызывает автоматическую загрузку команд КОМАНДА1, КОМАНДА2 и КОМАНДА3 из файла cmds.lsp и команды НОВАЯКОМ из файла newcmd.lsp.

(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) 
(autoload "NEWCMD" '("NEWCMD"))

При первом вводе в командной строке имени автоматически загруженной команды AutoLISP загружает полное определение этой команды из соответствующего файла. В AutoLISP также имеется функция autoarxload для приложений ObjectARX.

Прим.: Если существует несколько файлов автозагрузки AutoLISP с одинаковыми именами, загружается тот из них, который имеет наиболее поздний штемпель даты и времени. То же самое происходит при загрузке файлов с расширениями LSP, если не указано полное имя файла (с расширением).

Файл ACAD.LSP или ACADLT.LSP

Пользователь может создать файл acad.lsp или acadlt.lsp для регулярного использования программ AutoLISP. При запуске AutoCAD производится поиск вспомогательного файла acad.lsp или acadlt.lsp. Если файл acad.lsp или acadlt.lsp найден, он загружается в память.

Файлы acad.lsp и acadlt.lsp предназначены для автозагрузки специальных приложений. Поэтому все переменные и функции, определенные в файлах acad.lsp и acadlt.lsp, доступны только для самого первого чертежа. Если требуется, чтобы некоторые процедуры были доступны для всех открываемых документов из файла acad.lsp или acadlt.lsp, их следует поместить в файл acaddoc.lsp или acadltdoc.lsp.

Режимом загрузки файлов acad.lsp или acadlt.lsp и acaddoc.lsp или acadlt.lsp можно управлять с помощью системной переменной ACADLSPASDOC. Если для системной переменной ACADLSPASDOC задано значение 0 (значение по умолчанию), файл acad.lsp или acadlt.lsp загружается только один раз: при запуске приложения. Если задано значение 1, файл acad.lsp или acadlt.lsp загружается при создании нового чертежа или открытии существующего файла чертежа.

В файле acad.lsp или acadlt.lsp может размещаться код AutoLISP одной или нескольких программ или только последовательность вызовов функции load. Последний способ более предпочтителен, так как при этом упрощается возможная модификация перечня загружаемых процедур и приложений. Если следующий код сохранить как файл acad.lsp или acadlt.lsp, файлы mysessionapp1.lsp, databasesynch.lsp и drawingmanager.lsp будут загружаться при каждом запуске программы.

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
Прим.: Не изменяйте зарезервированные файлы acad<версия>.lsp или acadlt<версия>.lsp. В программе Autodesk имеется файл acad<версия>.lsp или acadlt<версия>.lsp, который содержит функции на языке AutoLISP, описанные специально для этой версии. Этот файл загружается в память непосредственно перед загрузкой файла acad.lsp или acadlt.lsp. Параметр <версия> обозначает версию программы. Например, acad2026.lsp является файлом, загруженным программой на базе AutoCAD и AutoCAD 2026, а acadlt2026.lsp — на базе AutoCAD LT 2026.

Файл ACADDOC.LSP или ACADLTDOC.LSP

Файл acaddoc.lsp или acadltdoc.lsp предназначен для выполнения инициализации каждого документа (чертежа). Этот файл удобно использовать для автоматической загрузки библиотек AutoLISP-процедур при создании нового чертежа или открытии имеющегося.

Каждый раз при открытии чертежа программа AutoCAD производит поиск файла acaddoc.lsp или acadltdoc.lsp по библиотечному пути. При обнаружении такого файла производится его загрузка в память. Файл acaddoc.lsp или acadltdoc.lsp всегда загружается вместе с каждым чертежом независимо от значения ACADLSPASDOC.

В большинстве случаев пользователю достаточно иметь один файл acaddoc.lsp или acadltdoc.lsp для всех программ AutoLISP, работающих непосредственно с документами. Программа выполняет поиск файла acaddoc.lsp или acadltdoc.lsp в порядке, заданном в стандартных библиотечных путях. Поэтому при работе с различными типами чертежей в каждой папке с чертежами можно хранить свой файл acaddoc.lsp или acadltdoc.lsp для загрузки требуемого набора программ AutoLISP.

В файле acaddoc.lsp или acadltdoc.lsp может храниться код для одной или нескольких программ или серии запросов функции load. Последний способ более предпочтителен, так как при этом упрощается возможная модификация перечня загружаемых процедур и приложений. Если приведенный ниже код сохранить как файл acaddoc.lsp или acadltdoc.lsp, файлы mydocumentapp1.lsp, build.lsp и counter.lsp будут загружаться каждый раз при открытии нового документа.

(load "mydocumentapp1")
(load "build")
(load "counter")
Прим.: Не изменяйте зарезервированные файлы acad<версия>doc.lsp или acadlt<версия>doc.lsp. В программе Autodesk имеется файл acad<версия>doc.lsp или acadlt<версия>doc.lsp, который содержит функции на языке AutoLISP, описанные специально для этой версии. Этот файл загружается в память непосредственно перед загрузкой файла acaddoc.lsp или acadltdoc.lsp. Параметр <версия> обозначает версию программы. Например, acad2026doc.lsp является файлом, загруженным программой на базе AutoCAD и AutoCAD 2026, а acadlt2026doc.lsp — на базе AutoCAD LT 2026.

Адаптация файлов MNL и меню AutoLISP

Во время загрузки файла адаптации (CUI/CUIx) программа выполняет поиск файла MNL с таким же именем. При обнаружении нужного файла производится его загрузка в память. Данный механизм позволяет обеспечить загрузку функций AutoLISP, необходимых для работы элементов пользовательского интерфейса.

Прим.: AutoCAD LT не поддерживает автоматическую загрузку файлов MNL, однако эти файлы можно загрузить с помощью функции AutoLISP LOAD из другого файла LISP.

Например, если программа загружает файл адаптации custom.cuix, выполняется поиск файла custom.mnl, который может содержать определения различных функций AutoLISP, вызываемых элементами пользовательского интерфейса в файле адаптации. Файл MNL загружается после файла acaddoc.lsp.

Прим.: Если файл адаптации загружается с помощью функции AutoLISP command, которая имеет формат (command "меню" "новое меню"), то соответствующий файл MNL загружается только после запуска всей программы AutoLISP.
(command "menu" "newmenu")

(princ "Newmenu utilities… Loaded.")
(Princ)

В данном примере для выдачи сообщения использована функция princ. При первом обращении к функции princ в командной строке отображается следующий текст:

Утилиты «новое меню»… Загружены.

Второй вызов princ используется для завершения функции AutoLISP. Без второго вызова princ сообщение в командной строке появится дважды. Как уже упоминалось ранее, можно использовать аргумент при_ошибке при вызове функции load для повышения надежности процедур.

Функция S::STARTUP: выполнение после завершения инициализации чертежа

Для выполнения операций по настройке после инициализации чертежа можно написать функцию S::STARTUP.

Файлы LISP (acad.lsp или acadlt.lsp, acaddoc.lsp или acadltdoc.lsp) размещаются в памяти вместе со всеми автоматически загружаемыми MNL-файлами до завершения полной инициализации чертежа. Обычно это не создает проблем, за исключением тех случаев, когда используется функция command; надежная работоспособность данной функции возможна только после завершения инициализации чертежа.

Прим.: AutoCAD LT не поддерживает автоматическую загрузку файлов MNL, однако эти файлы можно загрузить с помощью функции AutoLISP LOAD из другого файла LISP.

Если функция S::STARTUP, определенная пользователем, содержится в файлах acad.lsp или acadlt.lsp, acaddoc.lsp или acadltdoc.lsp или MNL, то она выполняется при каждом создании нового чертежа или открытии имеющегося. Таким образом, для выполнения операций по настройке можно создать функцию S::STARTUP и поместить ее в автоматически загружаемый файл AutoLISP.

Пусть, например, требуется переопределить стандартную команду ШТРИХ таким образом, чтобы при вводе ее имени вызывалась команда КШТРИХ и выдавалось соответствующее сообщение. Для этого в файл acaddoc.lsp или acadltdoc.lsp нужно добавить следующий код:

(defun C:HATCH ( ) 
  (alert "Using the BHATCH command!")
  (princ "\nEnter OLDHATCH to get to real HATCH command.\n")
  (command "BHATCH")
  (princ)
) 
(defun C:OLDHATCH ( ) 
  (command ".HATCH")
  (princ)
) 
(defun-q S::STARTUP ( ) 
  (command "undefine" "hatch") 
  (princ "\nRedefined HATCH to BHATCH!\n")
)

Перед завершением инициализации чертежа с помощью функции defun задаются новые описания команд ШТРИХ и ВСТРШТРИХ. После завершения инициализации чертежа вызывается функция S::STARTUP, которая отключает стандартное описание команды ШТРИХ.

Прим.: Для того чтобы функция S::STARTUP не переопределяла функции с таким же именем из других файлов, ее следует определить с помощью функции defun-q, а не defun.

Так как функция с именем S::STARTUP может быть определена в различных файлах (acad.lsp или acadlt.lsp, acaddoc.lsp или acadltdoc.lsp, файлах MNL или любых других файлах AutoLISP), то определенную ранее функцию S::STARTUP можно переопределить.

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

(defun-q MYSTARTUP ( )

... автоматически выполняемая функция ...

)
(setq S::STARTUP (append S::STARTUP MYSTARTUP))

В результате такого определения код предыдущей загруженной функции S::STARTUP добавляется к коду новой функции S::STARTUP. Этот способ определения можно использовать независимо от ранее существовавшей функции S::STARTUP.