Выполнение команды при открытии файла

Здравствуйте. Вопрос к разработчикам.

Имеется лисп с командой.

Требуется выполнять команду при открытии DWG файла (не просто загружать лисп, а выполнять загруженную команду).

Как возможно это реализовать?

Насколько я понимаю, штатных возможностей для этого нет.

Во вложении лисп. Команда "проверить_элементы_вариации". Лисп проверяет наличие элементов вариации, если находит выводит соответствующее сообщение.

Тэги темы:

Лучший ответ

  • EdwardSt
    отредактировано December 2024 Ответ ✓

    Если команду нужно запустить во время загрузки, то в конце загружаемого файла нужно вставить строку с вызовом функции.

    В вашем случае предложил бы саму основную функции оформить некомандной (без c:). Например , как то так

    По поводу NRX не подскажу. Но предполагаю, что там тоже можно установить обработчик события создания документа. И это будет аналог той самой автозагрузки (с единственным вызовом функции check_vary из примера) при каждом документе, который можно на лиспе реализовать с помощью реакторов.

    UPD.Кстати, функция check_vary прямо может быть указано в обработчике события реактора менеджера документов :vlr-documentBecameCurrent. При каждой активации чертежа будет вызываться алерт

Ответы

  • В нанокаде нет штатной возможности загрузки лиспа с каждым файлом. Только при загрузке приложения.

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

  • Кожевников_Юра
    отредактировано December 2024

    Лисп не надо загружать при открытии каждого файла (загружается автоматически при загрузке Нанокада через appload). Нужно выполнять команду из этого лиспа при открытии каждого файла.

    Как полумера, устроит выполнение только при открытии первого файла (вместе с загрузкой приложения). Или во время работы запускался бы через интервал времени. Или при закрытии файла.

    Если лисп переписать в NRX приложение, это поможет?

  • Для первого открытого файла это работает.
    Спасибо!

  • А можно подробнее?
    Где/как указать в обработчике события реактора менеджера документов :vlr-documentBecameCurrent свою функцию? Или где почитать об этом?

  • В справке АС был целый тематический цикл, посвященный реакторам. Тема довольно сложная. Особенно из-за того, в нанокаде (как оказалось) не все команды реакторов работают корректно. Приходится выявлять методом тыка работающие, работающие при определенных условиях, работающие всегда неправильно и не работатющие вовсе инструменты.

    Гдето на форуме выкладывал реактор, в котором в заголовок нанокада выводится полное наименование текущего чертежа. Там как раз реактор на активацию документа. Вот именно в ту функцию, которая выводит заголовок, и нужно вставить ваши изыскания. Сейчас этого лиспа под рукой нет. Поищите по сайту или телеге что-то типа "автозапуск". Или коллеги с сайта помогут- дадут наводку.

    Но еще раз повторюсь: тема с реакторами очень скользкая и неоднозначная. Простым копипастом не обойтись

  • этот?

    если ты будешь подписывать свой код как @kpblc то мне будет немножечко легче вести летопись КЛАССИКОВ

  • да, этот)

    Я подумаю насчет @подписи

  • Кожевников_Юра
    отредактировано December 2024

    Адаптировал. Почти получилось:

    ;Автоматическая проверка элементов вариации
    ;при переключении вкладки чертежа

    (vl-load-com)

    ;Тело реактора
    (defun check_vary2 (reactor-object parameter-list / vdict dict)
    (setq vdict (vla-GetExtensionDictionary
    (vla-get-modelspace
    (vla-get-ActiveDocument
    (vlax-get-acad-object)))))
    (setq dict (vlax-vla-object->ename vdict))
    (if (dictsearch dict "ACAD_ENHANCEDBLOCK")
    (progn
    (alert "Файл содержит элементы вариации!")
    ))
    (prin1)
    )

    ;натравливаем ректор на событие
    (if (not CaptionReactor)
    (setq CaptionReactor (vlr-docmanager-reactor nil
    '(
    (:vlr-documentBecameCurrent . check_vary2)
    )
    )))
    (prin1)

    1. Но после второго вывода сообщения "Файл содержит элементы вариации!" появляется диалог расположения окон, который появляться не должен:
      Видимо что-то нужно очищать или сбрасывать после выполнения функции check_vary2.
    2. Первый открытый файл не проверяется реактором. Проверяется другим, выше указанным кодом. То есть нужно иметь два разных лиспа.
      Можно ли их объединить, добавив какой-либо реактор открытия первого файла-чертежа?

    Помогите, пожалуйста, доработать.

  • EdwardSt
    отредактировано December 2024

    1. С таким поведением тоже сталкивался. Не помню, как это победил. Возможно, достаточно перегрузить приложение. Это могут быть следы от экспериментов. Очистка следов реактора - наиболее муторная и неоднозначная часть. Еще есть подозрение на функцию (alert. Попробуйте ее заменить на обычный (print. Может, этого будет достаточно?
    2. В принципе, достаточно в файле предпоследней строке поставить принудительный вызов (check_vary2 nil nil). Хотя, это коряво и может запутать в дальнейшем. Только в обработчике (внутри самой функции) желательно проверить первый параметр на nil. Это будет маячком, запущена функция реактором или юзером. Как это использовать - на ваше усмотрение. Например: запущена юзером - выдавать alert, запущена реактором - печатать в командную строку (print …). Второй параметр - это активируемый документ. Вообще-то, оно должно быть равно ActiveDocument. Но реакторы они такие реакторы! Я бы проверил на разных сочетаниях. Возможно, правильнее использовать именно параметр функции, а не свойство ActiveDocument. Ну и еще отмечу, что в примере выше вроде такого эффекта не наблюдается. Я специально тестировал при разных ситуациях (запуск приложения, закрытие всех документов, переключение) - вроде отрабатывалось во всех случаях