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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Интерактивный ввод числа

Интерактивный ввод числа

Ответ
Поиск в этой теме
Непрочитано 26.03.2019, 22:14 #1
Интерактивный ввод числа
Chief
 
Регистрация: 21.08.2017
Сообщений: 2

Требуется ввести число по запросу (getreal) либо выбрать на экране существующее число через (entsel).
Можно ли реализовать данный выбор через общий запрос, например через (grread) ?
Просмотров: 1562
 
Непрочитано 26.03.2019, 23:27
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,023


grread можно получить координаты указателя мыши, и потом пытаться найти объект(ы) в этой точке и подсвечивать их. И отслеживать ввод цифр, и тогда создать временный мультитекст и туда начать отображать вводимое число.
Сергей812 вне форума  
 
Непрочитано 27.03.2019, 16:58
#3
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Есть еще пару идей (велосипедностроительных).
Вот не понимаю, отчего было не сделать возможность для функции entsel воспринимать биты initget? Конечно, не все, а только логически оправданные, например, бит 128, который бы давал пользователю на запрос объекта в качестве альтернативы вводить любую строку, которую после нетрудно перевести в тот же REAL. Но нет - имеем то, что имеем. И по сему есть первая идея (которую, разумеется, не одобрят "программар-наци"): если область допустимых для ввода значений относительно невелика. допустим, от -1000 до +1000 и количество знаков после запятой также не превышает разумных величин (думаю, 1-2), то можно динамически (изящной подфункцией) или жестко ("в лоб") создавать строку для (initget), которая будет содержать все допустимые значения, ну и далее разные постобработки и проч.

Вторая идея - тоже костыль. Запрашивать REAL, а в ответ на пустой ввод (правая кнопка или Enter) "щупать" под курсором ssget'ом с опцией "_C". Правда, тут пострадают те, кто привык правой кнопкой завершать команду.
skkkk на форуме  
 
Непрочитано 27.03.2019, 17:08
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,023


Насколько помню, DCL может только модальные окна создавать. На том же .Net можно сделать висящее на курсоре немодальное окно ввода и использовать стандартные механизмы выбора.
Сергей812 вне форума  
 
Непрочитано 27.03.2019, 17:23
#5
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Сергей812, не понял, при чем тут DCL?
skkkk на форуме  
 
Непрочитано 27.03.2019, 17:27
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,023


Цитата:
Сообщение от skkkk Посмотреть сообщение
не понял, при чем тут DCL?
ветка то лиспа, по умолчанию только DCL и его так не повесишь на координаты указателя мыши...

----- добавлено через ~4 мин. -----
хотя проще сделать вложенные: сначала ввод, если отказался или пустое значение - переходить к выбору. Более стабильная и предсказуемая работа, имхо.

----- добавлено через ~28 мин. -----
Кстати так проще всего получается:
Код:
[Выделить все]
 
  (setq lV (getreal "\nВведите значение (либо Ввод для выбора):" ))
  (if (null lV)
    (progn
      (setq lEnt (entsel "\nВыберите число:"))
      %Вытаскиваем из примитива значение и преобразуем в число%
      
    );progn
  ) ;if
и обернуть в обработчик ошибок для "тихой" отмены ввода.
Сергей812 вне форума  
 
Непрочитано 27.03.2019, 18:09
#7
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Сергей812, все равно не понял, зачем DCL? Вроде же не идет речи о диалогах? Не могу уловить мысли, где они даже тут могут сгодиться и быть полезными.
Мое предложение (первое) подразумевает использовать запрос на выбор объекта (entsel) с возможностью ввода числа, но в виде строки... Не, стоп.
Проще в коде показать, наверное )
Код:
[Выделить все]
 (defun C:TST ( / a)
	(initget "1 1.0 1.1 1.2 1.3 1.4 1.5") ;;; тут должна быть строка - перечень допустимых значений
	(setq a (entsel "\nВыберите объект-текст или введите число от 1 до 1.5:"))
	(cond 
		;;; если a - строка, 
	  (	(and a (= (type a) 'STR)) 
		;;; то преобразовываем в REAL
		(setq a (atof a))
		(terpri)
		a
	  )
	  ;;; если a - список (объект+точка) и объект - TEXT или MTEXT, 
	  (	(and a (= (type a) 'LIST) (wcmatch (cdr (assoc 0 (entget (setq a (car a))))) "*TEXT"))
		;;; то берем его значение и преобразовываем в REAL 
		(setq a (atof (cdr (assoc 1 (entget a)))))
		(terpri)
		a
	  )
	  (	T
		(princ "\nНедопустимый ввод")
		(C:TST)
	  )
	)
)
----- добавлено через ~9 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Кстати так проще всего получается:
Так не только проще, но и правильней всего, по мнению - я уверен - многих хороших и уважаемых LISPоведов, но это дополнительный клик и такой подход идет вразрез с ТЗ от ТС. Такой вариант, полагаю, он и сам знает, но он ему не подходит. Как, скорее всего, и мой - разве что область допустимых значений невелика.
skkkk на форуме  
 
Непрочитано 27.03.2019, 19:08
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,023


Цитата:
Сообщение от skkkk Посмотреть сообщение
Сергей812, все равно не понял, зачем DCL? Вроде же не идет речи о диалогах?
Подвесить на курсор диалог ввода и туда отправлять нажатия клавиш, касающихся числа.

Цитата:
Сообщение от skkkk Посмотреть сообщение
но он ему не подходит.
когда ТС попробует (в случае удачной реализации) на реальной задаче свой вариант интерфейса... Скорость работы достигается за счет предсказуемости реакции интерфейса (т.е. когда уже почти на автомате совершаешь действия) - а не экономией кликов, имхо..
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.03.2019, 22:04
#9
Chief


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


В общем, в первом приближении задумка была такова:

Код:
[Выделить все]
 (princ "\nВведи или выбери отметку земли:")
   	(setq a (grread nil 6 2))
(cond
  (	(= 3 (car a)) ;если мыш кродеться :)
   ;;; то считываем координату и преобразовываем в число
   (setq otm (atof (cdr (assoc 1  (entget (ssname (ssget (cadr a)) 0))))))
   )

  (	(= 2 (car a)); если клац клава
	(setq otm (getreal)); тогда ввод ручками
   )
 )
Chief вне форума  
 
Непрочитано 27.03.2019, 22:49
1 | 1 #10
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 169


Код:
[Выделить все]
 (getvar "LASTPROMPT")
Vov.Ka вне форума  
 
Непрочитано 08.04.2019, 00:37
#11
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Vov.Ka, гениально!
skkkk на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Интерактивный ввод числа

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 669 24.03.2017 20:16
Calculix 2.9 ругается на числа в экспоненциальном формате hungry_Duck Расчетные программы 0 26.10.2016 15:30
Как отключить автозамену числа на дату в Excel? Art1st Прочее. Программное обеспечение 10 31.07.2015 14:45
DYNMODE (Системная переменная динамический ввод) sdv79 Справочник команд 0 10.06.2012 17:17
Приямок ("кессон") скважины водоснабжения. Гидроизоляция, ввод трубы. Андрей О Конструкции зданий и сооружений 2 27.05.2011 23:52