明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 13

[提问] 已解决:AB两列数据,A列是类型,B列是数量,如何归类并对每类求和。

[复制链接]
发表于 2016-10-2 00:35:46 | 显示全部楼层 |阅读模式
本帖最后由 dragoon33333 于 2016-10-2 15:43 编辑

求助:AB两列数据,A列是类型,B列是数量,如何归类并对每类求和。
已经嵌套了5层repeat、6层if了,绕进去了,想求教下大神思路。
见附图:求不同壁厚的管道长度。
壁厚类型不一定就这些,也可能更多,每个壁厚后面都带着长度,最后将每个壁厚对应的长度和求出。
根据本帖跟帖的多位好友的协助,自己重新整理了下思路,已经实现了统计功能。顺延了自己求助前的思路,嵌套比较多。
  •   (setq wtb (ssget "w" '(5272.0 533.0 0.0) '(5312.0 85.0 0.0) '((8 . "弯管明细") (0 . "text,mtext") (1 . "~*[~.0-9]*")))) ;选择弯头壁厚明细
  •   (setq wtc (ssget "w" '(5312.0 533.0 0.0) '(5352.0 85.0 0.0) '((8 . "弯管明细") (0 . "text,mtext") (1 . "~*[~.0-9]*")))) ;选择弯头长度明细
  •   (if (= wtb nil)
  •     (princ "无弯头明细")
  •     (progn
  •       (setq wtbn (sslength wtb))
  •       (setq i -1 enb nil)
  •       (repeat wtbn
  •         (setq i (1+ i))
  •         (setq wtbnn (caddr (assoc 10 (entget (ssname wtb i)))))
  •         (setq wtba (cdr (assoc 1 (entget (ssname wtb i)))))
  •         (setq j -1 slb nil)
  •         (repeat wtbn
  •           (setq j (1+ j))
  •           (setq wtcnn (caddr (assoc 10 (entget (ssname wtc j)))))
  •           (setq wtca (atof (cdr (assoc 1 (entget (ssname wtc j))))))
  •           (if (= wtbnn wtcnn)
  •             (setq slb (list wtba wtca));构造壁厚、长度表
  •           )
  •         )
  •         (setq enb (cons slb enb));构造包含壁厚长度表的表
  •       )
  •       (setq qhjg 'nil)
  •       (foreach zb enb
  •         (if (setq cxjg (assoc (car zb) qhjg))
  •           (setq qhjg (subst (list (car zb) (+ (cadr cxjg) (cadr zb))) cxjg qhjg))
  •           (setq qhjg (cons zb qhjg))
  •         )
  •       )
  •       (setq qhjg (vl-sort qhjg '(lambda(x1 x2)(< (car x1) (car x2)))))
  •       ;可以这样(setq qhjg (vl-sort qhjg '))))
  •       (setq slbl (length qhjg))
  •     )
  •   );热煨壁厚数量
  •   (setq wy (ssget "_w" '(5132.0 1005.0 0.0) '(5292.0 861.0 0.0) '((0 . "TEXT,MTEXT")))) ;选择弯头用量
  •   (if wy
  •     (progn
  •       (setq o 0)
  •       (repeat (sslength wy)
  •         (setq wyt (entget (ssname wy o)))
  •         (setq o (+ 1 o))
  •         (setq rwyg (cdr (assoc 1 wyt))) ;选择的文字内容
  •         (if (= rwyg "热煨弯管用管")
  •           (progn
  •             (setq wzx (caddr (assoc 10 wyt)))
  •             (setq wym (ssget "_w" (list 5132.0 wzx 0.0) '(5292.0 861.0 0.0) '((0 . "TEXT,MTEXT")))) ;进一步选择弯头明细
  •             (setq wyml (sslength wym))
  •             (if (= wyml slbl)
  •               (progn
  •                 (setq p 0)
  •                 (repeat wyml
  •                   (setq entn (entget (ssname wym p)))
  •                   (setq bhmx (list 10 5338.0 (caddr (assoc 10 entn)) 0.0))
  •                   (setq p (+ 1 p))
  •                   (setq typeb (cdr (assoc 1 entn))) ;选择的文字内容
  •                   (setq typeb-len (strlen typeb)) ;选择的文字内容的长度
  •                   (setq q 0)
  •                   (repeat slbl
  •                     (setq bh (nth q qhjg))
  •                     (setq char-blen (strlen (strcat "X" (car bh)))) ;取得要找的文字的长度
  •                     (setq q (+ 1 q))
  •                     (setq r 1)
  •                     (repeat typeb-len
  •                       (setq char-bb (substr typeb r char-blen));查找选择的文字内容里是否有要被替换的文字
  •                       (if (= char-bb (strcat "X" (car bh)))
  •                         (progn
  •                           (setq tjsl (ssget "X" (LIST (CONS 0 "*text") bhmx)))
  •                           (setq tjsln (entget (ssname tjsl 0)))
  •                           (entmod (subst (cons 1 (rtos (cadr bh))) (assoc 1 tjsln) tjsln))
  •                         )
  •                       )
  •                       (setq r (1+ r))
  •                     )
  •                   )
  •                 )
  •               )
  •               (alert "弯头统计数量与明细不一致!")
  •             )
  •           )
  •         )
  •       )
  •     )
  •   )

本帖子中包含更多资源

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

x
发表于 2016-10-2 14:47:24 | 显示全部楼层
试用以下程序:
  1. (defun c:flqh()
  2.   (command "_undo" "be")

  3.   (defun tqsjzb(Xssa Xn / i n Xtymb)
  4.        (setq i 0   n (sslength Xssa)  Xtymb ni)
  5.        (repeat n
  6.             (setq ent (ssname Xssa i)
  7.                   dxf (entget ent)
  8.             )
  9.             (if (= Xn 0)
  10.                 (setq Xtymb (cons (list (cdr (assoc 1 dxf)) (cdr (assoc 10 dxf))) Xtymb))
  11.                 (setq Xtymb (cons (list (cdr (assoc 1 dxf)) (cdr (assoc 10 dxf)) ent) Xtymb))
  12.             )
  13.             (setq i (1+ i))
  14.        )
  15.       
  16.        (setq Xtymb (vl-sort Xtymb '(lambda(e1 e2)
  17.                                           (setq pt1 (cadr e1)
  18.                                                 pt2 (cadr e2)
  19.                                           )
  20.                                           (if (equal (cadr pt1) (cadr pt2) 2.0)
  21.                                               (< (car pt1) (car pt2))
  22.                                               (> (cadr pt1) (cadr pt2))
  23.                                           )
  24.                                       )
  25.                       )
  26.        )
  27.   )
  28.   
  29.   (if (progn
  30.           (princ "\n请选取要统计的数据:")
  31.           (setq ssa (ssget '((0 . "*text") (1 . "#*#"))))
  32.       )
  33.       (if (progn
  34.              (princ "\n请选取更新的数据:")
  35.              (setq ssb (ssget '((0 . "*text") (1 . "#*#壁厚管材,#*#"))))

  36.          )
  37.           (progn
  38.               (setq tymba (tqsjzb ssa 0))
  39.               (setq tymbb (tqsjzb ssb 1))
  40.                     
  41.               (setq sjb nil)
  42.               (while tymba
  43.                    (setq sjb (cons (list (car (car tymba)) (car (cadr tymba))) sjb))
  44.                    (setq tymba (cdr (cdr tymba)))
  45.               )
  46.               (setq qhjg 'nil)
  47.               (foreach zb sjb
  48.                    (if (setq cxjg (assoc (car zb) qhjg))
  49.                        (setq qhjg (subst (list (car zb) (+  (cadr cxjg) (read (cadr zb)))) cxjg qhjg))
  50.                        (setq qhjg (cons (list (car zb) (read (cadr zb))) qhjg))
  51.                    )
  52.               )
  53.               (setq qhjg (vl-sort qhjg '(lambda(x1 x2)(< (car x1) (car x2)))))
  54.               (setq Newsjb nil)
  55.               (while tymbb
  56.                    (setq Newsjb (cons (list (car (car tymbb)) (last (cadr tymbb))) Newsjb))
  57.                    (setq tymbb (cdr (cdr tymbb)))
  58.               )
  59.               (foreach zb qhjg
  60.                    (If (setq cxjg (assoc (strcat (car zb) "壁厚管材" ) Newsjb))
  61.                        (progn
  62.                             (setq ent (last cxjg)
  63.                                   dxf (entget ent)
  64.                                   dxf (subst (cons 1 (rtos (cadr zb))) (assoc 1 dxf) dxf)
  65.                             )
  66.                             (entmod dxf)
  67.                        )
  68.                    )
  69.               )
  70.          )
  71.       )
  72.   )

  73.   (command "_undo" "e")
  74.   (princ)
  75. )
发表于 2016-10-2 11:16:16 | 显示全部楼层
本帖最后由 437271963 于 2016-10-2 11:52 编辑

写了一个,在命令行显示数据统计。测试了一下,图纸里面的是【多行文字】,所以程序做了修正。
  1. (defun c:tes ( / &k1 &kw1 &ob1 &p1 &p2 &ss1 &ss2 &str1 x1 x5 y1 y5)
  2. (vl-load-com)
  3. (princ "\n请选择文字")
  4. (if (setq &kw1 (ssget '((0 . "TEXT,MTEXT"))))
  5.   (progn
  6.    (setq &ss1 '() x5 0.0 y5 nil);建立表
  7.    (while (setq &k1 (ssname &kw1 0))
  8.     (setq &kw1 (ssdel &k1 &kw1))
  9.     (setq &ob1 (vlax-ename->vla-object &k1))
  10.     (setq &str1 (vla-get-TextString &ob1));提取文字内容
  11.     (if (numberp (setq &str1 (read &str1)));如果文字是数值
  12.      (progn
  13.       (setq &ss2 (s1610021 &ob1) &p1 (car &ss2) &p2 (cadr &ss2))
  14.       (setq x1 (car &p2) y1 (cadr &p2))
  15.       (if (> x1 x5) (setq x5 x1) );计算文字宽度
  16.       (if y5;计算文字高度
  17.        (if (< y1 y5) (setq y5 y1) )
  18.        (setq y5 y1)
  19.       );计算文字高度最小数值
  20.       (setq &ss1 (cons (list &p1 &str1) &ss1));文字坐标及内容
  21.      );progn
  22.     );if
  23.    );while
  24.    (if (car &ss1) (s1610022 &ss1 x5 y5) );如果有选择了内容就进入下面运行
  25.   )
  26. )
  27. (princ)
  28. )

  29. ;函数功能:计算文字包围框坐标
  30. (defun s1610021 (&ob1 / pt1 pt2)
  31. (vla-GetBoundingBox &ob1 'pt1 'pt2)
  32. (setq pt1 (vlax-safearray->list pt1))
  33. (setq pt2 (vlax-safearray->list pt2))
  34. (setq pt2 (mapcar '- pt2 pt1))
  35. (list pt1 pt2)
  36. )

  37. ;函数功能:根据坐标分类
  38. (defun s1610022 (&ss1 x5 y5)
  39. (setq &ss2 '() &ss5 '() y5 (* 0.5 y5))
  40. (while (car &ss1)
  41.   (setq &ss1 (vl-sort &ss1 '(lambda (x y) (> (cadar x) (cadar y)))));排序
  42.   (setq y1 (- (cadaar &ss1) y5));取得最大Y值
  43.   (setq &ss3 (vl-remove-if-not '(lambda (X) (> (cadar x) y1)) &ss1))
  44.   (setq &ss1 (vl-remove-if '(lambda (X) (> (cadar x) y1)) &ss1));排除已经计算的对象
  45.   (setq &ss3 (vl-sort &ss3 '(lambda (x y) (< (caar x) (caar y)))));排序
  46.   (if (> (length &ss3) 1);如果有两个以上对象
  47.    (progn
  48.     (setq &ss3 (mapcar 'cadr &ss3))
  49.     (while (car &ss3)
  50.      (setq x1 (car &ss3) y1 (cadr &ss3))
  51.      (if (and x1 y1);如果有两个对象
  52.       (progn
  53.        (setq &ss3 (cddr &ss3))
  54.        (setq &ss2 (cons (list x1 y1) &ss2))
  55.        (if (car &ss5)
  56.         (if (null (member x1 &ss5)) (setq &ss5 (append &ss5 (list x1))) )
  57.         (setq &ss5 (cons x1 &ss5))
  58.        );记录壁厚数据
  59.       )
  60.       (setq &ss3 '())
  61.      );if;2
  62.     );while
  63.    )
  64.   );if;1
  65. );while
  66. (if (car &ss2) (s1610023 &ss2 &ss5));进行数据统计
  67. )

  68. ;函数功能:计算数据
  69. (defun s1610023 (&ss2 &ss5 / &b1 &cd x)
  70. (while (setq &b1 (car &ss5))
  71.   (setq &ss5 (cdr &ss5))
  72.   (setq &cd (rtos (apply '+ (mapcar 'cadr (vl-remove-if-not '(lambda (X) (= (car x) &b1)) &ss2)))));统计数据
  73.   (princ "\n")
  74.   (princ (strcat "壁厚" (rtos &b1) "总长度:" &cd))
  75. );while
  76. )

本帖子中包含更多资源

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

x
发表于 2016-10-2 08:30:30 | 显示全部楼层
本帖最后由 yshf 于 2016-10-2 08:31 编辑

试用以下程序:
  1. (defun c:flqh()
  2.     (setq sjb '((11 2.84) (4.0 15.22)
  3.                 (11 6.34) (4.0 5.96)
  4.                 (11 3.15) (14.2 2.35)
  5.                 (3.5 18.99) (14.2 2.14)
  6.                 (4.5 11.56)
  7.               )
  8.     )
  9.     (setq qhjg 'nil)
  10.     (foreach zb sjb
  11.          (if (setq cxjg (assoc (car zb) qhjg))
  12.              (setq qhjg (subst (list (car zb) (+ (cadr cxjg) (cadr zb))) cxjg qhjg))
  13.              (setq qhjg (cons zb qhjg))
  14.          )
  15.     )
  16.     (setq qhjg (vl-sort qhjg '(lambda(x1 x2)(< (car x1) (car x2)))))
  17.     (foreach zb qhjg
  18.         (princ "\n")
  19.         (princ (car zb))
  20.         (princ " Σ=")
  21.         (princ (cadr zb))
  22.     )
  23.     (princ)
  24. )
命令: FLQH
3.5 Σ=18.99
4.0 Σ=21.18
4.5 Σ=11.56
11 Σ=12.33
14.2 Σ=4.49

 楼主| 发表于 2016-10-2 00:41:12 | 显示全部楼层
我的思路是repeat第一列选择集,assoc出坐标,然后嵌套repeat第二列,if第二列某图元坐标y值与第一列相同,则求和。
 楼主| 发表于 2016-10-2 09:12:35 来自手机 | 显示全部楼层
yshf 发表于 2016-10-2 08:30
试用以下程序:
命令: FLQH

3.5 Σ=18.99

多谢,不过变量sjb您这是手输的,我现在无法解决的就是怎么让相同行的不同列组成表。也就是我根据第一列能求出第二列图元的坐标,怎么根据一个图元的坐标而选中这个图元,这个问题能解决我就问题解决了,现在用repeat函数嵌套蒙了。
发表于 2016-10-2 09:25:51 | 显示全部楼层
不怎么会lisp,可以导入excel后用sumif求和
 楼主| 发表于 2016-10-2 09:38:43 | 显示全部楼层
boss0931 发表于 2016-10-2 09:25
不怎么会lisp,可以导入excel后用sumif求和

导出Excel也是个学问呀,两列导出后怎麼对齐,能对齐了我就不用进入Excel了。
发表于 2016-10-2 09:40:28 | 显示全部楼层
本帖最后由 yshf 于 2016-10-2 09:54 编辑

构造一个只有A列数据图元及B列数据图元的选择集,提取各数据图元的数值及位置点,如果B列数据其在图中的位置点Y坐标与A列的在±2范围内相等增,则是同一行的,如此就可得到同一行的A列数据和B列数据,并加入的sjb中。
(if (equal (cadr A列位置点) (cadr B列位置点) 2.0)
    (progn
         (同一行数据)
         (其中,X坐标小的为A列数据,X坐标大的为B列数据)
    )
    (非同一行数据)
)
发表于 2016-10-2 09:43:36 | 显示全部楼层
dragoon33333 发表于 2016-10-2 09:38
导出Excel也是个学问呀,两列导出后怎麼对齐,能对齐了我就不用进入Excel了。

常青藤可以导入导出表格数据,很方便,论坛里应该有的
 楼主| 发表于 2016-10-2 10:16:18 | 显示全部楼层
yshf 发表于 2016-10-2 09:40
构造一个只有A列数据图元及B列数据图元的选择集,提取各数据图元的数值及位置点,如果B列数据其在图中的位 ...

多谢前辈,这个if我用在了第二层repeat中。第一层是遍历第一列,第二层是遍历第二列,第二层中采用if函数确定与第一列同行,然后返回第二列1组码值。然后再在第一层中对获取的1组码值求和。看来我这个思路是正确的。看来我的问题不是出在这里,可能是嵌套汇总表对应壁厚的时候弄蒙了。

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 06:02 , Processed in 0.222471 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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