明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2847|回复: 11

请教一下关于文件选取的问题。

  [复制链接]
发表于 2004-8-6 01:16:00 | 显示全部楼层 |阅读模式
请教一下关于文件选取的问题。


比如我有2组文字,第一组为“2C14+2C20;2C25”,第二组为“;4C25”,我分别点取这两组文字,C为符号,在第一组中,我如何分别得到分号前面的数字的和?


比如,a1=2×14+2×20                                 a2=2×25,就是说按分号断,前面和后面的数字分别求和。


谢谢各位大侠!
发表于 2004-8-6 09:15:00 | 显示全部楼层
(setq a (vl-string-subst " " ";" "2C14+2C20;2C25"))
(setq a (strcat "(" a ")"))
(read a)
 楼主| 发表于 2004-8-6 12:25:00 | 显示全部楼层
我是在R14里面用,用vl好像不行。


这样做只是得到了字符串,但是还是无法计算出结果啊,a1=2×14+2×20=68,怎样得到这个68的计算结果啊??
发表于 2004-8-6 13:43:00 | 显示全部楼层
到底是乘还是C?你是问如何分割还是问如何计算,还是要把你写一个完整的程序?如果是后者,你提供的信息还不够详细, 还有,是否一定要在R14下使用? (setq a (vl-string-subst " " ";" "2*14+2*20;2*25"))
(setq a (strcat "(" a ")"))
(setq a (mapcar 'vl-symbol-name (read a)))
(mapcar 'cal a)
 楼主| 发表于 2004-8-6 20:06:00 | 显示全部楼层
是符号,如果是乘号就好办了。我的是一个字符串“%%131”,是结构里的钢筋符号,2%%13116就表示2根16的钢筋,比如我有一串文字,"2%%13116;3%%13125",怎样才能计算出分号前后的钢筋的面积啊??或者是把根数和直径直接分离出来也可以。



可以不用14,只要2002能用就行。


如下图,黄色的为第一组数据,就是2%%13116;3%%13125,表示上部2根16,下部3根25,请问我如何能分别得到面积??




本帖子中包含更多资源

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

x
 楼主| 发表于 2004-8-6 20:09:00 | 显示全部楼层
顺便把图也弄上来,我要得到的最终结果是判断白色的钢筋的面积是否小于分号后面的钢筋面积的1/4。

本帖子中包含更多资源

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

x
发表于 2004-8-7 00:56:00 | 显示全部楼层
本帖最后由 作者 于 2004-8-7 16:23:01 编辑
  1. (defun C:tt(/ str1 str2 tmp1 tmp2 area1 area2)
  2.    (setq str1 (cdr (assoc 1 (entget (car (entsel "\n选择第一个text: ")))))
  3.   str2 (cdr (assoc 1 (entget (car (entsel "\n选择第二个text: ")))))
  4.    )
  5.    (setq tmp1 (Parse_It (vl-string-subst "x" "%%131" (last (Parse_It str1 ";"))) "x")
  6.   tmp2 (Parse_It (vl-string-subst "x" "%%131" (last (Parse_It str2 ";"))) "x")
  7.    )
  8.    (setq area1 (* (read (car tmp1)) (CirArea (read (cadr tmp1))))
  9.   area2 (* (read (car tmp2)) (CirArea (read (cadr tmp2))))
  10.    )
  11.    (if (> area2 (/ area1 4))
  12.        (princ "\n腰筋面积>1/4底筋面积.")
  13.        (princ "\n腰筋面积<=1/4底筋面积.")
  14.    )
  15.    (princ)
  16. )
  17. ;计算园面积
  18. (defun CirArea (dia)
  19.    (* pi dia dia 0.25)
  20. )
  21. ; 字符串分拆 作者: Bill Kramer
  22. (defun Parse_It (inStr   ;Input string to parse
  23.      Delim   ;Delimeter character (or ascii code)
  24.      /
  25.      Res     ;Result list buffer
  26.      Inx     ;Character location of delim in string
  27.      InxP   ;Previous character location
  28.      )
  29.    ;
  30.    ; Verify DELIM is of the proper type
  31.    ;
  32.    (setq Delim (if (= (type Delim) 'STR)
  33.     (ASCII Delim) ;Convert character to integer
  34.     (if (/= (type Delim) 'INT) ;is it integer?
  35.        32 ;then use space
  36.        (if (> 0 Delim 256) Delim 32)))
  37.   ;
  38.   ; Set up parameters for string search loop
  39.   ;
  40.   Inx (VL-String-Position Delim inStr 0)
  41.   InxP -1
  42.   )
  43.    ;
  44.    (while (and Inx (< Inx (strlen inStr)))
  45.        (setq Res
  46.        (cons (substr inStr (+ 2 InxP) (- Inx InxP 1))
  47.      Res)
  48.      InxP Inx
  49.      Inx (VL-String-Position Delim inStr (1+ InxP))
  50.      )
  51.    )
  52.    (setq Res (cons (substr inStr (+ 2 InxP)) Res))
  53.    (reverse Res)
  54.    )
  55. ;
 楼主| 发表于 2004-8-7 14:22:00 | 显示全部楼层
本帖最后由 作者 于 2004-8-7 14:54:25 编辑

谢谢alin,先送你一朵鲜花,你真是太厉害了。 不过我还有几个问题,我不懂vl,你能不能帮我完善一下。 1.如果是两种钢筋的组合,比如1%%13116+1%%13118,能不能将这将这两种钢筋加起来,求出面积? 2.如果我在选第二组文字的时候,不选直接回车,那么area2就读分号前面的数字。可以实现吗? 3.如果area2<area1/4,就加大直径,直到大于为止,直接在改文字。
发表于 2004-8-7 17:43:00 | 显示全部楼层
  1. (defun C:TEST   (/ ss1 ss2 str1 str2 tmp1 tmp2 area1 area2 ent1 ent2 newbarDia)
  2.    (princ "\n选择第一个text: ")
  3.    (setq ss1 (ssget ":s" '((0 . "TEXT"))))
  4.    (princ "\n选择第二个text: ")
  5.    (setq ss2 (ssget ":s" '((0 . "TEXT"))))
  6.    (if ss1
  7.        (progn
  8.            (setq str1 (cdr (assoc 1 (setq ent1 (entget (ssname ss1 0))))))
  9.            (if ss2
  10.   (progn
  11.      (setq  str2
  12.      (cdr (assoc 1 (setq ent2 (entget (ssname ss2 0))))))
  13.      (setq  tmp1 (Parse_It (vl-string-subst
  14.          "x"
  15.          "%%131"
  16.          (last (Parse_It str1 ";")))
  17.                    "x")
  18.     tmp2 (Parse_It (vl-string-subst
  19.          "x"
  20.          "%%131"
  21.          (last (Parse_It str2 ";")))
  22.                    "x")
  23.     )
  24.      ) ;progn
  25.   (progn
  26.      (setq  tmp1 (Parse_It (vl-string-subst
  27.          "x"
  28.          "%%131"
  29.          (last (Parse_It str1 ";")))
  30.                    "x")
  31.     tmp2 (Parse_It (vl-string-subst
  32.          "x"
  33.          "%%131"
  34.          (car (Parse_It str1 ";")))
  35.                    "x")
  36.     ) ;setq
  37.      ) ;progn
  38.   ) ;if ss2
  39.            (setq area1 (* (read (car tmp1))
  40.              (CirArea (read (cadr tmp1))))
  41.          area2 (* (read (car tmp2))
  42.              (CirArea (read (cadr tmp2))))
  43.          )
  44.            (if (> area2 (/ area1 4))
  45.   (cond (ss2
  46.                (princ "\n腰筋面积>1/4底筋面积。通过。"))
  47.              (t
  48.                (princ "\n面筋面积>1/4底筋面积。通过。"))
  49.              )
  50.   (cond
  51.      (ss2
  52.        (princ "\n腰筋面积<=1/4底筋面积.")
  53.        (if (setq newbarDia (PickABar (/ area1 8)))
  54.            (progn
  55.                (entmod (setq ent2
  56.                  (subst
  57.         (cons
  58.            1
  59.            (strcat "2%%131" (itoa newbarDia)))
  60.         (assoc 1 ent2)
  61.         ent2)))
  62.                (princ (strcat "\n腰筋已改为"
  63.                  (vl-string-subst
  64.         "-"
  65.         "%%131"
  66.         (cdr (assoc 1 ent2)))))
  67.                )
  68.            (princ "\n*****超出选筋范围。可能要设两排腰筋。*****")
  69.            )
  70.        )
  71.      (t
  72.        (princ "\n面筋面积<=1/4底筋面积.")
  73.        (if (setq newbarDia (PickABar (/ area1 8)))
  74.            (progn
  75.                (entmod (setq ent1
  76.                  (subst
  77.         (cons
  78.            1
  79.            (strcat "2%%131"
  80.              (itoa newbarDia)
  81.              ";"
  82.              (last (Parse_It str1 ";"))))
  83.            (cons 1 str1)
  84.            ent1)))
  85.                (princ
  86.      (strcat
  87.          "\n面筋已改为"
  88.          (vl-string-subst
  89.              "-"
  90.              "%%131"
  91.              (car (Parse_It (cdr (assoc 1 ent1)) ";")))))
  92.                )
  93.            (princ
  94.                "\n*****超出选筋范围。可能要设两条以上面筋。*****")
  95.            )
  96.        )
  97.      )
  98.   ) ;if
  99.            ) ;progn
  100.        (princ "\n没有选择处理文字。")
  101.        ) ;if ss1
  102.    (princ)
  103.    )
  104.   ;计算园面积
  105. (defun CirArea  (dia)
  106.    (* pi dia dia 0.25)
  107.    )
  108.   ;选筋
  109. (defun PickABar   (a)
  110.    (setq barlst '(12 14 16 18 20 22 25 28 30 32))
  111.    (setq newdia (1+ (fix (sqrt (/ (* 4 a) pi)))))
  112.    (if (member newdia barlst)
  113.        newdia
  114.        (nth (vl-position newdia (vl-sort (cons newdia barlst) '<))
  115.    barlst)
  116.        )
  117.    )
  118.   ; 作者: Bill Kramer
  119.   ;
  120. (defun Parse_It   (inStr ;Input string to parse
  121.        Delim ;Delimeter character (or ascii code)
  122.        / Res ;Result list buffer
  123.        Inx ;Character location of delim in string
  124.        InxP ;Previous character location
  125. )
  126.   ;
  127.   ; Verify DELIM is of the proper type
  128.   ;
  129.    (setq  Delim (if (= (type Delim) 'STR)
  130.     (ASCII Delim) ;Convert character to integer
  131.     (if (/= (type Delim) 'INT) ;is it integer?
  132.        32 ;then use space
  133.        (if (> 0 Delim 256)
  134.            Delim
  135.            32)))
  136.   ;
  137.   ; Set up parameters for string search loop
  138.   ;
  139.   Inx     (VL-String-Position Delim inStr 0)
  140.   InxP   -1
  141.   )
  142.   ;
  143.    (while (and Inx (< Inx (strlen inStr)))
  144.        (setq Res
  145.                (cons (substr inStr (+ 2 InxP) (- Inx InxP 1))
  146.              Res)
  147.      InxP Inx
  148.      Inx   (VL-String-Position Delim inStr (1+ InxP))
  149.      )
  150.        )
  151.    (setq Res (cons (substr inStr (+ 2 InxP)) Res))
  152.    (reverse Res)
  153.    )
  154.   ;
 楼主| 发表于 2004-8-7 18:26:00 | 显示全部楼层
谢谢,现在的程序已经基本可以满足我的需要了。


还有两个小问题就是上部筋和下部筋都可能出现组合的情况,如何像上面的一样让他们相加?


还有就是有时钢筋后面可能有表示排二排的数字,比如2/3等,如何不受这些文字的干扰?我列了4种可能出现的情况,如果这4种情况都能够实现,那就大功告成了。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-18 21:30 , Processed in 0.227718 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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