明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 488|回复: 17

[讨论] deepseek写的程序,在cad中运行后总是提示:读入的 (八进制) 字符不正确

[复制链接]
发表于 昨天 12:15 | 显示全部楼层 |阅读模式
我用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)
)


回复

使用道具 举报

发表于 昨天 13:00 | 显示全部楼层
本帖最后由 尘缘一生 于 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)
  • )

回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:18 | 显示全部楼层

这个程序无效,上网搜了一下,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 [HKEY_CLASSES_ROOT\AutoCAD.Document\shell\open\command] @="\"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=[System.IO.Path]::Combine('" (vla-get-Path curDoc) "','" (vla-get-Name curDoc) "');" "Start-Sleep -Milliseconds 800;" "[System.IO.File]::SetLastWriteTime($path,[DateTime]::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 = [System.IO.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 [DateTime]::Today) { $mappedFile = [System.IO.MemoryMappedFiles.MemoryMappedFile]::CreateFromFile( $path, [System.IO.FileMode]::Open, "TimeUpdater", 4096, [System.IO.MemoryMappedFiles.MemoryMappedFileAccess]::ReadWrite ) $stream = $mappedFile.CreateViewStream() $writer = New-Object System.IO.BinaryWriter $stream $writer.Seek(0x12C, [System.IO.SeekOrigin]::Begin) # 定位到DWG时间戳存储偏移量 $writer.Write([BitConverter]::GetBytes([DateTime]::Now.ToBinary()), 0, 8) $writer.Close() } } Register-ObjectEvent $watcher "Changed" -Action $action

技术亮点:

智能路径解析
使用[System.IO.Path]::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

总之,实现挺麻烦的
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 小时前 | 显示全部楼层
经过我的几轮问答,deepseek终于给出了正确解。总结,deepseek还是很厉害的,远远强于其他AI,编程方面尤为突出。难怪老美怕的要死

(defun c:ForceSetTime (/ oldfile newfile randomNum newFileName)
  ;; 获取原文件的完整路径
  (setq oldfile (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")))
  
  ;; 检查是否已经保存了初始文件名
  (if (not (boundp '*initialFileName*))
    (setq *initialFileName* (getvar "DWGNAME")) ; 如果是第一次运行,保存初始文件名
  )
  
  ;; 生成5个随机阿拉伯数字(范围:10000 到 99999)
  (setq randomNum (itoa (+ 10000 (fix (* (rem (getvar "CPUTICKS") 1e6) 0.9)))))
  
  ;; 生成新的文件名,格式为 "2025-5个随机数字-初始文件名"
  (setq newFileName (strcat (getvar "DWGPREFIX") "2025-" randomNum "-" *initialFileName*))
  
  ;; 另存为新文件
  (command "_.SAVEAS" "" newFileName)
  
  ;; 使用PowerShell修改原文件的最后修改时间
  (startapp
    (strcat
      "powershell.exe -NoExit -Command \"(Get-Item '"
      oldfile
      "').LastWriteTime = Get-Date\""
    )
  )
  
  (alert "原文件时间已修改,请手动删除临时文件。")
)
回复 支持 反对

使用道具 举报

发表于 昨天 13:07 | 显示全部楼层
DEEPSEEK是个国际玩笑
回复 支持 反对

使用道具 举报

发表于 昨天 13:16 | 显示全部楼层
应该是保存文件时 文件的编码不对 应该是ANSI
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 13:21 | 显示全部楼层
对,我问了deepseek,它告诉我了,就是ANSI,不要用utf-8存储
回复 支持 反对

使用道具 举报

发表于 昨天 13:43 | 显示全部楼层
问过DeepSeek,训练DeepSeek学习写AutoLisp代码要用Python。我的天,看来只能意淫下
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 13:50 | 显示全部楼层
我把存储的命令去掉了,只让它执行改变当前文件修改时间为当前时间,但是它为什么不工作呢,是哪出了问题,大家有懂得么


(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)
)
回复 支持 反对

使用道具 举报

发表于 昨天 14:06 | 显示全部楼层
尘缘一生 发表于 2025-2-2 13:00
这两天哪,我就想问问这DEEPSEEK问题来

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

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

使用道具 举报

发表于 昨天 15:57 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-3 19:08 , Processed in 0.205312 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表