送佛送到西,贴上用到的函数 - ;利用表格型list制作CAD表格 By77077
- ;参数:
- ;lis --- 表格型list
- ;pt --- 表格左上角(点)
- ;zg ---- 字高(数值型)
- ;测试(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)
- (defun TableLst2Table (lis pt zg / emkLine emkText h len1 len2 i h1 w2 tab_h len j w1 w2 wlst p0 p1 txt)
- (defun emkLine (p1 p2)
- (entmake (list '(0 . "LINE") (cons 8 "DM_文字表格") (cons 10 p1) (cons 11 p2)))
- )
- (defun emkText (pt str h)
- (entmake (list '(0 . "TEXT") (cons 1 str) (cons 8 "DM_文字表格") (cons 10 pt) (cons 40 h) (cons 11 pt) (cons 72 1) (cons 73 2)))
- )
- (setq h (* zg 2) ; 表格高
- len1 (length lis) ; 表格行数len1
- len2 (apply 'max (mapcar 'length lis)) ; 表格列数len2
- p0 (list (car pt) (- (cadr pt) (* 0.5 h))); 定义文字原点
- )
- (setq lis (mapcar '(lambda (y) (mapcar 'vl-princ-to-string y)) lis)) ; 将表中元素全部变为文本型
- ; 以下获取列宽表 wlst
- (setq i 0 w2 0 wlst '())
- (repeat len2
- (foreach e lis
- (setq txt (nth i e))
- (if (not txt) (setq txt "")) ;如果没有字符
- (setq w1 (* (+ (strlen txt) 1) zg)) ; 列宽=(文字长度+1)*zg
- (if (> w1 w2) (setq w2 w1)) ;取最大列宽
- )
- (setq wlst (cons w2 wlst) w2 0 i (1+ i))
- )
- ;以下按行写出文字
- (setq wlst (reverse wlst))
- (setq i 0 j 0 w1 0 w2 0)
- (foreach e lis
- (setq h1 (- (cadr p0) (* i h))) ; 文字行的y坐标值
- (foreach f e
- (setq w1 (nth j wlst) w2 (+ w2 w1))
- (setq p1 (list (- (+ (car p0) w2) (* w1 0.5)) h1)) ; 文字插入点
- (emkText P1 f zg)
- (setq j (1+ j))
- )
- (setq i (1+ i) j 0 w1 0 w2 0)
- )
- ; 开始绘制竖线
- (setq tab_h (* len1 h)) ; 竖线长
- (emkLine pt (polar pt (* pi 1.5) tab_h)) ; 绘制左侧第一根竖线
- (setq len 0)
- (foreach x wlst ; 绘制竖线
- (setq len (+ x len) p1 (polar pt 0 len))
- (emkLine p1 (polar p1 (* Pi 1.5) tab_h))
- )
- ; 开始绘制横线
- (setq i 0 len 0)
- (setq len (apply '+ wlst)) ; 横线长度
- (repeat (1+ len1) ; 绘制横线
- (setq p1 (polar pt (* Pi 1.5) (* i h)) i (1+ i))
- (emkLine p1 (polar p1 0 len))
- )
- (princ)
- )
|