找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2414|回复: 12

[每日一码] LSP格式化

[复制链接]
发表于 2013-6-2 17:39:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 QiaoCheng 于 2013-6-2 17:43 编辑

1、用了太多的append
2、测试了两个,好像没问题,但我知道肯定有bug或者思路不对(水平低)
3、想用mapcar、lambda来写 写不出来啊{:soso_e113:}
4、暂时先放上来,等高手指点几招
[pcode=lisp,true]
(defun c:qq ( / alst diff file i laststr line linelst nfile nfn ofn pos str1 str2 strlst t0 v with x)
  (if (setq file (getfiled "选择lsp文件" (getvar "dwgprefix") "lsp" 0))
    (progn
      (setq t0 (car (_VL-TIMES)))
      (setq nfile
        (strcat (vl-filename-directory file) "\\" (vl-filename-base file) "tmpFormat.lsp")
      )
      (setq ofn (open file "r"))
      (setq nfn (open nfile "w"))
      (setq i 0 linelst nil)
      (while (setq line (read-line ofn))
        (setq line (vl-string-trim " " line))
        (setq line (vl-string-translate "( )" "{ }" line))
        (cond
          ((= (substr line 1 2) ";|")
            (while (and line (not (vl-string-search "|;" line)))
              (setq line (read-line file))
              (setq alst (append alst line))
            )
            (setq linelst (append linelst (list alst)))
          )
          ((or (= (substr line 1 1) ";") (wcmatch line "*defun*") (wcmatch line "*DEFUN*"))
            (setq linelst (append linelst (list line)))
          )
          ((and (not (wcmatch line "*defun*")) (not (wcmatch line "*DEFUN*"))
                 (/= (substr line 1 1) ";") (/= (substr line 1 2) ";|")
           )
            (setq laststr (last linelst))
            (cond
              ((= i 0) (setq Diff (XL:CalDiff line)))
              ((and (>= i 1) (= Diff 0)) (setq Diff (XL:CalDiff laststr)))
              ((and (>= i 1) (/= Diff 0)) (setq Diff (XL:CalDiff line)))
            )
            (setq pos (vl-string-search ";" laststr))
            (cond
              ((/= Diff 0)
                 (setq str1 (substr laststr 1 (vl-string-search ";" laststr))
                       str2 (substr laststr (1+ (vl-string-search ";" laststr))) ;注释
                 )
                 (setq with (strlen (strcat str1 line)))
                 (cond
                   ((<= with 120) ;控制行宽
                      (setq line (strcat str1 line str2))
                      (setq linelst (vl-remove laststr linelst))
                      (setq linelst (append linelst (list line)))
                   )
                   ((> with 120)
                      (setq line (strcat str1 line str2))
                      (setq linelst (vl-remove laststr linelst))
                      (setq strlst (XL:strformat line))
                      (foreach v strlst
                        (setq linelst (append linelst (list (strcat "  " v))))
                      )
                   )
                 )
              )
              ((= diff 0) ;"{" "}"相等
                 (setq linelst (append linelst (list (strcat "  " line))))
              )
            )
            (setq i (1+ i))
          )
        )
      )
      (mapcar
        (function
          (lambda (x)
            (setq x (vl-string-translate "{ }" "( )" x))
            (if (/= (vl-string-trim " " x) "")
              (progn (princ x nfn) (princ "\n" nfn))
            )
          )
        )
        linelst
      )
      (close ofn) (close nfn)
      ;(vl-file-delete File)
      ;(vl-file-rename nfile File)
      (princ (strcat "\n用时" (rtos (* 0.001 (- (car (_VL-TIMES)) t0)) 2 4) "秒"))
      (princ)
    )
  )
)
;;(XL:CalDiff "{setq pickcircle " "{list '" "{0 . \"CIRCLE\"} '" "{8 . \"0\"} ;End_setq")
(defun XL:CalDiff (line / lcnt pos rcnt)
  (setq lcnt 0)
  (setq Pos -1)
  (while (setq Pos (vl-string-search "{" line (1+ Pos)))
     (setq lcnt (1+ lcnt))
  )
  (setq Pos -1)
  (setq rCnt 0)
  (while (setq Pos (vl-string-search "}" line (1+ Pos)))
    (setq rCnt (1+ rCnt))
  )
  (- lcnt rCnt)
)
;;(XL:strformat "{setq pickcircle {list '{0 . \"CIRCLE\"} '{8 . \"0\"} {append {list 10} pnt} '{40 . 1000}}} ;End_setq")
(defun XL:strformat (str / i lst m n slst strT strZ strW x)
  (defun XL:lstSplit (n m slst)
    (setq i 0)
    (vl-remove-if 'not
      (mapcar '(lambda (x) (setq i (1+ i)) (if (and (>= i n) (<= i m)) (setq x x))) slst)
    )
  )
  (setq str (vl-string-trim " " str))
  (setq lst (vl-string->list str))
  ;;头部
  (setq n (vl-position 123 (cdr lst)))
  (setq strT (list (vl-list->string (XL:lstSplit 0 n lst))))
  ;尾部
  (setq m (vl-position 125 (reverse lst)))
  (setq strW (list (vl-list->string (reverse (XL:lstSplit 0 m (reverse lst))))))
  ;中部 ;这里使用vl-string-trim为何不对?
  (setq strZ (list (vl-list->string (XL:lstSplit (1+ n) (- (length lst) m) lst))))
  (append strT strZ strW)
)
[/pcode]


评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-2 17:51:22 | 显示全部楼层
LISP格式化,以前有看到过一个。不知道这,是不是类似的

点评

在那里见过?能贴上来不  详情 回复 发表于 2013-6-2 18:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 343个

财富等级: 日进斗金

发表于 2013-6-2 17:55:18 | 显示全部楼层
支持一下,这个程序实用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-2 17:55:57 | 显示全部楼层
做这种东西,我觉得应该用递归,楼主用没?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-2 18:07:32 | 显示全部楼层
控制行宽那还没处理好,弄了一天头晕了,不弄咯
主要是看到电脑上这也有lsp那也有,所以想汇聚做一个CHM的

递归还没学会呐{:soso_e140:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-2 18:16:49 | 显示全部楼层
jiucheng01 发表于 2013-6-2 17:51
LISP格式化,以前有看到过一个。不知道这,是不是类似的

在那里见过?能贴上来不

点评

没有源码,只有编译的。  详情 回复 发表于 2013-6-9 19:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-2 18:19:31 | 显示全部楼层
楼主到底想要干什么呢?格式化的问题交给acad的VLISP(或VLIDE)编辑器完成不好么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-6-9 12:44:34 | 显示全部楼层
格式化的意思是把LISP中的内容清空吗?我执行后命令行出现:QQ ; 错误: 参数类型错误: numberp: nil,并得到一个0KB的*tmpFormat.lsp文件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-9 19:42:49 | 显示全部楼层
QiaoCheng 发表于 2013-6-2 18:16
在那里见过?能贴上来不

没有源码,只有编译的。

new_lisp格式化.rar

3.07 KB, 下载次数: 17, 下载积分: D豆 -1 , 活跃度 1

这个是编译的版本,没有源码。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-9 23:33:06 | 显示全部楼层
dos年代就有啊,你去搜Delisp.exe
现在用vlide或者其他编辑器,还不够用吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-9 23:56:34 | 显示全部楼层
我晕,如果是编译的或是.exe。。。。
能不能像地板一样给点建议

点评

精神值得鼓励,需要格式化的大都是网页拷贝的活着其他途径得到的,在 Vlide活着 Lisplink 中手动格式化的过程也就是一个学习过程,当然把这个写成自动化想必楼主对这个过程会有更深的理解,以后遇到需要格式化的程序  详情 回复 发表于 2013-6-10 00:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-10 00:25:32 | 显示全部楼层
QiaoCheng 发表于 2013-6-9 23:56
我晕,如果是编译的或是.exe。。。。
能不能像地板一样给点建议

精神值得鼓励,需要格式化的大都是网页拷贝的或着其他途径得到的程序,在 Vlide或着 Lisplink 中手动格式化的过程也就是一个学习过程,当然把这个写成自动化想必楼主对这个过程会有更深的理解,以后遇到需要格式化的程序也未必用这个自动格式化。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-10 23:56:22 | 显示全部楼层
正好需要这个东西。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 17:22 , Processed in 0.225433 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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