deepseek写的程序,在cad中运行后总是提示:读入的 (八进制) 字符不正确
我用deepseek写了一个cad的autolisp程序,功能是存储文件,并将文件的修改时间改为当前,在cad中运行后总是提示:读入的 (八进制) 字符不正确请大家帮忙看看是哪个环节出了问题
(defun c:SaveAndUpdateTime (/ dwgpath pscommand)
(vl-load-com)
;;; 执行快速保存命令
(command "_.qsave")
;;; 等待文件保存完成(约1秒)
(while (> (getvar "cmdactive") 0)
(command "")
)
;;; 构建完整文件路径
(setq dwgpath (strcat (getvar "dwgprefix") (getvar "dwgname")))
;;; 验证文件有效性
(cond
((not dwgpath)
(princ "\n错误:未找到有效文件路径"))
((not (findfile dwgpath))
(princ "\n错误:文件不存在或未保存"))
(T
;;; 构造PowerShell命令
(setq pscommand
(strcat
"powershell -Command \""
"(Get-Item '" dwgpath "').LastWriteTime = Get-Date;"
"Write-Output ('更新时间: ' + (Get-Item '" dwgpath "').LastWriteTime)\""
)
)
;;; 执行系统命令
(startapp pscommand)
(princ (strcat "\n文件已保存并更新时间: " dwgpath))
)
)
(princ)
)
DEEPSEEK是个国际玩笑 本帖最后由 su37 于 2025-2-14 10:09 编辑
误伤到了友军!~ 本帖最后由 su37 于 2025-2-14 10:07 编辑
sirlowlam1 发表于 2025-2-4 16:17
我看你自己就是个笑话。要是美国人搞的,你会不会这么说?!
不好意思,没看清楚!~ 本帖最后由 尘缘一生 于 2025-2-2 19:18 编辑
这两天哪,我就想问问这DEEPSEEK问题来
我关心的还不是其他问题,我就想问问,网上说的,DEEPSEEK开源了,
这个问题,据说是汇编语言写的,绕过了英伟达。
那么,我开发的三领也免费了,难道我开源不成!?
难道,好东西非开源才为人所知不成吗?
140来人的小孩子(博士)作的事,对不对,头叫:梁文锋,对不对?
厉害,当然我们承认,不是什么怀疑还存在。
那么,对于我们来说,我们没有那些什么的博士学位什么的,
对于明经朋友说啊,
我SLdesign v.0做不到,叫我开源吗?绝不可能!也许我理解有错误,所谓他们开源啊,并不是源代码的意思。我认为是这样。
三领那一天开源?当然,我这快60岁了的人了,等我咽气那一天,自然开源,全部放开,这就是爱好罢了,否则,作这个有意思吗?
话又说回来,我见过不少开源的代码,比如:贱人工具箱,曹操铝单板,信工具箱。。。。等等吧。佩服这种精神!当然,这很多是破解群的人破解的罢了。
我不断得到的建议就是:三领如果这样,是不行的,因为都不知道,也不知怎么用,希望我第一步要叫大家用起来,这样子。所以我免费了。但是,叫我开源,我还没死来!我不高尚,对不起!万万做不到的事,有本事你破解得了,我还会奖励你,信不信?这就叫作,不服你,咋的?拿出你的本事,我才服你!
红客联盟的一些孩子啊,年龄不大,也不会超过25岁,甚至什么大学都没上过的,比如:打游戏的孩子,并不简单的。我就知道的,有个孩子,就是打游戏很厉害,就是红客联盟的人。高中都没学完的孩子。你不信是不是?
记住了我还是那句话:真正有本事的人啊,都在社会上,并不在国企,央企,什么的玩意地方,记住我的话。
他们只不过是:身处档位,作的是:身不由己的分内之事罢了。其实啊,比他强的多了去了!包括明经的你和我!
三领哪,有一部分存盘代码,节录如下:
[*];;活动文档是否已经保存?----(一级)-----
[*];;返回 T 已保存 nil 尚未保存
[*](defun sl:Saved-p ()
[*](= (vla-get-saved *AcDocument*) :vlax-True)
[*])
[*];;图纸存为:名称(当前时间),以分钟间隔
[*](defun c:slqsave (/ name obj k kk basename ext fullname path time newname ss pt)
[*](if (= $sltime nil) (setq $sltime (getvar "MILLISECS")))
[*](if (not (sl:Saved-p)) ;没保存,先保存
[*] (progn
[*] (setq path (strcat (getvar "DWGPREFIX") "user-all.dwg"))
[*] (while (findfile path)
[*] (setq path (strcat (getvar "DWGPREFIX") "user-all" (slsjqs) ".dwg")) ;(slsjqs) 随机字符串函数,自理
[*] )
[*] (command "_.QSAVE" path)
[*] )
[*])
[*](setq name (Vlax-Get (Vlax-Get *Acad* 'ActiveDocument) 'Name))
[*](setq time (menucmd "m=$(edtime,$(getvar,DATE),YYYY-MO-DD HH-MM)"))
[*](setq fullname (Vlax-Get (Vlax-Get *Acad* 'ActiveDocument) 'FullName))
[*](setq path (vl-filename-directory fullname))
[*](setq ext (vl-filename-extension name))
[*](setq basename (vl-filename-base name))
[*](if (wcmatch (strcase name)"*`(####-##-## ##-##`).DWG") ;如果文件已带有时间格式了
[*] (setq newname (strcat path "\\" (substr basename 1 (- (strlen basename) 18)) "(" time ")" ext))
[*] (setq newname (strcat path "\\" basename "(" time ")" ext))
[*])
[*](if (and (setq ss (ssget "X")) (= (getvar "ISAVEBAK") 1)) ;每次保存均备份
[*] (progn
[*] (setq pt (getvar "VIEWCTR"))
[*] (command "COPY" ss "" "non" pt "non" pt)
[*] (command "-WBLOCK" newname "" "non" pt ss "")
[*] (vl-file-rename newname (strcat path "\\" (vl-filename-base newname) ".bak"))
[*] )
[*])
[*](if (< (- (getvar "MILLISECS") $sltime) 300000)
[*] (command "_.QSAVE")
[*] (progn
[*] (setq kk "名称不变"
[*] k (sl:do1ordo2 "名称是否+时间?" kk "随时更名")
[*] )
[*] (if (= k kk)
[*] (command "_.QSAVE")
[*] (vl-cmdf "SAVEAS" "" newname)
[*] )
[*] )
[*])
[*](setq $sltime (getvar "MILLISECS"))
[*](princ)
[*])
应该是保存文件时 文件的编码不对 应该是ANSI 对,我问了deepseek,它告诉我了,就是ANSI,不要用utf-8存储 问过DeepSeek,训练DeepSeek学习写AutoLisp代码要用Python。我的天,看来只能意淫下 我把存储的命令去掉了,只让它执行改变当前文件修改时间为当前时间,但是它为什么不工作呢,是哪出了问题,大家有懂得么
(defun c:SaveAndUpdateTime (/ dwgpath pscommand)
(vl-load-com)
;;; 构建完整文件路径
(setq dwgpath (strcat (getvar "dwgprefix") (getvar "dwgname")))
;;; 验证文件有效性
(cond
((not dwgpath)
(princ "\n错误:未找到有效文件路径"))
((not (findfile dwgpath))
(princ "\n错误:文件不存在或未保存"))
(T
;;; 构造PowerShell命令
(setq pscommand
(strcat
"powershell -Command \""
"(Get-Item '" dwgpath "').LastWriteTime = Get-Date;"
"Write-Output ('更新时间: ' + (Get-Item '" dwgpath "').LastWriteTime)\""
)
)
;;; 执行系统命令
(startapp pscommand)
(princ (strcat "\n文件已保存并更新时间: " dwgpath))
)
)
(princ)
) 尘缘一生 发表于 2025-2-2 13:00
这两天哪,我就想问问这DEEPSEEK问题来
我关心的还不是其他问题,我就想问问,网上说的,DEEPSEEK开源了 ...
有几个工具箱源码,几经不知在哪了。
但丛来不用工具箱,都是用自己做的。
因为不适合我的要求,所以一些什么工具箱懒得看。
工具箱加密是为了有些人破解后拿出去卖。
想买工具箱来用的都是小白,有点能力基本自己来。
xyp1964 发表于 2025-2-2 15:57
这个程序无效,上网搜了一下,cad文件是打开状态,被占用,powershell调用命令无效
我这做事因为用了db软件,存储文件被锁定在了去年的一个固定日期,就想个办法解决,现在看来比较难
我在deepseek里提问,给了一个思路,大概是这样的
用C#编写后台服务监控CAD进程:
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\CAD\"); watcher.Changed += (sender, e) => { File.SetLastWriteTime(e.FullPath, DateTime.Now); };
AutoLISP触发机制
修改保存命令:
(defun c:QSAVE () (command "._qsave") (startapp "powershell.exe" "& {Start-Sleep -s 2; (gi 'D:/drawing.dwg').LastWriteTime=Get-Date}") (princ) )
注册表Hook
修改
Windows Registry Editor Version 5.00 @="\"C:\\Program Files\\AutoCAD\\acad.exe\" /nologo /b \"C:\\timehook.scr\" \"%1\""
注意事项:
系统权限要求:方案二、三需要管理员权限
版本兼容性:需针对不同CAD版本调整内存地址
安全风险:内核级操作可能导致系统不稳定
性能影响:文件监控服务会增加约3-5%的CPU占用
建议优先尝试混合方案中的AutoLISP+PowerShell组合,该方案在测试环境中可实现97.3%的成功率,平均延迟时间为2.8秒。若需实时更新,可考虑结合文件系统过滤驱动技术。
这是改进后的通用解决方案,通过动态获取当前DWG文件路径实现全自动处理:
步骤1:增强型AutoLISP代码
复制代码
(defun c:UniversalTimeHook (/ cmd curDoc) (vl-load-com) (setq curDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (defun *SaveHook* (args) (vla-Save curDoc) (startapp "powershell.exe" (strcat "-Command \"&{" "$path=::Combine('" (vla-get-Path curDoc) "','" (vla-get-Name curDoc) "');" "Start-Sleep -Milliseconds 800;" "::SetLastWriteTime($path,::Now);" "}\"" ) ) (princ) ) (setq cmd (vlax-get curDoc 'Commands)) (vlax-invoke cmd 'Add "QSAVE" (*SaveHook*)) (princ "\n全局时间同步器已激活") (princ) )
步骤2:内核级文件监控(需管理员权限)
powershell
复制代码
# 保存为TimeKeeper.ps1 $global:cadProcess = Get-Process acad* | Select-Object -First 1 $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = ::GetDirectoryName($cadProcess.MainModule.FileName) $watcher.Filter = "*.dwg" $watcher.IncludeSubdirectories = $true $action = { $path = $Event.SourceEventArgs.FullPath $lastWrite = (Get-Item $path).LastWriteTime if ($lastWrite.Date -lt ::Today) { $mappedFile = ::CreateFromFile( $path, ::Open, "TimeUpdater", 4096, ::ReadWrite ) $stream = $mappedFile.CreateViewStream() $writer = New-Object System.IO.BinaryWriter $stream $writer.Seek(0x12C, ::Begin) # 定位到DWG时间戳存储偏移量 $writer.Write(::GetBytes(::Now.ToBinary()), 0, 8) $writer.Close() } } Register-ObjectEvent $watcher "Changed" -Action $action
技术亮点:
智能路径解析
使用::Combine确保正确处理不同操作系统的路径格式
精准时序控制
800
AutoCAD文件锁释放时间:平均500-700ms
机械硬盘写入延迟:约10ms
SSD写入延迟:约2ms
内存映射文件操作
直接修改DWG二进制结构中的时间戳字段(偏移量0x12C),绕过文件锁定
多文档支持
通过vla-get-ActiveDocument自动识别当前活动文档
部署方法:
将LISP代码保存为TimeMaster.lsp
在CAD启动组添加:
(load "TimeMaster.lsp") (c:UniversalTimeHook)
以管理员身份运行PowerShell脚本:
powershell
Set-ExecutionPolicy Bypass -Scope Process -Force .\TimeKeeper.ps1
总之,实现挺麻烦的