| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Запрет вывода контекстного меню после нажатия ПКМ?

Запрет вывода контекстного меню после нажатия ПКМ?

Ответ
Поиск в этой теме
Непрочитано 04.07.2018, 14:06 #1
Запрет вывода контекстного меню после нажатия ПКМ?
lithium80
 
Регистрация: 04.07.2018
Сообщений: 12

Начальное значение SHORTCUTMENU = 11.

(setvar "SHORTCUTMENU" 0) ; отключаю контекстное меню
(getreal ...) ; ввод с подтверждением ПКМ
(setvar "SHORTCUTMENU" 11) ; восстанавливаю контекстное меню

для завершения ввода в функции (getreal ...) нажимаю ПКМ в графической области
... и после завершения программы lisp выскакивает стандартное контекстное меню.
Вопрос: как отключить вывод всплывающего контекстного меню?

Последний раз редактировалось lithium80, 04.07.2018 в 15:55.
Просмотров: 3405
 
Непрочитано 04.07.2018, 14:16
#2
Кулик Алексей aka kpblc
Moderator

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


Не уверен, что понял правильно. Код приведи.
Мой вариант вроде ничего не выводит:
Код:
[Выделить все]
 (defun test (/ sys value)
  (setq sys (vl-remove nil
                       (mapcar (function (lambda (x / tmp)
                                           (if (setq tmp (getvar (car x)))
                                             (progn (if (cdr x)
                                                      (setvar (car x) (cdr x))
                                                      ) ;_ end of if
                                                    (cons (car x) tmp)
                                                    ) ;_ end of progn
                                             ) ;_ end of if
                                           ) ;_ end of LAMBDA
                                         ) ;_ end of function
                               '(("sysmon" . 0) ("shortcutmenu" . 0))
                               ) ;_ end of mapcar
                       ) ;_ end of vl-remove
        ) ;_ end of setq
  (if (= (type
           (setq value (vl-catch-all-apply (function (lambda () (getreal "\nEnter real value <Cancel> : ")))))
           ) ;_ end of type
         'real
         ) ;_ end of =
    (princ "\nCorrect!")
    ) ;_ end of if
  (foreach item sys (setvar (car item) (cdr item)))
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 14:34
#3
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


В AutoCAD 2008 ваш код также позволяет меню появиться (начальное значение SHORTCUTMENU = 11).
lithium80 вне форума  
 
Непрочитано 04.07.2018, 14:40
#4
Кулик Алексей aka kpblc
Moderator

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


У меня нет 2008. Код писал в ACAD2016.

----- добавлено через 47 сек. -----
Да, кстати! В какой момент выводится конт.меню?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.07.2018, 15:00
#5
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Контекстное меню - хороший инструмент при работе с AutoCAD. Например, контекстное меню позволяет вводить пользовательские значения опций, заданных при описании КОМАНДЫ в AotoLisp, с помощью правой кнопки мыши. При выполнении ФУНКЦИИ AutoLisp никакого контекстного меню не должно появляться. Похоже, автор что-то недоговаривает. Что это такое:
Цитата:
(getreal ...) ; ввод с подтверждением ПКМ
Почему бы полностью не написать выражение типа (getreal "\nВведите число: ")? Отвечаем на запрос мы в командной строке и ввод числа завершаем нажатием Enter или пробела. Если хотим завершить ввод числа правой кнопкой мыши, то курсор должен находиться в графической области экрана, а не в текстовой.
Setvar вне форума  
 
Автор темы   Непрочитано 04.07.2018, 15:05
#6
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Меню выскакивает после завершения программы lisp.
полная строка (проверял и без [...] <...>; выскакивает в 2008, 2012, 2015, 2017; и, да, ПКМ нажимается в графической области):
(initget 4) (setq __ (getreal (strcat "\nfactor [" (vl-princ-to-string _fac) "] <cancel>: ")))

Последний раз редактировалось lithium80, 04.07.2018 в 15:48.
lithium80 вне форума  
 
Непрочитано 04.07.2018, 15:18
#7
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Недостаточно информации. Огрызки какие-то.
Setvar вне форума  
 
Автор темы   Непрочитано 04.07.2018, 15:24
#8
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Код:
[Выделить все]
 (defun C:FUNC ()
(set '___ (getvar "SHORTCUTMENU")) (setvar "SHORTCUTMENU" 0)
(initget 4) (setq _ (getreal "\nfactor "))
(setvar "SHORTCUTMENU" ___)
)
Начальное значение SHORTCUTMENU = 11.
После вызова FUNC выскакивает меню если ввод завершить ПКМ.

Последний раз редактировалось Кулик Алексей aka kpblc, 04.07.2018 в 16:09.
lithium80 вне форума  
 
Непрочитано 04.07.2018, 16:13
#9
Кулик Алексей aka kpblc
Moderator

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


Если нажимать ПКМ, то "_" (кстати, что за имя переменной? Не лень считать количество символов?) после getreal будет nil.
Ставь точки останова и проходи пошагово. Ты настолько не хочешь показывать полный код, что у меня черные подозрения - ошибка выскакивает совсем не здесь. Или в настройках намудрил (что по дефолту стоит на правый клик?). Или какое-то дополнение типа СПДС GraphiCS свою лепту вносит.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 16:17
#10
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


ПКМ я нажимаю для пропуска ввода.
На чистом автокаде эта функция после завершения вызывает меню. Это есть реальный код. Вы пробовали его запустить?
P.S. Это минимальный пример проблемной функции. Зачем мне выкладывать сотни строк?

Последний раз редактировалось lithium80, 04.07.2018 в 16:30.
lithium80 вне форума  
 
Непрочитано 04.07.2018, 16:37
#11
Кулик Алексей aka kpblc
Moderator

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


При запуске из-под VLIDE конт.меню не появляется.
При запуске из-под ACAD конт.меню появится, если менять shortcutmenu.
Если shortcutmenu не трогать:
При запуске из-под VLIDE меню нет
При запуске из-под ACAD меню нет.
Вложения
Тип файла: zip context_menu.zip (915.5 Кб, 8 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 17:03
#12
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Вы правы, но:
По умолчанию SHORTCUTMENU = 11.
Если я его не изменю на 0, то выскакивает другое меню с предлагаемым значением по-умолчанию потому, что я использую следующую строку
Код:
[Выделить все]
 (initget 4) (setq _ (getreal (strcat "\nfactor [" "10.0" "] <cancel>: ")))
lithium80 вне форума  
 
Непрочитано 04.07.2018, 17:05
#13
Кулик Алексей aka kpblc
Moderator

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


Если до пробела или Enter не дотянуться, то в конт.меню выбирать "Отмена".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 17:08
#14
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если до пробела или Enter не дотянуться, то в конт.меню выбирать "Отмена".
То есть проблема не решаема?
А если выполнить перехват ПКМ через реактор или очистить буфер ввода?
lithium80 вне форума  
 
Непрочитано 04.07.2018, 17:25
#15
Кулик Алексей aka kpblc
Moderator

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


В таком виде - нет. Ну или переходить на C++ и писать на низком уровне. Хотя на фига - я не понимаю:
Код:
[Выделить все]
 (defun test (factor / sys value)
  (if (= (type
           (setq value (vl-catch-all-apply
                         (function (lambda ()
                                     (initget 4)
                                     (cond ((getreal (strcat "\nEnter real value <" (rtos factor 2 4) "> : ")))
                                           (t factor)
                                           ) ;_ end of cond
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                         ) ;_ end of vl-catch-all-apply
                 ) ;_ end of setq
           ) ;_ end of type
         'real
         ) ;_ end of =
    (progn (princ "\nCorrect!\n") value)
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через 18 сек. -----
Вызов: (test 16.5)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 17:34
#16
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Понятно.
Тогда не буду использовать квадратные скобки.
Если не использовать квадратные скобки и установку SHORTCUTMENU, то проблемы нет.
lithium80 вне форума  
 
Непрочитано 04.07.2018, 17:44
#17
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от lithium80 Посмотреть сообщение
То есть проблема не решаема?
Вот так работает:
Код:
[Выделить все]
(defun C:FUNC ( / f)
(setq shm (getvar "SHORTCUTMENU")) 
(setvar "SHORTCUTMENU" 0)
(initget 4) 
(setq f (getreal "\nfactor "))
)
Потом дополнительно ввести
Код:
[Выделить все]
(setvar "SHORTCUTMENU" shm)
Видимо, изменение командной переменной выполняется раньше, чем выполнение функции AutoLisp.
Нажать бы, шьорт побьери, просто Enter - и нет проблемы.
Setvar вне форума  
 
Непрочитано 04.07.2018, 18:03
#18
Кулик Алексей aka kpblc
Moderator

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


lithium80, ты код из #15 проверил?
Вообще говоря, есть стандарты запросов в ком.строке. В квадратных скобках через "/" указываются ключевые слова, варианты выбора. В угловых скобках - то, что будет принято "по умолчанию" (значение по умолчанию, отмена, или еще что-то). Исходя из этого, и действуй.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.07.2018, 18:03
#19
lithium80


 
Регистрация: 04.07.2018
Сообщений: 12


Setvar:
Ага, но ПКМ в качестве ENTER очень удобно.

Кулик Алексей aka kpblc:
Точно! В угловых скобках по-умолчанию, а не в квадратных.
lithium80 вне форума  
 
Непрочитано 04.07.2018, 18:04
#20
Кулик Алексей aka kpblc
Moderator

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


И обычно применение опций выбора предполагает использование initget с ключевыми словами или их сокращениями.

----- добавлено через 43 сек. -----
Цитата:
Сообщение от lithium80 Посмотреть сообщение
Ага, но ПКМ в качестве ENTER очень удобно.
Да бога ради! Обрабатывай полученное значение по умолчанию, как оно показано у меня в коде - и вперед.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Запрет вывода контекстного меню после нажатия ПКМ?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контекстное меню под ПКМ после _Qselect Alan AutoCAD 3 19.03.2012 10:12
Контекстное меню при адаптации TheBuTeK AutoCAD 1 16.02.2006 09:51
Победить экранное (боковое) меню. ===AAA=== Программирование 14 29.12.2005 12:03
Как настроить свое КОНТЕКСТНОЕ МЕНЮ? Olegic Программирование 3 19.07.2005 07:34
АСАД2006. Пропало контекстное меню. Gaa2001 AutoCAD 1 24.05.2005 21:21