提取文本数字并计算写入的程序
本人近期在工作中遇到大量 "钢板 δ10-200x100"类似的运算,要运算后写入已存在的单行文本单件重量 "xx"中,
本人水平有限,请好心人帮忙写个程序,谢谢!
计算公式:xx=10x200x100x0.001x0.001x7.85
(defun c:tt (/ a b n3 s1 ss)
(princ "\n选择文字: ")
(if (and
(setq ss (ssget ":S" '((0 . "*TEXT"))))
(setq n3 (entget (setq s1 (car (entsel "\n写入数值: ")))))
)
(progn
(setq a (cdr (assoc 1 (entget (ssname ss 0))))
b (apply '* (mapcar 'read (split-numbers a)))
b (* b 0.001 0.001 7.85)
)
(entmod (subst (cons 1 (rtos b 2 2)) (assoc 1 n3) n3))
(entupd s1)
)
)
(princ)
)
(defun split-numbers (str / buff l2)
(setq str (vl-string->list str))
(while str
(if(< 47 (car str) 58)
(setq buff (cons (car str) buff))
(if buff
(setq l2 (cons (vl-list->string (reverse buff)) l2)
buff nil
)
)
)
(setq str (cdr str))
)
(if buff
(setq l2 (cons (vl-list->string (reverse buff)) l2))
)
(reverse l2)
) ;; (abc "钢板 δ10-200x100")
(defun abc (tx / lst)
(setq lst (xyp-HzEngNum+- tx 3))
;(strcat "xx=" (xyp-strcat lst "x") "x0.001x0.001x7.85")
(apply '* (append (mapcar 'atoi lst) '(0.001 0.001 7.85)))
) http://bbs.xdcad.net/thread-669968-1-1.html
〈钢板重量计算器> (setq txt1 "钢板 δ120-2300x1400")
(setq n (vl-string-search "δ" txt1))
(setq txt2 (substr txt1 (+ n 3)))
(setq k (vl-string-search "-" txt2) i (vl-string-search "x" txt2) )
(setq txt3 (substr txt2 1 k) )
(setq txt4 (substr txt2 (+ 2 k) (- i k 1) ) )
(setq txt5 (substr txt2 (+ i 2) ))
(setq txt6 (rtos (* (atof txt3) (atof txt4) (atof txt5) 0.001 0.001 7.85) 2 4 ))
"3033.24"
本帖最后由 yangist 于 2015-2-5 10:36 编辑
fl202 发表于 2015-2-5 09:12 static/image/common/back.gif
(setq txt1 "钢板 δ120-2300x1400")
(setq n (vl-string-search "δ" txt1))
(setq txt2 (substr txt1 ( ...
这个太有局限性了 我想要个能通用的:
比如:
钢板δ10x100x200
钢板δ10-100x200
钢板10-100x200
δ10-100x200
t10-100x200
钢板t10-100x200
钢板t10x100x200
钢板t10*100*200
因为每个人的习惯都不一样... 本帖最后由 yangist 于 2015-2-5 16:12 编辑
自贡黄明儒 发表于 2015-2-5 08:59 static/image/common/back.gif
http://bbs.xdcad.net/thread-669968-1-1.html
〈钢板重量计算器>
谢谢,看到了,根据帖子的内容 我编了个程序
可惜用不了,提示参数类型错误
能帮我改改吗,谢谢
;;;提取数值计算========================
(DEFUN C:tt ( / ss ent dxf1 txt txt1 txt2 txt3 s s1 n3)
;(princ "\n选择标注: ")
;(setq ss (ssget ":S" '((0 . "Text")))
; ent (entget (ssname ss 0))
; a (cdr (assoc 1 ent))
; )
(setq a "钢板 δ12-230x140")
(setq b(SplitInstead a))
(setq b1 (atof (car b) 2 1))
(setq b2 (atof (cadr b) 2 1))
(setq b3 (atof (caddr b) 2 1))
(setq s (rtos (* b1 b2 b3 0.001 0.001 7.85) 2 1))
(setq n3 (entget (setq s1 (car (entsel "\n写入数值: ")))))
(entmod (subst (cons 1 s) (assoc 1 n3) n3))
(entupd s1)
(princ)
)
;;;字符串中非数字用空格替代
(defun SplitInstead (a / B C D)
(setq d "")
(while (/= a "")
(setq c (substr a 1 1))
(setq b (ascii c))
(setq a (substr a 2 (strlen a)))
(if (or (and (> b 47) (< b 58)) (= b 46))
(setq d (strcat d c))
(setq d (strcat d " "))
)
)
)
;;;===================================
xyp1964 发表于 2015-2-5 08:32 static/image/common/back.gif
院长大人 能帮楼上我自己写的程序调试下吗
您写的这个我用不来啊 o(╯□╰)o 本帖最后由 yangist 于 2015-2-5 17:07 编辑
vectra 发表于 2015-2-5 16:26 static/image/common/back.gif
谢谢,非常好用,最佳答案
就是 钢板t10-200x100 计算结果是正确的
而 钢板δ10-200x100 计算结果就错了 可能和δ有关
另外碰到小数点 "." 时也会计算错误,这样可是会很危险哦
不知道能不能调整下,谢谢!
“钢板t10-200x100” 和 “钢板δ10-200x100”测试结果均为1.57
第24行
(if (< 47 (car str) 58)
修改为(if (or (= 46 (car str)) (< 47 (car str) 58))
以增加对点号处理