Тема: часы в лиспе

Интересно, а можно ли в лисп встроить часы, и чтоб он (лисп) через заданное время не включался больше?

Re: часы в лиспе

Вот здесь
http://dwg.ru/forum/viewtopic.php?t=552 … mp;start=0
полно часов на лиспе, значит лисп умеет считывать время, а если умеет считывать время, то, наверное возможно заставить его отключиться при наступлении заданного времени, или я что-то не правильно понимаю?

Re: часы в лиспе

Неужели никто так и не откликнется?
Знатоки лиспа, напишите хоть такое возможно или нет?

Re: часы в лиспе

Невозможно.

Re: часы в лиспе

Может что-то типа такого (В 15 часов перестанет работать)

(defun C:TEST ()
  (if (= (substr (rtos (getvar "CDATE")) 10 2)
     "15" ;_В 15 часов
     )
    (setq C:TEST nil)
    (princ "\n*** Работаю ***")
    )
  (princ)
  )

Re: часы в лиспе

Не-а. При запуске в 15:00 не будет работать. При запуске в 16:30 корректно сработал.

Re: часы в лиспе

А уменя все сработало, я даже несколько раз менял время и в лиспе и на часах, все работает корректно!
Скажите,уважаемый VVA, а можно ли вместо часов установить дату?

Re: часы в лиспе

Посмотри описание переменной CDATE

Re: часы в лиспе

> Александр Ривилис
Посмотрел...
и не понял, как все же устаноить дату?
Извините!

Re: часы в лиспе

Команда: (rtos (getvar "CDATE") 2 16) "[b]20080723[/b].17060893"

Обрати внимание на цифры до точки. Формат: ГГГГММДД, где ГГГГ-год, ММ-месяц, ДД - день.

Re: часы в лиспе

> Кулик Алексей aka kpblc
Я там в rtos перепутал местами режим и точность. Может по этому. Должно быть так

(defun C:TEST ()
  (if (= (substr (rtos (getvar "CDATE")) 2 16)
   "15" ;_В 15 часов
   )
    (setq C:TEST nil)
    (princ "\n*** Работаю ***")
    )
  (princ)
  )

> Сергей
Про дату см > Александр Ривилис (2008-07-23 18:09:08)

Re: часы в лиспе

> VVA
Странно!
И у меня теперь не работает, т.е. не зависио от времени и даты утверждает, что работает!

Re: часы в лиспе

> Сергей
Что значит в попыхах и без проверки

(defun C:TEST ()
  (if (= (substr (rtos (getvar "CDATE") 2 16) 10 2)
   "15" ;_В 15 часов
   )
    (setq C:TEST nil)
    (princ "\n*** Работаю ***")
    )
  (princ)
  )

Re: часы в лиспе

> VVA
Уважаемый VVA, к сожалению и эта сборка не работает!
Результат тот же:> Сергей (2008-07-23 20:43:23)
Помогите, очень уж надо!
С уважением!

Re: часы в лиспе

А у меня работает. В 12-00 пишет работаю, а в 15-00 ничего не пишет, а при повторном вызове пишет "неизвестная команда"

Re: часы в лиспе

> VVA
,
Нет,все же что-то не то!
Я пытаюсь экспериментировать и с датами тоже по совету> Александр Ривилис (2008-07-23 18:09:08)
и тоже ничего!
И вчаташняя дата и завтрашняя все одно:"работаю"!

Re: часы в лиспе

(defun c:test ()
  (if (>= (atof (substr (rtos (getvar "CDATE") 2 16) 10 2)) [b]14[/b])
;;; До 14:00 работать будет.
    (setq c:test nil)
    (princ "\n*** Работаю ***")
    ) ;_ end of if
  (princ)
  ) ;_ end of defun

Re: часы в лиспе

> Кулик Алексей aka kpblc
Хорошо, со временем вроде работает, а вот с датами-нет!

Re: часы в лиспе

> Сергей
А подумать и прочитать что тебе здесь все пишут?

(defun c:test ()
;;; Работает до 1-го сентября 2008 года
  (if (> (getvar "CDATE") 20080901.0)
    (setq c:test nil)
    (princ "\n*** Работаю ***")
  ) ;_ end of if
  (princ)
) ;_ end of defun

Re: часы в лиспе

> Александр Ривилис
Уважаемый Александр!
Спасибо, все работает, что поделаешь, я совсем новичек, и очень хочу научиться!
У меня есть последний (я надеюсь)вопрос.

> Сергей
Здесь я спросил:"Интересно, а можно ли в лисп встроить часы, и чтоб он (лисп) через заданное время не включался больше?"
Так вот, у меня есть лисп, который работает, и именно этот лисп необходимо ограничить во времени.
Могу ли я использовать вышеизложенный лисп, как заготовку, и если да, то как?
Т.е. другими словами, можно ли их как то объединить?

Re: часы в лиспе

Добавь конструкцию в начало твоей функции:

;;; Работает до 1-го сентября 2008 года
  (if (> (getvar "CDATE") 20080901.0)
    (exit); выход
    (princ "\n*** Работаю ***")
  ) ;_ end of if

Re: часы в лиспе

Возможна такая функция. Lisp будет работать 30 дней с момента запуска (считая, что в месяце 30 дней и без учета часов).

(defun c:date_verify (/ date_work date_s)
  (if (setq date_work (getcfg "AppData/Lisp_test/Date_work"))
    (progn
      (setq date_s (mapcar '(lambda (x) (mapcar 'atof (mapcar 'substr (list x x x) '(1 5 7) '(4 2 2)))) (list date_work (rtos (getvar "CDATE") 2 0))))
      (if (> ((lambda (x y)
            (+ (* 12 (- (car y) (car x)))
           (* 30 (- (cadr y) (cadr x)))
           (- (caddr y) (caddr x))))
           (car date_s) (cadr date_s)) 30)
        (progn
      (princ "\n*** Срок дейсвия закончился! ***")
      (exit)
        )
      )
    )
    (setcfg "AppData/Lisp_test/Date_work" (rtos (getvar "CDATE") 2 0))
  )
)

Re: часы в лиспе

> Donhuan
30 дней легче посчитать с помощью

(fix (getvar 'DATE))

Re: часы в лиспе

;; Для начала делаем простенькое шифрование программы
;; и сохраняем текст с программой в переменную - дальше, можно сразу писать в файл и.т.д...
(setq prog
      (vl-string-translate
       (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
       (vl-list->string
        (mapcar (function (lambda (x) (boole 6 x 128)))
                (vl-string->list
                 (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
                ) ;_  vl-string->list
        ) ;_  mapcar
       ) ;_  vl-list->string
       (vl-prin1-to-string
        '(defun
          c:test
          (/ P1 P2 V)
          ;; by ElpanovEvgeniy
          ;; http://dwg.ru/f/showpost.php?p=267751&postcount=10
          ;; Описание алгоритма работы программы
          (setq
           ;; Вычисляем две точки
           p1
           (getpoint "\n Укажите середину первой стороы")
           p2
           (getpoint "\n Укажите середину второй стороны")
           ;; Вычисляем коэфициент, во сколько раз расстояние между точками
           ;; больше половины стороны (0.8)
           v
           (/ (distance p1 p2) 0.4)
           ;; вычисляем вектор смещения, между точками
           ;; при вычитании, я использовал еще одну точку с координатами 0,0
           ;; это позволило отбросить Z измерение в векторе
           ;; и укоротил вектор до длинны 0.4 единицы
           ;; получился вектор длинной 0.4
           ;; и с направлением равым углу из второй в первую точку
           v
           (mapcar '/ (mapcar '- p1 p2 '(0 0)) (list v v))
           ;; поворачиваем вектор на 90 градусов, против часовой стрелки
           v
           (list (- (cadr v)) (car v))
          ) ;_  setq
          ;; собственно создание полилинии, используя коды dxf
          (entmakex
           (append
            '((0 . "LWPOLYLINE")
              (100 . "AcDbEntity")
              (410 . "Model")
              (100 . "AcDbPolyline")
              (90 . 4)
              (70 . 1)
              (43 . 0.3)
             )
            ;; добавляем ко всем четырем точкам код 10 в начало
            (mapcar
             'cons
             '(10 10 10 10)
             ;; делаем смещение точек вектором в обе стороны, т.е. +/- 0.4
             (mapcar 'mapcar '(- + + -) (list p1 p1 p2 p2) (list v v v v))
            ) ;_  mapcar
           ) ;_  append
          ) ;_  entmakex
         ) ;_  defun
       ) ;_  vl-prin1-to-string
      ) ;_  vl-string-translate
) ;_  setq
;; В итоге, в переменной сохранился текст подобного содержания,
;; но без переносов на другую строку.
;; Форматирование я специально добавил, чтоб было удобнее просматривать отличия,
;; от оригинала. Очевидно, что программа не будет работать...
"(DEFUN C:TEST (/ P1 PІ V)
  (SETQ P1 (GETPOINT \"\n Укажите середину первой стороы\")
        PІ (GETPOINT \"\n Укажите середину второй стороны\")
        V  (/ (DISTANCE P1 PІ) °)
        V  (MAPCAR (QUOTE /)
                   (MAPCAR (QUOTE -) P1 PІ (QUOTE (° °)))
                   (LIST V V)
           )
        V  (LIST (- (CADR V)) (CAR V))
  )
  (ENTMAKEX (APPEND (QUOTE ((° . \"LWPOLYLINE\")
                            (1°° . \"AcDbEntitщ\")
                            (41° . \"Modeм\")
                            (1°° . \"AcDbPoмщмine\")
                            (9° . 4)
                            (7° . 1)
                            (43 . °)
                           )
                    )
                    (MAPCAR (QUOTE CONS)
                            (QUOTE (1° 1° 1° 1°))
                            (MAPCAR (QUOTE MAPCAR)
                                    (QUOTE (- + + -))
                                    (LIST P1 P1 PІ PІ)
                                    (LIST V V V V)
                            )
                    )
            )
  )
)
"
;; Такой текст пишем в файл, можно его и скомпилировать...
;; программа получилась не рабочая только до конца июля 2008 года.
(eval
(read
  (vl-string-translate
   (vl-list->string
    (mapcar (function (lambda (x) (boole 6 x 128)))
            (vl-string->list
             (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
            ) ;_  vl-string->list
    ) ;_  mapcar
   ) ;_  vl-list->string
   (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
   "(DEFUN C:TEST (/ P1 PІ V)
     (SETQ P1 (GETPOINT \"\n Укажите середину первой стороы\")
           PІ (GETPOINT \"\n Укажите середину второй стороны\")
           V  (/ (DISTANCE P1 PІ) °)
           V  (MAPCAR (QUOTE /)
                      (MAPCAR (QUOTE -) P1 PІ (QUOTE (° °)))
                      (LIST V V)
              )
           V  (LIST (- (CADR V)) (CAR V))
     )
     (ENTMAKEX (APPEND (QUOTE ((° . \"LWPOLYLINE\")
                               (1°° . \"AcDbEntitщ\")
                               (41° . \"Modeм\")
                               (1°° . \"AcDbPoмщмine\")
                               (9° . 4)
                               (7° . 1)
                               (43 . °)
                              )
                       )
                       (MAPCAR (QUOTE CONS)
                               (QUOTE (1° 1° 1° 1°))
                               (MAPCAR (QUOTE MAPCAR)
                                       (QUOTE (- + + -))
                                       (LIST P1 P1 PІ PІ)
                                       (LIST V V V V)
                               )
                       )
               )
     )
    )
   ") ;_  vl-string-translate
) ;_  read
) ;_  eval

Re: часы в лиспе

повторюсь, только ради тегов...

;; Для начала делаем простенькое шифрование программы
;; и сохраняем текст с программой в переменную - дальше, можно сразу писать в файл и.т.д...
(setq prog
      (vl-string-translate
       (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
       (vl-list->string
        (mapcar (function (lambda (x) (boole 6 x 128)))
                (vl-string->list
                 (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
                ) ;_  vl-string->list
        ) ;_  mapcar
       ) ;_  vl-list->string
       (vl-prin1-to-string
        '(defun
          c:test
          (/ P1 P2 V)
          ;; by ElpanovEvgeniy
          ;; http://dwg.ru/f/showpost.php?p=267751&postcount=10
          ;; Описание алгоритма работы программы
          (setq
           ;; Вычисляем две точки
           p1
           (getpoint "\n Укажите середину первой стороы")
           p2
           (getpoint "\n Укажите середину второй стороны")
           ;; Вычисляем коэфициент, во сколько раз расстояние между точками
           ;; больше половины стороны (0.8)
           v
           (/ (distance p1 p2) 0.4)
           ;; вычисляем вектор смещения, между точками
           ;; при вычитании, я использовал еще одну точку с координатами 0,0
           ;; это позволило отбросить Z измерение в векторе
           ;; и укоротил вектор до длинны 0.4 единицы
           ;; получился вектор длинной 0.4
           ;; и с направлением равым углу из второй в первую точку
           v
           (mapcar '/ (mapcar '- p1 p2 '(0 0)) (list v v))
           ;; поворачиваем вектор на 90 градусов, против часовой стрелки
           v
           (list (- (cadr v)) (car v))
          ) ;_  setq
          ;; собственно создание полилинии, используя коды dxf
          (entmakex
           (append
            '((0 . "LWPOLYLINE")
              (100 . "AcDbEntity")
              (410 . "Model")
              (100 . "AcDbPolyline")
              (90 . 4)
              (70 . 1)
              (43 . 0.3)
             )
            ;; добавляем ко всем четырем точкам код 10 в начало
            (mapcar
             'cons
             '(10 10 10 10)
             ;; делаем смещение точек вектором в обе стороны, т.е. +/- 0.4
             (mapcar 'mapcar '(- + + -) (list p1 p1 p2 p2) (list v v v v))
            ) ;_  mapcar
           ) ;_  append
          ) ;_  entmakex
         ) ;_  defun
       ) ;_  vl-prin1-to-string
      ) ;_  vl-string-translate
) ;_  setq
;; В итоге, в переменной сохранился текст подобного содержания,
;; но без переносов на другую строку.
;; Форматирование я специально добавил, чтоб было удобнее просматривать отличия,
;; от оригинала. Очевидно, что программа не будет работать...
 "(DEFUN C:TEST (/ P1 PІ V)
  (SETQ P1 (GETPOINT \"\n Укажите середину первой стороы\")
        PІ (GETPOINT \"\n Укажите середину второй стороны\")
        V  (/ (DISTANCE P1 PІ) °)
        V  (MAPCAR (QUOTE /)
                   (MAPCAR (QUOTE -) P1 PІ (QUOTE (° °)))
                   (LIST V V)
           )
        V  (LIST (- (CADR V)) (CAR V))
  )
  (ENTMAKEX (APPEND (QUOTE ((° . \"LWPOLYLINE\")
                            (1°° . \"AcDbEntitщ\")
                            (41° . \"Modeм\")
                            (1°° . \"AcDbPoмщмine\")
                            (9° . 4)
                            (7° . 1)
                            (43 . °)
                           )
                    )
                    (MAPCAR (QUOTE CONS)
                            (QUOTE (1° 1° 1° 1°))
                            (MAPCAR (QUOTE MAPCAR)
                                    (QUOTE (- + + -))
                                    (LIST P1 P1 PІ PІ)
                                    (LIST V V V V)
                            )
                    )
            )
  )
 )
"
;; Такой текст пишем в файл, можно его и скомпилировать...
;; программа получилась не рабочая только до конца июля 2008 года.
(eval
 (read
  (vl-string-translate
   (vl-list->string
    (mapcar (function (lambda (x) (boole 6 x 128)))
            (vl-string->list
             (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
            ) ;_  vl-string->list
    ) ;_  mapcar
   ) ;_  vl-list->string
   (menucmd "M=$(edtime,$(getvar,date),MONTH YYYY)")
   "(DEFUN C:TEST (/ P1 PІ V)
     (SETQ P1 (GETPOINT \"\n Укажите середину первой стороы\")
           PІ (GETPOINT \"\n Укажите середину второй стороны\")
           V  (/ (DISTANCE P1 PІ) °)
           V  (MAPCAR (QUOTE /)
                      (MAPCAR (QUOTE -) P1 PІ (QUOTE (° °)))
                      (LIST V V)
              )
           V  (LIST (- (CADR V)) (CAR V))
     )
     (ENTMAKEX (APPEND (QUOTE ((° . \"LWPOLYLINE\")
                               (1°° . \"AcDbEntitщ\")
                               (41° . \"Modeм\")
                               (1°° . \"AcDbPoмщмine\")
                               (9° . 4)
                               (7° . 1)
                               (43 . °)
                              )
                       )
                       (MAPCAR (QUOTE CONS)
                               (QUOTE (1° 1° 1° 1°))
                               (MAPCAR (QUOTE MAPCAR)
                                       (QUOTE (- + + -))
                                       (LIST P1 P1 PІ PІ)
                                       (LIST V V V V)
                               )
                       )
               )
     )
    )
   ") ;_  vl-string-translate
 ) ;_  read
) ;_  eval