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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вопрос по упрощению пользовательского ввода. Подскажите по фукциям getpoint и getreal

Вопрос по упрощению пользовательского ввода. Подскажите по фукциям getpoint и getreal

Ответ
Поиск в этой теме
Непрочитано 18.11.2016, 17:30 #1
Вопрос по упрощению пользовательского ввода. Подскажите по фукциям getpoint и getreal
Diam Finn
 
Инженер-проектировщик
 
Подмосковье
Регистрация: 25.12.2014
Сообщений: 5

Добрый день, коллеги! Прошу о помощи с такой проблемой:
В своих лиспах, когда требуется ввод пользователем каких-то данных, я пользуюсь стандартными конструкциями, например:
если требуется указать точку вставки и высоту текста объекта, пишу так:

Код:
[Выделить все]
(setq coordinate (getpoint "Укажите точку вставки"))
(setq txtheight (getreal "Введите высоту текста <250>: "))
Значение высоты текста по умолчанию 250, эта высота используется в 90% случаев, но пользователю все равно приходится лишний раз нажимать enter чтобы ее подтвердить, неудобно.
Можно ли переписать код так, чтобы осталась только одна активная операция "Укажите точку вставки", а высоту можно было менять только специально нажав отдельную клавишу, выводимую в командной строке.
Ну то есть, как в самом Автокаде, когда я, например, рисую полилинию, мне ничего больше не надо нажимать, но в командой строке прописаны "горячие клавиши" для особых случаев.

Последний раз редактировалось Diam Finn, 18.11.2016 в 22:57.
Просмотров: 1478
 
Непрочитано 18.11.2016, 19:52
1 | 1 #2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Присмотрись к функции initget , особенно с установленным битом 128.
Profan вне форума  
 
Непрочитано 21.11.2016, 10:12
#3
AlexZh


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



а можно поподробнее?
AlexZh вне форума  
 
Непрочитано 21.11.2016, 11:09
1 | 1 #4
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


например (setq txtheight (getvar "textsize").
Ну в инитгет запихать опции выбора и прописать их обработку, на случай, если надо поменять textsize.
Например:
Код:
[Выделить все]
 (initget "Другая Изменить Change Luprec")
(setq pt  (getpoint "\nУкажите точку: [Другая ось, Изменить точность]") )
(cond 
	((or (= pt "Другая") (= pt "Change"))
	(setq curve-os (car (nentsel "\nУкажите другую ось: ")))
	(sssetfirst nil (ssadd curve-os))
	(setq pt  (getpoint "\nУкажите точку: ") )
	)
	((or (= pt "Изменить") (= pt "Luprec"))
	(setq luprec-pk (getint "\nУкажите требуемую точность: "))
	(sssetfirst nil (ssadd curve-os))
	(setq pt  (getpoint "\nУкажите точку: ") )
	)
);cond
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 21.11.2016, 13:32
#5
Diam Finn

Инженер-проектировщик
 
Регистрация: 25.12.2014
Подмосковье
Сообщений: 5


Большое спасибо, все получилось! Действительно, команда Inetget с флагом 128 разрешает в команде getpoint вводить ключевые слова. Даже синим цветом подсвечивает ключевое слово при использовании квадратных скобок. Правда, если ключевых слов несколько, синим подсвечивается только одно из них. Пытаюсь разобраться, как подсветить несколько.
Diam Finn вне форума  
 
Непрочитано 21.11.2016, 13:46
1 | 1 #6
Кулик Алексей aka kpblc
Moderator

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


Перечислять надо не через запятую, а через дробь (/)

----- добавлено через ~4 мин. -----
Как вариант:
Код:
[Выделить все]
 (defun test (/ pt curve-os)
  (initget 128 "Другая Изменить Change Luprec _ C L C L")
  (if (not
        (vl-catch-all-error-p
          (setq pt (vl-catch-all-apply
                     (function (lambda () (getpoint "\nУкажите точку: [Другая ось/Изменить точность] <Отмена> : ")))
                     ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
          ) ;_ end of vl-catch-all-error-p
        ) ;_ end of not
    (cond ((= pt "C")
           (setq curve-os (car (nentsel "\nУкажите другую ось: ")))
           (sssetfirst nil (ssadd curve-os))
           (setq pt (test))
           )
          ((= pt "L")
           (setq luprec-pk (getint "\nУкажите требуемую точность: ")
                 pt        (test)
                 ) ;_ end of setq
           )
          (pt pt)
          ) ;_ end of cond
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.11.2016, 14:05
| 1 #7
AlexZh


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Перечислять надо не через запятую, а через дробь (/)

----- добавлено через ~4 мин. -----
Как вариант:
Код:
[Выделить все]
 (defun test (/ pt curve-os)
  (initget 128 "Другая Изменить Change Luprec _ C L C L")
  (if (not
        (vl-catch-all-error-p
          (setq pt (vl-catch-all-apply
                     (function (lambda () (getpoint "\nУкажите точку: [Другая ось/Изменить точность] <Отмена> : ")))
                     ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
          ) ;_ end of vl-catch-all-error-p
        ) ;_ end of not
    (cond ((= pt "C")
           (setq curve-os (car (nentsel "\nУкажите другую ось: ")))
           (sssetfirst nil (ssadd curve-os))
           (setq pt (test))
           )
          ((= pt "L")
           (setq luprec-pk (getint "\nУкажите требуемую точность: ")
                 pt        (test)
                 ) ;_ end of setq
           )
          (pt pt)
          ) ;_ end of cond
    ) ;_ end of if
  ) ;_ end of defun
вот это, конечно, уровень!
AlexZh вне форума  
 
Автор темы   Непрочитано 21.11.2016, 15:59
#8
Diam Finn

Инженер-проектировщик
 
Регистрация: 25.12.2014
Подмосковье
Сообщений: 5


Всем большое спасибо! Мой конечный код выглядит так:
Код:
[Выделить все]
(while (atom coord)
	  	(initget 128 "W H")
	  	(setq coord (getpoint "Укажите точку вставки: [Wipeout/Height]"))
		(cond ((= coord "W")
				(progn
					(initget 1 "Yes No")
				  	(setq wipe (getkword "Использовать блок с маской? [Yes/No]:"))
				));_progn
			((= coord "H")
		      		(progn
				  	(initget 6)
					(setq height (getint "Введите максимальное количество блоков в столбце <5>: "))
				  	(if (not height) (setq height 5))
				));_progn
		      
		);cond
);while
(if (not height) (setq height 5))
(if (not wipe) (setq wipe "Yes"))
Дополнительно организовал цикл, чтобы пользователь мог менять параметры количества блоков в столбце и наличия маски в блоке, а потом вернулся к указанию точки вставки.
Diam Finn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вопрос по упрощению пользовательского ввода. Подскажите по фукциям getpoint и getreal

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо ли в разделе ТХ отражать вопрос системы безопасности детей и персонала по предотвращению криминальных проявлений...? нюра87 Архитектура 4 16.10.2012 09:55
Дада ввода здания в эксплуатацию - как она определяется? pterik Прочее. Отраслевые разделы 2 29.06.2012 11:40
Вопрос по фундаменту для МЖД Toxel Основания и фундаменты 1 23.12.2011 09:33
Кто использует возможности ввода значений в поля свойств объекта с помощью калькулятора MIP AutoCAD 5 16.03.2009 23:48
Крепление раковины - вопрос к строителям Pilot Прочее. Архитектура и строительство 21 06.12.2004 10:35