明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3987|回复: 17

[讨论] 求大神做个程序根据lisp表绘制cad表格

[复制链接]
发表于 2013-8-29 23:27 | 显示全部楼层 |阅读模式
本帖最后由 linshiyin2 于 2013-8-29 23:29 编辑

根据这个表,在cad里直接绘制一个表格每个格子放置这个表的对应位置的内容

表的格式为如下,可以是字符串或者数字
(1.0 0.0 0.0)
(1.0 0.0 0.0)
(1.0 0.0 0.0)
绘制成表格

本帖子中包含更多资源

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

x
发表于 2017-11-15 13:04 | 显示全部楼层
大神可以改下:如excel般编辑吗,自定义要多少行列
发表于 2013-8-29 23:35 | 显示全部楼层
大哥,你有没有看过群共享?里面有很多宝贝哦。
那个刚传上去还剩三天的Excel2CAD.lsp就是你说的程序啊
赶紧抢下吧,晚了就没了。
 楼主| 发表于 2013-8-30 01:03 | 显示全部楼层
  1. (defun c:tt (/ B H I J LIS M MM N P0 P1 P2 PT ZG)
  2.   (setq lis (cons '(1.0 0.0 0.0) lis))
  3.   (setq lis (cons '(1.0 0.0 0.0) lis))
  4.   (setq lis (cons '(1.0 0.0 0.0 1) lis))
  5.   (setq zg 1;字高
  6.         b 2 ;表格宽度
  7.         h 3);表格高
  8.   (setq n (length lis));表格行数n
  9.   (foreach e lis
  10.     (setq mm (length e))
  11.     (if (> mm m) (setq m mm)));表格列数m
  12.   (setq pt (getpoint "选取表格左上角位置:"))
  13.   (setq i 0)
  14.   (repeat (1+ m);绘制竖线
  15.     (setq p1 (polar pt (*  0.0 Pi) (* i b))
  16.           p2 (polar p1 (* -0.5 Pi) (* n h))
  17.           i (1+ i))
  18.    
  19.     (command "pline" p1 p2 "")
  20.     )
  21.   (setq i 0)
  22.   (repeat (1+ n) ;绘制横线
  23.     (setq p1 (polar pt (* -0.5 Pi) (* i h))
  24.           p2 (polar p1 (*  0.0 Pi) (* m b))
  25.           i (1+ i))
  26.    
  27.     (command "pline" p1 p2 "")
  28.     )
  29.   (setq i 0
  30.         j 0
  31.         p0 (list (+ (car pt) (* 0.5 b)) (- (cadr pt) (* 0.7 h))));定义文字原点
  32.   (foreach e lis  ;填入表内容
  33.     (foreach f e
  34.       (setq p1 (list (+ (car p0) (* j b)) (- (cadr p0) (* i h)))
  35.             j (1+ j))
  36.       (command "text" p1 zg 0 (rtos f 2 2))
  37.       )
  38.     (setq i (1+ i)
  39.           j 0)
  40.    )
  41.   )
自己写的,没有判断每个格子内容长短
发表于 2013-8-30 08:19 | 显示全部楼层
  1. ;先写内容再画表,自适应文字宽度 明经 ZZXXQQ 2013.8.30
  2. (defun c:tt (/ B H I J LIS M MM N P0 P1 P2 PT ZG)
  3.   (setq lis (cons '(1.0 0.0 0.0) lis))
  4.   (setq lis (cons '(1.0 0.0 0.0) lis))
  5.   (setq lis (cons '(1.0 0.0 0.0) lis))
  6.   (setq zg 1;字高
  7.         h 3);表格高
  8.   (setq n (length lis) m 1);表格行数n
  9.   (foreach e lis
  10.     (if (> (setq mm (length e)) m) (setq m mm)));表格列数m
  11.   (setq pt (getpoint "选取表格左上角位置:"))
  12.   (setq i 0 tabl 0 ;表长
  13.         j 0 tabbl (list)
  14.         p0 (list (car pt) (- (cadr pt) (* 0.7 h))));定义文字原点
  15.   (foreach e lis  ;填入表内容
  16.    (setq tabll (list)) ;行长
  17.    (setq tabb (list))
  18.    (foreach f e
  19.     (setq txtf (rtos f 2 2)
  20.           txtl (strlen txtf)
  21.           tabb (cons txtl tabb)
  22.           tabll (+ tabl txtl 2))
  23.     (setq p1 (list (+ (car p0) tabll (/ txtl 2) -1) (- (cadr p0) (* i h))))
  24.     (command "text" "C" p1 zg 0 txtf)
  25.    )
  26.    (if (> tabll tabl) (setq tabl tabll tabbl tabb))
  27.    (setq i (1+ i))
  28.   )
  29.   (command ".line" p1 (polar p1(/ pi 2) (* n h)) "")
  30.   (foreach x tabbl ;绘制竖线
  31.     (setq p1 (polar pt 0 (+ x 2)))
  32.     (command ".line" p1 (polar p1 (/ Pi 2) (* n h)) "")
  33.   )
  34.   (setq i 0)
  35.   (repeat (1+ n) ;绘制横线
  36.     (setq p1 (polar pt (/ Pi 2) (* i h))
  37.           i (1+ i))
  38.     (command "pline" p1 (polar p1 0 tabl) "")
  39.   )
  40.   (princ)
  41. )
 楼主| 发表于 2013-8-30 09:23 | 显示全部楼层
  1. ;先写内容再画表,自适应文字宽度 明经 ZZXXQQ 2013.8.30
  2. (defun c:tt1 (/ B H I J LIS M MM N P0 P1 P2 PT ZG)
  3.   (setq lis (cons '(1.0 0.0 0.0) lis))
  4.   (setq lis (cons '(1.0 0.0 0.0) lis))
  5.   (setq lis (cons '(1.0 0.0 0.0 "ff") lis))
  6.   (setq zg 1;字高
  7.         h 3);表格高
  8.   (setq n (length lis) m 1);表格行数n
  9.   (foreach e lis
  10.     (if (> (setq mm (length e)) m) (setq m mm)));表格列数m
  11.   (setq pt (getpoint "选取表格左上角位置:"))
  12.   (setq i 0 tabl 0 ;表长
  13.         j 0 tabbl (list);表宽列表
  14.         p0 (list (car pt) (- (cadr pt) (* 0.7 h))));定义文字原点
  15.   (foreach e lis  ;填入表内容
  16.    (setq tabll 0) ;行长
  17.    (setq tabb (list))
  18.    (foreach f e
  19.      (if (/= (type f) 'STR) (setq txtf (rtos f 2 2)) (setq txtf f));判断f是否是字符串
  20.     (setq txtl (strlen txtf)
  21.           tabb (cons txtl tabb)
  22.           tabll (+ tabll txtl 2))
  23.     (setq p1 (list (+ (car p0) tabll (/ txtl 2) -1) (- (cadr p0) (* i h))))
  24.     (command "text" "C" p1 zg 0 txtf)
  25.    )
  26.    (if (> tabll tabl) (setq tabl tabll tabbl tabb))
  27.    (setq i (1+ i))
  28.   )
  29.   (command ".line" pt (polar pt (/ pi -2) (* n h)) "")
  30.   (setq len 0)
  31.   (foreach x tabbl ;绘制竖线
  32.     (setq len (+ x len 2))
  33.     (setq p1 (polar pt 0 len))
  34.     (command ".line" p1 (polar p1 (/ Pi -2) (* n h)) "")
  35.   )
  36.   (setq i 0)
  37.   (repeat (1+ n) ;绘制横线
  38.     (setq p1 (polar pt (/ Pi -2) (* i h)) i (1+ i))
  39.     (command "pline" p1 (polar p1 0 tabl) "")
  40.   )
  41.   (princ)
  42. )
增加了判断字符格式,修改了zzxxqq的错误部分
 楼主| 发表于 2013-8-30 09:27 | 显示全部楼层
ZZXXQQ 发表于 2013-8-30 08:19

还不完善,需改进,先写表格内容部分文字的位置需要调整,调整最好根据开头定义的字体高度自动的来调整。
 楼主| 发表于 2013-9-2 03:27 | 显示全部楼层
  1. ;将表打印出来 2013年9月2日
  2. (defun c:tt1 (/ H I J LEN LIS LIS1 LIS2 M MM N P0 P1 PT TAB TABBL TABL TXT ZG)
  3.   (setq lis (cons '(1 12 123 1234 12345 123456 1234567 12345678 123456780 1234567890) lis))
  4.   (setq lis (cons '(1.0 0.0 0.0) lis))
  5.   (setq lis (cons '(100.0 12345.0 "5551000" "1234") lis))
  6.   (setq zg 1;字高
  7.         h 3);表格高
  8.   (setq n (length lis) m 1);表格行数n
  9.   (foreach e lis
  10.     (if (> (setq mm (length e)) m) (setq m mm)));表格列数m
  11.   (setq pt (getpoint "选取表格左上角位置:"))
  12.   (setq i    0
  13.         tabl 0 ;表长
  14.         j    0
  15.         tabbl (list);表宽表
  16.         p0 (list (car pt) (- (cadr pt) (* 0.7 h))));定义文字原点
  17.   ;将表中的数字全部变为字符串
  18.   (setq lis1 (list)
  19.         lis2 (list))
  20.   (foreach e lis
  21.     (foreach f e
  22.       (if (and (/= (type f) 'STR) f) (setq f (rtos f 2 2)))
  23.       (setq lis1 (cons f lis1))      )
  24.     (setq lis2 (cons (reverse lis1) lis2)
  25.           lis1 nil)    )
  26.   (setq lis (reverse lis2))

  27.   ;以下获取列宽表 tabbl
  28.   (setq i 0)
  29.   (repeat m
  30.     (foreach e lis
  31.       (setq txt (nth i e))
  32.       (if (and (/= (type txt) 'STR) txt) (setq txt (rtos txt 2 2)))
  33.       (if (not txt) (setq txt ""))
  34.       (setq tab (strlen txt))
  35.       (if (> tab tabl) (setq tabl tab)) ;找到此列最长的长度
  36.       )
  37.     (setq tabbl (cons tabl tabbl))
  38.     (setq tabl 0)
  39.     (setq i (1+ i))
  40.     )
  41.   (setq tabbl (reverse tabbl))
  42.    ;填入表内容
  43.   (setq i 0
  44.         j 0
  45.         tab 0
  46.         tabl 0)
  47.   (foreach e lis
  48.     (foreach f e
  49.       (setq tab (nth j tabbl)
  50.             tabl (+ tabl tab 1))
  51.       (setq p1 (list (- (+ (car p0) tabl) (* tab 0.5)) (- (cadr p0) (* i h))))
  52.       (command "text" "C" p1 zg 0 f)
  53.       (setq tabl (+ tabl 1))
  54.       (setq j (1+ j))
  55.      )
  56.     (setq i (1+ i) j 0 tab 0 tabl 0)
  57.     )
  58. ;一下绘制竖线
  59.   (command ".line" pt (polar pt (/ pi -2) (* n h)) "")
  60.   (setq len 0)
  61.   (foreach x tabbl ;绘制竖线
  62.     (setq len (+ x len 2))
  63.     (setq p1 (polar pt 0 len))
  64.     (command ".line" p1 (polar p1 (/ Pi -2) (* n h)) "")  )
  65.   (setq i 0        len 0)
  66.   (foreach e tabbl
  67.     (setq len (+ len e 2)));横线长度
  68.   (repeat (1+ n) ;绘制横线
  69.     (setq p1 (polar pt (* Pi -0.5) (* i h)) i (1+ i))
  70.     (command "pline" p1 (polar p1 0 len) "")  )
  71.   (princ)
  72. )
发表于 2013-9-3 09:12 | 显示全部楼层
linshiyin2 发表于 2013-9-2 03:27

谢谢分享
先收集下来,等会看看,学习学习。
谢谢
发表于 2014-3-12 09:36 | 显示全部楼层
linshiyin2 发表于 2013-9-2 03:27

不错不错很实用~可以修改下弄成lst2tab函数了!
有一点小瑕疵
(setq zg 1 h zg 3)==> (setq zg 1 h (* zg 2))
(setq tab (strlen txt))==>(setq tab (* (strlen txt) zg))
发表于 2014-3-19 19:53 | 显示全部楼层
看看好不好用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 13:21 , Processed in 0.502776 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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