明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1920|回复: 6

[源码] 自动计算钢筋总长总重

[复制链接]
发表于 2020-8-31 17:01:47 | 显示全部楼层 |阅读模式
本帖最后由 hai20110730 于 2020-8-31 17:05 编辑

  1. ;;;开发者:上善若水,引用请注明出处。
  2. (vl-load-com)
  3. ;;;形成矩阵
  4. (defun xcjz(xcjz_ss)
  5.   (setq xcjz_ss1 (SORT-SE xcjz_ss 10 1 0 T))
  6.   (setq xcjz_i 0 xcjz_enamelst nil)
  7.   (repeat (/ (sslength xcjz_ss1) 5)
  8.     (setq xcjz_enam1 (ssname xcjz_ss1 xcjz_i))
  9.     (setq xcjz_enam2 (ssname xcjz_ss1 (+ xcjz_i 1)))
  10.     (setq xcjz_enam3 (ssname xcjz_ss1 (+ xcjz_i 2)))
  11.     (setq xcjz_enam4 (ssname xcjz_ss1 (+ xcjz_i 3)))
  12.     (setq xcjz_enam5 (ssname xcjz_ss1 (+ xcjz_i 4)))
  13.     (setq xcjz_enamelst (cons (SORT-ET (list xcjz_enam1 xcjz_enam2 xcjz_enam3 xcjz_enam4 xcjz_enam5) 10 0 0 T) xcjz_enamelst))
  14.     (setq xcjz_i (+ xcjz_i 5))
  15.   )
  16.   (reverse xcjz_enamelst)
  17. )

  18. (defun C:GJJS()
  19.   (setq GJJS_lst (xcjz (ssget '((0 . "TEXT")))))
  20.   (setq GJJS_i 0)
  21.   (repeat (length GJJS_lst)
  22.     (setq GJJS_lstf (nth GJJS_i GJJS_lst))
  23.     (setq GJJS_enam1 (nth 0 GJJS_lstf))
  24.     (setq GJJS_enam2 (nth 1 GJJS_lstf))
  25.     (setq GJJS_enam3 (nth 2 GJJS_lstf))
  26.     (setq GJJS_enam4 (nth 3 GJJS_lstf))
  27.     (setq GJJS_enam5 (nth 4 GJJS_lstf))
  28.     (setq GJJS_ggent (entget GJJS_enam1) GJJS_gg (ggzh (cdr (assoc 1 GJJS_ggent))))
  29.     (setq GJJS_cdent (entget GJJS_enam2) GJJS_cd (cdzh (cdr (assoc 1 GJJS_cdent))))
  30.     (setq GJJS_gsent (entget GJJS_enam3) GJJS_gs (gszh (cdr (assoc 1 GJJS_gsent))))
  31.     (gjk GJJS_gg GJJS_cd GJJS_gs GJJS_enam4 GJJS_enam5)
  32.     (setq GJJS_i (1+ GJJS_i))
  33.   )
  34.   (prin1)
  35. )

  36. (defun gjk(gj_gg gj_cd gj_gs gj_zcname gj_zlname / )
  37.   (setq gj_zcname (entget gj_zcname))
  38.   (setq gj_zlname (entget gj_zlname))
  39.   (setq gj_zc (atof (cdr (assoc 1 gj_zcname))));_求钢筋总长
  40.   (setq gj_zl (atof (cdr (assoc 1 gj_zlname))));_求钢筋重量
  41.   (setq gj_zcnr (* gj_cd gj_gs))
  42.   (setq gj_zcnrf (rtos (/ (* gj_cd gj_gs) 1000.0) 2 2))
  43.   (setq gj_zlnr (rtos (/ (* (* 0.00617 (expt gj_gg 2.0)) gj_zcnr) 1000.0) 2 2))
  44.   (setq gj_zcnrf (cons 1 gj_zcnrf))
  45.   (setq gj_zlnr (cons 1 gj_zlnr))
  46.   (setq gj_zc (subst gj_zcnrf (assoc 1 gj_zcname) gj_zcname))
  47.   (setq gj_zl (subst gj_zlnr (assoc 1 gj_zlname) gj_zlname))
  48.   (entmod gj_zc)(entmod gj_zl)
  49.   (prin1)
  50. )

  51. ;;;(setq uu (xcjz (ssget '((0 . "TEXT")))))
  52. ;;;(entdel (nth 0 (nth 0 uu)))(entdel (nth 1 (nth 0 uu)))(entdel (nth 2 (nth 0 uu)))(entdel (nth 3 (nth 0 uu)))(entdel (nth 4 (nth 0 uu)))
  53. ;;;(entdel (nth 0 (nth 1 uu)))(entdel (nth 1 (nth 1 uu)))(entdel (nth 2 (nth 1 uu)))(entdel (nth 3 (nth 1 uu)))(entdel (nth 4 (nth 1 uu)))

  54. ;;;规格转换
  55. ;;;(setq ggzh_zfc "\U+008412")
  56. ;;;(setq ggzh_zfc "%%13112")
  57. (defun ggzh(ggzh_zfc)
  58.   (cond ((wcmatch ggzh_zfc "*%%*")
  59.       (setq ggzh_str (substr ggzh_zfc 6 (- (strlen ggzh_zfc) 5))))
  60.   ((wcmatch (substr ggzh_zfc 1 1) "\\")
  61.       (setq ggzh_str (substr ggzh_zfc 8 (- (strlen ggzh_zfc) 7))))
  62.       (T (setq ggzh_str ggzh_zfc))
  63.   )
  64.   (atof ggzh_str)
  65. )
  66. ;;;(ggzh ggzh_zfc)


  67. ;;;长度转换
  68. ;;;(setq cdzh_zfc "2830")
  69. (defun cdzh(cdzh_zfc)
  70.   (if (wcmatch cdzh_zfc "*~*")
  71.           (setq cdzh_strlst (Parse cdzh_zfc "~"))
  72.         )
  73.   (if (wcmatch cdzh_zfc "*~*")
  74.           (setq cdzh_strlst (Parse cdzh_zfc "~"))
  75.         )
  76.   (if (or (wcmatch cdzh_zfc "*~*") (wcmatch cdzh_zfc "*~*"))
  77.       (setq cdzh_real (* 0.5 (+ (atof (car cdzh_strlst))(atof (cadr cdzh_strlst)))))
  78.       (setq cdzh_real (atof cdzh_zfc))
  79.   )
  80. )
  81. ;;;(cdzh "2100~3900")


  82. ;;;根数转换
  83. (defun gszh(gszh_zfc)
  84.   (if (not c:cal) (arxload "geomcal"))
  85.   (if (wcmatch gszh_zfc "*(*")
  86.           (setq gszh_zfc (XD::String:Replace "(" gszh_zfc "(" ""))
  87.         )
  88.   (if (wcmatch gszh_zfc "*)*")
  89.           (setq gszh_zfc (XD::String:Replace ")" gszh_zfc ")" ""))
  90.         )
  91.   (if (wcmatch gszh_zfc "*×*")
  92.           (setq gszh_zfc (XD::String:Replace "×"  gszh_zfc "*" ""))
  93.         )
  94.   (cal gszh_zfc)
  95. )
  96. ;;;(gszh "(6+3)+2")


  97. ;;[功能] 字符串查找与替换(正则表达式)
  98. (defun XD::String:Replace (pat str nstr key / end)
  99.   (if (not *xxvbsexp)
  100.     (setq *xxvbsexp (vlax-get-or-create-object "VBScript.RegExp"))
  101.   )
  102.   (vlax-put *xxvbsexp 'Pattern pat)
  103.   (if (not key)
  104.     (setq key "")
  105.   )
  106.   (setq key (strcase key))
  107.   (setq keys '(("I" "IgnoreCase") ("G" "Global") ("M" "Multiline")))
  108.   (mapcar '(lambda (x)
  109.        (if (wcmatch key (strcat "*" (car x) "*"))
  110.          (vlax-put *xxvbsexp (read (cadr x)) 0)
  111.          (vlax-put *xxvbsexp (read (cadr x)) -1)
  112.        )
  113.      )
  114.     keys
  115.   )
  116.   (vlax-invoke *xxvbsexp 'replace str nstr)
  117. )
  118. ;;;(XD::String:Replace "×"  "(6+3)××2" "*"  "")
  119. ;;;(XD::String:Replace "~"  "2100~3900" ","  "")
  120. ;;;(setq delim "2100~3900" str "~")
  121. ;;;(defun Parse (str delim /
  122. ;;;        lst pos
  123. ;;;        )
  124. ;;;  (setq pos (zg-string-search delim str 0))
  125. ;;;    (setq lst (cons (substr str 1 pos) lst)
  126. ;;;    str (substr str (+ pos 2))
  127. ;;;    pos (vl-string-search delim str)
  128. ;;;    )
  129. ;;;  (if (> (strlen str) 0)
  130. ;;;    (setq lst (cons str lst))
  131. ;;;  )
  132. ;;;  (if (= " " delim)
  133. ;;;    (setq lst (vl-remove "" lst))
  134. ;;;  )
  135. ;;;  (reverse lst)
  136. ;;;)

  137. ; user defined function strsplit.
  138. ; strsplit splits a string with delimiter, and return a list.
  139. ; example: (strsplit "1,22,333,4444" ",")    -->> ("1","22","333","4444")
  140. ;          (strsplit ",1,22,333,4444," ",")  -->> ("" "1" "22" "333" "4444" "")
  141. (defun strsplit(datastr delimiter)
  142.     (setq strlist '()
  143.           str ""
  144.     )
  145.     (setq n (strlen datastr))
  146.     (setq i 1)
  147.     (repeat n
  148.         ; s is a single letter, starts from the first to the end.
  149.         (setq s (substr datastr i 1))
  150.         ;
  151.         (if (/= s delimiter)
  152.             ; when s is't a delimiter
  153.             (progn
  154.                 (setq str (strcat str s))
  155.                 ; if s is the last letter
  156.                 (if (= i n)
  157.                     (setq strlist (cons str strlist))
  158.                 )
  159.             )
  160.             ; when s is a delimiter
  161.             (progn
  162.                 (setq strlist (cons str strlist))
  163.                 (setq str "")
  164.                 ; if delimiter is the last letter
  165.                 (if (= i n)
  166.                     (setq strlist (cons "" strlist))
  167.                 )
  168.             )
  169.         )
  170.         (setq i (1+ i))
  171.     )
  172.     ; reverse list and retrun it
  173.     (reverse strlist)
  174. )

  175. (defun Parse(datastr delimiter)  
  176.     (setq datastr (XD::String:Replace delimiter  datastr ","  ""))
  177.     (strsplit datastr ",")
  178. )

  179. ;;;(Parse "2100~3900" "~")



  180. ;|;;参数说明:SE  ----要排序的选择集                                                                  
  181.               DXF ----排序依据的组码号                                                                 
  182.               INT ----如果组码值为一个表,则INT指出使用第几个;否则nil                                 
  183.               FUZZ----允许偏差;若无为nil                                                              
  184.               K   ----T表示从大到小,nil表示从小到大                                                   
  185.     返回值:排序后的选择集                                                                             
  186.     示例:(SORT-SE SS 10 0   5.0 T  )  表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小
  187.           (SORT-SE SS 10 1   3.0 NIL)  表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大
  188.           (SORT-SE SS 8  NIL NIL NIL)  表示按照8组码值(图层名称)进行排序,顺序为从小到大            
  189. |;
  190. (defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  191.   (setq  LST '()
  192.   INDEX 0
  193.   )
  194.   (repeat (sslength SE)
  195.     (setq ENT (entget (ssname SE INDEX))
  196.     TMP (cdr (assoc DXF ENT))
  197.     )
  198.     (if  (and INT
  199.        (= (type INT) 'INT)
  200.        (= (type TMP) 'list)
  201.        (< INT (length TMP))
  202.   )
  203.       (setq TMP (nth INT TMP))
  204.     )
  205.     (setq LST (cons (list TMP (cdr (assoc 5 ENT))) LST))
  206.     (setq INDEX (1+ INDEX))
  207.   ) ;_建立排序列表
  208.   (if (and FUZZ
  209.      (or (= (type FUZZ) 'INT) (= (type FUZZ) 'REAL))
  210.      (or (= (type TMP) 'INT) (= (type TMP) 'REAL))
  211.       )
  212.     (setq NEWLST
  213.      (vl-sort
  214.        LST
  215.        (function (lambda (E1 E2) (< (+ (car E1) FUZZ) (car E2)))
  216.        )
  217.      )
  218.     )
  219.     (setq NEWLST
  220.      (vl-sort LST
  221.         (function (lambda (E1 E2) (< (car E1) (car E2))))
  222.      )
  223.     )
  224.   ) ;_排序操作
  225.   (if K
  226.     (setq NEWLST (reverse NEWLST))
  227.   ) ;_如果K为T,则倒置
  228.   (setq NEWSE (ssadd)) ;_组织排序后的选择集
  229.   (foreach TMP NEWLST
  230.     (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
  231.   )
  232.   NEWSE ;_返回值
  233. ) ;_结束defun


  234. ;|;;参数说明:ENAMELST  ----要排序的图元列表                                                           
  235.               DXF ----排序依据的组码号                                                                 
  236.               INT ----如果组码值为一个表,则INT指出使用第几个;否则nil                                 
  237.               FUZZ----允许偏差;若无为nil                                                              
  238.               K   ----T表示从大到小,nil表示从小到大                                                   
  239.     返回值:排序后的选择集                                                                             
  240.     示例:(SORT-SE SS 10 0   5.0 T  )  表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小
  241.           (SORT-SE SS 10 1   3.0 NIL)  表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大
  242.           (SORT-SE SS 8  NIL NIL NIL)  表示按照8组码值(图层名称)进行排序,顺序为从小到大            
  243. |;
  244. (defun SORT-ET (ENAMELST DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  245.   (setq  LST '()
  246.   INDEX 0
  247.   )
  248.   (repeat (length ENAMELST)
  249.     (setq ENT (entget (nth INDEX ENAMELST))
  250.     TMP (cdr (assoc DXF ENT))
  251.     )
  252.     (if  (and INT
  253.        (= (type INT) 'INT)
  254.        (= (type TMP) 'list)
  255.        (< INT (length TMP))
  256.   )
  257.       (setq TMP (nth INT TMP))
  258.     )
  259.     (setq LST (cons (list TMP (cdr (assoc 5 ENT))) LST))
  260.     (setq INDEX (1+ INDEX))
  261.   ) ;_建立排序列表
  262.   (if (and FUZZ
  263.      (or (= (type FUZZ) 'INT) (= (type FUZZ) 'REAL))
  264.      (or (= (type TMP) 'INT) (= (type TMP) 'REAL))
  265.       )
  266.     (setq NEWLST
  267.      (vl-sort
  268.        LST
  269.        (function (lambda (E1 E2) (< (+ (car E1) FUZZ) (car E2)))
  270.        )
  271.      )
  272.     )
  273.     (setq NEWLST
  274.      (vl-sort LST
  275.         (function (lambda (E1 E2) (< (car E1) (car E2))))
  276.      )
  277.     )
  278.   ) ;_排序操作
  279.   (if K
  280.     (setq NEWLST (reverse NEWLST))
  281.   ) ;_如果K为T,则倒置
  282.   (setq NEWSE nil) ;_组织排序后的选择集
  283.   (foreach TMP NEWLST
  284.     (setq NEWSE (cons (handent (cadr TMP)) NEWSE))
  285.   )
  286.   NEWSE ;_返回值
  287. ) ;_结束defun



本帖子中包含更多资源

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

x
发表于 2020-9-1 09:19:06 | 显示全部楼层
不错,装配式的图吧,这些数据不能通过yjk等计算软件导出吗
 楼主| 发表于 2020-9-1 16:30:42 | 显示全部楼层
cghdy 发表于 2020-9-1 09:19
不错,装配式的图吧,这些数据不能通过yjk等计算软件导出吗

这个钢筋表数据里所有数字都是纯的文本数字,没有扩展字符,不知道yjk是不是要通过扩展字符实现数据导出。
发表于 2020-9-19 14:49:57 | 显示全部楼层
厉害了!!学习一下
发表于 2020-10-6 22:13:27 | 显示全部楼层

厉害了!!学习一下
发表于 2022-1-2 13:58:25 | 显示全部楼层
本帖最后由 hl2006 于 2022-1-2 14:10 编辑

你这个理论重量那地方能改下就好了,在理论重量的时候(如:0.00617*12*12保留三位小数)
发表于 2024-1-27 11:23:39 | 显示全部楼层
报错

no function definition: SORT-SE
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 23:45 , Processed in 0.199945 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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