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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Запомнить последнее введенное значение

Запомнить последнее введенное значение

Ответ
Поиск в этой теме
Непрочитано 20.09.2010, 17:52 #1
Запомнить последнее введенное значение
Айнар
 
Москау
Регистрация: 16.05.2007
Сообщений: 63

Подскажите пожалуйста как сделать в ЛИСПе, чтобы при следующем вызове команды по умолчанию выводился по умолчанию параметр введенный ранее. типа вот этого: "Specify fillet radius <0.0000>:"
Просмотров: 9193
 
Непрочитано 20.09.2010, 19:08
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Объявляй переменную глобально или пиши в реестр...
gomer вне форума  
 
Непрочитано 20.09.2010, 20:04
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Айнар Посмотреть сообщение
Подскажите пожалуйста как сделать в ЛИСПе, чтобы при следующем вызове команды по умолчанию выводился по умолчанию параметр введенный ранее. типа вот этого: "Specify fillet radius <0.0000>:"
Смотря что понимается под "ранее":
1. "Ранее" в текущем сеансе работы
2. "Ранее" в предыдущих сеансах работы

Если (1), то gomer прав насчёт использования глобальной переменной.
Если (2), то хранить подобные настройки в реестре - не лучшая идея, под это дело лучше бы подошёл xml-файл (имхо).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 21.09.2010, 07:10
#4
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от gomer Посмотреть сообщение
Объявляй переменную глобально или пиши в реестр...
Ты думаешь, если бы Айнар, знал о том что такое глобальные переменные или тем более реестр, он бы задал такой вопрос?
Цитата:
Сообщение от AutoLISP и Visual LISP в среде AutoCAD

К локальным переменным относятся переменные, имена которых заданы при описании функций либо в перечне аргументов, либо в перечне рабочих переменных. Такие переменные существуют только внутри функции, в которой они определены, и их значение не передаются наружу.
Остальные переменные, который не являются локальными, считаются глобальными, и им отводиться специальное место в именном пространстве текущего документа и в текущем сеансе работы
Для ввода предыдущего значения, по-умолчанию
[IMG]http://s42.***********/i095/1009/48/f34422ffe6be.gif[/IMG]
, я использую конструкцию вот такого типа:
Код:
[Выделить все]
(defun c:test (/ entered_value)
  (setq	Einar_last_entered_value_test
	 (if Einar_last_entered_value_test 
	   Einar_last_entered_value_test 
	   0 
	 )
	entered_value
	 (getreal
	   (strcat
	     "\nВведите значение <"
	     (rtos Einar_last_entered_value_test)
	     ">: "
	   )
	 )
	entered_value
	 (if entered_value
	   entered_value
	   Einar_last_entered_value_test
	 )
	Einar_last_entered_value_test
	 entered_value
  )
)
. где entered_value - локальная переменная, Einar_last_entered_value_test - глобальная переменная.

Цитата:
Сообщение от hwd Посмотреть сообщение
лучше бы подошёл xml-файл (имхо).
Можно по подробнее, давно хочу чтоб "ранее" было не только в текущем
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 21.09.2010 в 08:32.
Disney вне форума  
 
Автор темы   Непрочитано 21.09.2010, 09:56
#5
Айнар


 
Регистрация: 16.05.2007
Москау
Сообщений: 63


Нужно "Ранее" в предыдущих сеансах работы
Айнар вне форума  
 
Непрочитано 21.09.2010, 10:15
#6
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Цитата:
Нужно "Ранее" в предыдущих сеансах работы
Для таких вещей я использую простые текстовые файлы используя функцию (open "......" "w") и (open "......" "r"). может не красиво, но работает.

В качестве основы для записи и считывания файла взял команду Appload из R13, реализованную Lisp-ом. (см. вложение)
Вложения
Тип файла: zip appload.zip (6.3 Кб, 75 просмотров)
E-degtyarev вне форума  
 
Непрочитано 21.09.2010, 10:20
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


http://forum.dwg.ru/showthread.php?t...E0%ED%ED%FB%F5
Do$ вне форума  
 
Непрочитано 21.09.2010, 16:19 Пример работы с XML
1 | #8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Disney Посмотреть сообщение
Цитата:
Сообщение от hwd
Смотря что понимается под "ранее":
1. "Ранее" в текущем сеансе работы
2. "Ранее" в предыдущих сеансах работы

...лучше бы подошёл xml-файл (имхо).
Можно по подробнее, давно хочу чтоб "ранее" было не только в текущем
Можно. Озвученный видео-пример с исходниками разместил здесь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 01.10.2010, 10:25
#9
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


На мой взгляд, лучше всего работать с ini файлами, а не с реестром, особенно при использовании малого количества информации.
вот к примеру две функции чтение/запись в ini.
Код:
[Выделить все]
;;;FileName 	- имя файл ini
;;;Section 	- секция ini
;;;key 		- ключ ini
;;;Default	- значение по умолчанию (если не обнаружит значения в фале)
(defun read-ini	(FileName Section Key Default / IniSection str)
  (setq File (open FileName "r"))
  (if (= File nil)
    (progn
      Default
    )
    (progn
      (setq IniSection (strcat "[" (strcase Section) "]"))
      (setq str (read-line File))
      (setq temp T)
      (while (and (/= str "///")
		  (/= (strcase str) IniSection)
	     )

	(progn
	  (setq str (read-line File))
	  (if (= str nil)
	    (setq str "///")
	  )
	)
      )
      (if (= str "///")
	(progn Default)

	(progn
	  (setq str (read-line File))
	  (if (= str nil)
	    (setq str "///")
	  )
	  (while

	    (and (/= str "///")
		 (/= (strcase (substr str 1 (vl-string-search "=" str)))
		     (strcase Key)
		 )
		 (/= (substr str 1 1) "[")

	    )
	     (progn
	       (setq str (read-line File))
	       (if (= str nil)
		 (setq str "///")
	       )
	     )
	  )
	  (close File)
	  (if (= (strcase (substr str 1 (vl-string-search "=" str)))
		 (strcase Key)
	      )
	    (progn
	      (setq str (substr str (+ 2 (vl-string-search "=" str))))
	      str
	    )
	    (progn Default)
	  )
	)
      )
    )
  )
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;запись в ини

(defun write-ini (FileName   Section	Key	   Value
		  /	     IniSection	str	   Lstr
		  insertion  elem	curSection
		 )
  (setq insertion :vlax-false)
  (setq File (open FileName "r"))

  (if (= File nil)
    (progn
      (setq Lstr
	     (append Lstr (list (strcat "[" (strcase Section) "]")))
      )
      (setq Lstr (append Lstr (list (strcat Key "=" Value))))
    )
    (progn

      (setq str (read-line File))
      (if (= (substr str 1 1) "[")
	(setq curSection (strcase str))
      )

      (while (/= str nil)
	(progn
	  (if
	    (and (/= (strcase (substr str 1 (vl-string-search "=" str)))
		     (strcase Key)
		 )
		 (= (strcase curSection)
		    (strcat "[" (strcase Section) "]")
		 )
	    )
	     (progn
	       (setq Lstr (append Lstr (list str)))
	     )
	     (progn (if	(/= (strcase curSection)
			    (strcat "[" (strcase Section) "]")
			)
		      (setq Lstr (append Lstr (list str)))
		    )
	     )
	  )


	  (if (= (strcase str) (strcat "[" (strcase Section) "]"))
	    (progn
	      (setq Lstr (append Lstr (list (strcat Key "=" Value))))
	      (setq insertion :vlax-true)
	    )

	  )
	  (setq str (read-line File))
	  (if (/= str nil)
	    (if	(= (substr str 1 1) "[")
	      (setq curSection (strcase str))
	    )
	  )
	)
      )


      (if (= insertion :vlax-false)
	(progn
	  (setq	Lstr
		 (append Lstr (list (strcat "[" (strcase Section) "]")))
	  )
	  (setq Lstr (append Lstr (list (strcat Key "=" Value))))
	)
      )
      (close File)
    )
  )

  (setq File (open FileName "w"))
  (if (/= File nil)
    (progn
      (foreach elem Lstr (write-line elem File))
    )
  )
  (close File)
)
EfremenkoDO вне форума  
 
Непрочитано 01.10.2010, 10:43
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от EfremenkoDO Посмотреть сообщение
На мой взгляд, лучше всего работать с ini файлами, а не с реестром, особенно при использовании малого количества информации.
"Работать" и "хранить свои настройки" - это не одно и то же. Работать нужно уметь и с реестром, поскольку AutoCAD много чего хранит именно в нём. Если говорить о том, в каких файлах хранить свою информацию, то возможно (но не обязательно) следует учитывать возможности языка, на котором программист пишет. Если кто-то пишет на языке, который не имеет в своём арсенале функций по работе с xml, но имеет функции для работы с текстовыми файлами, то возможно, что такому разработчику будет удобней работать с ini-файлом (хотя, честно говоря, я не вижу совершенно никаких трудностей в том, чтобы с тем же успехом создавать xml). Если же в языке функционал для работы с xml имеется, то лучше использовать xml, а не ini, поскольку возможно, что в дальнейшем с файлом ваших настроек потребуется работать из внешних приложений или же тот, кто будет писать код - будет писать его на языке, умеющем работать с xml. Если это будет ini-файл, то программисту придётся тратить своё время на написание парсера. А ежели это будет xml - этого делать не придётся.

Вообще существует аксиома: xml - это универсальный формат хранения/передачи данных. Любой серьёзный язык программирования имеет в своём арсенале инструменты по работе с xml, а следовательно такой файл будет легко прочитан и изменён (при необходимости).

Если коротко - я против ini-файлов.

Offtop: з.ы. Хотя на данном форуме преобладают лиспописатели, которым вопросы совместимости и удобства поддержки, к сожалению побоку.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 01.10.2010, 10:56
#11
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Если коротко - я против ini-файлов.
стоит учесть что за данные планируется хранить, если не особо структурированные, например несколько не связаных значений - зачем xml?

Если коротко - я против тотальной подсадки на xml. а за пихание всякой лабуды в реестр - нужно руки отрывать. иногда плакать хочется глядя в regedit... зачем это там?
zamtmn вне форума  
 
Непрочитано 01.10.2010, 11:01
#12
Кулик Алексей aka kpblc
Moderator

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


ИМХО: ini превосходно подходит для одноуровневой организации информации.
xml - для сложноструктурированной.
Но и то, и другое (по крайней мере с точки зрения лиспа) требует обращения к файлам, то есть достаточно медленные операции. Мне кажется (подробных исследований не проводил), что доступ к реестру будет осуществляться быстрее.
Как бы то ни было, все равно хранение информации надо продумывать - любой механизм можно угробить
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2010, 11:02
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
если не особо структурированные, например несколько не связаных значений - зачем xml?
имхо - для порядка. Что произойдёт, если юзер подправит такой ini-файл, случайно поменяв местами две строки? В xml можно автоматически проверять структуру файла и его содержимое на корректность (с помощью xsd-схем). А как вы проверите ini-файл? Можно конечно проверить, но для этого нужно будет писать опять же кучу кода.
Цитата:
любой механизм можно угробить
Чтобы этого не случилось, как раз и существуют xsd-схемы. По ним можно даже сгенерировать нужный xml-файл с нуля.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 01.10.2010, 11:03
#14
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Что произойдёт, если юзер подправит такой ini-файл, случайно поменяв местами две строки?
А ничего Если, конечно, реализация чтения-записи грамотная
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2010, 11:05
#15
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А ничего Если, конечно, реализация чтения-записи грамотная
А если он укажет не допустимое значение? Тоже ничего, если "грамотная реализация". Но ты упускаешь один момент - эту реализацию нужно писать. В случае использования xml - эта реализация уже есть в виде xsd-схем.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 01.10.2010, 11:09
#16
Кулик Алексей aka kpblc
Moderator

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


Андрей, ты про схемы-то не это, не тово... В общем, не надо
Для затравки несколько функций, которые я использую для работы с ini-файлами (используется некоторое количество библиотечных функций, но суть от этого меняется мало).
Вложения
Тип файла: lsp _kpblc-ini-datas-read.LSP (3.0 Кб, 56 просмотров)
Тип файла: lsp _kpblc-ini-datas-write.LSP (4.7 Кб, 54 просмотров)
Тип файла: lsp _kpblc-ini-read-value.LSP (755 байт, 58 просмотров)
Тип файла: lsp _kpblc-ini-write-value.LSP (883 байт, 56 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2010, 11:13
#17
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ты про схемы-то не это, не тово... В общем, не надо
поясни
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 01.10.2010, 11:15
#18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Удалено
Do$ вне форума  
 
Непрочитано 01.10.2010, 11:16
#19
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Тоже ничего, если "грамотная реализация"
Без грамотной реализации и xml не поможет.
Я не спорю xml - индустриальный стандарт... но тут в основном не професионалы. Есть некоторый предел сложности данных до которого xml - излишество
zamtmn вне форума  
 
Непрочитано 01.10.2010, 11:26
#20
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


С INI-файлом ничего не произойдет, даже если поменять местами строчки. Вручную. И с юзером ничего не произойдет. Правильная программа (не такая примитивная как в #9) прочитает информацию. И хранить в INI можно структурированную (несколько уровней) информацию. Достаточно задавать соответствующие имена секций и переменных.

А вот с XML, при всех его несомненных преимуществах для многих целей все гораздо сложнее. Требования к синтаксису более строгие. Жестокие! XML должен быть и valid и well-formatted. Да еще, возможно, соответствовать какой-нибудь XSD-схеме.

И "что произойдет если юзер подправит такой XML-файл"? Даже не меняя местами строки? XML от таких правок также ничем не защищен.

Но для работы с XML необходимы дополнительные парсеры, причем гораздо более сложные, чем для INI. Вот hwd всё время на XML напирает потому что работает с .NET. А посади его в другую среду? Хотя бы в "чистый WIN-api" с написанием программы в "Блокноте"? Вот и кончился весь XML.

Поэтому все неоднозначно. В случаях с настройками, например "последним значением" нет смысла применять сложные решения.

Цитата:
за пихание всякой лабуды в реестр - нужно руки отрывать. иногда плакать хочется глядя в regedit... зачем это там?
Обычные рассуждения начинающих программистов. Которые, типа, пишут программы, круче чем вся Microsoft. Плакать хочется и пацталом валяться.

Руки им надо отрывать за то, что лезут с regedit.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Запомнить последнее введенное значение



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массовое редактирование свойств атрибутов блоков kgb Программирование 11 13.06.2023 14:39
Считывание значение ячейки таблицы в виде Field в AutoLISP tokhot LISP 9 08.01.2017 17:54
Значение аттрибутов блоков Андрей Будзинский AutoCAD 5 16.12.2009 17:18
ГОСТ Р 53231-2008 UnyqUm Поиск литературы, чертежей, моделей и прочих материалов 5 15.09.2009 14:41
Как в 2006 вызвать последнее введенное с клавиатуры? GAP AutoCAD 4 28.10.2005 16:39