NanoCAD: проблема с назначением на кнопку КОМАНДЫ
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > NanoCAD: проблема с назначением на кнопку КОМАНДЫ

NanoCAD: проблема с назначением на кнопку КОМАНДЫ

Ответ
Поиск в этой теме
Непрочитано 15.03.2024, 12:18 #1
NanoCAD: проблема с назначением на кнопку КОМАНДЫ
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 616

Всем привет!

Опять же в Автокаде всё прекрасно работало, а в наноКАДе не получается.

Назначаю на кнопку панели инструментов КОМАНДУ (т.е. не функцию)

^C^C^P(load"c:/путь/имя.lsp")(princ) ^PD_ABC

где D_ABC оформлена, как команда, т.е. (defun C: D_ABC ... и так далее ...)

***После С: "пробел" стоит специально, иначе в данном сообщении "рожа" рисуется, типа

Подгрузка каждый раз при нажатии на кнопку - для отладки.

Т.е. нажал кнопку, посмотрел, как работает, поправил файл, снова нажал кнопку...
Или чтобы код большой в памяти всё время не держать - неважно.

В Автокаде всё чудесно работает, а вот в наноКАДе эта же самая конструкция
при первом вызове выдаст:



Команда: D_ABC
Неправильный ключ или команда. Введите (') для команды или (?) для математического выражения: D_ABC

Т.е. загрузка отрабатывает (определение команды появляется), а вот её выполнение - нет.

При втором/третьем/четвёртом нажатии на кнопку может сработать ... или не сработать ... или вообще
запустить невесть что ("сохранить рисунок, как растр", "печать" и прочие произвольные команды).
А вот если оформить это дело не командой, а функцией (т.е. без C:xxx ) - то всё стабильно и нормально.

Конечно, дело не в коде. Для теста использовался такой вот примитив:

(defun C: D_ABC ( / p)
(write-line "Начало...")
(setq p (+ 5 5))
(print p)
(write-line "...конец.")
(princ)
)

Где собака порылась, может, что-то в определении *.cfg-файла не то?

Вот реальное определение кнопки для команды:

[\ConfigMan\Commands\ID_SdVerDwg]
cmdtype=i1
weight=i50
Intername=sID_SdVerDwg
LocalName=sID_SdVerDwg
BitmapDll=sD:\DREAMn\sd_vda32.bmp
DispName=sПроверка
StatusText=sКомплексная проверка чертежей
Keyword=s^C^C^P(progn(load"d:\\dreamn\\nd_abc.lsp")(princ)) ^PD_ABC
IsUserCommand=f1

Для функции строка
Keyword=
конечно, будет немного другая, но там вопросов нет.
__________________
Счастливо, Алексей!
Просмотров: 4299
 
Непрочитано 15.03.2024, 12:35
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Я бы попробовал для начала убрать ^P. И заменить пробелы на ";".
Может быть, сработает код типа
Код:
[Выделить все]
^C^C(progn (load "c:\\path\\file.lsp") (c:d_abc))
Offtop: Вообще ставку на макросы уже делать ИМХО не стоит - в последних версиях вроде бы выпилили эту возможность, судя по обсуждениям в телеге.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.03.2024, 12:41
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Код

^C^C(progn (load "c:\\path\\file.lsp") (c:d_abc))

наверняка сработает (не проверял), но вся прелесть определения
именно команды, а не функции состоит в возможности повторно
вызвать её правой кнопкой мыши, а не повторным тычком в кнопку
или пункт меню. А при данной конструкции, ПКМ наверняка вызовет
не эту, а предыдущую команду. :-(

Проверил.

Работает, но ПКМ - как и предполагалось - вызывает предыдущую команду.
Игры с ^P и ; тоже пока результата не дали.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 15.03.2024 в 12:50.
===AAA=== вне форума  
 
Непрочитано 15.03.2024, 13:02
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Ну дык определи команду напрямую в коде, если работает:
Код:
[Выделить все]
^C^C(defun c:restart-d_abc() (load "c:\\path\\file.lsp") (c:d_abc));restart-d_abc;
Как-то так примерно. Не проверял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.03.2024, 14:05
#5
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Эксперименты показали, что проблему вызывает именно связка
(load "файл_с_командой.lsp") вызов_команды

Если делать лоад_функция или повесить на кнопку команду,
определённую ранее, то проблем нет.

Подозреваю, что это связано с неудержимым желанием нанокада
после загрузки файла с определением команд обязательно вывести
на экран имена этих новых команд. И как отключить этот безумный
эхо-вывод я пока не знаю. :-(
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 15.03.2024, 14:20
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Эксперименты показали, что проблему вызывает именно связка
(load "файл_с_командой.lsp") вызов_команды
Ну ты же сам сказал, что progn срабатывает.
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Подозреваю, что это связано с неудержимым желанием нанокада
после загрузки файла с определением команд обязательно вывести
на экран имена этих новых команд.
Вряд ли...
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
И как отключить этот безумный
эхо-вывод я пока не знаю. :-(
Можно попробовать поиграться с nomutt, но какой будет эффект - не представляю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.03.2024, 14:45
#7
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Ну ты же сам сказал, что progn срабатывает.
Наверное, нужно уточнить формулировку.

Вызов (c:d_abc) внутри (progn ...) действительно срабатывает.
Не срабатывает, когда пытаешься вызвать команду, именно,
как команду, т.е. просто D_ABC

nomutt проверял - не помогает

Самое забавное, что поведение такой кнопки (работает / не работает)
нестабильно. Т.е. потыкал - не работает. Делаешь "нарисуй отрезок",
"сотри", ещё какие-нибудь команды, снова тыкаешь в кнопку - работает,
как часики. Потом снова не работает. И это в одном и том же сеансе
с разницей в десятки секунд.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 15.03.2024, 15:39
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Ну лично я под наником а) постарался забыть про лисп и б) при необходимости загружаю приложения руками. Ну и в) иногда все же пробую пользоваться их встроенным скрипторедактором. Ужас, конечно, но за неимением лучшего...
Offtop: Была в октябре мысля разрабам закинуть идею на разработку расширения для VSCode, но я вовремя остановился
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.03.2024, 15:50
#9
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Похоже, нужно будет браться за C# всё-таки... :-(

Visual Studio 2022 позволяет создавать приложения
для nanoCAD или нужна другая её версия?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 15.03.2024, 16:07
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Позволяет. Мало того, под nc23+ она крайне желательна: там прошел переход на NET6, который в 2019 не поддерживается (по крайней мере "из коробки")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.03.2024, 11:35
#11
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Не срабатывает, когда пытаешься вызвать команду, именно,
как команду, т.е. просто D_ABC
если лисп с этой командой загружен, то срабатывать будет и повтор последней команды и на правой кнопке без регистрации будет
просто ты регистрируешь одну команду, а вызывать хочешь другую
и это
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Intername=sID_SdVerDwg
LocalName=sID_SdVerDwg
емнип должны отличаться
--------------------
имха проще лисп команды кинуть в автозагрузку

для оперативной перезагрузки (отладка правка) в этом лиспе добавить команду

Код:
[Выделить все]
 

(defun c:зз ()
  ;; reload, nd_abc.lsp
  (load "nd_abc")
  (prompt "\nПерезагрузил ")
  (princ)
) ;_enddefun
----------------
регистрация команд нужна только если хочешь прицепить к меню или сделать кнопку
а повтор и история будет работать и без регистрации
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 17.03.2024, 07:10
#12
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Про "кинуть в автозагрузку" и сделать "команду 33" - понятно.

Часть КОМАНД у меня и так сидит в автозагрузке,
есть и команды "для быстрой перезагрузки" и прочих "отладочных
действий".

Целых четыре: 21, 22, 66, 99 - все на цифровой клавиатуре,
чтобы Enter был рядом. :-)

И выкрутиться конкретно из этой ситуации можно, но "цепануло"
другое - почему повесить на кнопку загрузку не определённой
ранее функции с последующим "тут же её выполнением" можно,
а команды, именно, как команды, чтобы отрабатывалось потом
по ПКМ
- нет.

В АвтоКАДе-то работает без вопросов, а здесь где собака порылась? :-)

Вариант с:

Intername=sID_SdVerDwg
LocalName=sID_SdVerDwg

должны отличаться интересный, попробую.

То doctorraz:

Если сочтёте возможным (всё понятно - другие дела, нет времени и желания и т.п.)
написать и показать здесь кусочек *.cfg, позволяющий реализовать задачу:

- повесить на кнопку загрузку файла с командой (а не функцией), тут же
выполнить её, да так, чтобы последующий щелчок ПКМ вызвал её повторно

думаю, что это интересно будет не только мне.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 17.03.2024 в 07:26.
===AAA=== вне форума  
 
Непрочитано 17.03.2024, 09:47
#13
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Если сочтёте возможным
Вряд ли, выше уже все написано и про использование макросов и как обойти.
Еще раз повторю, стремлюсь по максимуму отделять команды от cfg
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 18.03.2024, 06:49
#14
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Вариант с:

Intername=sID_SdVerDwg
LocalName=sID_SdVerDwg

должны отличаться - интересный, попробую.
Попробовал. Результата не добился.

У кого-нибудь есть контакты с разработчиками nanoCAD'а ?

Если есть - спросите у них напрямую, плиз, такая задача решается
(может быть, у меня проблема в синтаксисе, непонятно пока) или нет.

Видимо, конструкцию типа:

Keyword=s^C^C^P(progn(load"d:\\dreamn\\nd_abc.lsp")(princ)) ^PD_ABC

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

А вот с функцией - другое дело. Т.к. загрузка и выполнение находятся
внутри (progn ...), то и выполняются они шаг-за-шагом.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 18.03.2024 в 14:52.
===AAA=== вне форума  
 
Автор темы   Непрочитано 18.03.2024, 16:04
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Что ж оно так через одно место-то работает... :-(

Keyword=s^C^C(progn(load"d:\\dreamn\\nd_abc.lsp")(c:d_abc)(princ))

отрабатывает стабильно - вопросов нет. Кроме одного - прежде, чем отработать,
она выводит на экран строку:

(progn(load"d:\\dreamn\\nd_abc.lsp")(c:d_abc)(princ))

Пытаемся её спрятать:

Keyword=s^C^C^P(progn(load"d:\\dreamn\\nd_abc.lsp")(c:d_abc)(princ)) ^P

Всё вроде бы замечательно, если только не нажимать эту кнопку во время выполнения
другой команды (например, _line), которая находится в режиме запроса "введите точку"
Тогда после её завершения возобновляется прерванная команда (видимо, срабатывает
"пробел" перед крайним справа ^P).

Ну и как составить в таком случае строку "Keyword=", которая "навсегда" прерывала бы
любую работающую команду, отрабатывала бы мою (уже неважно - функцию или команду,
результат одинаковый) и выходила бы на приглашение

Команда:

?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 18.03.2024, 21:14
#16
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Там еще фича есть..
Код:
[Выделить все]
 
[\ConfigMan\Commands\PUG]
cmdtype=i0
weight=i0
RealCommandName=slsp
Intername=sPUG_r
LocalName=sУдалитьВсеНеименованныегруппы
DispName=sУдаляет ВСЕ неименованные группы
Keyword=s(PurgeAllUnNamedGroups)
IsUserCommand=f1
BitmapDll=snewbtns.dll
Icon=sPURGE_DARK
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 19.03.2024, 08:47
#17
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А это как?

Код:
[Выделить все]
 RealCommandName=slsp
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 19.03.2024, 09:12
#18
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
А это как?
lisp
а в ключевом слове лисп выражение
-----
мож сгодится))
в аттаче функция лисп которая вызывается для понимания

Offtop: PS в нк22 еще такие штуки можно было добавлять через НПИ, начиная с нк23 сильно упростили, без бутылки с НПИ не разобраться, проще руками в блокноте править
Вложения
Тип файла: lsp UngroupAll.lsp (3.9 Кб, 8 просмотров)
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 19.03.2024 в 09:18.
doctorraz вне форума  
 
Автор темы   Непрочитано 19.03.2024, 09:38
#19
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Ещё поэкспериментировал:

Цитата:
Всё вроде бы замечательно, если только не нажимать эту кнопку во время выполнения
другой команды (например, _line), которая находится в режиме запроса "введите точку"
Тогда после её завершения возобновляется прерванная команда (видимо, срабатывает
"пробел" перед крайним справа ^P).
Хрен там! :-)

Это не команда возобновляется, а просто в командную строку выводится последнее
"приглашение" прерванной команды. Поэтому, скажем, запрос "введите 2-й точку"
в реальности ничего не запрашивает, а просто заменяет собой слово "Команда:"

Т.е.

Ожидали видеть:

Команда:

А видим:

Укажите следующую точку:

Которая по факту ничего не хочет, а является обычным приглашением
командной строки.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 19.03.2024, 11:33
#20
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


с Keyword так работает(((
Вызови из меню: справка, лицензионное соглашение, а потом попробуй повторить по enter space или ПКМ((
----------
короче поразбирался, в истории команд: (ПКМ) остается только команда
Keyword в историю не попадает, выражения и функции тоже
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 19.03.2024 в 12:27.
doctorraz вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > NanoCAD: проблема с назначением на кнопку КОМАНДЫ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C#. nanoCAD, Autocad. Экспорт геометрии в позиционный проект Stark ES Нубий-IV Готовые программы 2 27.05.2024 15:17
.Net TableAutoComplete2 - Автозаполнение строк спецификации. Поддержка баз оборудования Nanocad valerik88 Готовые программы 5 19.06.2023 08:40
Вызов команды лиспа без скобок и запись команды в файле acad.pgp Ingpro LISP 10 02.12.2022 15:12
Проблема с ксероксом Canon PC860 _Oleg_ Разное 5 26.12.2007 10:18
Проблема при применении команды BHATCH Torino AutoCAD 4 20.01.2004 18:06