明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4807|回复: 14

[源码] 统计块数量并绘制表格

[复制链接]
发表于 2014-4-23 18:40 | 显示全部楼层 |阅读模式
(defun c:lsp_50()
(setvar "cmdecho" 0)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq pt1 (getpoint "\n左上角: "))
(setq ww (getdist pt1 "\n宽度 <50>: "))
(if (null ww) (setq ww 40.0))
(setq hh (getdist pt1 "\n每格高度 <8>: "))
(if (null hh) (setq hh 8.0))
(setq pt2 (polar pt1 0 ww))
(setq pt3 (polar pt2 (* pi 1.5) hh))
(setq pt4 (polar pt1 (* pi 1.5) hh))
(command "pline" pt1 pt2 pt3 pt4 "c")
(setq pt5 (polar pt1 0 (/ ww 2)))
(setq pt6 (polar pt5 (* pi 1.5) hh))
(command "line" pt5 pt6 "")
(command "text" "m" (inters pt1 pt6 pt4 pt5) (/ hh 2) 0 "块名称")
(command "text" "m" (inters pt5 pt3 pt2 pt6) (/ hh 2) 0 "数量")
(setq blk (tblnext "block" t))
(while blk
(setq blkn (assoc 2 blk))
(setq blk_key (substr (cdr blkn) 1 1))
(if (/= blk_key "*")
(progn
(setq ss (ssget "X" (list blkn)))
(if (null ss)
(setq ssn 0)
(setq ssn (sslength ss))              
)
(setq blknn (cdr blkn))
(setq pt1 pt4 pt5 pt6 pt2 pt3)
(setq pt4 (polar pt1 (* pi 1.5) hh))
(setq pt6 (polar pt5 (* pi 1.5) hh))
(setq pt3 (polar pt2 (* pi 1.5) hh))
(command "pline" pt2 pt3 pt4 pt1 "")
(command "line" pt5 pt6 "")
(command "text" "m" (inters pt1 pt6 pt4 pt5) (/ hh 2) 0 blknn)
(command "text" "m" (inters pt5 pt3 pt2 pt6) (/ hh 2) 0 (itoa ssn))
)
)
(setq blk (tblnext "block"))
)
(setvar "osmode" os)
(prin1)
)  
发表于 2015-4-22 23:49 | 显示全部楼层
送佛送到西,贴上用到的函数
  1. ;利用表格型list制作CAD表格 By77077
  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 len j w1 w2 wlst p0 p1 txt)
  8.   (defun emkLine (p1 p2)
  9.     (entmake (list '(0 . "LINE") (cons 8 "DM_文字表格") (cons 10 p1) (cons 11 p2)))
  10.     )
  11.   (defun emkText (pt str h)
  12.     (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)))
  13.     )
  14.   (setq h (* zg 2)                             ; 表格高
  15.               len1 (length lis)                      ; 表格行数len1
  16.               len2 (apply 'max (mapcar 'length lis)) ; 表格列数len2
  17.               p0 (list (car pt) (- (cadr pt) (* 0.5 h))); 定义文字原点
  18.               )
  19.   (setq lis (mapcar '(lambda (y) (mapcar 'vl-princ-to-string y)) lis)) ; 将表中元素全部变为文本型
  20.   ; 以下获取列宽表 wlst
  21.   (setq i 0 w2 0 wlst '())
  22.   (repeat len2
  23.     (foreach e lis
  24.       (setq txt (nth i e))
  25.       (if (not txt) (setq txt ""))         ;如果没有字符
  26.       (setq w1 (* (+ (strlen txt) 1) zg))  ; 列宽=(文字长度+1)*zg
  27.       (if (> w1 w2) (setq w2 w1))          ;取最大列宽
  28.       )
  29.     (setq wlst (cons w2 wlst) w2 0 i (1+ i))
  30.     )
  31.   ;以下按行写出文字
  32.   (setq wlst (reverse wlst))
  33.   (setq i 0 j 0 w1 0 w2 0)
  34.   (foreach e lis
  35.     (setq h1 (- (cadr p0) (* i h)))        ; 文字行的y坐标值
  36.     (foreach f e
  37.       (setq w1 (nth j wlst) w2 (+ w2 w1))
  38.       (setq p1 (list (- (+ (car p0) w2) (* w1 0.5)) h1)) ; 文字插入点
  39.       (emkText P1 f zg)
  40.       (setq j (1+ j))
  41.       )
  42.     (setq i (1+ i) j 0 w1 0 w2 0)
  43.     )
  44.   ; 开始绘制竖线
  45.   (setq tab_h (* len1 h))                  ; 竖线长
  46.   (emkLine pt (polar pt (* pi 1.5) tab_h)) ; 绘制左侧第一根竖线
  47.   (setq len 0)
  48.   (foreach x wlst                          ; 绘制竖线
  49.     (setq len (+ x len) p1 (polar pt 0 len))
  50.     (emkLine p1 (polar p1 (* Pi 1.5) tab_h))
  51.     )
  52.   ; 开始绘制横线
  53.   (setq i 0 len 0)
  54.   (setq len (apply '+ wlst))              ; 横线长度
  55.   (repeat (1+ len1)                       ; 绘制横线
  56.     (setq p1 (polar pt (* Pi 1.5) (* i h)) i (1+ i))
  57.     (emkLine p1 (polar p1 0 len))
  58.     )
  59.   (princ)
  60.   )

点评

学习了,谢谢分享  发表于 2015-4-28 15:29
回复 支持 1 反对 0

使用道具 举报

发表于 2023-11-18 12:32 | 显示全部楼层
本帖最后由 qazxswk 于 2023-11-19 14:50 编辑
77077 发表于 2015-4-22 23:49
送佛送到西,贴上用到的函数

感觉TableLst2Table函数,控制列表的宽度很难操作,内容最宽的,列表宽度反而最小。怎么样修改一下,方便控制列表的宽度?
发表于 2018-7-23 22:16 | 显示全部楼层
blklst2tab  把这个函数法出来啊   大家学习一下
发表于 2015-4-21 20:21 | 显示全部楼层
这个挺好的,请问同名块是哪里加上去的,没看明白!
发表于 2015-4-22 23:06 | 显示全部楼层
伪源码

  1. (defun c:tt( / os lst blk blkn zg pt x)
  2.   (setvar "cmdecho" 0)
  3.   (setq os (getvar "osmode"))
  4.   (setvar "osmode" 0)
  5.   (setq lst (list '("图例" "块名" "数量"))
  6.         blk (tblnext "block" t)
  7.         )
  8.   (while blk
  9.     (setq blkn (cdr(assoc 2 blk))
  10.           ss (ssget "X" (list '(0 . "INSERT")(cons 2 blkn)))
  11.           x (list blkn (sslength ss))
  12.           lst (cons x lst))
  13.     (setq blk (tblnext "block"))
  14.     )
  15.   (setq zg(getreal "\n字高: ")
  16.         pt(getpoint "\n左上角: ")
  17.         )
  18.   (blklst2tab (reverse lst) pt zg)
  19.   (setvar "osmode" os)
  20.   (prin1)
  21.   )
发表于 2015-4-23 18:47 | 显示全部楼层
感谢 77077  分享程序源码!
发表于 2016-6-29 16:10 | 显示全部楼层
学习学习 谢谢分享
发表于 2016-7-3 17:56 | 显示全部楼层
你好,可以帮我做个类似的程序吗?
人工输入长宽尺寸
程序逐行往下提出用户跟据板材名称选择厚度值
板A   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板b   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板c   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
.........总计十几行完成
程序提示用户第二次人工输入长宽尺寸
程序逐行往下提出用户跟据板材名称选择厚度值
板A1   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板b2   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板c3   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
.........总计十几行完成
程序提示用户第三次人工输入长宽尺寸
。。。。。。
。。。。。。
最后结束,程序制表并根据上面的输入自动填表,表的形成如下
板A      长宽高尺寸    备注一     备注二
板A1    长宽高尺寸     备注一     备注二
板b      长宽高尺寸    备注一     备注二
板b1    长宽高尺寸     备注一     备注二
板c      长宽高尺寸    备注一     备注二
板c1    长宽高尺寸     备注一     备注二
发表于 2016-7-3 17:58 | 显示全部楼层
77077 发表于 2015-4-22 23:06
伪源码

你好,可以帮我做个类似的程序吗?
人工输入长宽尺寸
程序逐行往下提出用户跟据板材名称选择厚度值
板A   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板b   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板c   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
.........总计十几行完成
程序提示用户第二次人工输入长宽尺寸
程序逐行往下提出用户跟据板材名称选择厚度值
板A1   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板b2   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
板c3   (人工输入选项确认厚度值:1:15mm  2:20mm  3:25mm  4:30mm)
.........总计十几行完成
程序提示用户第三次人工输入长宽尺寸
。。。。。。
。。。。。。
最后结束,程序制表并根据上面的输入自动填表,表的形成如下
板A      长宽高尺寸    备注一     备注二
板A1    长宽高尺寸     备注一     备注二
板b      长宽高尺寸    备注一     备注二
板b1    长宽高尺寸     备注一     备注二
板c      长宽高尺寸    备注一     备注二
板c1    长宽高尺寸     备注一     备注二
发表于 2016-7-6 07:53 | 显示全部楼层
77077 发表于 2015-4-22 23:06
伪源码

可以把blklst2tab这个函数发出来吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 00:21 , Processed in 0.304622 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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