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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп программа. Как реализавать Undo

Лисп программа. Как реализавать Undo

Ответ
Поиск в этой теме
Непрочитано 20.01.2009, 15:14 #1
Лисп программа. Как реализавать Undo
Krcho
 
Регистрация: 20.01.2009
Сообщений: 4

Нужно реализавать undo с помощю (ctrl+z) вот примерно в таком отрывке программы так чтобы можно было вернутся к предыдущей команде.

(setq f (getreal "\n Введите размер фонта: "))
(setq s (getstring "\n название пикета (PK 0+000) :" ))
(setq a (getpoint "Укажите начальную точку "))
(setq n (getreal "\n Введите начальное число:"))
Просмотров: 1981
 
Непрочитано 20.01.2009, 15:28
#2
Profan


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


Опции команды "_UNDO":
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
Profan вне форума  
 
Автор темы   Непрочитано 20.01.2009, 15:43
#3
Krcho


 
Регистрация: 20.01.2009
Сообщений: 4
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Опции команды "_UNDO":
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
Так не работает пробовал. Спасибо
Krcho вне форума  
 
Непрочитано 20.01.2009, 15:49
#4
Profan


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


Как так?
Я-то имел в виду:
Код:
[Выделить все]
 
(vl-cmdf "_UNDO" "_BE")
(setq f (getreal "\n Введите размер фонта: "))
(setq s (getstring "\n название пикета (PK 0+000) :" ))
(setq a (getpoint "Укажите начальную точку "))
(setq n (getreal "\n Введите начальное число:"))
(vl-cmdf "_UNDO" "_E")
Profan вне форума  
 
Непрочитано 20.01.2009, 16:18
#5
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,118


Krcho, тебе что отменить надо? изменение значений f s a n что-ли?

дай фрагмент побольше
SetQ вне форума  
 
Автор темы   Непрочитано 20.01.2009, 18:13
#6
Krcho


 
Регистрация: 20.01.2009
Сообщений: 4
<phrase 1=


вот вся программа
да, мне нужно изменить значение f s a n.
если пользователь ошибся и набрал не ту цифру он смог бы изменить его для этого и нужно UNDO.

Код:
[Выделить все]
(defun c:poper (/ )
(setq f (getreal "\n Введите размер фонта: "))
(setq s (getstring "\n название пикета (PK 0+000) :" ))
(setq a1 (getpoint "Укажите начальную точку "))
(setq n (getreal "\n Введите начальное число:"))
(setq pk (getreal "\n Введите NISH грунта :"))
  (setvar "cmdecho" 0)
  (setq osm (getvar "OSMODE"))
  (setvar "osmode" 8)
  (setq n(* n 5))
  (setq pk(* pk 5))
  (setq ppk(- pk n))
  (while 
  	(progn 
   		(setq hh (polar a1 1.5708  ppk))
	  	(setq hhe a1)
	  	(setq h3 hh)
	  	(command "_line" a1 hh "")
            	(setq TEXT_PK (polar hh 1.5708 10))
   	    	(setq len(strlen s))
   	    	(setq textlen(/ (float len) 2))
   	    	(setq TEXT_PK (polar TEXT_PK pi textlen))	
	  	(command "_TEXT" TEXT_PK f 0.00 s )
	  	(setq naxe a1)
	  	(setq nax hh)
	  	(setq naxm a1)
	  	(setq naxl hh)
	  	(setq e (getreal "\nВведите растаяние от нуля (00.00) :"))
		(setq hr (getreal "\nВведите NISH грунта :"))
   		(setq naxdr 0)
   		
	  	(while
      			(progn
			  	(setq et(* e 5))
			  	(setq ht(* hr 5))
			  	(setq phr (- ht n))
			  	(setq font (/ f 1.5))
			  	(if (> e 0)
				(progn
			  	(setq ee (polar a1 0 et))
			  	(setq hhr(polar ee 1.5708 phr))
				(setq a0r(polar naxe 1.5708 -10))
				(setq b0r(polar ee 1.5708 -10))
				(setq a1r(polar naxe 1.5708 -20))
				(setq b1r(polar ee 1.5708 -20))
				(setq a2r(polar naxe 1.5708 -35))
				(setq b2r(polar ee 1.5708 -35))
				(setq a3r(polar naxe 1.5708 -45))
				(setq b3r(polar ee 1.5708 -45))
			  	(command "_line" ee naxe "")
			  	(command "_line" ee hhr "")
			  	(command "_line" hhr nax "")
				(command "_line" a0r b0r "")
				(command "_line" a1r b1r "")
				(command "_line" a2r b2r "")
				(command "_line" a3r b3r "")
				(command "_line" b3r b2r "")
				(setq text1r (polar b3r pi font))
				(setq text1r (polar text1r 1.5708 -1))
				(command "_text" text1r font 90 (rtos e 2 2))
				(setq text2r (polar b2r pi font))
				(setq text2r (polar text2r 1.5708 -1))
				(command "_text" text2r font 90 (rtos hr 2 2))
				(setq naxe 0)
			  	(setq naxe ee)
			  	(setq nax 0)
			  	(setq nax hhr)
				)
				(progn
			  	(setq ee (polar a1 0 et))
			  	(setq hhr(polar ee 1.5708 phr))
				(setq a0l(polar naxm 1.5708 -10))
				(setq b0l(polar ee 1.5708 -10))
				(setq a1l(polar naxm 1.5708 -20))
				(setq b1l(polar ee 1.5708 -20))
				(setq a2l(polar naxm 1.5708 -35))
				(setq b2l(polar ee 1.5708 -35))
				(setq a3l(polar naxm 1.5708 -45))
				(setq b3l(polar ee 1.5708 -45))
			  	(command "_line" ee naxm "")
			  	(command "_line" ee hhr "")
			  	(command "_line" hhr naxl "")
				(command "_line" a0l b0l "")
				(command "_line" a1l b1l "")
				(command "_line" a2l b2l "")
				(command "_line" a3l b3l "")
				(setq text1l (polar b3l pi font))
				(setq text1l (polar text1l 1.5708 -1))
				(command "_text" text1l font 90 (rtos e 2 2))
				(setq text2l (polar b2l pi font))
				(setq text2l (polar text2l 1.5708 -1))
				(command "_text" text2l font 90 (rtos hr 2 2))
			  	(setq naxm 0)
			  	(setq naxm ee)
			  	(setq naxl 0)
			  	(setq naxl hhr)
				)
				  )
			  	
			 	(setq e (getreal "\nВведите растаяние от нуля (00.00) :"))
   	 			(setq hr (getreal "\nВведите NISH грунта :"))
			)
		)

	 ) 	
  (setq f (getstring "\n Введите размер фонта: "))
  (setq s (getstring "\n название пикета (PK 0+000) :" ))
  (setq a1 (getpoint "Укажите начальную точку: "))
  (setq n (getreal "\n Введите начальное число"))
  (setq pk (getreal "\n Введите NISH грунта :"))
  )
)
)
)
Krcho вне форума  
 
Непрочитано 20.01.2009, 18:19
#7
Profan


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


В таком случае я какую-то фигню написал. Впрочем, я об этом знал заранее...
Profan вне форума  
 
Непрочитано 20.01.2009, 20:03
#8
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,118


1. объединяй setq:
Код:
[Выделить все]
(setq
f (getreal "\n Введите размер фонта: ")
s (getstring "\n название пикета (PK 0+000) :" )
a1 (getpoint "Укажите начальную точку ")
n (getreal "\n Введите начальное число:")
pk (getreal "\n Введите NISH грунта :")
)
тоже с command

2. если в while одна функция - можно без ProgN.

3. undo отменяет команды автокада, сделай как в п. 4, только вокруг комнад рисования чтоб их можно было одним анду отменить - тебе ведь это надо? отмену ввода значений лучше в програме делать, например в цикле запрашивать значения, а потом переспрашивать: всё ОК?
SetQ вне форума  
 
Непрочитано 20.01.2009, 22:40
#9
ShaggyDoc

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


Здесь надо принципиально изменять структуру программы. Сейчас сделан примитивный последовательный ввод данных (хоть объединяй setq, хоть нет). А надо делать ввод с опциями, как в командах AutoCAD.

Фактически здесь требуется для начала рисования только точка a1, а все остальное (f, s, n, pk) - опциональные значения. Их надо первоначально инициализировать, а затем в цикле запрашивать только точку a1. В приглашении должны выводиться действующие значения остальных параметров и быть опции для их изменения. Может ничего не надо менять, а можно что угодно поменять сколько угодно раз, и только когда будет введена точка a1 будет выполняться дальнейший расчет и рисование.

Приглашение для ввода точки должно быть наподобие:

"Фонт - 10, Пикет - PK 0+200, NISH- ???, Число - 25. Укажите начальную точку [Фонт/Пикет/NISH/Число]<Выход>:"
ShaggyDoc вне форума  
 
Непрочитано 21.01.2009, 15:13
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Krcho,
1. Правильный варинт - вариант ShaggyDoc,
2. Если хочешь в своей, то это тоже можно сделать. Нужно сохранять значения переменных в переменные Автокада USERR1 - USERR5 или USERI1 - USERI5 и использовать команду UNDO с опцией _M (сохранение) и _B (откат), контролируя значение переменной UNDOMARKS
Как пример смотри пост #8
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.02.2009, 11:52
#11
Krcho


 
Регистрация: 20.01.2009
Сообщений: 4
<phrase 1=


Спасибо большое. Все получилось. Сделал по варианту ShaggyDoc.
Krcho вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп программа. Как реализавать Undo



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как именно настроить параметры нового чертежа? Макс_Северянин AutoCAD 31 01.09.2010 10:16
Мониторы LCD CRT Разное 94 17.06.2008 10:51