jim_archi4 发表于 2022-7-6 08:46:04

修复我的记录时间lisp rou

下面是我10年前写的一个lisp例程。我已经脱离了lisp写作多年了,现在已经忘记了它是如何工作的。此例程提取在图形中花费的时间。它过去工作得很好,在我的Acad内存中的S::Strartup路由中。lsp文件,因此每次打开图形时都会加载该文件,并记录所用的时间。现在它不起作用了,我已经好几年没有使用它了,但我现在需要记录下在每张画上花费的时间,所以我想知道是否有人可以帮忙?
 
(重置)
下面是Acad。lsp但在S::启动之外
 
;;;*重置
(卸载重置()
(setq开始(getvar“date”))
(setq时间(getvar“tdindwg”))
(普林斯)
)
 
;;;*日记
(德芬日记()
(setq x(getvar“DWGNAME”))
(SETVAR“LUPREC”2)
(setq时间(*(getvar“TDINDWG”)时间)24.0)
(今天)
(第0部分)
(如果(
(setq jnum“*”)
(getjnum)
)
(如果(/=jnam nil)
(程序
(setq dia(打开“c:/WPA\u CAD2009/diary.ntp”“a”)
hr(itoa(固定时间))
最小值(itoa(fix(*-etime(fix-etime))100)))
)
(如果(和(=hr“0”)(=最小值“0”))
(setq min“01”)
)
(setq wline(strcat“作业:”jnum“日
“-”mo“-”年
文件:“jnam”时间:
hr”:“最小”
)
)
(写入线直径)
(闭合直径)
)
)
(重置)
(SETVAR“LUPREC”0)
(普林斯)
)
(defun getjnum()
(setq divt div)
(第1部分(-第1部分))
(setq n1(1+dinum))
(divi divt)
(setq n2 dinum)
(setq jnum(substr x n1(-n2 n1))
jnam(substr x(1+n2))
)
)
(defun divi(测试)
(setq i 1
第0部分
)
(重复(-(strlen x)1)
(if(=(substr x i 1)(chr 92))
(progn(setq div(1+div))
(如果(和(/=测试0)(=div测试))
(setq dinum i)
)
)
)
(setq i(1+i))
)
)
 
;;;*今天
(defun today(/d)
(setq d(rtos(getvar“cdate”)2 6)
年(substr d 3 2)
mo(substr d 5 2)
天(substr d 7 2)
)
(strcat日)“mo”年)
)
 
在另一个例程中,我使用“Mgetfile”命令打开了自己的diagalog,在其中我植入了日志并重置了命令,如下所示;由于使用了多个绘图会话,因此无法正常工作,因此我只使用AutoCad open。现在我需要用日记再次记录时间,如果有人能帮我,我将不胜感激。我只是很高兴使用标准的Acad打开,但重新定义运行我的(日记)和(重置)之前的手。
 
(defun do_open()
(打印)
(princ“\n选择要打开的文件…”
(打印)
(setq nm(car)(mgetfiled“wpa\U cad-文件管理器”)
(getvar“dwgprefix”)
“dwg”
12
)
)
)
(打印)
(打印)
(如果(/=nm(getvar“DWGNAME”))
(程序
(日记)
(重置)
(命令“.OPEN”nmm nm)
(setvar“cmdecho”cmd)
(普林斯)
)
)
)

jim_archi4 发表于 2022-7-6 08:53:00

下面是我10年前写的一个lisp例程。我已经脱离了lisp写作多年了,现在已经忘记了它是如何工作的。此例程提取在图形中花费的时间。它过去工作得很好,在我的Acad内存中的S::Strartup路由中。lsp文件,因此每次打开图形时都会加载该文件,并记录所用的时间。现在它不起作用了,我已经好几年没有使用它了,但我现在需要记录下在每张画上花费的时间,所以我想知道是否有人可以帮忙?
 
 
(重置)
 
下面是Acad。lsp但在S::启动之外
 
;;;*重置
(卸载重置()
(setq开始(getvar“date”))
(setq时间(getvar“tdindwg”))
(普林斯)
)
 
;;;*日记
(德芬日记()
(setq x(getvar“DWGNAME”))
(SETVAR“LUPREC”2)
(setq时间(*(getvar“TDINDWG”)时间)24.0)
(今天)
(第0部分)
(如果(
(setq jnum“*”)
(getjnum)
)
(如果(/=jnam nil)
(程序
(setq dia(打开“c:/WPA\u CAD2009/diary.ntp”“a”)
hr(itoa(固定时间))
最小值(itoa(fix(*-etime(fix-etime))100)))
)
(如果(和(=hr“0”)(=最小值“0”))
(setq min“01”)
)
(setq wline(strcat“作业:”jnum“日
“-”mo“-”年
文件:“jnam”时间:
hr”:“最小”
)
)
(写入线直径)
(闭合直径)
)
)
(重置)
(SETVAR“LUPREC”0)
(普林斯)
)
(defun getjnum()
(setq divt div)
(第1部分(-第1部分))
(setq n1(1+dinum))
(divi divt)
(setq n2 dinum)
(setq jnum(substr x n1(-n2 n1))
jnam(substr x(1+n2))
)
)
(defun divi(测试)
(setq i 1
第0部分
)
(重复(-(strlen x)1)
(if(=(substr x i 1)(chr 92))
(progn(setq div(1+div))
(如果(和(/=测试0)(=div测试))
(setq dinum i)
)
)
)
(setq i(1+i))
)
)
 
;;;*今天
(defun today(/d)
(setq d(rtos(getvar“cdate”)2 6)
年(substr d 3 2)
mo(substr d 5 2)
天(substr d 7 2)
)
(strcat日)“mo”年)
)
 
在另一个例程中,我使用“Mgetfile”命令打开了自己的diagalog,在其中我植入了日志并重置了命令,如下所示;由于使用了多个绘图会话,因此无法正常工作,因此我只使用AutoCad open。现在我需要用日记再次记录时间,如果有人能帮我,我将不胜感激。我只是很高兴使用标准的Acad打开,但重新定义运行我的(日记)和(重置)之前的手。
 
(defun do_open()
(打印)
(princ“\n选择要打开的文件…”
(打印)
(setq nm(car)(mgetfiled“wpa\U cad-文件管理器”)
(getvar“dwgprefix”)
“dwg”
12
)
)
)
(打印)
(打印)
(如果(/=nm(getvar“DWGNAME”))
(程序
(日记)
(重置)
(命令“.OPEN”nmm nm)
(setvar“cmdecho”cmd)
(普林斯)
)
)
)

pBe 发表于 2022-7-6 09:00:08

我建议你查一下“日期/时间变量的特殊处理”和“edtime”
例子:
而不是
(defun today (/ d)
(setq d   (rtos (getvar "cdate") 2 6)
yr(substr d 3 2)
mo(substr d 5 2)
day (substr d 7 2)
)
(strcat day "." mo "." yr)
)
 
尝试:
 

(menucmd "M=$(edtime,$(getvar,date),DD.MO.YY)")

 
您的问题:
你想维护你的代码吗?你愿意重新编写并学习新东西吗?
您现在只需要运行代码,这是一个紧迫的问题吗?
 
在我看来,如果你想触发“日记”,最好使用反应堆

jim_archi4 发表于 2022-7-6 09:04:44

你好,pBe,
 
谢谢你的代码。。。
嗯,我需要为新版本的Autocad维护代码,有些代码会被删除,因为通常下一版本的Autocad会添加这些代码,但我总是想学习一种新的做事方式。
 
在打开图形之前,我使用(日记)子程序的唯一原因是,这是打开命令的最后一件事,而且它相当准确。
 
告诉我关于反应堆的事???我非常好奇
 
顺便说一句,我得到了我的(日记)例行工作使用您的test4u非常感谢。我只需要更改(setq x(getvar“DWGNAME”))
至(setq x(stracat(Getvar“Dwgprefix”)(Getvar“Dwgname”))
)
)
现在它像金丝雀一样歌唱,再次表示感谢

jim_archi4 发表于 2022-7-6 09:13:12

你好,pBe,
 
决心让这项工作,我做了一些研究重铸,发现他们非常有趣。我试过一些例子,效果很好。。。然而,我写了这篇文章,它错误地失败了。。。。我得到错误:参数太多
 
(vl load com)
 
;**************************************************************
 
;设置并初始化反应堆
(vlr dwg反应堆“记录数据”(:vlr beginDwgOpen.recordmydata)))
 
;**************************************************************
 
(取消recordmydata()
 
(日记)
(普林斯)
 
);德芬
 
我在下面也尝试了这些,但出现了类似的错误—参数太多或太少
:vlr保存完成
:vlr endDwgOpen
:vlr DWG文件已打开
:vlr endDwgOpen
 
此外,我还需要考虑我打开的最后一个图形,因为它在打开另一个图形之前不会记录数据,所以我可能还需要在保存或结束图形时查看是否有反应器来提取数据,也许保存可能是最好的,因为我可以确定是否需要自己记录它,例如:。一张未打开且未处理的图纸不需要记录。
 
从命令行运行(recordmydata)效果很好,我认为错误在reactor代码中,因为它似乎没有调用我的(recordmydata)子例程。我甚至尝试将(recordmydata)重命名为(日记),因为它存放在Acad中。每次打开图形时(ACADLSPASDOC设置为1),lsp文件,但仍然没有成功。
 
谢谢你给我介绍反应堆。它们很酷。我可以看到它们在一些方面的用途
 
如果你能帮忙,我将不胜感激!!!!!。。。

ketxu 发表于 2022-7-6 09:17:15

@吉姆:你为什么不把你的代码贴上代码标签?
http://www.cadtutor.net/forum/showthread.php?9184-代码发布指南

jim_archi4 发表于 2022-7-6 09:23:38

谢谢ketxu,我是新来的,仍然在寻找我的路。。。我对代码进行了颜色编码,以便可以不同地阅读

pBe 发表于 2022-7-6 09:25:16

 
回调函数需要两个参数
 
(defun recordmydata(arg1 arg2)。。。。。
 
 
为您提供的示例:
(if (and Record (vlr-added-p Record))
(vlr-remove Record)
)
(setq Record
      (vlr-dwg-reactor
"Start Recording This" '((:vlr-beginSave . AskedToRecord)

)
      )
   )
(defun AskedToRecord (Triggered Thiscommand)
(initget 1 "Y N")
   (setq ans (getkword "\nRecord this session : "))
(if (eq ans "Y")
   (princ "\nSaving data....")
   (princ "\nData ignored....")
)
)


 
您会注意到,我发布的代码片段使用了“保存”反应器,您可以在其中控制是否需要记录文件。
在beginDwgOpen反应堆上,我建议您包括一个条件,如果打开的文件是“vald文档”,例如标准图纸前缀,即“ProjectCode_*”,则“日记”才会被激活。
 
 
 
好的一点,这就是为什么SDI很重要,这样你就不会在没有活动的情况下挂起打开的图纸。您将被迫关闭文件,并被提示立即录制。
 
另一方面,您可以维护MDI,并可以添加一个“暂停”例程,其中经过的时间将被冻结,直到您点击“播放”按钮。
 
编辑:
单击此处了解有关edtime/menucmd的更多信息

jim_archi4 发表于 2022-7-6 09:32:12

你好,pBe,
 
 
我在对反应堆进行了一些研究后写了这篇文章,它很管用,但我不知道如何添加2个关闭/退出选项(单击“X”)。当我单击“X”(关闭图形)时,我可以选择保存或不保存数据,例如,当我不保存数据时

pBe 发表于 2022-7-6 09:38:02

Lets analyze this statement Jim
 
 
If you need to open a file for "reference" open it as read only.
remind them that everytime a drawing is saved, it will count on editing time.
 
What you need to do is to add a conditon test on you "diary" routine dont start recording if the file is read only
 

(if (eq (vla-get-readonly(vla-get-ActiveDocument (vlax-get-acad-object))   )   :vlax-false )(princ "\nRecord routine activated...")(princ "\nRecord routine De-activated..."))
 
 
Why would you want to save the file if its open for reference. if modification needs to be done on that drawing it will still count as "editing" time,
otherwise why save it at all?
 
((= thecommandstart "OPEN") (diary))
 
Believe me, I've been down that road before Jim. programs are only as good as the user could be.
 
BTW did you look into the link I posted above for edtime function? I strongly suggest re-writing you "diary" routine to account for every possible condtion. I could write one for you but where's the fun in that? , besides who better understand what needs to be done other than you Jim
 
You can heed my suggestions and start writing the code, if you hit a snag just holler
 
Cheers
页: [1] 2
查看完整版本: 修复我的记录时间lisp rou