带数字文字算量、分类统计插件
(defun c:xdtb_tjtxtprefix (/ prefix ss lst txt str x i pt)
(if (and (/= "" (setq prefix (getstring "\n请输入前缀<退出>:")) "")
(xdrx_initssget
(xdrx_prompt
"\n请选择要统计的带前缀("
prefix
")的文字<退出>:"
t
)
)
(setq ss
(xdrx_ssget
(list
(cons 1 (strcat (XD::STRING:Escapewildcards prefix) "*"))
)
)
)
)
(progn (if (not #xd-tongji-textheight)
(setq #xd-tongji-textheight 4.0)
)
(if (setq val
(getreal
(xdrx_prompt "\n输入字高<" #xd-tongji-textheight ">:" t)
)
)
(setq #xd-tongji-textheight val)
)
(setq lst nil)
(mapcar '(lambda (x)
(setq txt (xdrx_getpropertyvalue x "textstring"))
(if (setq str (xdrx_string_regexps
(strcat "(?<="
(XD::String:EscapeCha prefix)
".*[ ]+)+(?=.*$)"
)
txt
)
)
(progn (setq lst
(cons
(list (car (xdrx_string_regexps
(strcat (XD::String:EscapeCha prefix)
".*(?=[ ]+.*$)"
)
txt
)
)
(atof (car str))
)
lst
)
)
)
)
)
(xdrx_pickset->ents ss)
)
(setq lst (xd::list:groupbyindex lst 0.1))
(setq lst (vl-sort lst '(lambda (x y) (< (car x) (car y)))))
(setq i 0)
(setq lst (mapcar '(lambda (x)
(list (itoa (setq i (1+ i)))
(car x)
(length (cdr x))
(apply '+ (cdr x))
)
)
lst
)
)
(setq lst (append lst
(list (list "合 计"
""
(apply '+ (mapcar 'caddr lst))
(apply '+ (mapcar 'cadddr lst))
)
)
)
)
(setq lst (cons (list "序 号" "型 号" "数 量" "总 长") lst))
(setq lst (cons (list "统计表" nil nil nil) lst))
(if (setq pt (getpoint "\n表格插入点<退出>:"))
(progn (xd::text:init 1)
(xd::table:makefromlist
lst
pt
#xd-tongji-textheight
(/ #xd-tongji-textheight 2.0)
)
)
)
)
)
(princ)
)
(defun c:xdtb_tjtxtprefix
(/ prefix ss lst txt str x i pt strs strs1 val num)
(if (and (/= "" (setq prefix (getstring "\n请输入前缀<退出>:")) "")
(xdrx_initssget
(xdrx_prompt
"\n请选择要统计的带前缀("
prefix
")的文字<退出>:"
t
)
)
(setq
ss (xdrx_ssget
(list (cons 1
(strcat (XD::STRING:Escapewildcards prefix)
"*"
",#"
(XD::STRING:Escapewildcards prefix)
"*"
",##"
(XD::STRING:Escapewildcards prefix)
"*"
",###"
(XD::STRING:Escapewildcards prefix)
"*"
",####"
(XD::STRING:Escapewildcards prefix)
"*"
",#####"
(XD::STRING:Escapewildcards prefix)
"*"
",######"
(XD::STRING:Escapewildcards prefix)
"*"
",#######"
(XD::STRING:Escapewildcards prefix)
"*"
",########"
(XD::STRING:Escapewildcards prefix)
"*"
",#########"
(XD::STRING:Escapewildcards prefix)
"*"
)
)
)
)
)
)
(progn
(if (not #xd-tongji-textheight)
(setq #xd-tongji-textheight 4.0)
)
(if (setq val
(getreal
(xdrx_prompt "\n输入字高<" #xd-tongji-textheight ">:" t)
)
)
(setq #xd-tongji-textheight val)
)
(if (not #xd_var_global_bits)
(setq #xd_var_global_bits 1)
)
(if (setq
val (getreal
(xdrx_prompt "\n小数位数<" #xd_var_global_bits ">:" t)
)
)
(setq #xd_var_global_bits val)
)
(setq lst nil
str-nums nil
)
(mapcar '(lambda (x)
(setq txt (xdrx_getpropertyvalue x "textstring"))
(setq num 1)
(if (setq str (xdrx_string_regexps
(strcat "^+(?="
(XD::String:EscapeCha prefix)
".*$)"
)
txt
)
)
(setq num (atoi (car str)))
)
(if (setq str (xdrx_string_regexps
(strcat "(?<="
(XD::String:EscapeCha prefix)
".*[ ]+)+(?=.*$)"
)
txt
)
)
(progn (setq lst (cons
(cons
(car (xdrx_string_regexps
(strcat (XD::String:EscapeCha prefix)
"(?<=+)?.*?(?=[ ]+|$)"
)
txt
)
)
(cons
num
(mapcar '(lambda (y) (* num (atof y))) str)
)
)
lst
)
str-nums (cons (length str) str-nums)
)
)
(progn (setq lst (cons
(cons (car (xdrx_string_regexps
(strcat (XD::String:EscapeCha prefix)
"(?<=+)?.*?(?=[ ]+|$)"
)
txt
)
)
(list (list num 0.0))
)
lst
)
str-nums (cons 0 str-nums)
)
)
)
)
(xdrx_pickset->ents ss)
)
(setq lst (xd::list:groupbyindex lst 0.1))
(setq lst (vl-sort lst '(lambda (x y) (< (car x) (car y)))))
(setq i 0)
(setq
lst (mapcar '(lambda (x)
(cons (car x) (xd::table:fillgap (cdr x) 0.0))
)
lst
)
)
(setq lst
(mapcar
'(lambda (x)
(cons
(itoa (setq i (1+ i)))
(cons
(car x)
(mapcar '(lambda (x) (apply '+ (vl-remove nil x)))
(xd::table:compose (cdr x))
)
)
)
)
lst
)
)
(if (= (apply 'max str-nums) 0)
(setq lst (mapcar '(lambda (x) (xd::list:removetail x)) lst))
)
(setq lst (xd::table:fillgap lst 0.0))
(setq strs1 (mapcar '(lambda (x) (apply '+ (vl-remove nil x)))
(xd::table:compose (mapcar 'cddr lst))
)
)
(setq lst (append lst (list (append (list "合 计" "") strs1))))
(setq i 0
strs nil
)
(repeat (apply 'max str-nums)
(setq strs (cons (strcat "总量" (itoa (setq i (1+ i)))) strs))
)
(setq strs (reverse strs))
(setq lst (cons (append (list "序 号" "类 别" "数 量") strs) lst))
(setq strs nil)
(repeat (apply 'max str-nums) (setq strs (cons nil strs)))
(setq lst (cons (append (list "统计表" nil nil) strs) lst))
(if (setq pt (getpoint "\n表格插入点<退出>:"))
(progn (xd::text:init 1)
(xd::table:makefromlist
lst
pt
#xd-tongji-textheight
(/ #xd-tongji-textheight 2.0)
)
)
)
)
)
(princ)
)
本帖最后由 lw5297590 于 2018-8-1 20:40 编辑
我试了一下“分类统计指定文字前缀的最后数字的总和并制表”,在我的图上有这样的问题:执行过程,没有报错,就是没有成功输出表格(表格插入点确认后没有输出表格)。我重新写了一个单行文字,程序就可以输出表格。我的图全部是多行文字,可不可以以把多行文字中的数据按照要求的顺序,提取出来生成表格。附测试图,麻烦版主看一下,谢谢!!!
哇塞,这个太牛逼了,谢谢N版! lw5297590 发表于 2018-7-31 15:29
我试了一下“分类统计指定文字前缀的最后数字的总和并制表”,在我的图上有这样的问题:执行过程,没有报错 ...
你这个,执行命令 tt
(defun c:tt ()
(if (and (xdrx_initssget "\n选择统计的文字<退出>:")
(setq ss (xdrx_ssget '((0 . "mtext"))))
)
(progn
(xdrx_begin)
(setq titles nil
lst nil
ths nil
)
(if (not #xd_var_global_textheight)
(setq #xd_var_global_textheight 4.0)
)
(if (setq val (getreal
(xdrx_prompt "\n输入字高<" #xd_var_global_textheight ">:" t)
)
)
(setq #xd_var_global_textheight val)
)
(setq num 1
i 0
nums nil
)
(mapcar '(lambda (x)
(setq txt (xdrx_getpropertyvalue x "textstring")
txt (xdrx_string_replace txt "\n" "")
txt (xdrx_string_split txt "\r")
)
(mapcar '(lambda (y)
(if (and (setq str (xdrx_string_regexps "[^=]+" y))
(= (length str) 2)
)
(progn
(cond ((= (car str) "数量") (setq num (atoi (cadr str))
nums (cons num nums)))
((= (car str) "图号")
(setq th (cadr str))
(if (= i 0)
(setq i (1+ i)
titles (cons "图 号" titles)
)
)
(setq ths (cons th ths))
)
)
)
)
)
txt
)
)
(setq ents (xdrx_pickset->ents ss))
)
(setq i 0
j 0
nums (reverse nums)
)
(princ "\n111")
(mapcar
'(lambda (x)
(setq txt(xdrx_getpropertyvalue x "textstring")
txt(xdrx_string_replace txt "\n" "")
txt(xdrx_string_split txt "\r")
lst1 nil
)
(mapcar '(lambda (y)
(if (and (setq str (xdrx_string_regexps "[^(:|:)]+" y))
(= (length str) 2)
)
(progn
(if (xdrx_string_regexps "合计" (car str))
(progn (setq titles (cons "数量" titles)
titles (cons "合计" titles)
)
(princ "\n4444")
(setq n (car (xdrx_string_regexps "+" (cadr str)))
n (rtos (* (nth j nums) (atof n)) 2 1)
j (1+ j)
)
(setq lst1 (cons (xdrx_string_regexpr "(+)" (cadr str) n) lst1))
)
(progn (if (= i 0)
(setq titles (cons (car str) titles))
)
(setq lst1 (cons (cadr str) lst1))
)
)
)
)
)
txt
)
(princ "\n222")
(setq i (1+ i)
lst (cons lst1 lst)
)
)
ents
)
(princ "\n111")
(setq lst (mapcar '(lambda (x y) (cons x (reverse y))) ths lst))
(setq lxd lst)
(setq lst (mapcar '(lambda (x y)
(list (nth 0 x)
(nth 1 x)
(nth 2 x)
(nth 3 x)
(nth 4 x)
(nth 5 x)
y
(nth 6 x)
)
)
lst
(reverse nums)
)
)
(setq lst (cons (reverse titles) lst))
(setq lst (cons (list "统计表" nil nil nil nil nil nil nil) lst))
(if (setq pt (getpoint "\n表格插入点<退出>:"))
(progn (xd::text:init 1)
(xd::table:makefromlist
lst
pt
#xd_var_global_textheight
(/ #xd_var_global_textheight 2.0)
)
)
)
)
)
(princ)
)
本帖最后由 lw5297590 于 2018-7-31 18:17 编辑
newer 发表于 2018-7-31 17:07
你这个,执行命令 tt
谢谢,试了一下,折腾了半天才发现在CAD2007里运行不了,生成不了表格,2012里可以用,谢谢!!!如果可以,麻烦你帮我看看是什么原因,谢谢您了,给你添麻烦了。还有生成的表格里的那个“合计”实际上应该是“总计”才对。多行文字里的“合计费用”实际上就是“单价”,能不能把它放到表格的“合计”(总计=合计费用*数量)前面,万分感谢!!! lw5297590 发表于 2018-7-31 17:51
谢谢,试了一下,折腾了半天才发现在CAD2007里运行不了,生成不了表格,2012里可以用,谢谢!!!如果可 ...
表格可以任意编辑的,你双击,想改什么,你就改什么。 Lisphk 发表于 2018-7-31 18:55
表格可以任意编辑的,你双击,想改什么,你就改什么。
我说的意思是数据提取少了一项“合计费用”,实际上是“单价”,能不能添加上去,自动生成表格,有这一项,表格就一目了然了。最后面那个实际就是各项的总价格,缺了单价容易看糊涂。谢谢,麻烦您 lw5297590 发表于 2018-7-31 19:12
我说的意思是数据提取少了一项“合计费用”,实际上是“单价”,能不能添加上去,自动生成表格,有这一项 ...
你就把单价放到 合计后面,就行了,程序是自动提取合计后面的价格*数量
zhangfaren 发表于 2018-7-31 21:19
看你数据2153个,如果加上明细,那表就要老长了。 XDSoft 发表于 2018-7-31 20:57
你就把单价放到 合计后面,就行了,程序是自动提取合计后面的价格*数量
试了一下,表格中没有生成“单价”这一项,我的意思是:多行文字里,合计后面的价格就是单价,能不能在表格中单独显示出来,合计后面的价格*数量的数据显示在最后为“总计”。谢谢您 XDSoft 发表于 2018-7-31 21:26
看你数据2153个,如果加上明细,那表就要老长了。
不会很长啊,这是您昨天的发的公式,我只不过将5φ110改为φ110×5了,也就是将φ前面的数字放到了后面加了一个×号。
昨天那个公式就是分类统计表,今天这个公式就是汇总统计表!{:1_12:}
newer 发表于 2018-7-31 17:07
你这个,执行命令 tt
支持楼主分享。 在反馈下,我将PVC管子的数量,分别放到φ的前面和后面,奇迹竟然出现了,两个截然不同的表格,一个是分类表,一个是汇总表。问题来了,能否不调整管子数量的顺序,无论是放在φ前面或者后面,都可以得到这两张表格呢!