明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3478|回复: 11

[源码] 简易钢材重量计算

[复制链接]
发表于 2016-1-2 10:12:48 | 显示全部楼层 |阅读模式
本帖最后由 mvehu 于 2016-1-5 20:13 编辑

用来计算矩管、圆管、圆钢、钢板、折弯件、角钢(3#、4#)等工作中经常接触到的钢材重量,并加总。类似于材料明细表中重量的功能。

语法:[<number>-]<form><n>x<n>...[l<length>]

<number>数量;<form>类型:实心圆棒q 空心圆环o 方管d 几字钢j 钢板i 折弯件z 角钢v <length>长度

比如2根50x50方管,壁厚2mm,长度1000mm,输入表达式 2-d50x50x2l1000
如果是1根,前面的1-可省略。

再比如1根圆管,直径33,壁厚3mm,长度6000mm,输入表达式 o33x3l6000

1块钢板240x240,10mm厚,表达式 i240x240x10
1根折弯件,各边长分别是30、20、45,板厚1mm,长4000mm,表达式 z30x20x45x1l4000

使用了正则表达式验证输入是否符合语法。(不支持边长、直径参数带小数点,壁厚可带小数点.)


6楼有新修改的代码,增加了重新编辑计算已有算式的命令。 1楼的当作历史版本吧。

  1. (defun weight (density guige-list / form z-length num)
  2.                                         ;接受密度和一个规格表 (型材类型代号 规格参数... )
  3.                                         ;计算重量
  4.   (setq form (car guige-list))          ;型材代号
  5.   (cond
  6.     ((= form 'o)                        ; 空心圆环 (o 32 2 length)
  7.      (* (/ pi 4)
  8.         4
  9.         (nth 2 guige-list)
  10.         (- (nth 1 guige-list) (nth 2 guige-list))
  11.         (nth 3 guige-list)
  12.         density
  13.         )
  14.      )
  15.     ((= form 'q)                        ;实心圆棒 (q 32 length)
  16.      (* (/ pi 4)
  17.         (nth 1 guige-list)
  18.         (nth 1 guige-list)
  19.         (nth 2 guige-list)
  20.         density
  21.         )
  22.      )
  23.     ((= form 'd)                        ;矩形管 (d 50 30 2 length)
  24.      (* 2
  25.         (nth 3 guige-list)
  26.         (+ (nth 1 guige-list) (nth 2 guige-list) (* -2 (nth 3 guige-list)))
  27.         (nth 4 guige-list)
  28.         density
  29.         )
  30.      )
  31.     ((= form 'j)                        ;几字钢 (j 50 length)
  32.      (cond ((= (nth 1 guige-list) '38) (* (nth 2 guige-list) 1.6e-3))
  33.                                         ;展开 130 ,1.03镀锌系数
  34.            ((= (nth 1 guige-list) '50) (* (nth 2 guige-list) 1.94e-3))
  35.                                         ;展开 160
  36.            ((= (nth 1 guige-list) '70) (* (nth 2 guige-list) 2.6e-3))
  37.            )
  38.      )                                  ;展开 214
  39.     ((= form 'i)                        ;板状物(i 边长 边长 厚度)
  40.      (* (nth 1 guige-list) (nth 2 guige-list) (nth 3 guige-list) density)
  41.      )
  42.     ((= form 'z)                        ; 多边折弯件 (z 边长1 边长2 ... 厚度 延长)
  43.      (setq z-length 0                   ;封边各边长总长
  44.            num 1
  45.            )
  46.      (while (<= num (- (length guige-list) 3))
  47.        (setq z-length (+ (nth num guige-list) z-length))
  48.        (setq num (1+ num))
  49.        )
  50.      (* density
  51.         z-length
  52.         (nth num guige-list)            ;厚度
  53.         (nth (1+ num) guige-list)       ;延长
  54.         )
  55.      )
  56.     ((= form 'v)                        ;角钢 (v 3 length)
  57.      (cond ((= (nth 1 guige-list) '3) (* (nth 2 guige-list) 1.09e-3))
  58.                                         ;3号角钢6.5kg/6m
  59.            ((= (nth 1 guige-list) '4) (* (nth 2 guige-list) 1.75e-3))
  60.                                         ;4号角钢10.5kg/6m
  61.            )
  62.      )
  63.     )
  64.   )

  65. (defun regex-test (pat str key / regex test)
  66.   ;; 测试字符串str是否存在字串符合正则表达式模式pat
  67.   ;; pat 正则表达式 str 字符串
  68.   ;; pat 中 \ 使用 \\
  69.   ;; key "igm" i(Ignorecase)忽略大小写 g (Global)全局匹配 m (Multili) 多行模式
  70.   ;; 注意:一般使用全局匹配 g
  71.   ;; 可组合使用或单独使用 或置空 ""
  72.   (vl-load-com)
  73.   (setq regex (vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  74.   (if (wcmatch key "*i*,*I*")
  75.     (vlax-put-property regex "IgnoreCase" 1) ;忽略大小写
  76.     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  77.     )
  78.   (if (wcmatch key "*g*,*G*")
  79.     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  80.     (vlax-put-property regex "Global" 0)
  81.     )
  82.   (if (wcmatch key "*m*,*M*")
  83.     (vlax-put-property regex "Multiline" 1) ;多行模式
  84.     (vlax-put-property regex "Multiline" 0)
  85.     )
  86.   (vlax-put-property regex "Pattern" pat)
  87.   (setq test (if (eq (vlax-invoke-method regex "test" str) :vlax-true)
  88.                t
  89.                nil
  90.                )
  91.         )
  92.   (vlax-release-object regex)
  93.   test
  94.   )

  95. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  96. (defun test-str (str)                   ;判断str是否符合特定模式
  97.   (cond ((regex-test "^\\d+-o\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  98.                                         ;1-o32x1.8l2000
  99.         ((regex-test "^\\d+-q\\d+\\.?\\d*l\\d+$" str "ig") t) ;24-q16l500
  100.         ((regex-test "^\\d+-d\\d+x\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t) ;2-d50x50x2.5l1000
  101.         ((regex-test "^\\d+-j(38|50|70)l\\d+$" str "ig") t) ;1-j38|50|70l1000
  102.         ((regex-test "^\\d+-i\\d+x\\d+x\\d+$" str "ig") t) ;1-i100x100x10
  103.         ((regex-test "^\\d+-z\\d+(x\\d+)+l\\d+$" str "ig") t) ;2-z10x10x20x2l1000
  104.         ((regex-test "^\\d+-v[34]l\\d+$" str "ig") t) ;24-v3|4l500
  105.         ((= str "1-e") t)               ;结束
  106.         (t nil)
  107.         )
  108.   )
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





  110. (defun parsel (str delim / LST POS)
  111.   ;;字符串分割 delim是用来分割的字符
  112.   (setq lst nil)
  113.   (while (setq pos (vl-string-search delim str))
  114.     (setq lst (cons (substr str 1 pos) lst)
  115.           str (substr str (+ pos 2))
  116.           )
  117.     )
  118.   (if (> (strlen str) 0)
  119.     (setq lst (cons str lst))
  120.     )
  121.   (reverse lst)
  122.   )


  123. (defun add1- (str)                      ;辅助函数 如果字符串中不含"-",则在开头添加"1-"
  124.   (if (not (vl-string-position (ascii "-") str))
  125.     (strcat "1-" str)
  126.     str
  127.     )
  128.   )

  129. (defun str->weight
  130.        (str-n / density str->list number guige-list str-weight canshu form)
  131.                                         ;从字符串计算重量列表
  132.                                         ;返回一个列表 (字符串:数量-类型-单重-总重 总重)
  133.   (setq density 7.85e-6)                ;钢材密度
  134.   (setq str->list
  135.          (read
  136.            (strcat
  137.              "("                        ;将字符串str-n分解成各参数的列表
  138.              (vl-string-translate
  139.                "-xl"                    ;参数分割字符集 -xl
  140.                "   "
  141.                (strcat
  142.                  (substr str-n
  143.                          1
  144.                          (+ 2 (vl-string-position (ascii "-") str-n))
  145.                          )
  146.                  "-"
  147.                  (substr str-n
  148.                          (+ 3 (vl-string-position (ascii "-") str-n))
  149.                          )
  150.                  )
  151.                )
  152.              ")"
  153.              )
  154.            )
  155.         )
  156.   (setq number     (car str->list)      ; 该类型钢材数量
  157.         guige-list (cdr str->list)      ;该类型钢材重量计算的规格表
  158.         str-weight (weight density guige-list) ;钢材重量
  159.         canshu     (strcase
  160.                      (substr str-n (+ 3 (vl-string-position (ascii "-") str-n)))
  161.                      )
  162.         )                               ;规格表转换大写
  163.   (setq form (cadr str->list))
  164.   (cond ((= form 'o) (setq form "圆钢管%%C"))
  165.         ((= form 'q) (setq form "圆钢%%C"))
  166.         ((= form 'd) (setq form "钢矩管\\U+25A1"))
  167.         ((= form 'j) (setq form "几字钢J"))
  168.         ((= form 'i) (setq form "钢板I"))
  169.         ((= form 'z) (setq form "折弯件Z"))
  170.         ((= form 'v) (setq form "角钢\\U+2220"))
  171.         )
  172.   (list (strcat (rtos (nth 0 str->list))
  173.                 "个"
  174.                 form
  175.                 canshu
  176.                 ",单重:"
  177.                 (rtos str-weight 2 3)
  178.                 "kg"
  179.                 ",总重: "
  180.                 (rtos (* str-weight number) 2 3)
  181.                 "kg。"
  182.                 )
  183.         (* str-weight number)
  184.         )
  185.   )


  186. (defun c:sweight
  187.        (/ str weight-list weight-sum num str-str-sum point text-size)
  188.   (princ
  189.     "语法:[<number>-]<form><n>x<n>...[l<length>] [<number>-]<form><n>x<n>...[l<length>]"
  190.     )
  191.   (princ
  192.     "\n<number>数量;<form>类型:实心圆棒q 中心圆环o 方管d 几字钢j 钢板i 折弯件z 角钢v <length>长度"
  193.     )
  194.   (princ
  195.     "\n例子:实心圆棒q16l500  中心圆环2-o32x1.8l1000 方管3-d50x50x2l1500 \n
  196.     几字钢1-j38|50|70l1000 钢板i-100x100x3 折弯件z30x30x2l1000 角钢v3|4l500"
  197.     )
  198.   (setq weight-sum 0
  199.         str-str-sum " "
  200.         )
  201.   (while
  202.     (progn
  203.       (while
  204.         (not (test-str
  205.                (setq
  206.                  str (add1- (getstring
  207.                               t
  208.                               "\n输入计算表达式[圆管O|圆钢Q|矩管D|几字钢J|钢板I|折弯Z|角钢V][e结束计算]:"
  209.                               )
  210.                             )
  211.                  )
  212.                )
  213.              )
  214.         (princ "\n输入语法有误,请重新输入")
  215.         )
  216.       (if (not (= str "1-e"))
  217.         t
  218.         )
  219.       )
  220.      (setq str->weight-list (str->weight str))
  221.      (setq weight-sum  (+ weight-sum (cadr str->weight-list))
  222.            str-str-sum (strcat str-str-sum (car str->weight-list) "\\P")
  223.            )
  224.      (princ (strcat (car str->weight-list)
  225.                     "=>以上重量加总"
  226.                     (rtos weight-sum 2 3)
  227.                     "kg"
  228.                     )
  229.             )
  230.      )
  231.   (if
  232.     (not (= (getstring "是否将计算结果写入文档(n不写入)<默认写入>:") "n"))
  233.      (progn (setq str-str-sum
  234.                    (strcat (substr str-str-sum 2)
  235.                            "----------------\\P总重:"
  236.                            (rtos weight-sum 2 2)
  237.                            "kg"
  238.                            )
  239.                   )
  240.             (setq point (getpoint "输入文字起始位置"))
  241.             (setq text-size             ;当前字体高度
  242.                    (cdr (assoc 40 (entget (tblobjname "style" (getvar "textstyle")))))
  243.                   )
  244.             (command "mtext"
  245.                      point
  246.                      (polar point -0.1 (* 45 text-size))
  247.                                         ; 设置多行文字宽度 字体高度的45倍
  248.                      str-str-sum
  249.                      ""
  250.                      )
  251.             )
  252.      )
  253.   )


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 金钱 +10 收起 理由
lucas_3333 + 1 + 10 谢谢分享,如果使用对话框会更加直观!

查看全部评分

发表于 2020-3-20 11:43:49 | 显示全部楼层
简易钢材重量计算
发表于 2016-1-3 21:30:39 | 显示全部楼层
本帖最后由 bai2000 于 2016-1-4 09:52 编辑

X 能改为*么?不符合输入数字的习惯
同时把工字钢、槽钢加进去?
 楼主| 发表于 2016-1-4 22:06:44 | 显示全部楼层
本帖最后由 mvehu 于 2016-1-4 22:30 编辑
bai2000 发表于 2016-1-3 21:30
X 能改为*么?不符合输入数字的习惯
同时把工字钢、槽钢加进去?

在笔记本电脑小键盘上,输入* 需要同时按两个键,而输入字母x只需要按一个键,比较方便。当然,如果修改成*,改代码也不难。你可以自己试试。

工字钢、槽钢,我工作上接触不到,理论计算公式也不知道啊。

 楼主| 发表于 2016-1-4 22:26:16 | 显示全部楼层
本帖最后由 mvehu 于 2016-1-5 13:43 编辑



新增加了一个编辑已有算式的命令 resw

适合如下情况: 已经有一个算式文本。现在要修改几个参数或者增加几种新的材料。修改参数,可以直接在文本上改。然后运行resw,选择算式文本,输入e,重新计算重量,或者输入追加的新的材料规格。

调试程序的时候发现两个奇怪问题。

1,在第一版程序中,输出结果时候用了一些如 \U+25A1 这样的Unicode Character  □。但是用如下代码获取字符串时候
(setq vlax-string (vlax-ename->vla-object (car (entsel "请选择算式:"))))
  (setq string (vlax-get-property vlax-string "TextString"))

有时获取的是 □,有时又变成了 \U+25A1 。导致程序有时能运行,有时又不成。搞不清原因,只得全改回英文字母 D V

2, 有一个测试输入字符串是否合法的函数 test-str ,已经在前面定义了。 但是在  resw 中调用的时候,总是报错,说没有定义。在控制台查询,也有定义! 实在没办法,在调用 test-str 之前,又重新定义了一遍,这次通过了。【发现原因了。在resw函数定义时,误把test-str定义成了临时变量】




下面是全部新代码:

  1. (defun weight (density guige-list / form z-length num)
  2.                                         ;接受密度和一个规格表 (型材类型代号 规格参数... )
  3.                                         ;计算重量
  4.   (setq form (car guige-list))          ;型材代号
  5.   (cond
  6.     ((= form 'o)                        ; 空心圆环 (o 32 2 length)
  7.      (* (/ pi 4)
  8.         4
  9.         (nth 2 guige-list)
  10.         (- (nth 1 guige-list) (nth 2 guige-list))
  11.         (nth 3 guige-list)
  12.         density
  13.         )
  14.      )
  15.     ((= form 'q)                        ;实心圆棒 (q 32 length)
  16.      (* (/ pi 4)
  17.         (nth 1 guige-list)
  18.         (nth 1 guige-list)
  19.         (nth 2 guige-list)
  20.         density
  21.         )
  22.      )
  23.     ((= form 'd)                        ;矩形管 (d 50 30 2 length)
  24.      (* 2
  25.         (nth 3 guige-list)
  26.         (+ (nth 1 guige-list) (nth 2 guige-list) (* -2 (nth 3 guige-list)))
  27.         (nth 4 guige-list)
  28.         density
  29.         )
  30.      )
  31.     ((= form 'j)                        ;几字钢 (j 50 length)
  32.      (cond ((= (nth 1 guige-list) '38) (* (nth 2 guige-list) 1.6e-3))
  33.                                         ;展开 130 ,1.03镀锌系数
  34.            ((= (nth 1 guige-list) '50) (* (nth 2 guige-list) 1.94e-3))
  35.                                         ;展开 160
  36.            ((= (nth 1 guige-list) '70) (* (nth 2 guige-list) 2.6e-3))
  37.            )
  38.      )                                  ;展开 214
  39.     ((= form 'i)                        ;板状物(i 边长 边长 厚度)
  40.      (* (nth 1 guige-list) (nth 2 guige-list) (nth 3 guige-list) density)
  41.      )
  42.     ((= form 'z)                        ; 多边折弯件 (z 边长1 边长2 ... 厚度 延长)
  43.      (setq z-length 0                   ;封边各边长总长
  44.            num 1
  45.            )
  46.      (while (<= num (- (length guige-list) 3))
  47.        (setq z-length (+ (nth num guige-list) z-length))
  48.        (setq num (1+ num))
  49.        )
  50.      (* density
  51.         z-length
  52.         (nth num guige-list)            ;厚度
  53.         (nth (1+ num) guige-list)       ;延长
  54.         )
  55.      )
  56.     ((= form 'v)                        ;角钢 (v 3 length)
  57.      (cond ((= (nth 1 guige-list) '3) (* (nth 2 guige-list) 1.09e-3))
  58.                                         ;3号角钢6.5kg/6m
  59.            ((= (nth 1 guige-list) '4) (* (nth 2 guige-list) 1.75e-3))
  60.                                         ;4号角钢10.5kg/6m
  61.            )
  62.      )
  63.     )
  64.   )

  65. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;正则表达式

  66. (defun regex-extract (pat str key / regex S tmp str1)
  67.   ;; 提取正则表达式匹配到的内容
  68.   ;; pat 正则表达式 str 字符串
  69.   ;; pat 中 \ 使用 \\
  70.   ;; key "igm" i(Ignorecase)忽略大小写 g (Global)全局匹配 m (Multili) 多行模式
  71.   ;; 注意:一般使用全局匹配 g
  72.   ;; 可组合使用或单独使用 或置空 ""
  73.   (vl-load-com)
  74.   (setq regex (vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  75.   (if (wcmatch key "*i*,*I*")
  76.     (vlax-put-property regex "IgnoreCase" 1) ;忽略大小写
  77.     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  78.     )
  79.   (if (wcmatch key "*g*,*G*")
  80.     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  81.     (vlax-put-property regex "Global" 0)
  82.     )
  83.   (if (wcmatch key "*m*,*M*")
  84.     (vlax-put-property regex "Multiline" 1) ;多行模式
  85.     (vlax-put-property regex "Multiline" 0)
  86.     )
  87.   (vlax-put-property regex "Pattern" pat)
  88.   (setq s (vlax-invoke-method regex "Execute" str))
  89.   ;;将规则运用到STR字符,得到提取出的文字内容
  90.   (VLAX-FOR tmp s                       ;遍历集合对象
  91.     (setq str1 (cons (vlax-get-property tmp "value") str1))
  92.     )
  93.   ;;将内容转换为LISP语言就可以直接观察了
  94.   (vlax-release-object regex)
  95.   (REVERSE str1)
  96.   )


  97. (defun regex-test (pat str key / regex test)
  98.   ;; 测试字符串str是否存在字串符合正则表达式模式pat
  99.   ;; pat 正则表达式 str 字符串
  100.   ;; pat 中 \ 使用 \\
  101.   ;; key "igm" i(Ignorecase)忽略大小写 g (Global)全局匹配 m (Multili) 多行模式
  102.   ;; 注意:一般使用全局匹配 g
  103.   ;; 可组合使用或单独使用 或置空 ""
  104.   (vl-load-com)
  105.   (setq regex (vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  106.   (if (wcmatch key "*i*,*I*")
  107.     (vlax-put-property regex "IgnoreCase" 1) ;忽略大小写
  108.     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  109.     )
  110.   (if (wcmatch key "*g*,*G*")
  111.     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  112.     (vlax-put-property regex "Global" 0)
  113.     )
  114.   (if (wcmatch key "*m*,*M*")
  115.     (vlax-put-property regex "Multiline" 1) ;多行模式
  116.     (vlax-put-property regex "Multiline" 0)
  117.     )
  118.   (vlax-put-property regex "Pattern" pat)
  119.   (setq test (if (eq (vlax-invoke-method regex "test" str) :vlax-true)
  120.                t
  121.                nil
  122.                )
  123.         )
  124.   (vlax-release-object regex)
  125.   test
  126.   )

  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128. (defun test-str (str)                   ;判断str是否符合特定模式
  129.   (cond ((regex-test "^\\d+-o\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  130.                                         ;1-o32x1.8l2000
  131.         ((regex-test "^\\d+-q\\d+\\.?\\d*l\\d+$" str "ig") t) ;24-q16l500
  132.         ((regex-test "^\\d+-d\\d+x\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  133.                                         ;2-d50x50x2.5l1000
  134.         ((regex-test "^\\d+-j(38|50|70)l\\d+$" str "ig") t)
  135.                                         ;1-j38|50|70l1000
  136.         ((regex-test "^\\d+-i\\d+x\\d+x\\d+$" str "ig") t) ;1-i100x100x10
  137.         ((regex-test "^\\d+-z\\d+(x\\d+)+l\\d+$" str "ig") t)
  138.                                         ;2-z10x10x20x2l1000
  139.         ((regex-test "^\\d+-v[34]l\\d+$" str "ig") t) ;24-v3|4l500
  140.         ((= str "1-e") t)               ;结束
  141.         (t nil)
  142.         )
  143.   )
  144. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





  145. (defun parsel (str delim / LST POS)
  146.   ;;字符串分割 delim是用来分割的字符
  147.   (setq lst nil)
  148.   (while (setq pos (vl-string-search delim str))
  149.     (setq lst (cons (substr str 1 pos) lst)
  150.           str (substr str (+ pos 2))
  151.           )
  152.     )
  153.   (if (> (strlen str) 0)
  154.     (setq lst (cons str lst))
  155.     )
  156.   (reverse lst)
  157.   )


  158. (defun add1- (str)                      ;辅助函数 如果字符串中不含"-",则在开头添加"1-"
  159.   (if (not (vl-string-position (ascii "-") str))
  160.     (strcat "1-" str)
  161.     str
  162.     )
  163.   )

  164. (defun str->weight
  165.        (str-n / density str->list number guige-list str-weight canshu form)
  166.                                         ;从字符串计算重量列表
  167.                                         ;返回一个列表 (字符串:数量-类型-单重-总重 总重)
  168.   (setq density 7.85e-6)                ;钢材密度
  169.   (setq str->list
  170.          (read
  171.            (strcat
  172.              "("                        ;将字符串str-n分解成各参数的列表
  173.              (vl-string-translate
  174.                "-xXLl"                  ;参数分割字符集 -xl
  175.                "     "
  176.                (strcat
  177.                  (substr str-n
  178.                          1
  179.                          (+ 2 (vl-string-position (ascii "-") str-n))
  180.                          )
  181.                  "-"
  182.                  (substr str-n
  183.                          (+ 3 (vl-string-position (ascii "-") str-n))
  184.                          )
  185.                  )
  186.                )
  187.              ")"
  188.              )
  189.            )
  190.         )
  191.   (setq number     (car str->list)      ; 该类型钢材数量
  192.         guige-list (cdr str->list)      ;该类型钢材重量计算的规格表
  193.         str-weight (weight density guige-list) ;钢材重量
  194.         canshu     (strcase
  195.                      (substr str-n (+ 3 (vl-string-position (ascii "-") str-n)))
  196.                      )
  197.         )                               ;规格表转换大写
  198.   (setq form (cadr str->list))
  199.   (cond ((= form 'o) (setq form "圆钢管%%C"))
  200.         ((= form 'q) (setq form "圆钢%%C"))
  201.         ((= form 'd) (setq form "钢矩管D"))
  202.         ((= form 'j) (setq form "几字钢J"))
  203.         ((= form 'i) (setq form "钢板I"))
  204.         ((= form 'z) (setq form "折弯件Z"))
  205.         ((= form 'v) (setq form "角钢V"))
  206.         )
  207.   (list (strcat (rtos (nth 0 str->list))
  208.                 "个"
  209.                 form
  210.                 canshu
  211.                 ",单重:"
  212.                 (rtos str-weight 2 3)
  213.                 "kg"
  214.                 ",总重: "
  215.                 (rtos (* str-weight number) 2 3)
  216.                 "kg。"
  217.                 )
  218.         (* str-weight number)
  219.         )
  220.   )


  221. (defun c:sw (/ str weight-list weight-sum num str-str-sum point text-size)
  222.   (princ "语法:[<number>-]<form><n>x<n>...[l<length>]")
  223.   (princ
  224.     "\n<number>数量;<form>类型:实心圆棒q 空心圆环o 方管d 几字钢j 钢板i 折弯件z 角钢v <length>长度"
  225.     )
  226.   (princ
  227.     "\n例子:实心圆棒q16l500  空心圆环2-o32x1.8l1000 方管3-d50x50x2l1500 \n
  228.     几字钢1-j38|50|70l1000 钢板i-100x100x8 折弯件z30x30x2l1000 角钢v3|4l500"
  229.     )
  230.   (setq weight-sum 0
  231.         str-str-sum ""
  232.         )
  233.   (while (progn (while (not (test-str (setq str
  234.                                              (add1-
  235.                                                (getstring
  236.                                                  t
  237.                                                  "\n输入计算表达式[圆管O|圆钢Q|矩管D|几字钢J|钢板I|折弯Z|角钢V][e结束计算]:"
  238.                                                  )
  239.                                                )
  240.                                             )
  241.                                       )
  242.                             )
  243.                   (princ "\n输入语法有误,请重新输入")
  244.                   )
  245.                 (if (not (= str "1-e"))
  246.                   t
  247.                   )
  248.                 )
  249.     (setq str->weight-list (str->weight str))
  250.     (setq weight-sum  (+ weight-sum (cadr str->weight-list))
  251.           str-str-sum (strcat str-str-sum (car str->weight-list) "\\P")
  252.           )
  253.     (princ (strcat (car str->weight-list)
  254.                    "=>以上重量加总"
  255.                    (rtos weight-sum 2 3)
  256.                    "kg"
  257.                    )
  258.            )
  259.     )
  260.   (if
  261.     (not (= (getstring "是否将计算结果写入文档(n不写入)<默认写入>:") "n"))
  262.      (progn (setq str-str-sum
  263.                    (strcat str-str-sum
  264.                            "----------------\\P总重:"
  265.                            (rtos weight-sum 2 2)
  266.                            "kg"
  267.                            )
  268.                   )
  269.             (setq point (getpoint "输入文字起始位置"))
  270.             (setq text-size             ;当前字体高度
  271.                    (cdr (assoc 40 (entget (tblobjname "style" (getvar "textstyle")))))
  272.                   )
  273.             (command "mtext"
  274.                      point
  275.                      (polar point -0.1 (* 45 text-size))
  276.                                         ; 设置多行文字宽度 字体高度的45倍
  277.                      str-str-sum
  278.                      ""
  279.                      )
  280.             )
  281.      )
  282.   )


  283. (defun c:resw (/             vlax-string   string        text-weight
  284.                num           weight-sum    str-str-sum   test-str
  285.                str           str->weight-list
  286.                )
  287.   ;;重新计算已有文本
  288.   (VL-LOAD-COM)
  289.   (setq vlax-string (vlax-ename->vla-object (car (entsel "请选择算式:"))))
  290.                                         ;已有文本的vlax对象
  291.   (setq string (vlax-get-property vlax-string "TextString"))
  292.   (defun string-trim (string / str s tmp) ;字符串重新格式化函数
  293.     (setq str (regex-extract "(^|\\\\P)[^,]+(?=,)" string "igm"))
  294.     (defun trim (str)
  295.       (setq str (vl-string-subst "" "\\P" str))
  296.       (setq str (vl-string-subst "-o" "个圆钢管%%C" str))
  297.       (setq str (vl-string-subst "-d" "个钢矩管D" str))
  298.       (setq str (vl-string-subst "-i" "个钢板I" str))
  299.       (setq str (vl-string-subst "-j" "个几字钢J" str))
  300.       (setq str (vl-string-subst "-z" "个折弯件Z" str))
  301.       (setq str (vl-string-subst "-v" "个角钢V" str))
  302.       (setq str (vl-string-subst "-q" "个圆钢%%C" str))
  303.       str
  304.       )
  305.     (setq tmp nil)
  306.     (foreach s str (setq tmp (cons (trim s) tmp)))
  307.     (reverse tmp)
  308.     )
  309.   (setq string (string-trim string))
  310.   (setq text-weight (mapcar 'str->weight string))
  311.   (setq num 0
  312.         weight-sum 0
  313.         )
  314.   (repeat (length text-weight)          ;计算已有算式的总重
  315.     (setq weight-sum (+ (cadr (nth num text-weight)) weight-sum))
  316.     (setq num (1+ num))
  317.     )
  318.   (setq str-str-sum "")                 ;计算已有算式的字符串说明汇总
  319.   (repeat (length text-weight)
  320.     (setq str-str-sum (strcat str-str-sum (caar text-weight) "\\P"))
  321.     (setq text-weight (cdr text-weight))
  322.     )
  323.   (princ str-str-sum)
  324.   (princ (strcat "=>以上重量加总" (rtos weight-sum 2 3) "kg"))
  325.   
  326. ;;;;;;;;;;;;;;;;;;;;;;;;!!!非常奇怪!!! test-str函数前面已定义,可运行时,总是说无定义。只得在此重新定义一下。
  327.   (defun test-str (str)                 ;判断str是否符合特定模式
  328.     (cond ((regex-test "^\\d+-o\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  329.                                         ;1-o32x1.8l2000
  330.           ((regex-test "^\\d+-q\\d+\\.?\\d*l\\d+$" str "ig") t)
  331.                                         ;24-q16l500
  332.           ((regex-test "^\\d+-d\\d+x\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  333.                                         ;2-d50x50x2.5l1000
  334.           ((regex-test "^\\d+-j(38|50|70)l\\d+$" str "ig") t)
  335.                                         ;1-j38|50|70l1000
  336.           ((regex-test "^\\d+-i\\d+x\\d+x\\d+$" str "ig") t)
  337.                                         ;1-i100x100x10
  338.           ((regex-test "^\\d+-z\\d+(x\\d+)+l\\d+$" str "ig") t)
  339.                                         ;2-z10x10x20x2l1000
  340.           ((regex-test "^\\d+-v[34]l\\d+$" str "ig") t) ;24-v3|4l500
  341.           ((= str "1-e") t)             ;结束
  342.           (t nil)
  343.           )
  344.     )
  345.   
  346.   (while (progn (while (not (test-str (setq str
  347.                                              (add1-
  348.                                                (getstring
  349.                                                  t
  350.                                                  "\n输入计算表达式[圆管O|圆钢Q|矩管D|几字钢J|钢板I|折弯Z|角钢V][e结束计算]:"
  351.                                                  )
  352.                                                )
  353.                                             )
  354.                                       )
  355.                             )
  356.                   (princ "\n输入语法有误,请重新输入")
  357.                   )
  358.                 (if (not (= str "1-e"))
  359.                   t
  360.                   )
  361.                 )
  362.     (setq str->weight-list (str->weight str))
  363.     (setq weight-sum  (+ weight-sum (cadr str->weight-list))
  364.           str-str-sum (strcat str-str-sum (car str->weight-list) "\\P")
  365.           )
  366.     (princ (strcat (car str->weight-list)
  367.                    "=>以上重量加总"
  368.                    (rtos weight-sum 2 3)
  369.                    "kg"
  370.                    )
  371.            )
  372.     )
  373.   (setq str-str-sum
  374.          (strcat str-str-sum
  375.                  "----------------\\P总重:"
  376.                  (rtos weight-sum 2 2)
  377.                  "kg"
  378.                  )
  379.         )
  380.   (vlax-put-property vlax-string "TextString" str-str-sum)
  381.   (vlax-object-released-p vlax-string)
  382.   )

  383. ;;;(princ "\nsw 重量计算\nresw 重新计算")
  384. ;;;(princ)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 编程有时要考虑到Unicode Character的问题

查看全部评分

发表于 2016-1-5 12:12:52 | 显示全部楼层
"resw"运行不了,
加5号角钢在
((= (nth 1 guige-list) '4) (* (nth 2 guige-list) 1.75e-3))
                                        ;4号角钢10.5kg/6m
((= (nth 1 guige-list) '5) (* (nth 2 guige-list) 3.77e-3))
                                        ;5号角钢22.62kg/6m
也运行错误
 楼主| 发表于 2016-1-5 13:55:42 | 显示全部楼层
本帖最后由 mvehu 于 2016-1-5 22:32 编辑
bai2000 发表于 2016-1-5 12:12
"resw"运行不了,
加5号角钢在
((= (nth 1 guige-list) '4) (* (nth 2 guige-list) 1.75e-3))

重新修改了一下代码,把sw和resw合并成一个命令。

编辑已有算式时,输入开关 r 即可。

增加5号角钢,不仅要增加你写的代码,在函数 test-str 处也要修改一下。test-str使用正则表达式来判断输入的算式命令是否合法。开始的代码角钢只有3、4两个型号,需要增加型号5。

(defun test-str         (str)                        ;判断str是否符合特定模式
  (cond
    ((regex-test "^\\d+-o\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
                                        ;1-o32x1.8l2000
    ((regex-test "^\\d+-q\\d+\\.?\\d*l\\d+$" str "ig") t) ;24-q16l500
    ((regex-test "^\\d+-d\\d+x\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
                                        ;2-d50x50x2.5l1000
    ((regex-test "^\\d+-j(38|50|70)l\\d+$" str "ig") t)
                                        ;1-j38|50|70l1000
    ((regex-test "^\\d+-i\\d+x\\d+x\\d+$" str "ig") t) ;1-i100x100x10
    ((regex-test "^\\d+-z\\d+(x\\d+)+l\\d+$" str "ig") t)
                                        ;2-z10x10x20x2l1000
    ((regex-test "^\\d+-v[345]l\\d+$" str "ig") t) ;  增加5号角钢 以前的正则表达式 "^\\d+-v[34]l\\d+$"
    ((= str "1-r") t)
    ((= str "1-e") t)                        ;结束
    (t nil)))


你可以试试下面的代码。合并了sw和resw。已经增加了5号角钢。 不过话说,你那里能买到国标的角钢? 我的算式里3、4号角钢都是非标的。

  1. (defun weight  (density guige-list / form z-length num)
  2.                                         ;接受密度和一个规格表 (型材类型代号 规格参数... )
  3.                                         ;计算重量
  4.   (setq form (car guige-list))                ;型材代号
  5.   (cond
  6.     ((= form 'o)                        ; 空心圆环 (o 32 2 length)
  7.      (*        (/ pi 4)
  8.         4
  9.         (nth 2 guige-list)
  10.         (- (nth 1 guige-list) (nth 2 guige-list))
  11.         (nth 3 guige-list)
  12.         density))
  13.     ((= form 'q)                        ;实心圆棒 (q 32 length)
  14.      (*        (/ pi 4)
  15.         (nth 1 guige-list)
  16.         (nth 1 guige-list)
  17.         (nth 2 guige-list)
  18.         density))
  19.     ((= form 'd)                        ;矩形管 (d 50 30 2 length)
  20.      (*        2
  21.         (nth 3 guige-list)
  22.         (+ (nth 1 guige-list)
  23.            (nth 2 guige-list)
  24.            (* -2 (nth 3 guige-list)))
  25.         (nth 4 guige-list)
  26.         density))
  27.     ((= form 'j)                        ;几字钢 (j 50 length)
  28.      (cond ((= (nth 1 guige-list) '38) (* (nth 2 guige-list) 1.6e-3))
  29.                                         ;展开 130 ,1.03镀锌系数
  30.            ((= (nth 1 guige-list) '50) (* (nth 2 guige-list) 1.94e-3))
  31.                                         ;展开 160
  32.            ((= (nth 1 guige-list) '70) (* (nth 2 guige-list) 2.6e-3))))
  33.                                         ;展开 214
  34.     ((= form 'i)                        ;板状物(i 边长 边长 厚度)
  35.      (*        (nth 1 guige-list)
  36.         (nth 2 guige-list)
  37.         (nth 3 guige-list)
  38.         density))
  39.     ((= form 'z)                        ; 多边折弯件 (z 边长1 边长2 ... 厚度 延长)
  40.      (setq z-length 0                        ;封边各边长总长
  41.            num 1)
  42.      (while (<= num (- (length guige-list) 3))
  43.        (setq z-length (+ (nth num guige-list) z-length))
  44.        (setq num (1+ num)))
  45.      (*        density
  46.         z-length
  47.         (nth num guige-list)                ;厚度
  48.         (nth (1+ num) guige-list)        ;延长
  49.         ))
  50.     ((= form 'v)                        ;角钢 (v 3 length)
  51.      (cond ((= (nth 1 guige-list) '3) (* (nth 2 guige-list) 1.09e-3))
  52.                                         ;3号角钢6.5kg/6m
  53.            ((= (nth 1 guige-list) '4) (* (nth 2 guige-list) 1.75e-3))
  54.                                         ;4号角钢10.5kg/6m
  55.            ((= (nth 1 guige-list) '5) (* (nth 2 guige-list) 3.77e-3))
  56.                                         ;5号角钢22.62kg/6m
  57.            ))))

  58. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;正则表达式

  59. (defun regex-extract  (pat str key / regex S tmp str1)
  60.   ;; 提取正则表达式匹配到的内容
  61.   ;; pat 正则表达式 str 字符串
  62.   ;; pat 中 \ 使用 \\
  63.   ;; key "igm" i(Ignorecase)忽略大小写 g (Global)全局匹配 m (Multili) 多行模式
  64.   ;; 注意:一般使用全局匹配 g
  65.   ;; 可组合使用或单独使用 或置空 ""
  66.   (vl-load-com)
  67.   (setq regex (vlax-create-object "Vbscript.RegExp"))
  68.                                         ;引用正则表达式控件
  69.   (if (wcmatch key "*i*,*I*")
  70.     (vlax-put-property regex "IgnoreCase" 1) ;忽略大小写
  71.     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  72.     )
  73.   (if (wcmatch key "*g*,*G*")
  74.     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  75.     (vlax-put-property regex "Global" 0))
  76.   (if (wcmatch key "*m*,*M*")
  77.     (vlax-put-property regex "Multiline" 1) ;多行模式
  78.     (vlax-put-property regex "Multiline" 0))
  79.   (vlax-put-property regex "Pattern" pat)
  80.   (setq s (vlax-invoke-method regex "Execute" str))
  81.   ;;将规则运用到STR字符,得到提取出的文字内容
  82.   (VLAX-FOR tmp         s                        ;遍历集合对象
  83.     (setq str1 (cons (vlax-get-property tmp "value") str1)))
  84.   ;;将内容转换为LISP语言就可以直接观察了
  85.   (vlax-release-object regex)
  86.   (REVERSE str1))


  87. (defun regex-test  (pat str key / regex test)
  88.   ;; 测试字符串str是否存在字串符合正则表达式模式pat
  89.   ;; pat 正则表达式 str 字符串
  90.   ;; pat 中 \ 使用 \\
  91.   ;; key "igm" i(Ignorecase)忽略大小写 g (Global)全局匹配 m (Multili) 多行模式
  92.   ;; 注意:一般使用全局匹配 g
  93.   ;; 可组合使用或单独使用 或置空 ""
  94.   (vl-load-com)
  95.   (setq regex (vlax-create-object "Vbscript.RegExp"))
  96.                                         ;引用正则表达式控件
  97.   (if (wcmatch key "*i*,*I*")
  98.     (vlax-put-property regex "IgnoreCase" 1) ;忽略大小写
  99.     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  100.     )
  101.   (if (wcmatch key "*g*,*G*")
  102.     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  103.     (vlax-put-property regex "Global" 0))
  104.   (if (wcmatch key "*m*,*M*")
  105.     (vlax-put-property regex "Multiline" 1) ;多行模式
  106.     (vlax-put-property regex "Multiline" 0))
  107.   (vlax-put-property regex "Pattern" pat)
  108.   (setq        test
  109.          (if (eq (vlax-invoke-method regex "test" str) :vlax-true)
  110.            t
  111.            nil))
  112.   (vlax-release-object regex)
  113.   test)

  114. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  115. (defun test-str         (str)                        ;判断str是否符合特定模式
  116.   (cond
  117.     ((regex-test "^\\d+-o\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  118.                                         ;1-o32x1.8l2000
  119.     ((regex-test "^\\d+-q\\d+\\.?\\d*l\\d+$" str "ig") t) ;24-q16l500
  120.     ((regex-test "^\\d+-d\\d+x\\d+x\\d+\\.?\\d*l\\d+$" str "ig") t)
  121.                                         ;2-d50x50x2.5l1000
  122.     ((regex-test "^\\d+-j(38|50|70)l\\d+$" str "ig") t)
  123.                                         ;1-j38|50|70l1000
  124.     ((regex-test "^\\d+-i\\d+x\\d+x\\d+$" str "ig") t) ;1-i100x100x10
  125.     ((regex-test "^\\d+-z\\d+(x\\d+)+l\\d+$" str "ig") t)
  126.                                         ;2-z10x10x20x2l1000
  127.     ((regex-test "^\\d+-v[345]l\\d+$" str "ig") t) ;24-v3|4|5l500
  128.     ((= str "1-r") t)
  129.     ((= str "1-e") t)                        ;结束
  130.     (t nil)))
  131. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





  132. (defun parsel  (str delim / LST POS)
  133.   ;;字符串分割 delim是用来分割的字符
  134.   (setq lst nil)
  135.   (while (setq pos (vl-string-search delim str))
  136.     (setq lst (cons (substr str 1 pos) lst)
  137.           str (substr str (+ pos 2))))
  138.   (if (> (strlen str) 0)
  139.     (setq lst (cons str lst)))
  140.   (reverse lst))


  141. (defun add1-  (str)                        ;辅助函数 如果字符串中不含"-",则在开头添加"1-"
  142.   (if (not (vl-string-position (ascii "-") str))
  143.     (strcat "1-" str)
  144.     str))

  145. (defun str->weight  (str-n        /           density    str->list
  146.                      number        guige-list str-weight canshu
  147.                      form)                ;从字符串计算重量列表
  148.                                         ;返回一个列表 (字符串:数量-类型-单重-总重 总重)
  149.   (setq density 7.85e-6)                ;钢材密度
  150.   (setq        str->list
  151.          (read
  152.            (strcat
  153.              "("                        ;将字符串str-n分解成各参数的列表
  154.              (vl-string-translate
  155.                "-xXLl"                        ;参数分割字符集 -xl
  156.                "     "
  157.                (strcat
  158.                  (substr
  159.                    str-n
  160.                    1
  161.                    (+ 2
  162.                       (vl-string-position (ascii "-") str-n)))
  163.                  "-"
  164.                  (substr
  165.                    str-n
  166.                    (+ 3
  167.                       (vl-string-position (ascii "-") str-n)))))
  168.              ")")))
  169.   (setq        number           (car str->list)        ; 该类型钢材数量
  170.         guige-list (cdr str->list)        ;该类型钢材重量计算的规格表
  171.         str-weight (weight density guige-list) ;钢材重量
  172.         canshu           (strcase
  173.                      (substr str-n
  174.                              (+ 3 (vl-string-position (ascii "-") str-n)))))
  175.                                         ;规格表转换大写
  176.   (setq form (cadr str->list))
  177.   (cond        ((= form 'o) (setq form "圆钢管%%C"))
  178.         ((= form 'q) (setq form "圆钢%%C"))
  179.         ((= form 'd) (setq form "钢矩管D"))
  180.         ((= form 'j) (setq form "几字钢J"))
  181.         ((= form 'i) (setq form "钢板I"))
  182.         ((= form 'z) (setq form "折弯件Z"))
  183.         ((= form 'v) (setq form "角钢V")))
  184.   (list        (strcat        (rtos (nth 0 str->list))
  185.                 "个"
  186.                 form
  187.                 canshu
  188.                 ",单重:"
  189.                 (rtos str-weight 2 3)
  190.                 "kg"
  191.                 ",总重: "
  192.                 (rtos (* str-weight number) 2 3)
  193.                 "kg。")
  194.         (* str-weight number)))


  195. (defun c:sw  (/         str        weight-sum
  196.               num            str-str-sum          point                text-size
  197.               text-edit            vlax-string          string        text-weight
  198.               str->weight-list)
  199.   (princ "语法:[<number>-]<form><n>x<n>...[l<length>]")
  200.   (princ
  201.     "\n<number>数量;<form>类型:实心圆棒q 空心圆环o 方管d 几字钢j 钢板i 折弯件z 角钢v <length>长度")
  202.   (princ
  203.     "\n例子:实心圆棒q16l500  空心圆环2-o32x1.8l1000 方管3-d50x50x2l1500 \n
  204.     几字钢1-j38|50|70l1000 钢板i-100x100x8 折弯件z30x30x2l1000 角钢v3|4l500")
  205.   (setq        weight-sum 0
  206.         str-str-sum "")
  207.   (while (progn        (while (not (test-str (setq str
  208.                                              (add1-
  209.                                                (getstring
  210.                                                  "\n输入计算表达式[圆管O|圆钢Q|矩管D|几字钢J|钢板I|折弯Z|角钢V][e结束计算][r重算算式]:")))))
  211.                   (princ "\n输入语法有误,请重新输入"))
  212.                 (if (not (= str "1-e"))
  213.                   t))
  214.     (if        (not (= str "1-r"))
  215.       (progn (setq str->weight-list (str->weight str))
  216.              (setq weight-sum  (+ weight-sum (cadr str->weight-list))
  217.                    str-str-sum (strcat str-str-sum
  218.                                        (car str->weight-list)
  219.                                        "\\P"))
  220.              (princ (strcat (car str->weight-list)
  221.                             "=>以上重量加总"
  222.                             (rtos weight-sum 2 3)
  223.                             "kg"))))
  224.     (if        (= str "1-r")
  225.       (progn
  226.         (setq text-edit t) ;设置标志位,重新编辑已有算式
  227.         (VL-LOAD-COM)
  228.         (setq vlax-string
  229.                (vlax-ename->vla-object
  230.                  (car (entsel "请选择算式:")))) ;已有文本的vlax对象
  231.         (setq string (vlax-get-property vlax-string "TextString"))
  232.         (defun string-trim  (string / str s tmp) ;字符串重新格式化函数
  233.           (setq        str
  234.                  (regex-extract "(^|\\\\P)[^,]+(?=,)" string "igm"))
  235.           (defun trim  (str)
  236.             (setq str (vl-string-subst "" "\\P" str))
  237.             (setq str (vl-string-subst "-o" "个圆钢管%%C" str))
  238.             (setq str (vl-string-subst "-d" "个钢矩管D" str))
  239.             (setq str (vl-string-subst "-i" "个钢板I" str))
  240.             (setq str (vl-string-subst "-j" "个几字钢J" str))
  241.             (setq str (vl-string-subst "-z" "个折弯件Z" str))
  242.             (setq str (vl-string-subst "-v" "个角钢V" str))
  243.             (setq str (vl-string-subst "-q" "个圆钢%%C" str)))
  244.           (setq tmp nil)
  245.           (foreach s str (setq tmp (cons (trim s) tmp)))
  246.           (reverse tmp))
  247.         (setq string (string-trim string))
  248.         (setq text-weight (mapcar 'str->weight string))
  249.         (setq num 0
  250.               weight-sum 0)
  251.         (repeat        (length text-weight)        ;计算已有算式的总重
  252.           (setq        weight-sum
  253.                  (+ (cadr (nth num text-weight)) weight-sum))
  254.           (setq num (1+ num)))
  255.         (setq str-str-sum "")                ;计算已有算式的字符串说明汇总
  256.         (repeat        (length text-weight)
  257.           (setq        str-str-sum
  258.                  (strcat str-str-sum
  259.                          (caar text-weight)
  260.                          "\\P"))
  261.           (setq text-weight (cdr text-weight)))
  262.         (princ str-str-sum)
  263.         (princ (strcat "=>以上重量加总" (rtos weight-sum 2 3) "kg")))))
  264.   (if text-edit
  265.     (progn (setq str-str-sum
  266.                   (strcat str-str-sum
  267.                           "----------------\\P总重:"
  268.                           (rtos weight-sum 2 3)
  269.                           "kg"))
  270.            (vlax-put-property vlax-string "TextString" str-str-sum)
  271.            (vlax-object-released-p vlax-string)
  272.            (setq text-edit nil))
  273.     (progn
  274.       (if
  275.         (not
  276.           (=
  277.             (getstring "是否将计算结果写入文档(n不写入)<默认写入>:")
  278.             "n"))
  279.          (progn        (setq str-str-sum
  280.                        (strcat str-str-sum
  281.                                "----------------\\P总重:"
  282.                                (rtos weight-sum 2 3)
  283.                                "kg"))
  284.                 (setq point (getpoint "输入文字起始位置"))
  285.                 (setq text-size                ;当前字体高度
  286.                        (cdr
  287.                          (assoc
  288.                            40
  289.                            (entget (tblobjname "style" (getvar "textstyle"))))))
  290.                 (command "mtext"
  291.                          point
  292.                          (polar point -0.1 (* 45 text-size))
  293.                                         ; 设置多行文字宽度 字体高度的45倍
  294.                          str-str-sum
  295.                          ""))))))


  296. (princ "\n启动命令 sw")

本帖子中包含更多资源

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

x
 楼主| 发表于 2016-1-5 22:41:00 | 显示全部楼层
本帖最后由 mvehu 于 2016-1-6 09:27 编辑

前面 lucas_3333 网友 说使用对话框会更加直观。

直观也许是有,但是熟悉型材代码后,速度绝对没有键盘输入快。

而且,命令行输入,理论上可输入的型材数量只受内存限制。而对话框就没这么方便了。

比如一个焊件,用了两种乃至三种规格的矩管,命令行上无非是输入两行或三行命令,对话框又如何容纳处理这种输入呢?
发表于 2016-1-5 23:23:50 | 显示全部楼层
使用对话框和不使用对话框应该说各有优点, 前者更加直观,后者熟练后会快一些,
看过院长@xyp1964的演示,几乎都是对话框,
 楼主| 发表于 2016-1-8 10:45:14 | 显示全部楼层
本帖最后由 mvehu 于 2016-1-8 11:18 编辑
bai2000 发表于 2016-1-3 21:30
X 能改为*么?不符合输入数字的习惯
同时把工字钢、槽钢加进去?

在标准键盘上试了试,输入*要比x方便。 代码改了下,同时支持“*xl”三种分隔符。

同时钢板代码由i改成b。

本帖子中包含更多资源

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

x
发表于 2016-1-9 20:25:09 | 显示全部楼层
谢楼主。改后程序好用多了,如果吧槽钢也加进去怎么做?,举个例子(8号槽钢米重8.03,10号槽钢米重10.00)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 15:03 , Processed in 0.206430 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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