su37 发表于 2025-2-2 12:15:54

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)
)


GEGEYANG88 发表于 2025-2-2 13:07:48

DEEPSEEK是个国际玩笑

su37 发表于 2025-2-4 16:38:12

本帖最后由 su37 于 2025-2-14 10:09 编辑

误伤到了友军!~

su37 发表于 2025-2-4 17:00:14

本帖最后由 su37 于 2025-2-14 10:07 编辑

sirlowlam1 发表于 2025-2-4 16:17
我看你自己就是个笑话。要是美国人搞的,你会不会这么说?!
不好意思,没看清楚!~

尘缘一生 发表于 2025-2-2 13:00:55

本帖最后由 尘缘一生 于 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)
[*])

飞雪神光 发表于 2025-2-2 13:16:27

应该是保存文件时 文件的编码不对 应该是ANSI

su37 发表于 2025-2-2 13:21:27

对,我问了deepseek,它告诉我了,就是ANSI,不要用utf-8存储

jt133 发表于 2025-2-2 13:43:52

问过DeepSeek,训练DeepSeek学习写AutoLisp代码要用Python。我的天,看来只能意淫下

su37 发表于 2025-2-2 13:50:28

我把存储的命令去掉了,只让它执行改变当前文件修改时间为当前时间,但是它为什么不工作呢,是哪出了问题,大家有懂得么


(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)
)

gzcsun 发表于 2025-2-2 14:06:22

尘缘一生 发表于 2025-2-2 13:00
这两天哪,我就想问问这DEEPSEEK问题来

我关心的还不是其他问题,我就想问问,网上说的,DEEPSEEK开源了 ...

有几个工具箱源码,几经不知在哪了。
但丛来不用工具箱,都是用自己做的。
因为不适合我的要求,所以一些什么工具箱懒得看。
工具箱加密是为了有些人破解后拿出去卖。
想买工具箱来用的都是小白,有点能力基本自己来。

xyp1964 发表于 2025-2-2 15:57:29


su37 发表于 2025-2-2 16:18:44

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

总之,实现挺麻烦的
页: [1] 2 3 4
查看完整版本: deepseek写的程序,在cad中运行后总是提示:读入的 (八进制) 字符不正确