dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

lithium80 вне форума Вставить имя

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

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

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

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

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


Не уверен, что понял правильно. Код приведи.
Мой вариант вроде ничего не выводит:
Код:
[Выделить все]
 (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
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 14:34
#3
lithium80


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


В 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
С.-Петербург
Сообщений: 35,543


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

----- добавлено через 47 сек. -----
Да, кстати! В какой момент выводится конт.меню?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.07.2018, 15:00
#5
Setvar

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 540


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


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


Меню выскакивает после завершения программы 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
Москва
Сообщений: 540


Недостаточно информации. Огрызки какие-то.
__________________
Установи FILEDIA в 1 и не парься.
Setvar вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 15:24
#8
lithium80


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


Код:
[Выделить все]
 (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
С.-Петербург
Сообщений: 35,543


Если нажимать ПКМ, то "_" (кстати, что за имя переменной? Не лень считать количество символов?) после getreal будет nil.
Ставь точки останова и проходи пошагово. Ты настолько не хочешь показывать полный код, что у меня черные подозрения - ошибка выскакивает совсем не здесь. Или в настройках намудрил (что по дефолту стоит на правый клик?). Или какое-то дополнение типа СПДС GraphiCS свою лепту вносит.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 16:17
#10
lithium80


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


ПКМ я нажимаю для пропуска ввода.
На чистом автокаде эта функция после завершения вызывает меню. Это есть реальный код. Вы пробовали его запустить?
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
С.-Петербург
Сообщений: 35,543


При запуске из-под VLIDE конт.меню не появляется.
При запуске из-под ACAD конт.меню появится, если менять shortcutmenu.
Если shortcutmenu не трогать:
При запуске из-под VLIDE меню нет
При запуске из-под ACAD меню нет.
Вложения
Тип файла: zip context_menu.zip (915.5 Кб, 1 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 17:03
#12
lithium80


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


Вы правы, но:
По умолчанию 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
С.-Петербург
Сообщений: 35,543


Если до пробела или Enter не дотянуться, то в конт.меню выбирать "Отмена".
__________________

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


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


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

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


В таком виде - нет. Ну или переходить на 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)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 17:34
#16
lithium80


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


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

Всего понемногу
 
Регистрация: 10.02.2007
Москва
Сообщений: 540


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

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


lithium80, ты код из #15 проверил?
Вообще говоря, есть стандарты запросов в ком.строке. В квадратных скобках через "/" указываются ключевые слова, варианты выбора. В угловых скобках - то, что будет принято "по умолчанию" (значение по умолчанию, отмена, или еще что-то). Исходя из этого, и действуй.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.07.2018, 18:03
#19
lithium80


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


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
С.-Петербург
Сообщений: 35,543


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

----- добавлено через 43 сек. -----
Цитата:
Сообщение от lithium80 Посмотреть сообщение
Ага, но ПКМ в качестве ENTER очень удобно.
Да бога ради! Обрабатывай полученное значение по умолчанию, как оно показано у меня в коде - и вперед.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Запрет вывода контекстного меню после нажатия ПКМ?

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контекстное меню под ПКМ после _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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||