材料表重量计算
本帖最后由 lostbalance 于 2016-9-25 20:37 编辑之前的程序漏了几个调用函数,补充了下。
更新附件的时候,原来的附件被删掉了,新的好像要重新收费。重复消费的短信通知我,我看看怎么退款
=====我=是=分=割=线=====
好老的帖子了,今天有人短消息问我要调用的函数……程序改动好多,调用函数也变动不少,就直接发新版的吧,如果有漏的回帖或者短消息吧。
新版和原版变化不大,主要加了面板功能。
;|= 材料重量计算
;|==CalWt
;|===
gvar: *var-calwt*
ver: by lostbalance 20160913
==========|;
(defun c:CalWt(/ shell shellv eha ehav hha hhav pipe plate Lsteel setdcl autocal md th a1 a2 a3 a4 b1 b2 b3 c1 c2 c3 d1 d2 d3 d4)
;;=================================计算公式
(defun shell (a b c md) (* pi (+ a b) b c md 1e-6))
(defun shellv (a c) (* pi a a c 2.5e-10))
(defun eha (a b c md) (* pi b (+ (/ (* a a) 3.) (/ (* a b 5.) 6.) (/ (* b b 2.) 3.) (* a c) (* b c)) md 1e-6))
(defun ehav (a c) (* pi (+ (/ (* a a a) 24.) (* a a c 0.25)) 1e-9))
(defun hha (a b c md) (* pi (+ (* a a b 0.5) (* a b b) (* b b b (/ 2. 3.)) (* a b c) (* b b c)) md 1e-6))
(defun hhav (a c) (* pi (+ (* a a a (/ 1. 12.)) (* a a c 0.25)) 1e-9))
(defun pipe (a b c md) (* pi (- a b) b c md 1e-6))
(defun plate (a b c md) (* a b c md 1e-6))
(defun Lsteel ( a b c d md) (* (+ (* a c) (* b c) (* c c -1.) (* a b 0.0025)) d md 1e-6))
;;=================================
;;面板
(defun setdcl (/ calw str_lst init_lst infmsg ctl va1 va2 va3 wa1 wa2 wa3 wb wc wd)
(setq infmsg
(strcat
"材料重量计算(CalWt)"
"\nv1.0.1 20160913"
"\n\n自动计算可根据标记格式自动计算材料重量。"
"\n\n适用的标记格式如下:"
"\n 筒体 DN num %%130= num (H= num)"
"\n 椭圆形封头 EHA num X num (H= num)"
"\n 管 %%C num X num (L= num / L≈ num)"
"\n 筒 %%C num X num (L= num / L≈ num)"
"\n 节 %%C num X num (L= num / L≈ num)"
"\n 板 - num X num(L= num / L≈ num)"
"\n 板 num X num (%%130= num / X num)"
"\n 块 num X num (%%130= num / X num)"
"\n 板 %%C num %%130= num"
"\n 圈 %%C num /%%C num %%130= num"
"\n 环 %%C num /%%C num %%130= num"
"\n 角钢 ∠ num X num X num (L= num / L≈ num)"
"\n 角钢 L num X num X num (L= num / L≈ num)"
"\n 角钢法兰 num X num X num (L= num / L≈ num)"
"\n 角钢 num X num X num (L= num / L≈ num)"
"\n\n注:"
"\n 忽略大小写,num代表数字"
"\n 括号\"()\"表示尺寸支持即时输入"
"\n 斜杠\"/\"表示尺寸支持多种格式"
"\n\n单位: 长度 <> mm | 容积 <> m3 | 质量 <> kg"
"\n\nDeveloper: lostbalance"
"\nEmail: lostbalance@foxmail.com"
)
)
;;计算
(defun calw (flag / )
(setq va1 (shellv a1 a3))
(setq wa1 (shell a1 a2 a3 md))
(setq va2 (ehav a1 a4))
(setq wa2 (eha a1 a2 a4 md))
(setq va3 (hhav a1 a4))
(setq wa3 (hha a1 a2 a4 md))
(setq wb (pipe b1 b2 b3 md))
(setq wc (plate c1 c2 c3 md))
(setq wd (Lsteel d1 d2 d3 d4 md))
(if flag (wyb-set-init (list "va1" va1 "wa1" wa1 "va2" va2 "wa2" wa2 "va3" va3 "wa3" wa3 "wb" wb "wc" wc "wd" wd)))
)
(calw nil)
(setq str_lst
'(
("" "壳体" ":boxed_column{")
":row{"
("" "" ":row{" "left")
("a1" "DN" "real" "(setq a1 (atof $value))(calw t)" "10")
("a2" "δ=" "real" "(setq a2 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("" "EHA DN<=2000 h=25; DN>2000 h=40" "text")
"}"
"}"
":row{"
("" "" ":row{" "left")
("a3" "H=" "real" "(setq a3 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("va1" "筒体体积 " "real" "" "10")
("wa1" "质量" "real" "" "10")
("oa1" "输出" "button" "(done_dialog 2)" "4")
"}"
"}"
":row{"
("" "" ":row{" "left")
("a4" "h=" "real" "(setq a4 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("va2" "椭封EHA 体积" "real" "" "10")
("wa2" "质量" "real" "" "10")
("oa2" "输出" "button" "(done_dialog 3)" "4")
"}"
"}"
":row{"
("" "" ":row{" "left")
("" "HHA 准半球时h为负值" "text")
"}"
("" "" ":row{" "right")
("va3" "球封HHA 体积" "real" "" "10")
("wa3" "质量" "real" "" "10")
("oa3" "输出" "button" "(done_dialog 4)" "4")
"}"
"}"
"}"
("" "接管" ":boxed_row{")
("" "" ":row{" "left")
("b1" "φ" "real" "(setq b1 (atof $value))(calw t)" "10")
("b2" "X " "real" "(setq b2 (atof $value))(calw t)" "10")
("b3" "L=" "real" "(setq b3 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("wb" "质量" "real" "" "10")
("ob" "输出" "button" "(done_dialog 5)" "4")
"}"
"}"
("" "钢板" ":boxed_row{")
("" "" ":row{" "left")
("c1" " " "real" "(setq c1 (atof $value))(calw t)" "10")
("c2" "X " "real" "(setq c2 (atof $value))(calw t)" "10")
("c3" "X " "real" "(setq c3 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("wc" "质量" "real" "" "10")
("oc" "输出" "button" "(done_dialog 6)" "4")
"}"
"}"
("" "角钢" ":boxed_row{")
("" "" ":row{" "left")
("d1" "∠" "real" "(setq d1 (atof $value))(calw t)" "10")
("d2" "X " "real" "(setq d2 (atof $value))(calw t)" "10")
("d3" "X " "real" "(setq d3 (atof $value))(calw t)" "10")
("d4" "L=" "real" "(setq d4 (atof $value))(calw t)" "10")
"}"
("" "" ":row{" "right")
("wd" "质量" "real" "" "10")
("od" "输出" "button" "(done_dialog 7)" "4")
"}"
"}"
("" "" ":boxed_row{")
("" "" ":row{" "left")
("md" "密度" "real" "(setq md (atof $value))(calw t)" "10")
("" "g/cm3" "text")
("md1" "7.85" "radio" "(setq md 7.85)(wyb-set-value (list \\\"md\\\" \\\"7.85\\\" \\\"md1\\\" \\\"0\\\"))(calw t)")
("md2" "7.98" "radio" "(setq md 7.98)(wyb-set-value (list \\\"md\\\" \\\"7.98\\\" \\\"md2\\\" \\\"0\\\"))(calw t)")
"}"
("" "" ":row{" "right")
("th" "字高" "real" "" "10")
"}"
"}"
":row{"
"i"
("ok" "自动计算(&X)" "button" "(done_dialog 1)" "8")
"c"
"}"
; "iocr"
)
)
(setq init_lst
(list "md" md "th" th
"a1" a1 "a2" a2 "a3" a3 "a4" a4 "va1" va1 "wa1" wa1 "va2" va2 "wa2" wa2 "va3" va3 "wa3" wa3
"b1" b1 "b2" b2 "b3" b3 "wb" wb
"c1" c1 "c2" c2 "c3" c3 "wc" wc
"d1" d1 "d2" d2 "d3" d3 "d4" d4 "wd" wd
)
)
(setq ctl (wyb-dcl-init "材料质量计算 by lostbalance" str_lst init_lst))
(setq *var-calwt* (list md th a1 a2 a3 a4 b1 b2 b3 c1 c2 c3 d1 d2 d3 d4))
(cond
((= ctl 0))
((= ctl 1)(autocal))
((= ctl 2)(wyb-exportans wa1 th)(redraw)(setdcl))
((= ctl 3)(wyb-exportans wa2 th)(redraw)(setdcl))
((= ctl 4)(wyb-exportans wa3 th)(redraw)(setdcl))
((= ctl 5)(wyb-exportans wb th)(redraw)(setdcl))
((= ctl 6)(wyb-exportans wc th)(redraw)(setdcl))
((= ctl 7)(wyb-exportans wd th)(redraw)(setdcl))
)
)
;;自动计算程序
(defun autocal (/ rule IfNum GetNum str ans)
;;自动计算规则
(defun rule (str / a b c d)
(cond ;所有关键词必须大写!
( (IfNum str (list "筒体" "DN" "%%130=") nil)
(setq a (GetNum "DN"))
(setq b (GetNum "%%130="))
(cond
((vl-string-search "H=" str) (setq c (GetNum "H=")))
((setq c (wyb-getdist "\n筒体长度: <3000> " 3000.)))
)
(setq ans (shell a b c md))
)
( (IfNum str (list "椭圆形封头" "EHA" "X") nil)
(setq a (GetNum "EHA"))
(setq b (GetNum "X"))
(cond
((vl-string-search "H=" str) (setq c (GetNum "H=")))
((< a 2000) (setq c 25.))
((setq c 40.))
)
(setq ans (eha a b c md))
)
( (or (IfNum str (list "管" "%%C" "X") nil)
(IfNum str (list "筒" "%%C" "X") nil)
(IfNum str (list "节" "%%C" "X") nil)
)
(setq a (GetNum "%%C"))
(setq b (GetNum "X"))
(cond
((vl-string-search "L=" str) (setq c (GetNum "L=")))
((vl-string-search "L≈" str) (setq c (GetNum "L≈")))
((setq c (wyb-getdist "\n管长: <110> " 110.)))
)
(setq ans (pipe a b c md))
)
( (IfNum str (list "板-" "X") nil)
(setq a (GetNum "板-"))
(setq b (GetNum "X"))
(cond
((vl-string-search "L=" str) (setq c (GetNum "L=")))
((vl-string-search "L≈" str) (setq c (GetNum "L≈")))
((setq c (wyb-getdist "\n第三边长度: <100> " 100.)))
)
(setq ans (plate a b c md))
)
( (IfNum str (list "板" "X") nil)
(setq a (GetNum "板"))
(setq b (GetNum "X"))
(cond
((IfNum str (list "%%130=") nil) (setq c (GetNum "%%130=")))
((IfNum str (list "X") nil) (setq c (GetNum "X")))
((setq c (wyb-getdist "\n第三边长度: <8> " 8.)))
)
(setq ans (plate a b c md))
)
( (IfNum str (list "块" "X") nil)
(setq a (GetNum "块"))
(setq b (GetNum "X"))
(cond
((IfNum str (list "%%130=") nil) (setq c (GetNum "%%130=")))
((IfNum str (list "X") nil) (setq c (GetNum "X")))
((setq c (wyb-getdist "\n第三边长度: <8> " 8.)))
)
(setq ans (plate a b c md))
)
( (IfNum str (list "板" "%%C" "%%130=") (list "/%%C"))
(setq a (GetNum "%%C"))
(setq b (GetNum "%%130="))
(setq ans (pipe a (* a 0.5) b md))
)
( (or (IfNum str (list "圈" "%%C" "/%%C" "%%130=") nil)
(IfNum str (list "环" "%%C" "/%%C" "%%130=") nil)
)
(setq a (GetNum "%%C"))
(setq b (GetNum "/%%C"))
(setq c (GetNum "%%130="))
(setq ans (pipe a (* (- a b) 0.5) c md))
)
( (IfNum str (list "角钢" "X") nil)
(cond
((vl-string-search "角钢∠" str) (setq a (GetNum "角钢∠")))
((vl-string-search "角钢L" str) (setq a (GetNum "角钢L")))
((vl-string-search "角钢法兰" str) (setq a (GetNum "角钢法兰")))
((vl-string-search "角钢" str) (setq a (GetNum "角钢")))
)
(setq b (GetNum "X"))
(if (vl-string-search "X" str) (setq c (GetNum "X")) (setq c b b a))
(cond
((vl-string-search "L=" str) (setq d (GetNum "L=")))
((vl-string-search "L≈" str) (setq d (GetNum "L≈")))
((setq d (wyb-getdist "\n长度: <1000> " 1000.)))
)
(setq ans (Lsteel a b c d md))
)
)
)
;;根据关键词判断数据是否齐全 lst1需要;lst2排除
(defun IfNum (str lst1 lst2 / str1 i key n)
(setq n (length lst1))
(setq i 0 key t)
(while (and key (< i n))
(setq str1 (nth i lst1))
(if (vl-string-search str1 str)
(setq i (1+ i)
str (substr str (+ (vl-string-search str1 str) (1+ (strlen str1))))
)
(setq key nil)
)
)
(if lst2
(progn
(setq n (length lst2) i 0)
(while (and key (< i n))
(setq str1 (nth i lst2))
(if (vl-string-search str1 str)
(setq key nil)
(setq i (1+ i))
)
)
)
)
key
)
;;根据关键词提取其后的数字,同时截去str关键词前的部分
(defun GetNum (str1 / n a)
(setq n (1+ (strlen str1)))
(setq str (substr str (+ (vl-string-search str1 str) n)))
(setq a (atof str))
)
;;======================
(while (setq str (wyb-entsel "\n选择材料标记: <退出> " '("TEXT" "MTEXT")))
(setq str (wyb-get-entdxf 1 (entget (car str))))
(setq str (strcase (wyb-str-replace " " "" str))) ;;去空格并转大写
(Rule str)
(if ans
(progn
(princ (strcat " 材料重量: " (rtos ans 2 3) " kg"))
(wyb-ExportAns ans th)
(setq ans nil str nil)
)
(princ " 不支持该材料标记格式!...")
)
)
)
;;=============================
(if (not (vl-consp *var-calwt*)) (setq *var-calwt* '(7.85 4. 2000. 6. 3000. 25. 60.3 5.6 110. 200. 200. 6. 63. 63. 6. 1000.)))
(setq md (car *var-calwt*) th (cadr *var-calwt*)
a1 (caddr *var-calwt*) a2 (cadddr *var-calwt*) a3 (nth 4 *var-calwt*) a4 (nth 5 *var-calwt*)
b1 (nth 6 *var-calwt*) b2 (nth 7 *var-calwt*) b3 (nth 8 *var-calwt*)
c1 (nth 9 *var-calwt*) c2 (nth 10 *var-calwt*) c3 (nth 11 *var-calwt*)
d1 (nth 12 *var-calwt*) d2 (nth 13 *var-calwt*) d3 (nth 14 *var-calwt*) d4 (nth 15 *var-calwt*)
)
(wyb-error-init '("cmdecho" 0 "dimzin" 8))
(setdcl)
(wyb-error-end)
(princ)
)
=====我=是=分=割=线=====
这两天编了个材料表重量计算的程序,可以根据特定的关键词自动计算质量。
水平有限,有兴趣的可以优化下。另外,个人觉得可以程序可以改造成多选后,自动根据材料确定密度等参数,操作计算整个数据表,不过我所在的化工专业,材料表的很多材料只有一个名称,反而会影响效率,所以就不在这方面深化了。
另外,源码中涉及的调用函数,根据函数名,论坛里找一下或者自己写下吧,我就不贴了。
ps:公司做好的演示图正好超了4M,就打包了下。。。;;CalWt自动计算标准格式的材料质量
;;by woyb
(defun c:CalWt( / Setup IfNum GetNum txh str md nlst a b c ans)
;根据关键词判断数据是否齐全
(defun IfNum (str lst1 lst2 / str1 i key n)
(setq n (length lst1))
(setq i 0 key t)
(while (and key (< i n))
(setq str1 (nth i lst1))
(if (vl-string-search str1 str)
(progn
(setq i (1+ i))
(setq str (substr str (+ (vl-string-search str1 str) (1+ (strlen str1)))))
)
(setq key nil)
)
)
(if lst2
(progn
(setq n (length lst2))
(setq i 0)
(while (and key (< i n))
(setq str1 (nth i lst2))
(if (vl-string-search str1 str)
(setq key nil)
(setq i (1+ i))
)
)
)
)
key
)
;提取关键词后的字符,并转化数字
(defun GetNum (str1 / n a)
(setq n (1+ (strlen str1)))
(setq str (substr str (+ (vl-string-search str1 str) n)))
(setq a (atof str))
)
;取值函数
(defun Setup()
(initget "s d f")
(setq md (getreal (strcat "\n密度g/cm3 或 设置字高 7.85 7.98: <" (rtos ACW-md)">")))
(cond
((= md "s")
(setq txh (getreal (strcat "\n写入重量的文字高度: <"(rtos ACW-txh)"> ")))
(if txh (setq ACW-txh txh) (setq txh ACW-txh))
(Setup)
)
((= md "d") (setq md 7.85) (setq ACW-md 7.85))
((= md "f") (setq md 7.98) (setq ACW-md 7.98))
(md (setq ACW-md md))
((setq md ACW-md))
)
)
(if (not cal) (princ "\ncal..."))
(princ "\n计算标准标记格式的材料重量: ")
(WYB-CMD0)
(setq str (WYB-entsel "\n选择材料标记: " '((0 . "TEXT"))))
(WYB-CMD1)
(if (not ACW-md) (setq ACW-md 7.85))
(if (not ACW-txh) (setq ACW-txh 4 txh 4) (setq txh ACW-txh))
(setq str (cdr (assoc 1 (entget (car str)))))
(setq str (WYB-strreplace " " "" str));去空格
(setq str (strcase str));全部大写
(cond;所有关键词必须大写!
((IfNum str (list "筒体DN" "%%130=" "H=") nil)
(setq a (GetNum "筒体DN"))
(setq b (GetNum "%%130="))
(setq c (GetNum "H="))
(Setup)
(setq ans (* (+ (* a b 4.) (* b b 4.)) pi c md 0.00000025))
)
((IfNum str (list "椭圆形封头EHA" "X") nil)
(setq a (GetNum "椭圆形封头EHA"))
(setq b (GetNum "X"))
(cond
((vl-string-search "H=" str) (setq c (GetNum "H=")))
((< a 2000) (setq c 25.))
((setq c 40.))
)
(Setup)
(setq ans (* (+ (* a a (/ 1. 3.)) (* a b (/ 5. 6.)) (* b b (/ 2. 3.)) (* (+ a b) c)) b md pi 0.000001))
)
((or (IfNum str (list "管%%C" "X") nil)
(IfNum str (list "筒%%C" "X") nil)
(IfNum str (list "节%%C" "X") nil)
)
(setq a (GetNum "%%C"))
(setq b (GetNum "X"))
(cond
((vl-string-search "L=" str) (setq c (GetNum "L=")))
((vl-string-search "L≈" str) (setq c (GetNum "L≈")))
((setq c (WYB-getreal "\n管长: <110> " 110.)))
)
(Setup)
(setq ans (* (- (* a b 4.) (* b b 4.)) pi c md 0.00000025))
)
((IfNum str (list "板-" "X") nil)
(setq a (GetNum "板-"))
(setq b (GetNum "X"))
(cond
((vl-string-search "L=" str) (setq c (GetNum "L=")))
((vl-string-search "L≈" str) (setq c (GetNum "L≈")))
((setq c (WYB-getreal "\n第三边长度: <100> " 100.)))
)
(Setup)
(setq ans (* a b c md 0.000001))
)
((IfNum str (list "板" "X") nil)
(setq a (GetNum "板"))
(setq b (GetNum "X"))
(cond
((IfNum str (list "%%130=") nil) (setq c (GetNum "%%130=")))
((IfNum str (list "X") nil) (setq c (GetNum "X")))
((setq c (WYB-getreal "\n第三边长度: <10> " 10.)))
)
(Setup)
(setq ans (* a b c md 0.000001))
)
((IfNum str (list "块" "X") nil)
(setq a (GetNum "块"))
(setq b (GetNum "X"))
(cond
((IfNum str (list "%%130=") nil) (setq c (GetNum "%%130=")))
((IfNum str (list "X") nil) (setq c (GetNum "X")))
((setq c (WYB-getreal "\n第三边长度: <10> " 10.)))
)
(Setup)
(setq ans (* a b c md 0.000001))
)
((IfNum str (list "板" "%%C" "%%130=") (list "/%%C"))
(setq a (GetNum "%%C"))
(setq b (GetNum "%%130="))
(Setup)
(setq ans (* a a b pi md 0.00000025))
)
((or (IfNum str (list "圈" "%%C" "/%%C" "%%130=") nil)
(IfNum str (list "环" "%%C" "/%%C" "%%130=") nil)
)
(setq a (GetNum "%%C"))
(setq b (GetNum "/%%C"))
(setq c (GetNum "%%130="))
(Setup)
(setq ans (* (- (* a a) (* b b)) c pi md 0.00000025))
)
((IfNum str (list "角钢" "X") nil)
(cond
((vl-string-search "角钢∠" str) (setq a (GetNum "角钢∠")))
((vl-string-search "角钢" str) (setq a (GetNum "角钢")))
((vl-string-search "角钢法兰" str) (setq a (GetNum "角钢法兰")))
)
(setq b (GetNum "X"))
(if (vl-string-search "X" str) (setq c (GetNum "X")) (setq c b b a))
(cond
((vl-string-search "L=" str) (setq d (GetNum "L=")))
((vl-string-search "L≈" str) (setq d (GetNum "L≈")))
((setq d (WYB-getreal "\n长度: <1000> " 1000.)))
)
(Setup)
(setq ans (* (- (+ a b) c) c d md 0.000001))
)
)
(if ans
(progn (WYB-ExportAns ans txh) (princ "\n完成计算!"))
(princ "\n该材料标记格式未添加至本程序!")
)
(princ)
) 新鲜8 发表于 2017-10-10 09:45
可以计算槽钢H钢工子钢吗
如果是名称标识中能表示出横截面的长宽厚尺寸的话,在规则中增加相应的计算公式后也是用的。不过,就我个人接触的经验来说,槽钢工字钢类的,如果是标准截面的,都使用的是标准代号。建一个代号和长度质量对应的数据库,也是可行的。 kexiya123 发表于 2016-9-24 15:49
可是我运行后,calwt error:CAO ZUO ERROE,please try a time。
没反应,咋回事?
我这边试了没什么问题啊。这个提示是怎么出现的?你是不是在旧版的基础上改的?新旧差代码还是有区别的 hao3ren 发表于 2016-9-25 19:19
命令: CalWt
参数类型错误: VLA-OBJECT nil
又检查了下,好像有几个函数漏了。第一次测试的时候,函数库好像没有清掉,以为齐了。
你再试下看看。 希望大家编写一个门式钢架里面一块钢板变化尺寸后,直接出重量的程序! 能不能搞一个自动的材料表 主题编辑不会顶贴的吗,自己顶一下吧,应该不算挖坟吧 lostbalance 发表于 2016-9-23 22:27
主题编辑不会顶贴的吗,自己顶一下吧,应该不算挖坟吧
可是我运行后,calwt error:CAO ZUO ERROE,please try a time。
没反应,咋回事? lostbalance 发表于 2016-9-23 22:27
主题编辑不会顶贴的吗,自己顶一下吧,应该不算挖坟吧
可是我运行后,calwt error:CAO ZUO ERROE,please try a time。
没反应,咋回事? 命令: CalWt
参数类型错误: VLA-OBJECT nil kexiya123 发表于 2016-9-24 15:49
可是我运行后,calwt error:CAO ZUO ERROE,please try a time。
没反应,咋回事?
你再试试看。重置了cad,又检查了下,这回应该可以了。
页:
[1]
2