明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3129|回复: 12

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

  [复制链接]
发表于 2022-3-17 11:32:07 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2022-3-17 12:12 编辑

简单适用-画表格函数  非AcDbTable,后面例举3个应用场景
最后一个例子有动态感


类似功能函数论坛内很多了,分享我的版本,一直在用

如觉得ok!,你的赞或回复也许会成就另一位需要的朋友!!

=============

;写简易表格函数writetable
;datalst 元素均为字符串的数据表, 一行一子表
;子表长度可不等,以最大列数画表格
;zg字高,pt表格左上角基点
;wlst列宽表(list 5 10...),第0元素/第1列宽,依次类推,最大索引的值代表其之后的列宽
;dz:对正,T对正表格中央 nil对正表格左中
;即列宽表可以指定1个或多个值
;列宽推荐:最长字符长度*字高*0.5+2*子高
;行高不设参数,默认=字高*2.5
(defun writetable (datals wlst pt zg dz /  hg lastw i date n w str w0 pt1 pt2 pt3)
        (setq  hg (* zg 2.5) lastw (last wlst) i 0)
        (foreach date datals
                (setq n 0  w 0);单行操作开始
                (foreach str  date ;
                        (or (setq w0(nth n wlst))(setq w0 lastw));列宽
                        (setq w (+ w w0));列位置                        
                        (setq pt3(mapcar '+ pt(list w (* i hg -1))));单格右上角
                        (setq pt1(mapcar '- pt3 (list w0 hg)));左下角
                        (setq pt2(mapcar '+ pt1 (list (* 0.5 w0) (* 0.5 hg))))
                        (if dz
                                (entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt2) (cons 40 zg)
                                                '(41 . 0.8)(cons 7(getvar 'textstyle))'(72 . 1)(cons 11 pt2)'(73 . 2))
                                );当前字体, 对正中央
                                (entmakex (list '(0 . "text") (cons 1 str) (cons 7 (getvar "textstyle"))
                                        (cons 10 (mapcar '+ pt1 (list (* 0.5 zg) (* 0.5 zg))))(cons 40 zg)'(41 . 0.8))
                                );当前字体, 对正左下
                        )
                        (entmake(append
                                '((0 . "LWPOLYLINE")(100 . "AcDbEntity")(100 . "AcDbPolyline")(90 . 4)(70 . 1))
                                (mapcar '(lambda (x)(cons 10 x))
                                (list pt1 (list (car pt1)(cadr pt3))pt3(list (car pt3)(cadr pt1)))))
                        );画单格框
                        (setq n (1+ n))
                )(setq i (1+ i))
        )
)
;取得列表各列字串长(TableRwith lst)
(defun TableRwith (lst /  a w wls)
    (repeat
            (apply 'max (mapcar 'length lst));列数
            (setq a (subst "" nil(mapcar 'car lst)));列元素
            (setq w(apply 'max (mapcar 'strlen a)));最大串长
            (setq lst (mapcar 'cdr lst))
            (setq wls (append wls (list w)))
    )
)

;===============================
(vl-load-com)
;应用1 写表格
(defun c:ttt ( / lst zg pt wls)
        (setq lst(mapcar '(lambda(x) (mapcar 'vl-princ-to-string x))
           '(("字段1" "字段2" "字段3" "字段4" "字段5")
                ("as" "dfghj" "wertty" 3.445 16889)
                ("as" "dfghj" "wertty" 3.445 16889)
                ("格式化输入" "dfge" "edeer" 4568 132))
        ))
        (and(setq zg(getreal "输入子高"))
                (setq pt(getpoint "指定表格左上角"))
                (setq wls(mapcar '(lambda(x)(+ (* 2 zg)(* x zg 0.5)))(TableRwith lst)))
                ;列宽:最长字符长度*字高*0.5+2*子高
                (writetable lst wls pt zg nil)
        )
)



;应用2选线写坐标表 子高默认5
(defun c:zbbg ( / e i pt lst wls bl)        
        (if(setq e (ssget ":S" '((0 . "*POLYLINE"))))
                (progn
                (setq e (ssname e 0) i -1)
                (setvar "dimzin" 1)
                (while(setq pt(vlax-curve-getpointatparam e (setq i (1+ i))))
                        (setq lst(cons(list(itoa(1+ i)) (rtos(cadr pt)2 2)(rtos(car pt)2 2)) lst))
                )
                (setq lst (cons (list "序号" "X(m)" "Y(m)") (reverse lst)))
                (setq wls(mapcar '(lambda(i)(* i 4))(TableRwith lst)))
                (and(setq pt(getpoint "指定表格左上角"))
                        (writetable lst wls pt 5 t)                        
                )
                )               
        )
)
;应用3选点写坐标表  子高默认5 有动态感觉
(defun c:dzb ( / pt0 n)
        (setvar "cmdecho" 0)(setvar "dimzin" 1)
        (and(setq pt0(getpoint "指定表格左上角"))
                (writetable '(("序号" "X(m)" "Y(m)"))(list 15 25) pt0 5 t)
                (setq n 1)
                (while (setq pt(getpoint "点取坐标位置"))
                        (writetable
                                (list(list(itoa n)(rtos(cadr pt)2 2)(rtos(car pt)2 2)))
                                (list 15 25) (mapcar '- pt0 (list 0 (* n 12.5))) 5 t
                        )
                        (command "_text" "bl" "non" pt  5 0 (itoa n))
                        ;坐标点处写编号
                        (setq n (1+ n))                                
                )
        )(setvar "cmdecho" 1)
)






评分

参与人数 4明经币 +6 收起 理由
hubeiwdlue + 1 赞一个!
bssurvey + 1 赞一个!
start4444 + 1 很给力!
xyp1964 + 3 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-3-17 12:52:39 | 显示全部楼层
xyp1964 发表于 2022-3-17 12:14
应用3,(list 15 25) ,当坐标点离原点比较远时文字会出边框。
建议:1.加进群组功能;2.多段线改直线。

谢谢大佬的点评!!!!
这是我库存,以往我的使用环境一直未发现该问题,抽空再改
发表于 2022-3-17 12:14:01 | 显示全部楼层
应用3,(list 15 25) ,当坐标点离原点比较远时文字会出边框。
建议:1.加进群组功能;2.多段线改直线。
发表于 2024-3-16 11:29:00 | 显示全部楼层
点坐标时候,编号和坐标点距离相当的远哦,不知道怎么设置
发表于 2022-9-27 20:15:45 | 显示全部楼层
还能优化更好吗
发表于 2023-6-16 08:51:36 | 显示全部楼层
列钢筋表,正好用到了,感谢
发表于 2023-6-16 12:56:06 | 显示全部楼层
谢谢楼主分享
发表于 2023-8-7 21:03:32 | 显示全部楼层
这个东西不错,值得继续开发
发表于 2023-11-30 23:52:06 | 显示全部楼层
谢谢分享表格函数
发表于 2023-12-2 14:14:43 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 19:24 , Processed in 0.199049 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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