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

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

Как ввести ключевое слово в командную строку при выполнении цикла lisp'ом?

Ответ
Поиск в этой теме
Непрочитано 13.05.2010, 11:12 #1
Как ввести ключевое слово в командную строку при выполнении цикла lisp'ом?
Дмитрий_Leo
 
Регистрация: 27.07.2009
Сообщений: 28

Добрый день. С недавнего времени начал интерисоваться Lisp'ом. И вот какая проблема возникла - есть цикл (цикл отслеживает текущие координаты курсора (grread) выход из цикла после нажатия кнопки мыши), но во время выполнения цикла не получается ввести ключи в командную строку cad'а, до и после цикла без проблем, а во время цикла вообще никакие символы набрать не получается. Надеюсь кто-нибудь знает как решить или обойти эту проблему. Заранее спасибо.

Последний раз редактировалось Дмитрий_Leo, 13.05.2010 в 11:17.
Просмотров: 3447
 
Непрочитано 13.05.2010, 11:31
#2
Do$

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


Код бы посмотреть, чтоб в гадалки не играть...
Do$ вне форума  
 
Непрочитано 13.05.2010, 11:50
#3
ShaggyDoc

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


"Начиная интересоваться" LISP стоит отложить функцию grread напоследок.

Она и не предназначена для ввода ключевых слов - отслеживает положение курсора и коды нажатых клавиш, заданных ограниченным набором.

Любой ввод, позволяющий использовать ключевые слова (а заодно и контекстное меню), выполняется с помощью функций initget и getXXX.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 13.05.2010, 12:17
#4
Дмитрий_Leo


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


Програмка которую я пытаюсь написать по своей сути очень похожа на команду _pline, но только вместо "резиновой линии" должны показываться объекты по определенному алгоритму. В процессе изучения я делал пробные версии с командой initget, и между двумя указанными точками все прекрасно строилось. Но мне нужно чтобы мои объекты показывались в реальном времени и следовали за курсором.
Вот фрагмент кода который производит эти манипуляции, и загвоздка в том чтоб после начала цикла (while (/= value 3) и до его завершения, в командндную строку cad'а можно было бы ввести ключ, который обрабатывался бы в другой части кода

Код:
[Выделить все]
(defun c:test (/)


  (initget 7)
  (setq scl (getreal "\nМасштаб 1:"))
  (initget 1)
  (setq startpoint (getpoint "\nСтартовая точка"))


  (setq nextpoint (cadr (setq dinamicpoint (grread t 7 0))))

  (setq value (car (setq dinamicpoint (grread t 7 0))))



  (while (/= value 3)


    (setq n (fix (/ (distance startpoint nextpoint) (/ 500 scl))))

    (if	(> n 100)
      (setq n 100)
      (setq n n)
    ) ;_if

    (setq listname '())

    (setq i 0)

    (while (< i n)

      (if (= (rem i 2) 0)
	(progn (setq 500i (* i 500))
	       (setq realangle (angle startpoint nextpoint))
	)
	(progn (setq 500i (* (+ 1 i) 500))
	       (setq realangle (angle nextpoint startpoint))
	)
      ) ;_if

      (entmake
	(list
	  '(0 . "INSERT")
	  '(100 . "AcDbBlockReference")
	  '(8 . "0")
	  '(2 . "Shpunt_L5UM")
	  (cons
	    '10
	    (list
	      (+ (car startpoint)
		 (/ (* (cos (angle startpoint nextpoint)) 500i) scl)
	      )
	      (+ (cadr startpoint)
		 (/ (* (sin (angle startpoint nextpoint)) 500i) scl)
	      )
	      0.0
	    ) ;_list
	  ) ;_cons

	  (cons 41 (/ 1 scl))
	  (cons 42 (/ 1 scl))
	  (cons 50 realangle)
	) ;_list

      ) ;_entmake

      (setq i (1+ i))

      (setq objname (cdr (assoc -1 (entget (entlast)))))
      (setq listname (cons objname listname))

    ) ;_while

    (setq nextpoint (cadr (setq dinamicpoint (grread t 7 0))))
    (setq value (car (setq dinamicpoint (grread t 7 0))))

    (setq listname (reverse listname))
    (setq j 0)
    (while (< j i)
      (entdel (nth j listname))
      (setq j (1+ j))
    ) ;_while

  ) ;_while

) ;_defun

Последний раз редактировалось Дмитрий_Leo, 13.05.2010 в 12:54.
Дмитрий_Leo вне форума  
 
Непрочитано 13.05.2010, 13:09
#5
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Рекомендую для начала посмотреть здесь - динамические построения
CB вне форума  
 
Непрочитано 13.05.2010, 16:10
#6
Do$

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


У меня вот что получилось, можно использовать для примера:
Код:
[Выделить все]
(defun c:test (/ key gr word msg)
  (setq	key "keyword"
	msg "\nВведите ключевое слово <Укажете точку - выход>:"
  ) ;_ end of setq
  (prompt msg)
  (while (/= 3 (car (setq gr (grread T 9))))
    (if
      (= (car gr) 2)
       (progn
	 (if (and word (= (cadr gr) 13))
	   (progn
	     (if (and word (equal (reverse word) (vl-string->list key)))
	       (alert (strcat "Вы набрали слово " key "!"))
	       (alert (strcat "Неизвестное ключевое слово "
			      (vl-list->string (reverse word))
			      "!"
		      ) ;_ end of strcat
	       ) ;_ end of alert
	     ) ;_ end of if
	     (setq word (prompt msg))
	   ) ;_ end of progn
	   (progn
	     (princ (chr (cadr gr)))
	     (setq word (cons (cadr gr) word))
	   ) ;_ end of progn
	 ) ;_ end of if
       ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of while
  (cadr gr)
) ;_ end of defun
Попробуйте ввести "keyword"
Do$ вне форума  
 
Автор темы   Непрочитано 13.05.2010, 16:34
#7
Дмитрий_Leo


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


Спасибо Do$. Я понял Вашу идею. Сейчас начну пробы.
Дмитрий_Leo вне форума  
 
Непрочитано 14.05.2010, 17:21
#8
ShaggyDoc

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


Цитата:
Но мне нужно чтобы мои объекты показывались в реальном времени и следовали за курсором.
Чтобы следовали, их можно рисовать, а при необходимости отменять. Как и работает команда pline.

Разделите свою задачу на логические части (функции).

1. Общий ввод точек через getpoint с любыми необходимыми опциями и ключевыми словами. В том числе, например, с возможностью отмены. Эта основная функция должна быть предельно на вид простой за счет вызова внутри других функций, каждая из которых решает частную задачу. Например, надежного ввода точки, учитывающего неправильные действия пользователей.

Важнейшим аргументом такой функции должно быть имя "функции рисования".

Пример. У меня в ruCAD есть функция

(ru-pipe-draw-any func param_lst msg_1pt msg_2pt)

здесь в аргументах

func - имя "функции рисования" сегмента
param_lst - любой список параметров для рисования сегмента
msg_1pt и msg_2pt - тексты подсказок при вводе первой и последующих точек.

Код:
[Выделить все]
(defun ru-pipe-draw-any
       (func param_lst msg_1pt msg_2pt / start_pnt end_pnt end)
  (ru-app-begin)
  (while (not end)
    (setq start_pnt (if *ru_last_end_point*
                      (ru-get-point-or-lw-or-continue-or-exit msg_1pt)
                      (ru-get-point-or-exit-with-offset msg_1pt nil)
                    ) ;_ end of if
    ) ;_ end of if
    (cond
      ((ru-is-point start_pnt)
       ((eval func)
         start_pnt
         (ru-get-point-reguired-with-offset msg_2pt start_pnt)
         param_lst
       )
      )
      ((null start_pnt)
       (setq end t)
      )
    ) ;_ end of cond
  ) ;_ end of while
  (ru-app-end)
  (princ)
) ;_ end of defun
Важнейший участок кода, вызывающий рисование выделен красным.

2. Функция рисования сколь угодно сложным способом отдельного сегмента. Например

Код:
[Выделить все]
(defun ru-pipe-simple    (pnt_start pnt_end param_lst)
  (ru-pipe-line pnt_start pnt_end (list param_lst param_lst))
)
Она, в свою очередь вызывает функцию ru-pipe-line
Код:
[Выделить все]
(defun ru-pipe-line
       (pnt_start pnt_end param_lst / r_start r_end ang right left)
  (setq
    r_start (/ (car param_lst) 2.0)
    r_end   (/ (cadr param_lst) 2.0)
    ang     (angle pnt_start pnt_end)
    right   (ru-geom-go-right ang)
    left    (ru-geom-go-left ang)
  ) ;_ end of setq
  (ru-line-add-multi
    (list (polar pnt_start right r_start)
          (polar pnt_end right r_end)
          (polar pnt_end left r_end)
          (polar pnt_start left r_start)
    ) ;_ end of list
    t
    (ru-lw-current)
    nil
  ) ;_ end of 
  (ru-line-add pnt_start (setq *ru_last_end_point* pnt_end) 0 (ru-ltype-axes))
)
3. Общая функция ("команда") будет очень проста, например:

Код:
[Выделить все]
(ru-pipe-draw-any (quote ru-pipe-simple) 200.0 "Начало участка трубы" "Конечная точка участка трубы")
Такая программа рисует сегменты трубы диаметром 200 с возможностями привязки к предыдущим точкам, создания нового начала и т.п.

Меняем аргумент и получаем множество програм для рисования труб разных диаметров "в три линии". Это самый простой случай.

Другой вызов этой же функции
Код:
[Выделить все]
(ru-pipe-draw-any (quote ru-pipe-flexible) 50.0 "Начало гибкого трубопровода" "Точка направления гибкого трубопровода")"
позволяет рисовать уже гофрированный трубопровод

А еще вариант
Код:
[Выделить все]
(ru-pipe-draw-any (quote ru-pipe-block-simmetric) (list "equipment\\ru-lib-fitings" "nipple_joint_25_RU" 72.0 ) "Конец трубы" "Направление конца штуцера")"
создает сегмент с использованием блока. Вариантов можно делать бесконечное количество - везде работает одна базовая функция. Надо только менять имя функции рисования.
ShaggyDoc вне форума  
 
Непрочитано 15.05.2010, 09:44
#9
gomer

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


В download посмотри "Набор программ от CADALYST", а в нем команду dfillet в меню "фаски и сопряжения" вроде то что тебе нужно!
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как ввести ключевое слово в командную строку при выполнении цикла lisp'ом?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Электромагнитная пушка T-Yoke Машиностроение 112 06.08.2008 18:48
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41