本帖最后由 kozmosovia 于 2026-1-7 22:32 编辑

Defun和Defun-q都是定义函数的,Defun定义的函数,返回值类型是USUBR,Defun-Q定义的,返回值类型是一个表,这个表就是代码本身,而且是紧凑的代码。
利用这个区别,可以借助Defun-q来去除lsp文件中的注释,无论这些注释是以什么方式和姿势写的,只要CAD能正确读取,Defun-Q就能返回去掉注释的纯代码。
由于LSP文件中可能会定义多个顶层函数或者直接执行的代码,一个个都替换成Defun-Q并加载一方面太麻烦,另一方面可能会一加载就直接运行一些无谓的代码。实际操作中,可以把整个LSP文件内容用Defun-Q套壳,定义成一个临时的函数,然后保存LSP并加载,之后只需要将这个函数的内容写到新文件即可获取去掉注释的纯代码。

形式和样子与反编译出来的LSP很像,不知道在底层,Defun和Defun-Q,谁是谁的马甲。
下面的代码可以将LSP的注释去除并保存在临时目录。
《最初版代码有误,修正的如下》
  1. (Defun StripComment (src / ABC FNN FNX LSP)
  2.   (setq  lsp (vl-filename-mktemp nil nil ".lsp")
  3.   fnn (open lsp "w")
  4.   fnx (open src "r")
  5.   )
  6.   (write-line "(Defun-q StripCommentCore()" fnn)
  7.   (while (setq abc (read-line fnx)) (write-line abc fnn))
  8.   (write-line ")" fnn)
  9.   (close fnx)
  10.   (close fnn)
  11.   (load lsp)
  12.   (setq  fnn (open lsp "w")
  13.   fnx (vl-prin1-to-string
  14.         (vl-symbol-value (read "StripCommentCore"))
  15.       )
  16.   )
  17.   (princ (substr fnx 6 (- (strlen fnx) 6)) fnn)
  18.   (close fnn)
  19.   (alert (strcat "\n New LSP File without comments is saved:\n "
  20.      lsp
  21.      "\n\n Use VLIDE or other LSP editor to format it"
  22.    )
  23.   )
  24.   lsp
  25. )


LeeMac也有一个用RegEx的版本,技术真是稳如狗。不过没有输出文件,直接显示的。需要的可以自行修改写出为新文件。
  1. (defun stripcomments (lsp / des rgx rtn str tmp)
  2.   (if (setq des (open lsp "r"))
  3.     (progn
  4.       (while (setq str (read-line des)) (setq tmp (vl-list* "\n" str tmp)))
  5.       (close des)
  6.       (cond
  7.   ((null (setq rgx (vlax-create-object "vbscript.regexp")))
  8.    (prompt "\nUnable to interface with RegEx object.")
  9.   )
  10.   ((vl-catch-all-error-p
  11.      (setq rtn
  12.       (vl-catch-all-apply
  13.         '(lambda ()
  14.            (vlax-put-property rgx 'global actrue)
  15.            (vlax-put-property rgx 'multiline actrue)
  16.            (vlax-put-property
  17.        rgx
  18.        'pattern
  19.        "("(?:[^\\\\"]|\\\\.)*")|(?:;\\|[\\S\\s]+?\\|;)|(?:;[^\\n]*)"
  20.            )
  21.            (vlax-invoke
  22.        rgx
  23.        'replace
  24.        (apply 'strcat (reverse tmp))
  25.        "$1"
  26.            )
  27.          )
  28.       )
  29.      )
  30.    )
  31.    (prompt (strcat "\nError: " (vl-catch-all-error-message rtn)))
  32.   )
  33.   ((princ rtn))
  34.       )
  35.     )
  36.   )
  37.   (princ)
  38. )



网友答: 秒啊。。。。。。。。

网友答: 跟上跟上,逻辑可通

网友答: 必须要赞一个,每次发布都必须手动删除无关紧要的注释,这个太给力了
  • 上一篇:AQ连接线段和直线圆弧ARC为多段线兼容组码10和
  • 下一篇:没有了