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

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

Autolisp. Рисуем ответвления

Ответ
Поиск в этой теме
Непрочитано 16.12.2010, 15:22 #1
Autolisp. Рисуем ответвления
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, подскажите каким образом реализовать следующий алгоритм: ставлю точку, предлагается поставить другую точку, ставлю вторую точку. После этого вопрос следующая точка, либо ответвление, либо выход. Если ответвление, то должен запомнить точку и из нее резиновая линия куда захочется, дальше тоже может быть вопрос ответвление или выход или дальше И ТД... при выходе с ответвления должен вернуться на предыдущую точку и опять те же вопросы...
Просмотров: 1973
 
Непрочитано 16.12.2010, 16:11
2 | #2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Это хороший повод понять что такое рекурсия:
Код:
[Выделить все]
(defun menu (name lvar); Выводит запрос name и выбор вариантов lvar, возвращает выбранный
(initget (apply 'strcat (mapcar '(lambda (x) (strcat x " ")) lvar)))
(getkword (strcat "\n " name "[" (apply 'strcat (mapcar '(lambda (x) (strcat x "/")) lvar)) "]"))
);end of menu

(defun c:tree ()
  ((lambda (f-rec pt)
     (if pt (f-rec pt)))
   (lambda (pt)
     ((lambda (pt2)
        (if pt2
            (progn (entmakex (list (cons 0 "line") (cons 10 pt) (cons 11 pt2)))
                       (cons pt (f-rec pt2)))
            ((lambda (ch)
              (if (= ch "1")
                  (f-rec pt)
                  (if (= ch "2")
                      (cons (f-rec pt) (f-rec pt))
                      (list pt))))
            (menu "\nЧто дальше " '("1 - Продолжить" "2 - Новая ветка" "3 - Вернуться")))))
      (getpoint pt "\nNext point or ...")))
   (getpoint "\nFirst point ")))
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.12.2010 в 13:54.
Дима_ вне форума  
 
Автор темы   Непрочитано 16.12.2010, 16:27
#3
Zaghim


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


Все круто, работает!!! Спасибо, бум разбираться!

Последний раз редактировалось Zaghim, 16.12.2010 в 16:37.
Zaghim вне форума  
 
Непрочитано 17.12.2010, 08:56
1 | #4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Конечно же данная задача классическим образом решается с помощью рекурсии, что и сделал Дима_, и все же раз мы в разделе "Программирование", то вот еще вариант без рекурсии

Код:
[Выделить все]
(defun c:tree()
  ((lambda(pt0)
     (if (not (vl-catch-all-error-p pt0))
       ((lambda(lst_last_pt)
          (while lst_last_pt
            ((lambda(pt1)
               (if (and pt1 (not (vl-catch-all-error-p pt1)))
                 (cond
                   ((= pt1 "0")
                    (setq lst_last_pt (cons (getpoint (car lst_last_pt) "\n Первая точка новой ветки: ") lst_last_pt))
                    (entmakex (list (cons 0 "line") (cons 10 (cadr lst_last_pt)) (cons 11 (car lst_last_pt))))
                    )
                   ((= pt1 "1")
                    (setq lst_last_pt (cdr lst_last_pt))
                    )
                   (T
                    (entmakex (list (cons 0 "line") (cons 10 (car lst_last_pt)) (cons 11 pt1)))
                    (setq lst_last_pt (cons pt1 (cdr lst_last_pt)))
                    )
                   )
                 (setq lst_last_pt nil)
                 )
               )
              (progn
                (initget "0 1")
                (vl-catch-all-apply 'getpoint
                                    (list (car lst_last_pt) "\n Следующая точка или [0 - Новая ветка/1 - Вернуться]: ")
                                    )
                )
              )
            )
          )
         (list pt0)
         )
       )
     )
    (progn
      (initget 1)
      (vl-catch-all-apply 'getpoint
                          (list "\n Первая точка: ")
                          )
      )
    )
  (princ)
  ); end defun
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 17.12.2010, 09:24
1 | #5
ShaggyDoc

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


Цитата:
ставлю точку, предлагается поставить другую точку, ставлю вторую точку. После этого вопрос следующая точка, либо ответвление, либо выход
Это очень распространенная задача - автоматически "брать" какую-то из "предыдущих" точек. Сам по себе ввод точек реализовать несложно. В ruCAD я задачу расширил - сделал универсальную функцию, которая не только точки запрашивает, но и рисует "что угодно".
Код:
[Выделить все]
(defun ru-pipe-draw-any
       (func param_lst msg_1pt msg_2pt / start_pnt end_pnt end)
  ;; Рисование любого элемента трубопровода или чего угодно
  ;; func - имя функции рисования по quote
  ;; которой в дальнейшем передаются точка1 точка2 и список
  ;; параметров и которая изменяет *ru_last_start_point* *ru_last_end_point*
  ;;msg_1pt  - приглашение для точки1
  ;;msg_2pt  - приглашение для точки2
  (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)
                    ) 
    ) 
    (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)
      )
    ) 
  ) 
  (ru-app-end)
  (princ)
)
Примеры:

(ru-pipe-draw-any (quote ru-pipe-line) (list 400.0 400.0) "Начало прямого участка" "Конец прямого участка")

(ru-pipe-draw-any (quote ru-pipe-block-simmetric) (list "equipment\\ru-lib-fitings" "nipple_joint_15_RU" 43.0 ) "Конец трубы" "Направление конца штуцера")"

Такие вызовы прописываются на уровне меню (у меня XML) и обычные пользователи уровня "смышленая тетка" сами расширяют систему.

Скопировав, например, строку с вызовом

(ru-pipe-draw-any (quote ru-pipe-flexible) 15.0 "Начало гибкого трубопровода" "Точка направления гибкого трубопровода") и изменив 15.0 на другое значение, наприме, 50, "тетка" получает в меню новый вариант.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 17.12.2010, 12:56
#6
Zaghim


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


Было бы круто, если бы работало как в 1 примере, только это меню появлялось сразу...т.е. не нужно было бы жать enter после ввода точки, а потом уже делать выбор...вроде лишнее действие. И еще вопрос, можно запоминать все введенные точки в список с какой-либо грамотно организованной последовательностью. Просто потом эту ветку нужно будет обрабатывать и нужно понимать что за чем идет, вот.

А вообще ВСЕМ ОГРОМНОЕ СПАСИБО!!!!!!
Zaghim вне форума  
 
Непрочитано 17.12.2010, 13:57
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Zaghim Посмотреть сообщение
И еще вопрос, можно запоминать все введенные точки в список с какой-либо грамотно организованной последовательностью.
Добавил (выделенно жирным) во 2 посте - теперь функция будет возращать список из вершин и подсписков вершин (по мере построения).
P.S. про первую часть вопроса не понял - ты рисуешь линию, а когда надо разветвить\вернутся давишь правую кнопку мыши - зачем тебе это меню постоянно (сделать не проблемма - стереть пару строк и все), только количество "манипуляций" как-раз возрастет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.12.2010 в 15:05.
Дима_ вне форума  
 
Непрочитано 17.12.2010, 14:25
#8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Было бы круто, если бы работало как в 1 примере, только это меню появлялось сразу...т.е. не нужно было бы жать enter после ввода точки, а потом уже делать выбор...вроде лишнее действие.
Так в моем примере (пост #4) так и сделано!?
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Рисуем ответвления



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoLisp и база данных SQL-сервера Макс_Кунгур LISP 83 25.06.2019 12:00
Проблемы с расчетом Ж/Б каркаса в ANSYS derik ANSYS 457 04.07.2017 16:16
Реализация алгоритма шифрования AES средствами AutoLisp gomer LISP 20 09.09.2010 11:55
Изменение слоя примитивов Autocad из autolisp Anja_smol LISP 3 20.11.2009 17:04
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37