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

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

Программы на основе AutoCAD автоматически загружают содержимое трех определяемых пользователем файлов, acad.lsp, acaddoc.lsp и файла MNL, связанных с текущим файлом адаптации.

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

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

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

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

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

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

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

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

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

Файл ACAD.LSP

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

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

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

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

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

Файл ACADDOC.LSP

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

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

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

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

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

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

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

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

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

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

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

Утилиты "новое меню"… загружены.

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

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

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

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

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

Пусть, например, требуется переопределить стандартную команду ШТРИХ таким образом, чтобы при вводе ее имени вызывалась команда КШТРИХ и выдавалось соответствующее сообщение. Для этого в файл acaddoc.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, acaddoc.lsp, файлах MNL или любых других файлах AutoLISP), то определенную ранее функцию S::STARTUP можно переопределить.

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

(defun-q MYSTARTUP ( )

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

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

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