找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2443|回复: 9

[每日一码] 发几个表格型数据的函数

[复制链接]
发表于 2014-9-29 22:21:25 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 77077 于 2014-9-29 22:46 编辑
  1. ;获取表格型list的最大行列数
  2. ;(TableList-RowColNum '(("SDS" "DDDSS6" "SS" "")("FDS" "DFDSFSDA9")("SDS" "DDDS5" "SS")))
  3. ;=>(3 4)
  4. (defun TableList-RowColNum(lst)
  5.   (list (length lst)
  6.     (apply 'max (mapcar 'length lst))
  7.   )
  8. )
  9. ;用符号补齐表格型list各子表长度
  10. ;lst-表格型list   Len-补齐后长度 str-用于补齐的符号
  11. ;(TableList-FixLen '(("SDS" "DDDSS6" "SS" "")("FDS" "DFDSFSDA9")("SDS" "DDDS5" "SS")) 6 "-")
  12. ;=>(("SDS" "DDDSS6" "SS" "" "-" "-") ("FDS" "DFDSFSDA9" "-" "-" "-" "-") ("SDS" "DDDS5" "SS" "-" "-" "-"))
  13. (defun TableList-FixLen (lst Len str)
  14. (mapcar 'reverse
  15.   (mapcar
  16.           '(lambda(x)
  17.              (progn
  18.                      (setq x (reverse x))
  19.                (repeat (- len (length x))
  20.                        (setq x (cons str x))
  21.                 )
  22.               )
  23.           )
  24.           lst
  25.   )
  26. )
  27. )
  28. ;表格型list行列互转
  29. ;命令: (TableList-CR '(("SDS" "DDDSS6" "SS" "" "-" "-") ("FDS" "DFDSFSDA9" "-" "-" "-" "-") ("SDS" "DDDS5" "SS" "-" "-" "-")))
  30. ;=>(("SDS" "FDS" "SDS") ("DDDSS6" "DFDSFSDA9" "DDDS5") ("SS" "-" "SS") ("" "-" "-") ("-" "-" "-") ("-" "-" "-"))
  31. (defun TableList-CR (lst / l)       
  32.         (repeat (apply 'max (mapcar 'length lst))
  33.     (setq l (cons (mapcar 'car lst) l)
  34.          lst (mapcar 'cdr lst)
  35.          )
  36.   )
  37.   (reverse l)
  38. )
  39. ;表格型list中各子项转化为字符串
  40. ;命令: (TableList-StrLst '((0.5 0.8 0.6 0.3)(1.5 1.6 1.8)(2.2 2.5 2.8)))
  41. ;=>(("0.5" "0.8" "0.6" "0.3") ("1.5" "1.6" "1.8") ("2.2" "2.5" "2.8"))
  42. (defun TableList-StrLst(lst)
  43.     (mapcar
  44.                  '(lambda(y)
  45.                      (mapcar 'vl-princ-to-string y)
  46.                   )
  47.                 lst
  48.           )
  49. )
  50. ;获取表格型list各子表中最长字符串长度
  51. ;命令: (TableList-MaxlenC  '(("SDS" "DDDSS6" "SS" "")("FDS" "DFDSFSDA9" "SDFDS")("SDS" "DDDS5" "SS")))
  52. ;=>(6 9 5)
  53. (defun TableList-MaxlenC(lst)
  54.         (mapcar
  55.                 '(lambda(x)
  56.               (apply 'max (mapcar 'strlen x));单层表最大字符串长度
  57.      )
  58.            lst
  59.    )
  60. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2014-9-29 22:47:53 | 显示全部楼层
求优化.......
代码本来是对齐了的,怎么粘贴上来就变形了呢,编辑器问题?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5601个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-30 08:16:22 | 显示全部楼层
本帖最后由 st788796 于 2014-9-30 08:18 编辑
77077 发表于 2014-9-29 22:47
求优化.......
代码本来是对齐了的,怎么粘贴上来就变形了呢,编辑器问题?

可以参考下 XD开源函数库中 XD::Table 部分函数

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

使用道具 举报

 楼主| 发表于 2014-9-30 22:27:42 | 显示全部楼层
  1. ;利用表格型list制作CAD表格
  2. ;参数:
  3. ;lis --- 表格型list
  4. ;pt --- 表格左上角(点)
  5. ;zg ---- 字高(数值型)
  6. ;测试(TableLst2Table '((1 12 123 1234 12345 123456 1234567 12345678 123456780 1234567890)(1.0 0.0 0.0)(100.0 12345.0 "5551000" "1234")) (getpoint) 10)
  7. (defun TableLst2Table (lis pt zg / emkLine emkText h len1 len2 i h1 w2 tab_h
  8.                            len j w1 w2 wlst p0 p1 txt
  9.                       )
  10.   (defun emkLine (p1 p2)
  11.     (entmake (list '(0 . "LINE") (cons 8 "DM_文字表格") (cons 10 p1)
  12.                    (cons 11 p2)
  13.              )
  14.     )
  15.   )
  16.   (defun emkText (pt str h)
  17.     (entmake (list '(0 . "TEXT") (cons 1 str) (cons 8 "DM_文字表格")
  18.                    (cons 10 pt) (cons 40 h) (cons 11 pt) (cons 72 1)
  19.                    (cons 73 2)
  20.              )
  21.     )
  22.   )
  23.   (setq h (* zg 2)                       ; 表格高
  24.         len1 (length lis)               ; 表格行数len1
  25.         len2 (apply
  26.                'max
  27.                (mapcar
  28.                  'length
  29.                  lis
  30.                )
  31.              )                               ; 表格列数len2
  32.         p0 (list (car pt) (- (cadr pt) (* 0.5 h)))
  33.   )                                       ; 定义文字原点
  34.   (setq lis (mapcar
  35.               '(lambda (y)
  36.                  (mapcar
  37.                    'vl-princ-to-string
  38.                    y
  39.                  )
  40.                )
  41.               lis
  42.             )
  43.   )                                       ; 将表中元素全部变为文本型
  44.                                        ; 以下获取列宽表 wlst
  45.   (setq i 0
  46.         w2 0
  47.         wlst '()
  48.   )
  49.   (repeat len2
  50.     (foreach e lis
  51.       (setq txt (nth i e))
  52.       (if (not txt)
  53.         (setq txt "")
  54.       )
  55.       (setq w1 (* (+ (strlen txt) 1) zg)) ; 列宽=(文字长度+1)*zg
  56.       (if (> w1 w2)
  57.         (setq w2 w1)
  58.       )
  59.     )
  60.     (setq wlst (cons w2 wlst)
  61.           w2 0
  62.           i (1+ i)
  63.     )
  64.   )
  65.   (setq wlst (reverse wlst))               ; 按行顺序写出文字内容
  66.   (setq i 0
  67.         j 0
  68.         w1 0
  69.         w2 0
  70.   )
  71.   (foreach e lis
  72.     (setq h1 (- (cadr p0) (* i h)))    ; 文字行的y坐标值
  73.     (foreach f e
  74.       (setq w1 (nth j wlst)
  75.             w2 (+ w2 w1)
  76.       )
  77.       (setq p1 (list (- (+ (car p0) w2) (* w1 0.5)) h1)) ; 文字插入点
  78.       (emkText P1 f zg)
  79.       (setq j (1+ j))
  80.     )
  81.     (setq i (1+ i)
  82.           j 0
  83.           w1 0
  84.           w2 0
  85.     )
  86.   )                                       ; 开始绘制竖线
  87.   (setq tab_h (* len1 h))               ; 竖线长
  88.   (emkLine pt (polar pt (* pi 1.5) tab_h)) ; 绘制左侧第一根竖线
  89.   (setq len 0)
  90.   (foreach x wlst                       ; 绘制竖线
  91.     (setq len (+ x len)
  92.           p1 (polar pt 0 len)
  93.     )
  94.     (emkLine p1 (polar p1 (* Pi 1.5) tab_h))
  95.   )                                       ; 开始绘制横线
  96.   (setq i 0
  97.         len 0
  98.   )
  99.   (setq len (apply
  100.               '+
  101.               wlst
  102.             )
  103.   )                                       ; 横线长度
  104.   (repeat (1+ len1)                       ; 绘制横线
  105.     (setq p1 (polar pt (* Pi 1.5) (* i h))
  106.           i (1+ i)
  107.     )
  108.     (emkLine p1 (polar p1 0 len))
  109.   )
  110.   (princ)
  111. )

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-30 23:31:45 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2014-10-9 18:15:09 | 显示全部楼层
本帖最后由 77077 于 2014-10-9 19:35 编辑

  1. ;;; 测试命令:
  2. ;;; (tablist:group '(("a" 1 1) ("b" 1 1) ("c" 1 1) ("b" 2 1) ("b" 3 1) ("a" 2 2) ("a" 3 3) ("b" 4 2) ("c" 2 2) ("c" 3 1)) 1)
  3. ;;; ==>((("a" 1 1) ("a" 2 2) ("a" 3 3)) (("b" 1 1) ("b" 2 1) ("b" 3 1) ("b" 4 2)) (("c" 1 1) ("c" 2 2) ("c" 3 1)))
  4. (defun tablist:group (lst fuzz / k l ll)
  5.   (setq k (caar lst))                       ; 设定关键词
  6.   (while lst                                     ; 循环取值
  7.     (setq l (vl-remove-if-not '(lambda (x)
  8.                                  (equal (car x) k fuzz)
  9.                                ) lst
  10.             )                                           ; 以关键词查找出对应的元素表l
  11.           l (list l)                       ; 组合成一个小组
  12.           ll (append l ll)                             ; 小组添加到输出表
  13.     )
  14.     (setq lst (vl-remove-if '(lambda (x)
  15.                                (equal (car x) k fuzz)
  16.                              ) lst
  17.               )                                     ; 剔除后形成新表lst
  18.           k (caar lst)                       ; 设定新的关键词
  19.     )
  20.   )                                                 ; while循环结束
  21.   (reverse ll)                               ; 反串
  22. )

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

使用道具 举报

 楼主| 发表于 2014-10-9 19:21:43 | 显示全部楼层
还是来个合并分组的吧~~~

  1. ;;; 测试命令:
  2. ;;; (tablist:group1 '(("a" 1 1) ("b" 1 1) ("c" 1 1) ("b" 2 1) ("b" 3 1) ("a" 2 2) ("a" 3 3) ("b" 4 2) ("c" 2 2) ("c" 3 1)) 1)
  3. ;;; ==>(("a" (1 1) (2 2) (3 3)) ("b" (1 1) (2 1) (3 1) (4 2)) ("c" (1 1) (2 2) (3 1)))
  4. (defun tablist:group1 (lst fuzz / k l ll)
  5.   (setq k (caar lst))                       ; 设定关键词
  6.   (while lst                               ; 循环
  7.     (setq l (vl-remove-if-not
  8.                             '(lambda (x)
  9.                                  (equal (car x) k fuzz)
  10.                                ) lst
  11.             )                               ; 以关键词查找出对应的元素表l
  12.           l (mapcar
  13.               'cdr
  14.               l
  15.             )                               ; 分别剔除首项
  16.           l (list (cons k l))               ; 组合成一个小组
  17.           ll (append
  18.                l
  19.                ll
  20.              )                               ; 小组添加到输出表
  21.     )
  22.     (setq lst (vl-remove-if
  23.                             '(lambda (x)
  24.                                (equal (car x) k fuzz)
  25.                              ) lst
  26.               )                               ; 剔除后形成新表lst
  27.           k (caar lst)                       ; 设定新的关键词
  28.     )
  29.   )                                       ; while循环结束
  30.   (reverse ll)                               ; 反串
  31. )


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

使用道具 举报

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 13:34 , Processed in 0.282894 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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