本帖最后由 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的注释去除并保存在临时目录。
《最初版代码有误,修正的如下》

LeeMac也有一个用RegEx的版本,技术真是稳如狗。不过没有输出文件,直接显示的。需要的可以自行修改写出为新文件。

网友答: 秒啊。。。。。。。。网友答: 跟上跟上,逻辑可通网友答: 必须要赞一个,每次发布都必须手动删除无关紧要的注释,这个太给力了
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的注释去除并保存在临时目录。
《最初版代码有误,修正的如下》

- (Defun StripComment (src / ABC FNN FNX LSP)
- (setq lsp (vl-filename-mktemp nil nil ".lsp")
- fnn (open lsp "w")
- fnx (open src "r")
- )
- (write-line "(Defun-q StripCommentCore()" fnn)
- (while (setq abc (read-line fnx)) (write-line abc fnn))
- (write-line ")" fnn)
- (close fnx)
- (close fnn)
- (load lsp)
- (setq fnn (open lsp "w")
- fnx (vl-prin1-to-string
- (vl-symbol-value (read "StripCommentCore"))
- )
- )
- (princ (substr fnx 6 (- (strlen fnx) 6)) fnn)
- (close fnn)
- (alert (strcat "\n New LSP File without comments is saved:\n "
- lsp
- "\n\n Use VLIDE or other LSP editor to format it"
- )
- )
- lsp
- )
LeeMac也有一个用RegEx的版本,技术真是稳如狗。不过没有输出文件,直接显示的。需要的可以自行修改写出为新文件。

- (defun stripcomments (lsp / des rgx rtn str tmp)
- (if (setq des (open lsp "r"))
- (progn
- (while (setq str (read-line des)) (setq tmp (vl-list* "\n" str tmp)))
- (close des)
- (cond
- ((null (setq rgx (vlax-create-object "vbscript.regexp")))
- (prompt "\nUnable to interface with RegEx object.")
- )
- ((vl-catch-all-error-p
- (setq rtn
- (vl-catch-all-apply
- '(lambda ()
- (vlax-put-property rgx 'global actrue)
- (vlax-put-property rgx 'multiline actrue)
- (vlax-put-property
- rgx
- 'pattern
- "("(?:[^\\\\"]|\\\\.)*")|(?:;\\|[\\S\\s]+?\\|;)|(?:;[^\\n]*)"
- )
- (vlax-invoke
- rgx
- 'replace
- (apply 'strcat (reverse tmp))
- "$1"
- )
- )
- )
- )
- )
- (prompt (strcat "\nError: " (vl-catch-all-error-message rtn)))
- )
- ((princ rtn))
- )
- )
- )
- (princ)
- )
网友答: 秒啊。。。。。。。。网友答: 跟上跟上,逻辑可通网友答: 必须要赞一个,每次发布都必须手动删除无关紧要的注释,这个太给力了