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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как правильно организовать бесконечный цикл ?

как правильно организовать бесконечный цикл ?

Ответ
Поиск в этой теме
Непрочитано 27.06.2011, 09:30 #1
как правильно организовать бесконечный цикл ?
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

Доброго вреени!
У меня такой вопрос! как сделать выход из цикла данного вида
Код HTML:
(while 
;что-то делаем
(vl-cmdf "_.pline" )
   (while (= (getvar "CMDACTIVE") 1) (vl-cmdf pause))
   ;что-то делаем
)
по сути он получается бесконечным и прервать его не получается?
Просмотров: 5206
 
Непрочитано 27.06.2011, 11:05
#2
Do$

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


Код:
[Выделить все]
(while (;|тут должно быть условие для продолжения цикла/выхода из него|;)
;что-то делаем
(vl-cmdf "_.pline" )
   (while (= (getvar "CMDACTIVE") 1) (vl-cmdf pause)) ;здесь условием является (= (getvar "CMDACTIVE") 1), т.е. активность команды
   ;что-то делаем
)
Do$ вне форума  
 
Автор темы   Непрочитано 27.06.2011, 15:04
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


только цикл верхего уровня надо чтоб пользователь прервал т.е. нажал enter или esc как это сделать не пойму, получается если нажать enter то запускается последняя команда а по esc не прерывает цикл. через initget каждый раз спрашивать завершить тоже не хочется так.
ошибка видимо в условии работы цикла (while (= nil) но до этого я поступал точно также но вместо командного метода использовал (getpoint) и данный цикл работал(прерывался через esc), но решил что луше бы чтоб при отрисовке видна была линия и тут загвоздка
вот коды которые делаю
Код:
[Выделить все]
 (defun c:lin_trub (/ a b)  
 (while (= nil)
    (if (/= a "1")
      (progn
     (if (< (setq dcl_id (load_dialog "d_lt.dcl")) 0) (exit))
  (if (not (new_dialog "uz_lt" dcl_id)) (exit))
     ;Переключатель режимов подземные трубы
     (action_tile "pod"
       "(mode_tile \"tn1\" 1)
   (mode_tile \"tn2\" 1)
   (mode_tile \"tn3\" 1)
    (mode_tile \"tp1\" 0)
   (mode_tile \"tp2\" 0)
   (mode_tile \"tp3\" 0)
       (set_tile \"tn1\" \"0\")
       (set_tile \"tn2\" \"0\")
       (set_tile \"tn3\" \"0\")")
     ;Переключатель режимов наземные трубы
     (action_tile "naz"
       "(mode_tile \"tp1\" 1)
   (mode_tile \"tp2\" 1)
   (mode_tile \"tp3\" 1)
    (mode_tile \"tn1\" 0)
   (mode_tile \"tn2\" 0)
   (mode_tile \"tn3\" 0)
       (set_tile \"tp1\" \"0\")
       (set_tile \"tp2\" \"0\")
       (set_tile \"tp3\" \"0\")")
            ;Водопровод поземный
   (action_tile "tp1" "(setq t1  1  t2 nil t3 nil)
     (mode_tile \"tn1\" 1)
   (mode_tile \"tn2\" 1)
   (mode_tile \"tn3\" 1)
     (setq nt nil)")
   (action_tile "tp2" "(setq t2  1  t1 nil t3 nil)
     (mode_tile \"tn1\" 1)
   (mode_tile \"tn2\" 1)
   (mode_tile \"tn3\" 1)
     (setq nt nil)")
   (action_tile "tp3" "(setq t3  1  t2 nil t1 nil)
   (mode_tile \"tn1\" 1)
   (mode_tile \"tn2\" 1)
   (mode_tile \"tn3\" 1)
     (setq nt nil)")
    ;Водопровод наземный
  (action_tile "tn1" "(setq tr1  1 tr2 nil tr3 nil)
    (mode_tile \"tp1\" 1)
   (mode_tile \"tp2\" 1)
   (mode_tile \"tp3\" 1)
    (setq pt nil)")
  (action_tile "tn2" "(setq tr2  1 tr1 nil tr3 nil )
    (mode_tile \"tp1\" 1)
   (mode_tile \"tp2\" 1)
   (mode_tile \"tp3\" 1)
    (setq pt nil)")
  (action_tile "tn3" "(setq tr3  1 tr2 nil tr1 nil )
    (mode_tile \"tp1\" 1)
   (mode_tile \"tp2\" 1)
   (mode_tile \"tp3\" 1)
    (setq pt nil)")
       ;надпись трубопроводе
     (action_tile "npkw" "(setq kv  $value)")
     (action_tile "kp"  "(setq kp  $value)")
    ;значение сохранения
    (action_tile "no" "(setq a $value)")
       (setq b  (get_tile "no"))
(if (= a nil)
  (progn
    (setq a b)
    )
  (progn
        (set_tile "no" a)
    )
  ) 
    (start_dialog)
        (unload_dialog dcl_id )
     )
      )
  (vl-cmdf "_.pline" )
   (while (= (getvar "CMDACTIVE") 1) (vl-cmdf pause))
   (setq sp_tp (vl-remove-if-not '(lambda(x)(=(car x) 10))(entget(entlast))))
   (entdel(entlast))
        (setq k_ver(list (cons 90 (length sp_tp))))
  (if (= nil nt)
    (progn
      (if 
     (/= nil t1)
     (progn
     (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord")  (100 . "AcDbLayerTableRecord")
      (2 . "Водопровод поземный") (70 . 0) (62 . 5) (6 . "Vodoprovod") (290 . 1) (370 . 30)))
 (setvar "clayer" "Водопровод поземный")
       (setq sl (list(cons 8 "Водопровод поземный"))
      tip_lin (list(cons 6 "Vodoprovod")))
     )
     )
     (if
       (/= nil  t2)
       (progn
  (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord")   (100 . "AcDbLayerTableRecord")
      (2 . "Нефтепровод подземный") (70 . 0) (62 . 14) (6 . "Nefteprovod") (290 . 1) (370 . 30)))
 (setvar "clayer" "Нефтепровод подземный")
     (setq sl(list (cons 8 "Нефтепровод подземный"))
    tip_lin (list(cons 6 "Nefteprovod")))
       )
       )
    (if
     (/= nil t3)
     (progn
   (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord")
      (2 . "Газопровод подземный") (70 . 0) (62 . 1) (6 . "Gaz") (290 . 1) (370 . 30)))
 (setvar "clayer" "Газопровод подземный")
      (setq sl (list(cons 8 "Газопровод подземный"))
     tip_lin (list(cons 6 "Gaz")))
    )
     )
      )
    )
   (if (= nil pt)
    (progn
      (if 
     (/= nil tr1)
     (progn
     (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord")  (100 . "AcDbLayerTableRecord")
      (2 . "Водопровод наземный") (70 . 0) (62 . 5) (6 . "Vodoprovod_nazemniy") (290 . 1) (370 . 30)))
 (setvar "clayer" "Водопровод наземный")
       (setq sl (list(cons 8 "Водопровод наземный"))
      tip_lin (list(cons 6 "Vodoprovod_nazemniy")))
     )
     )
     (if
       (/= nil  tr2)
       (progn
  (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord")   (100 . "AcDbLayerTableRecord")
      (2 . "Нефтепровод наземный") (70 . 0) (62 . 14) (6 . "Nefteprovod_nazemniy") (290 . 1) (370 . 30)))
 (setvar "clayer" "Нефтепровод наземный")
     (setq sl(list (cons 8 "Нефтепровод наземный"))
   tip_lin (list(cons 6 "Nefteprovod_nazemniy")))
       )
       )
    (if
     (/= nil tr3)
     (progn
   (entmake '((0 . "LAYER")  (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord")
      (2 . "Газопровод наземный") (70 . 0) (62 . 1) (6 . "Gaz_nazemniy") (290 . 1) (370 . 30)))
 (setvar "clayer" "Газопровод наземный")
      (setq sl (list(cons 8 "Газопровод наземный"))
     tip_lin (list(cons 6 "Gaz_nazemniy")))
    )
     )
      )
    )
(entmake   (append '((0 . "LWPOLYLINE")   (100 . "AcDbEntity") (67 . 0) (410 . "Model")
  (100 . "AcDbPolyline")  (70 . 0) (43 . 0.0) (38 . 0.0)
 (39 . 0.0) 
  (210 0.0 0.0 1.0)) sl tip_lin k_ver  sp_tp))
   (command "_regen")
 
   )
   )
диалог
Код:
[Выделить все]
 uz_lt: dialog {label="Условные знаки трубопроводов";
:row{
: radio_row {label="Укажите подземные или наземные";
: radio_button {label="Подземные";key="pod";value="0";}
: radio_button {label="Подземные";key="naz";value="0";}
}
}
: row{
: radio_column {label="Подземные трубы";key="tp";
: radio_button {label="Водопровод"; key="tp1";value="0";}
: radio_button {label="Нефтепровод"; key="tp2";value="0";}
: radio_button {label="Газопровод"; key="tp3";value="0";}
}
: radio_column {label="Подземные трубы";key="tn";
: radio_button {label="Водопровод"; key="tn1";value="0";}
: radio_button {label="Нефтепровод"; key="tn2";value="0";}
: radio_button {label="Газопровод"; key="tn3";value="0";}
}
}
: row{
: column {label="Надпись";fixed_width=true; alignment=left;
: edit_box {label="Материал"; key="mat"; value="ст"; edit_width=6; }
: edit_box {label="Диаметр";  key="diam"; value="219"; edit_width=6;}
: edit_box {label="Глубина";  key="gl"; value="2.0"; edit_width=6;}
: edit_box {label="Давление";  key="dav"; value="н.д."; edit_width=6;}
}
: column {fixed_width=true; alignment=right;
: toggle {label="Не вызывать окно";  key="no"; value="0";}
: toggle {label="Создать надпись";  key="sntp"; value="1";}
}
}
ok_cancel;
}

Последний раз редактировалось mamuk, 27.06.2011 в 15:23.
mamuk вне форума  
 
Непрочитано 27.06.2011, 16:56
#4
Do$

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


Тут условием выхода из внешнего цикла может быть, к примеру, нажатие кнопки "cancel" в диалоге.
Do$ вне форума  
 
Непрочитано 27.06.2011, 17:53
#5
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Цитата:
решил что луше бы чтоб при отрисовке видна была линия
Ты про эту линию?
Код:
[Выделить все]
 (setq nt (getpoint "\nВведи первую точку: "))
(setq kt (getpoint nt "\nВведи вторую точку: "))
Oliver_88 вне форума  
 
Автор темы   Непрочитано 28.06.2011, 07:49
#6
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
Ты про эту линию?

Код:
view sourceprint?1(setq nt (getpoint "\nВведи первую точку: "))2(setq kt (getpoint nt "\nВведи вторую точку: "))
нет я через getpoint я получал список точек и потом по ним уже рисовал полилинию! не было так сказать визуального эфекта рисования и не удобно было когда не видишь что рисуешь.

Цитата:
Сообщение от Do$ Посмотреть сообщение
Тут условием выхода из внешнего цикла может быть, к примеру, нажатие кнопки "cancel" в диалоге.
А не покажите как можно через данную кнопочку получить выход или где прочитать можно! просто у всех конпок в dcl есть переменная которую можно назначить по ключу, а у ok_cancel я чесно незаю есть такая возможность?
mamuk вне форума  
 
Непрочитано 28.06.2011, 08:35
#7
Do$

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


Цитата:
Сообщение от mamuk Посмотреть сообщение
где прочитать можно
AutoLISP и VisualLISP в среде AutoCAD. Полещук Н.Н. и Лоскутов П.В. - это, не побоюсь этого слова, библия отечественного лиспописателя.
Про диалоги - глава 3 этой книги.
Цитата:
Сообщение от mamuk Посмотреть сообщение
как можно через данную кнопочку получить выход
Функция start_dialog возвращает 1, если выход из диалога произведен при помощи нажатия OK, и 0, если была нажата CANCEL (это справедливо, если не было никаких переназначений на эти кнопки функцией done_dialog).
То есть, можно сделать так:
Код:
[Выделить все]
...
(setq done_dialog_number (start_dialog)) ;вместо (start_dialog)
...
В первом while сделать условие:
Код:
[Выделить все]
(defun c:lin_trub (/ a b done_dialog_number)  
 (while (/= done_dialog_number 0);вместо (= nil)
...
А также, добавить условие, что если done_dialog_number=0, то по завершению диалога никаких вычислений-построений производиться не должно.
Do$ вне форума  
 
Автор темы   Непрочитано 28.06.2011, 08:49
#8
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Блогодарю вас за разъяснение!!!! надо будет попробовать!!!!!
mamuk вне форума  
 
Непрочитано 28.06.2011, 08:55
#9
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,518


mamuk что-за лисп? для чего он?
Рyslan вне форума  
 
Непрочитано 28.06.2011, 11:27
#10
gomer

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


Цитата:
Сообщение от Рyslan Посмотреть сообщение
Блогодарю вас за разъяснение
Обычно пользуются переменной what_next, которую предварительно выставляют в 2
gomer вне форума  
 
Непрочитано 28.06.2011, 12:44
#11
Do$

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


Сам придумал?
Do$ вне форума  
 
Непрочитано 28.06.2011, 13:19
#12
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Сам придумал?
неа логика в том что диалог вызывается пока не нажата кнопка ok или cancel
а цикл выглядит немного по другому:
Код:
[Выделить все]
 (setq what_next 2)
(while (< 1 what_next) ...)
gomer вне форума  
 
Непрочитано 28.06.2011, 14:23
#13
Do$

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


Сейчас еще раз взглянул на код - мой совет не поможет, если в диалоге поставить галочку "Не вызывать окно". Цикл тогда никак не прервать... Нужно либо убирать из диалога эту настройку и в каждом цикле наблюдать этот диалог, либо пересматривать алгоритм программы.
Do$ вне форума  
 
Автор темы   Непрочитано 28.06.2011, 15:01
#14
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от Рyslan Посмотреть сообщение
mamuk что-за лисп? для чего он?
рисую условные знаки трубороводов. хочу сделать подись коммуникаций еще.

Цитата:
Сообщение от Do$ Посмотреть сообщение
Сейчас еще раз взглянул на код - мой совет не поможет, если в диалоге поставить галочку "Не вызывать окно". Цикл тогда никак не прервать... Нужно либо убирать из диалога эту настройку и в каждом цикле наблюдать этот диалог, либо пересматривать алгоритм программы.
я вот склоняюсь к тому чтобы убрать настройку. конечно диалог рано или поздно начнет надоедать. и как переписать алгоритм пока не знаю(может рисовать полилинию в не цикла т.е. диалог будет вызываться или нет в зависимости от настройки, а потом уже рисовать полилинию такой вариант надо попробовать), я лишь так писака на lispe. буду искать решение!
mamuk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как правильно организовать бесконечный цикл ?

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Учёт ветра в "Лире" - как задать правильно? shakuredo Лира / Лира-САПР 5 08.10.2010 15:01
Как правильно организовать работу над проектом Kotsar AutoCAD 13 12.07.2007 18:22
Как правильно сделать сварную трубу из швеллеров? Chief Justice Прочее. Архитектура и строительство 36 01.04.2007 01:03
Правильно ли я делаю? AlexRU Прочее. Архитектура и строительство 13 24.03.2007 20:13
А ломаный скад (7.31 R4) правильно считает? satch SCAD 24 29.10.2004 10:01