Новые возможности LISP в nanoCAD 8.5

    Поддержка LISP в nanoCAD появилась давно и связывалась в первую очередь со специальной командой LSP, которая открывает LISP-консоль, предназначенную для ввода выражений и анализа переменных:


    Рис. 1. Окно LISP-консоли

    Релиз 8.5 сделал следующий важный шаг вперед, теперь ввод выражений LISP стал возможен в командной строке, кроме того, появилась поддержка символа PAUSE. Описываемые в статье изменения вошли в релиз 8.5, начиная с номера 8.5.4131.2629, сборка 4133.

    LISP-выражение вместо команды


    Ввод LISP-выражений в ответ на подсказку Команда: возможен, когда нет других запросов. Например:
    (min k1 k2),
    где k1 и k2 – некоторые глобальные переменные (рис. 2):


    Рис. 2. LISP-выражение в командной строке

    После нажатия клавиши Enter система вернет в командную строку результат. Возможно выполнение команд и задание их параметров с помощью LISP-функции command — например, для команды RECTANGLE (рис. 3):


    Рис. 3. Пример LISP-выражения, выполняющего команду RECTANGLE

    Результат выполнения увидим на экране:


    Рис. 4. Результат выполнения команды RECTANGLE

    LISP-символ PAUSE в качестве паузы для пользовательского ввода


    В версии 8.5 реализовано использование LISP-символа PAUSE, который означает прерывание работы команды с целью запроса пользовательского ввода. Предположим, радиус известен заранее, а точку центра окружности необходимо запросить. Тогда воспользуемся выражением:
    (command “_.CIRCLE” PAUSE (sqrt 2894.73))
    Результат обработки видим на рис. 5:


    Рис. 5. Прерывание команды CIRCLE с помощью PAUSE

    Команда CIRCLE стартовала, прервалась на запрос центра окружности и после указания точки центра завершила выполнение, использовав результат вычисления выражения (sqrt 2894.73) в качестве значения радиуса.
    Возможно неоднократное использование PAUSE в одном LISP-выражении, например:
    (command “_.CIRCLE” PAUSE PAUSE)

    Доступ к значениям LISP-символов


    Для отладки часто требуется проверка текущих значений LISP-символов. По опыту работы с другими CAD-системами нам известен способ получения текущего значения глобальной LISP-переменной – восклицательный знак, например:
    !myvar

    В версии 8.5 такой возможности нет, но есть заменяющая ее функция eval. Следующее выражение выдаст значение переменной myvar:
    (eval myvar)

    Примечание. (eval PAUSE) в nanoCAD возвратит nil.
    Функция eval ведет себя по-разному с данными разных типов, поэтому для переменных, хранящих списковые значения, придется добавлять функцию quote, например:
    (setq lista1 (list 1 (list 2 99)))
    (eval lista1) возвращает ошибку
    (eval (quote lista1)) возвращает (1 (2 99))

    Николай Полещук
    • +19
    • 2,1k
    • 4
    Нанософт
    81,00
    Компания
    Поделиться публикацией

    Комментарии 4

      0

      В примере про Окружность, как следует интерпретировать последнюю строку подсказки?

        0
        На рисунке 5 в последней строке отображен результат вычисления Нанокадом выражения
        (sqrt 2894.73), которое подхвачено в качестве значения радиуса.
        После этого еще будет одна строка с nil (значение, возвращаемое функцией command).
          0

          Я всё равно не очень понимаю.Там указан "Радиус окружности <55.8000> или [Диаметр]: 53,8026951"


          Если с Диаметром всё понятно — вычислен корень, то вот что это за Радиус я не понимаю.

            +1
            Это запрос команды Окружность. Она даёт в указанном виде два запроса: координата центра и радиус. На первый запрос символом PAUSE лисп передаёт управление человеку (который указывает точку), а затем на второй запрос подставляет число — результат выражения (sqrt 2894.73).
            Именно радиус. Подсказка — стандартная.
            Радиус окружности — то, что хочет команда в данный момент;
            <55.8000> — значение по умолчанию — если ничего не ввести (нажать пробел или Enter), то будет принято значение 55.8000. Видимо, оно было использовано при предыдущем вызове команды.
            или [Диаметр] — альтернатива для запроса. Можно переключить запрашиваемую информацию. В данном случае, если ткнуть в подсказку Диаметр или набрать Диаметр или Д, то команда переформулирует запрос и будет хотеть диаметр, а не радиус. Если заметили, то в первом запросе
            Центр окружности или [3Т/2Т/Ккр]:
            указаны три альтернативы вводимых данных: Если не хотите указывать центр окружности, то можно её построить по трём точкам, выбрав вариант , по двум точкам, выбрав вариант , или по двум касательным и радиусу (Ккр).
            53,8026951 — это и есть результат вычисления корня (sqrt 2894.73) — оно будет принято в качестве нового радиуса.
            Пробуйте вручную запустить команду, изучите работу командной строки и её запросов.

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

        Самое читаемое