Тема: часы в лиспе
Интересно, а можно ли в лисп встроить часы, и чтоб он (лисп) через заданное время не включался больше?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Интересно, а можно ли в лисп встроить часы, и чтоб он (лисп) через заданное время не включался больше?
Вот здесь
http://dwg.ru/forum/viewtopic.php?t=552 … mp;start=0
полно часов на лиспе, значит лисп умеет считывать время, а если умеет считывать время, то, наверное возможно заставить его отключиться при наступлении заданного времени, или я что-то не правильно понимаю?
Неужели никто так и не откликнется?
Знатоки лиспа, напишите хоть такое возможно или нет?
Может что-то типа такого (В 15 часов перестанет работать)
(defun C:TEST () (if (= (substr (rtos (getvar "CDATE")) 10 2) "15" ;_В 15 часов ) (setq C:TEST nil) (princ "\n*** Работаю ***") ) (princ) )
Не-а. При запуске в 15:00 не будет работать. При запуске в 16:30 корректно сработал.
А уменя все сработало, я даже несколько раз менял время и в лиспе и на часах, все работает корректно!
Скажите,уважаемый VVA, а можно ли вместо часов установить дату?
> Александр Ривилис
Посмотрел...
и не понял, как все же устаноить дату?
Извините!
Команда: (rtos (getvar "CDATE") 2 16) "[b]20080723[/b].17060893"
Обрати внимание на цифры до точки. Формат: ГГГГММДД, где ГГГГ-год, ММ-месяц, ДД - день.
> Кулик Алексей 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)
> VVA
Странно!
И у меня теперь не работает, т.е. не зависио от времени и даты утверждает, что работает!
> Сергей
Что значит в попыхах и без проверки
(defun C:TEST () (if (= (substr (rtos (getvar "CDATE") 2 16) 10 2) "15" ;_В 15 часов ) (setq C:TEST nil) (princ "\n*** Работаю ***") ) (princ) )
> VVA
Уважаемый VVA, к сожалению и эта сборка не работает!
Результат тот же:> Сергей (2008-07-23 20:43:23)
Помогите, очень уж надо!
С уважением!
А у меня работает. В 12-00 пишет работаю, а в 15-00 ничего не пишет, а при повторном вызове пишет "неизвестная команда"
> VVA
,
Нет,все же что-то не то!
Я пытаюсь экспериментировать и с датами тоже по совету> Александр Ривилис (2008-07-23 18:09:08)
и тоже ничего!
И вчаташняя дата и завтрашняя все одно:"работаю"!
(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
> Кулик Алексей aka kpblc
Хорошо, со временем вроде работает, а вот с датами-нет!
> Сергей
А подумать и прочитать что тебе здесь все пишут?
(defun c:test () ;;; Работает до 1-го сентября 2008 года (if (> (getvar "CDATE") 20080901.0) (setq c:test nil) (princ "\n*** Работаю ***") ) ;_ end of if (princ) ) ;_ end of defun
> Александр Ривилис
Уважаемый Александр!
Спасибо, все работает, что поделаешь, я совсем новичек, и очень хочу научиться!
У меня есть последний (я надеюсь)вопрос.
> Сергей
Здесь я спросил:"Интересно, а можно ли в лисп встроить часы, и чтоб он (лисп) через заданное время не включался больше?"
Так вот, у меня есть лисп, который работает, и именно этот лисп необходимо ограничить во времени.
Могу ли я использовать вышеизложенный лисп, как заготовку, и если да, то как?
Т.е. другими словами, можно ли их как то объединить?
Добавь конструкцию в начало твоей функции:
;;; Работает до 1-го сентября 2008 года (if (> (getvar "CDATE") 20080901.0) (exit); выход (princ "\n*** Работаю ***") ) ;_ end of if
Возможна такая функция. 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)) ) )
> Donhuan
30 дней легче посчитать с помощью
(fix (getvar 'DATE))
;; Для начала делаем простенькое шифрование программы
;; и сохраняем текст с программой в переменную - дальше, можно сразу писать в файл и.т.д...
(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
повторюсь, только ради тегов...
;; Для начала делаем простенькое шифрование программы ;; и сохраняем текст с программой в переменную - дальше, можно сразу писать в файл и.т.д... (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
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc