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

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

Получать точки в цикле

Ответ
Поиск в этой теме
Непрочитано 22.09.2010, 09:47 #1
Получать точки в цикле
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Скажите, каким образом получить н-ное число точек (может быть одна, может 100), записать эти значения в переменные, скажем р1, р2, р3...Рн, а потом каким-то образом достать содержимое этих переменных для проверки.

Сделал так:

Код:
[Выделить все]
(setq n 0)
 (setq cr 5) 
 (while cr
   (set (read (strcat "p" (itoa n))) (getpoint))
   (setq ????)
   (if (= ??? nil)
     (setq cr nil)
     (setq n (+ n 1))
   )  
 )
Как это сделать не понимаю, помогите.
Просмотров: 2337
 
Непрочитано 22.09.2010, 10:08
1 | #2
TararykovDG

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


Zaghim, а если так

Код:
[Выделить все]
(defun Get_Points( / i pnt loc_lst result)
  (setq i 1)
  (while (setq pnt (getpoint (strcat "\n" (itoa i) "-я точка: ")))
    (setq loc_lst (cons pnt loc_lst))
    (setq i (1+ i))
  )
  (setq result loc_lst)
)

; Вызов (setq list_points (Get_Points))
; Для остановки ввода нажать Enter
; list_points - список введенных точек
TararykovDG вне форума  
 
Непрочитано 22.09.2010, 10:09
1 | #3
Disney

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


Если точки будишь получать через getpoint, то
Код:
[Выделить все]
(setq list_point nil)
(while (setq point (getpoint "\nТра-ля-ля <Выход>:"))
  (setq list_point(cons point list_point)))
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 22.09.2010, 10:31
#4
Zaghim


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


Понятно.
Сделал так:
Код:
[Выделить все]
(setq list_point nil)
  (setq cl 1)
  (setq sk 0)
  (while cl
    (setq point (getpoint "\nВведи точку или <Выход>:"))
      (if (= point nil)
        (setq cl nil)
    (progn
      (setq sk (1+ sk))
          (setq list_point(cons point list_point))
    )
      )
  )
SK для того, что бы потом так же в цикле NTH получать значения по одному!
СПАСИБО ОГРОМНОЕ, особенно диснею, опять выручил)
Zaghim вне форума  
 
Непрочитано 22.09.2010, 11:25
#5
Disney

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


Zaghim, не надо меня особенно подчёркивать, во-первых я сам знаю не много больше тебя, во-вторых TararykovDG ответил первым и более правильно (не смотря на то, что вместо (setq result loc_lst), можно было просто написать loc_lst) , т.е. оформил в отдельную функцию, потому-что не надо всё лепить в одну кучу, а то потом не разберёшься.
И я сам ещё недавно писал 10 setq подряд, списки прогонял через While вместо mapcar и foreach, использовал nth вместо car, cdr и их комбинаций. Да и до сих пор ни как к рекурсии не подступлюсь.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 22.09.2010, 11:54
#6
ShaggyDoc

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


Цитата:
Понятно.
Сделал так:
А вот теперь проверь свою конструкцию "на вшивость" (пока не формируя список). В момент запроса "Введи точку или <Выход>:"

1. Укажи точку
2. Введи с клавиатуры правильно
3. Введи неправильно, например, одно число
4. Нажми ESC
5. Введи опцию "В"
6. Нажми Enter

Посмотри, в каждом варианте, что будет с циклом и что будет в списке.
Точки надо и на "точковость" проверять. Не надо завязывать while на какую-то cl. Не надо здесь никакой ck, потому что получать "потом" значения элементов списка через функцию nth можно через свою локальную переменную.

Вообще вынеси получение точки в свою функцию типа zaghim-getpoint-or-exit, которая будет надежно принимать точки и возвращать только nil или "истинную" точку, несмотря на любые действия "обезьяны с гранатой", сидящей за компьютером. Такая функция тебе тысячу раз пригодится

Вот тогда можно сделать просто и красиво:

Код:
[Выделить все]
;; (setq list_point nil) ;;это можно не делать, если list_point объявлена локальной
(while (setq point (zaghim-getpoint-or-exit "Введи очередную точку такой-то хрени"))
  (setq list_point(cons point list_point))
)
И этот цикл можно также загнать в библиотечную функцию, наподобие

Код:
[Выделить все]
(defun zaghim-get-list-points (message / point result)
  (while (setq point (zaghim-getpoint-or-exit message))
    (setq result (cons point result))
 )
(reverse result)
Имея такую функцию сможешь в десятках программ очень просто получать списки точек.

Код:
[Выделить все]
(setq list_points (zaghim-get-list-points "Введи очередную точку"))
Если будут обнаруживаться ошибки или надо будет совершенствовать, то это будет в одном месте, а не в десятках
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получать точки в цикле



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу пример расчета инсоляции FINE Поиск литературы, чертежей, моделей и прочих материалов 266 25.10.2017 18:54
Как вычислить расстояние от точки до точки методами ActiveX? Supermax Программирование 31 20.11.2009 12:23
Поставить точки в местах пересечений Юта Программирование 15 15.07.2009 16:01
как в CIVIL 3D точки нанесенные в 3-ке - перенести в точки п maksimys AutoCAD 3 23.08.2007 14:13
Lisp - проблема с получением точки? Кулик Алексей aka kpblc LISP 3 08.09.2006 15:14