找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 192|回复: 0

简单适用-画表格函数 非AcDbTable

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-16 20:47:05 | 显示全部楼层 |阅读模式
  1. 简单适用-画表格函数  非AcDbTable,后面例举3个应用场景
  2. 最后一个例子有动态感
  3. 类似功能函数论坛内很多了,分享我的版本,一直在用
  4. 如觉得ok!,你的赞或回复也许会成就另一位需要的朋友!!
  5. =============
  6. ;写简易表格函数writetable
  7. ;datalst 元素均为字符串的数据表, 一行一子表
  8. ;子表长度可不等,以最大列数画表格
  9. ;zg字高,pt表格左上角基点
  10. ;wlst列宽表(list 5 10...),第0元素/第1列宽,依次类推,最大索引的值代表其之后的列宽
  11. ;dz:对正,T对正表格中央 nil对正表格左中
  12. ;即列宽表可以指定1个或多个值
  13. ;列宽推荐:最长字符长度*字高*0.5+2*子高
  14. ;行高不设参数,默认=字高*2.5
  15. (defun writetable (datals wlst pt zg dz /  hg lastw i date n w str w0 pt1 pt2 pt3)
  16.         (setq  hg (* zg 2.5) lastw (last wlst) i 0)
  17.         (foreach date datals
  18.                 (setq n 0  w 0);单行操作开始
  19.                 (foreach str  date ;
  20.                         (or (setq w0(nth n wlst))(setq w0 lastw));列宽
  21.                         (setq w (+ w w0));列位置                        
  22.                         (setq pt3(mapcar '+ pt(list w (* i hg -1))));单格右上角
  23.                         (setq pt1(mapcar '- pt3 (list w0 hg)));左下角
  24.                         (setq pt2(mapcar '+ pt1 (list (* 0.5 w0) (* 0.5 hg))))
  25.                         (if dz
  26.                                 (entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt2) (cons 40 zg)
  27.                                                 '(41 . 0.8)(cons 7(getvar 'textstyle))'(72 . 1)(cons 11 pt2)'(73 . 2))
  28.                                 );当前字体, 对正中央
  29.                                 (entmakex (list '(0 . "text") (cons 1 str) (cons 7 (getvar "textstyle"))
  30.                                         (cons 10 (mapcar '+ pt1 (list (* 0.5 zg) (* 0.5 zg))))(cons 40 zg)'(41 . 0.8))
  31.                                 );当前字体, 对正左下
  32.                         )
  33.                         (entmake(append
  34.                                 '((0 . "LWPOLYLINE")(100 . "AcDbEntity")(100 . "AcDbPolyline")(90 . 4)(70 . 1))
  35.                                 (mapcar '(lambda (x)(cons 10 x))
  36.                                 (list pt1 (list (car pt1)(cadr pt3))pt3(list (car pt3)(cadr pt1)))))
  37.                         );画单格框
  38.                         (setq n (1+ n))
  39.                 )(setq i (1+ i))
  40.         )
  41. )
  42. ;取得列表各列字串长(TableRwith lst)
  43. (defun TableRwith (lst /  a w wls)
  44.     (repeat
  45.             (apply 'max (mapcar 'length lst));列数
  46.             (setq a (subst "" nil(mapcar 'car lst)));列元素
  47.             (setq w(apply 'max (mapcar 'strlen a)));最大串长
  48.             (setq lst (mapcar 'cdr lst))
  49.             (setq wls (append wls (list w)))
  50.     )
  51. )
  52. ;===============================
  53. (vl-load-com)
  54. ;应用1 写表格
  55. (defun c:ttt ( / lst zg pt wls)
  56.         (setq lst(mapcar '(lambda(x) (mapcar 'vl-princ-to-string x))
  57.            '(("字段1" "字段2" "字段3" "字段4" "字段5")
  58.                 ("as" "dfghj" "wertty" 3.445 16889)
  59.                 ("as" "dfghj" "wertty" 3.445 16889)
  60.                 ("格式化输入" "dfge" "edeer" 4568 132))
  61.         ))
  62.         (and(setq zg(getreal "输入子高"))
  63.                 (setq pt(getpoint "指定表格左上角"))
  64.                 (setq wls(mapcar '(lambda(x)(+ (* 2 zg)(* x zg 0.5)))(TableRwith lst)))
  65.                 ;列宽:最长字符长度*字高*0.5+2*子高
  66.                 (writetable lst wls pt zg nil)
  67.         )
  68. )
  69. ;应用2选线写坐标表 子高默认5
  70. (defun c:zbbg ( / e i pt lst wls bl)        
  71.         (if(setq e (ssget ":S" '((0 . "*POLYLINE"))))
  72.                 (progn
  73.                 (setq e (ssname e 0) i -1)
  74.                 (setvar "dimzin" 1)
  75.                 (while(setq pt(vlax-curve-getpointatparam e (setq i (1+ i))))
  76.                         (setq lst(cons(list(itoa(1+ i)) (rtos(cadr pt)2 2)(rtos(car pt)2 2)) lst))
  77.                 )
  78.                 (setq lst (cons (list "序号" "X(m)" "Y(m)") (reverse lst)))
  79.                 (setq wls(mapcar '(lambda(i)(* i 4))(TableRwith lst)))
  80.                 (and(setq pt(getpoint "指定表格左上角"))
  81.                         (writetable lst wls pt 5 t)                        
  82.                 )
  83.                 )               
  84.         )
  85. )
  86. ;应用3选点写坐标表  子高默认5 有动态感觉
  87. (defun c:dzb ( / pt0 n)
  88.         (setvar "cmdecho" 0)(setvar "dimzin" 1)
  89.         (and(setq pt0(getpoint "指定表格左上角"))
  90.                 (writetable '(("序号" "X(m)" "Y(m)"))(list 15 25) pt0 5 t)
  91.                 (setq n 1)
  92.                 (while (setq pt(getpoint "点取坐标位置"))
  93.                         (writetable
  94.                                 (list(list(itoa n)(rtos(cadr pt)2 2)(rtos(car pt)2 2)))
  95.                                 (list 15 25) (mapcar '- pt0 (list 0 (* n 12.5))) 5 t
  96.                         )
  97.                         (command "采用text" "bl" "non" pt  5 0 (itoa n))
  98.                         ;坐标点处写编号
  99.                         (setq n (1+ n))                                
  100.                 )
  101.         )(setvar "cmdecho" 1)
  102. )
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 18:04 , Processed in 0.115369 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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