newer 发表于 2018-7-31 14:19:43

带数字文字算量、分类统计插件






(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-7-31 15:29:19

本帖最后由 lw5297590 于 2018-8-1 20:40 编辑

我试了一下“分类统计指定文字前缀的最后数字的总和并制表”,在我的图上有这样的问题:执行过程,没有报错,就是没有成功输出表格(表格插入点确认后没有输出表格)。我重新写了一个单行文字,程序就可以输出表格。我的图全部是多行文字,可不可以以把多行文字中的数据按照要求的顺序,提取出来生成表格。附测试图,麻烦版主看一下,谢谢!!!

zhangfaren 发表于 2018-7-31 15:40:55

哇塞,这个太牛逼了,谢谢N版!

newer 发表于 2018-7-31 17:07:30

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 17:51:12

本帖最后由 lw5297590 于 2018-7-31 18:17 编辑

newer 发表于 2018-7-31 17:07
你这个,执行命令 tt
谢谢,试了一下,折腾了半天才发现在CAD2007里运行不了,生成不了表格,2012里可以用,谢谢!!!如果可以,麻烦你帮我看看是什么原因,谢谢您了,给你添麻烦了。还有生成的表格里的那个“合计”实际上应该是“总计”才对。多行文字里的“合计费用”实际上就是“单价”,能不能把它放到表格的“合计”(总计=合计费用*数量)前面,万分感谢!!!

Lisphk 发表于 2018-7-31 18:55:39

lw5297590 发表于 2018-7-31 17:51
谢谢,试了一下,折腾了半天才发现在CAD2007里运行不了,生成不了表格,2012里可以用,谢谢!!!如果可 ...

表格可以任意编辑的,你双击,想改什么,你就改什么。

lw5297590 发表于 2018-7-31 19:12:47

Lisphk 发表于 2018-7-31 18:55
表格可以任意编辑的,你双击,想改什么,你就改什么。

我说的意思是数据提取少了一项“合计费用”,实际上是“单价”,能不能添加上去,自动生成表格,有这一项,表格就一目了然了。最后面那个实际就是各项的总价格,缺了单价容易看糊涂。谢谢,麻烦您

XDSoft 发表于 2018-7-31 20:57:19

lw5297590 发表于 2018-7-31 19:12
我说的意思是数据提取少了一项“合计费用”,实际上是“单价”,能不能添加上去,自动生成表格,有这一项 ...

你就把单价放到 合计后面,就行了,程序是自动提取合计后面的价格*数量

zhangfaren 发表于 2018-7-31 21:19:36


XDSoft 发表于 2018-7-31 21:26:39

zhangfaren 发表于 2018-7-31 21:19


看你数据2153个,如果加上明细,那表就要老长了。

lw5297590 发表于 2018-7-31 21:32:57

XDSoft 发表于 2018-7-31 20:57
你就把单价放到 合计后面,就行了,程序是自动提取合计后面的价格*数量

试了一下,表格中没有生成“单价”这一项,我的意思是:多行文字里,合计后面的价格就是单价,能不能在表格中单独显示出来,合计后面的价格*数量的数据显示在最后为“总计”。谢谢您

zhangfaren 发表于 2018-7-31 21:50:53

XDSoft 发表于 2018-7-31 21:26
看你数据2153个,如果加上明细,那表就要老长了。

不会很长啊,这是您昨天的发的公式,我只不过将5φ110改为φ110×5了,也就是将φ前面的数字放到了后面加了一个×号。

zhangfaren 发表于 2018-7-31 22:01:29

昨天那个公式就是分类统计表,今天这个公式就是汇总统计表!{:1_12:}




yuren008 发表于 2018-7-31 22:14:30

newer 发表于 2018-7-31 17:07
你这个,执行命令 tt

支持楼主分享。

zhangfaren 发表于 2018-7-31 22:31:37

在反馈下,我将PVC管子的数量,分别放到φ的前面和后面,奇迹竟然出现了,两个截然不同的表格,一个是分类表,一个是汇总表。问题来了,能否不调整管子数量的顺序,无论是放在φ前面或者后面,都可以得到这两张表格呢!


页: [1] 2 3 4
查看完整版本: 带数字文字算量、分类统计插件