找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 876|回复: 3

[LISP程序]:请高手帮我调一下程序

[复制链接]
发表于 2007-2-11 12:31:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1.   [FONT=courier new]
  2. (defun c:bar (/)
  3. (princ "\n选择钢筋: ")
  4.   (setq ss1 (ssget ":s" '((0 . "TEXT"))))
  5.   (setq str1 (cdr (assoc 1 (setq ent1 (entget (ssname ss1 0))))))
  6.       (setq bba (BarArea (last (Parse_It str1 ";"))));计算出钢筋面积
  7.   (setq bbc (FIX (/ bba 100)));除以100并取整
  8.   );




  9. ;以下为子程序



  10. ;;计算钢筋面积
  11. (defun BarArea    (str / e)
  12.   (apply
  13.     '+
  14.     (mapcar '(lambda (x)
  15.            (setq e (Parse_It (vl-string-subst "x" "%%132" x) "x"))
  16.            (* (read (car e)) (CirArea (read (cadr e)))))
  17.         (Parse_It (car (Parse_It str " ")) "+")))
  18.   )
  19. ;计算园面积
  20. (defun CirArea    (dia)
  21.   (* pi dia dia 0.25)
  22.   )
  23. ;选筋(对称)
  24. (defun PickBars     (a n / barlst dia1 pos )
  25.   (setq barlst '(12 14 16 18 20 22 25 28 30 32))
  26.   (setq dia1 (1+ (fix (sqrt (/ (* 4 (/ a n)) pi)))))
  27.   (if (not (member dia1 barlst))
  28.     (setq dia1 (nth (setq pos (vl-position
  29.                 dia1
  30.                 (vl-sort (cons dia1 barlst) '<)))
  31.             barlst))
  32.     (setq pos (vl-position dia1 barlst))
  33.   )
  34.   (if dia1
  35.     (cond
  36.       ((<= n 2)
  37.        (strcat "2%%132" (itoa dia1)))
  38.       ((> n 2)
  39.        (if (> pos 0)
  40.      (if (> (+ (* (- n 2) (CirArea (nth (1- pos) barlst))) (* 2 (CirArea dia1))) a)
  41.       (strcat "2%%132"
  42.                 (itoa dia1)
  43.                 "+"
  44.                 (itoa (- n 2))
  45.                 "%%132"
  46.                 (itoa (nth (1- pos) barlst)))
  47.       (strcat (itoa n) "%%132" (itoa dia1))
  48.       )
  49.      (strcat (itoa n) "%%132" (itoa dia1))
  50.     );if
  51.        )
  52.       );cond
  53.     ) ;if
  54.   )
  55. ; 作者: Bill Kramer
  56. ;
  57. (defun Parse_It     (inStr ;Input string to parse
  58.           Delim ;Delimeter character (or ascii code)
  59.           / Res ;Result list buffer
  60.           Inx ;Character location of delim in string
  61.           InxP ;Previous character location
  62. )
  63. ;
  64. ; Verify DELIM is of the proper type
  65. ;
  66.   (setq    Delim (if (= (type Delim) 'STR)
  67.         (ASCII Delim) ;Convert character to integer
  68.         (if (/= (type Delim) 'INT) ;is it integer?
  69.           32 ;then use space
  70.           (if (> 0 Delim 256)
  71.             Delim
  72.             32)))
  73. ;
  74. ; Set up parameters for string search loop
  75. ;
  76.     Inx   (VL-String-Position Delim inStr 0)
  77.     InxP  -1
  78.     )
  79. ;
  80.   (while (and Inx (< Inx (strlen inStr)))
  81.     (setq Res
  82.            (cons (substr inStr (+ 2 InxP) (- Inx InxP 1))
  83.              Res)
  84.       InxP Inx
  85.       Inx  (VL-String-Position Delim inStr (1+ InxP))
  86.       )
  87.     )
  88.   (setq Res (cons (substr inStr (+ 2 InxP)) Res))
  89.   (reverse Res)
  90.   )
  91. ;


  92.   [/FONT]




这是一个计算钢筋面积并写在图上的程序,我只写了一部分,剩下的不会……

现在有几个问题:

1。我算出来了面积,即bbc,但想把它用txt写到图上,大小和刚才选的文字一样大,位置在文字上方,间隔一1。5个文字高度,颜色用红色。

2。现在的程序只能写一个,我想改成批量的,即框选后,写出所有的面积在图上。

3。如果图上钢筋的代码不是%%132,而是%%131,怎么办??

解释一下,一般钢筋的表示方法,2根18的钢筋,写法是2%%13218,%%132表示钢筋。

计算钢筋面积的子程序,我已经写在了后面
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-2-11 21:19:17 | 显示全部楼层
给你一个程序,我机器里面的,供你参考!另外稽龙也写了一个程序,你可以找找,在论坛里面!

  1.   [FONT=courier new]
  2. (defun c:4 (/ myerr dxf toang fx add_solid add_text dis olderr oldos oldfill
  3.               ss pd gr pt ent entold
  4.            )
  5.   (defun myerr (msg)
  6.     (setq *error* olderr)
  7.     (command "_.undo" "_b")
  8.     (princ)
  9.   )
  10.   (defun dxf (ent i)
  11.     (if (= (type ent) 'ename)
  12.       (setq ent (entget ent))
  13.     )
  14.     (cdr (assoc i ent))
  15.   )

  16.   (defun toang (ang i)
  17.     (if (= i 1)
  18.       (* ang (/ 180 pi))
  19.       (* ang (/ pi 180))
  20.     )
  21.   )

  22.   (defun fx (ang)
  23.     (cond
  24.       ((>= (/ pi 2) ang 0)
  25.         (list pi (+ pi (/ pi 2)) 1)
  26.       )
  27.       ((>= pi ang (/ pi 2))
  28.         (list 0 (+ pi (/ pi 2)) 1)
  29.       )
  30.       ((>= (+ pi (/ pi 2)) ang pi)
  31.         (list 0 (/ pi 2) 0)
  32.       )
  33.       ((>= (* 2 pi) ang (+ pi (/ pi 2)))
  34.         (list pi (/ pi 2) 0)
  35.       )
  36.     )
  37.   )

  38.   (defun add_solid (p1 p2 p3 p4)
  39.     (entmakex (list (cons 0 "SOLID") (cons 100 "AcDbEntity") (cons 62 7)
  40.                     (cons 100 "AcDbTrace") (cons 10 p1) (cons 11 p2)
  41.                     (cons 12 p3) (cons 13 p4)
  42.               )
  43.     )
  44.   )

  45.   (defun add_text (pt h ang txt style jus)
  46.     (entmakex (list (cons 0 "TEXT") (cons 100 "AcDbEntity") (cons 62 1)
  47.                     (cons 100 "AcDbText") (if (= jus 0)
  48.                                             (cons 10 pt)
  49.                                             (list 10 0.0 0.0 0.0)
  50.                                           ) (cons 40 h) (cons 1 txt)
  51.                     (cons 50 ang) (cons 7 style) (cons 72 (cond
  52.                                                             ((= jus 0)
  53.                                                               0
  54.                                                             )
  55.                                                             ((= jus 1)
  56.                                                               1
  57.                                                             )
  58.                                                             ((= jus 2)
  59.                                                               1
  60.                                                             )
  61.                                                             ((= jus 3)
  62.                                                               2
  63.                                                             )
  64.                                                           )
  65.                                                  ) (if (= jus 0)
  66.                                                      (list 11 0.0 0.0 0.0)
  67.                                                      (cons 11 pt)
  68.                                                    ) (cons 100 "AcDbText")
  69.                     (cons 73 (cond
  70.                                ((= jus 0)
  71.                                  0
  72.                                )
  73.                                ((= jus 1)
  74.                                  2
  75.                                )
  76.                                ((= jus 2)
  77.                                  3
  78.                                )
  79.                                ((= jus 3)
  80.                                  2
  81.                                )
  82.                              )
  83.                     )
  84.               )
  85.     )
  86.   )

  87.   (defun mj (txt1 / k1 n1 d as)               ; 计算诸如4%%13225所代表的面积:1963mm
  88.                                        ; 2
  89.     (setq k1 (vl-string-search "%%13" txt1)) ; k1=2   12%%13125 6/5
  90.     (setq n1 (atoi (substr txt1 1 k1)))
  91.     (setq d (atoi (substr txt1 (+ k1 6))))
  92.     (setq as (* pi d d 0.25 n1))
  93.   )

  94.   (defun mjj (txt / kong plus ww s1 s2)        ; 只要有txt就可以求出面积
  95.     (if (vl-string-search "  " txt)    ; 去除两空格字符
  96.       (setq txt (vl-string-subst " " "  " txt))
  97.     )
  98.     (setq kong (vl-string-search " " txt)) ; 获得空格所在位置
  99.     (if (/= kong nil)                       ; 如果有空格,则将txt从空格处去掉尾巴
  100.       (setq txt (substr txt 1 kong))
  101.     )                                       ; 到目前为止,txt只剩下有+号和无+号两
  102.                                        ; 种情况了
  103.     (setq plus (vl-string-search "+" txt)) ; 获得+所在位置
  104.     (if (= plus nil)                       ; 如果没有+,则直接进行计算
  105.       (setq ww (mj txt))
  106.       (progn
  107.         (setq s1 (mj (substr txt 1 plus)))
  108.         (setq s2 (mj (substr txt (+ plus 2))))
  109.         (setq ww (+ s1 s2))
  110.       )
  111.     )
  112.     (setq ww ww)
  113.   )


  114.   (defun dis (ent / obj laynm name st1 st2 st3 lst h ang n text fenhao ww1
  115.                   ww2 ss1 ss2 i d s i1 i2 i3 s1 s2 n as1 as2 fyjisuan fy
  116.              )
  117.     (setq obj (vlax-ename->vla-object ent))
  118.     (setq laynm (strcat "图层:" (dxf ent 8))
  119.           name (dxf ent 0)
  120.     )

  121.     (if (or
  122.           (= name "TEXT")
  123.           (= name "MTEXT")
  124.         )
  125.       (progn
  126.         (setq text (vla-get-textstring obj)) ; 获得文字内容
  127.         (if (vl-string-search "%%13" text)
  128.           (progn                       ; (setq text "2%%13114;3%%13114")
  129.             (setq fenhao (vl-string-search ";" text)) ; 获得;所在位置
  130.                                        ; 集中标注情况
  131.             (if (>= fenhao 0)               ; 有分号则输出面积
  132.               (progn
  133.                 (setq ww1 (substr text 1 fenhao)) ; 分号前面的文字
  134.                 (setq ww2 (substr text (+ fenhao 2))) ; 分号后面的文字
  135.                 (setq ss1 (/ (mjj ww1) 100))
  136.                 (setq ss2 (/ (mjj ww2) 100))
  137.                 (setq ss1 (rtos ss1 2 2))
  138.                 (setq ss2 (rtos ss2 2 2))
  139.                 (setq lst (list (strcat ss1 ";" ss2)))
  140.               )
  141.               (setq lst (list (rtos (/ (mjj text) 100) 2 2))) ; 如果没有;则?
  142.                                        ; ??屑扑?
  143.             )

  144.             (if                        ; %%1308@100板钢筋情况
  145.               (wcmatch text "%%13#*[@-@]###,%%13#*[@-@]##,%%13#*[@-@]#")
  146.               (progn                       ; (setq text "%%13110@200")
  147.                 (setq i (vl-string-search "@" text))
  148.                 (setq d (atof (substr text 6 (- i 6 -1))))
  149.                 (setq s (atof (substr text (+ i 2))))
  150.                 (setq stellas (/ (* pi d d 0.25 1000) s))
  151.                 (setq fy (fylisp (substr text 1 5)))

  152.                 (setq fyjisuan 210)    ; 计算时用一级钢则采用210,可根据情况
  153.                                        ; 修改*******************************
  154.                                        ; ***
  155.                 (if (= fy 210)               ; 如果是一级钢则只输出自身面积,否则?
  156.                                        ; 涑鲎陨砑白?怀梢患陡趾蟮拿婊?
  157.                   (setq lst (list (strcat "板筋:" (rtos stellas 2 1))))
  158.                   (setq lst (list (strcat "板筋:" (rtos stellas 2 1) "/"
  159.                                           (rtos (/ (* stellas fy) fyjisuan)
  160.                                                 2 1
  161.                                           )
  162.                                   )
  163.                             )
  164.                   )
  165.                 )
  166.               )
  167.             )

  168.             (if                        ; %%1308@100/150(2)箍筋情况
  169.               (wcmatch text "%%13#*[@-@]*/*(#)")
  170.               (progn
  171.                 (setq i1 (vl-string-search "@" text))
  172.                 (setq i2 (vl-string-search "/" text))
  173.                 (setq i3 (vl-string-search "(" text))
  174.                 (setq d (atof (substr text 6 (- i1 6 -1))))
  175.                 (setq s1 (atof (substr text (+ i1 2) (- i2 i1))))
  176.                 (setq s2 (atof (substr text (+ i2 2) (- i3 i1))))
  177.                 (setq n (atof (substr text (+ i3 2) (- (strlen text) i3 2))))
  178.                 (setq as1 (/ (* pi d d 0.25 100 n) s1 100)) ; 换成100间距时?
  179.                                        ; 墓拷蠲婊?
  180.                 (setq as2 (/ (* pi d d 0.25 100 n) s2 100)) ; 换成100间距时?
  181.                                        ; 墓拷蠲婊?
  182.                 (setq fy (fylisp (substr text 1 5)))
  183.                 (setq fyjisuan 210)    ; 计算时用一级钢则采用210,可根据情况
  184.                                        ; 修改*******************************
  185.                                        ; ***

  186.                 (if (= fy 210)
  187.                   (setq lst (list (strcat "G" (rtos as1 2 2) "-"
  188.                                           (rtos as2 2 2)
  189.                                   )
  190.                             )
  191.                   )
  192.                   (setq lst (list (strcat "G" (rtos as1 2 2) "-"
  193.                                           (rtos as2 2 2)
  194.                                   ) (strcat "G" (rtos (/ (* as1 fy) fyjisuan)
  195.                                                       2 2
  196.                                                 ) "-" (rtos (/ (* as2 fy)
  197.                                                                fyjisuan
  198.                                                             ) 2 2
  199.                                                       )
  200.                                     )
  201.                             )
  202.                   )
  203.                 )
  204.               )
  205.             )


  206.             (if                        ; %%1308@100(2)箍筋情况
  207.               (wcmatch text
  208.                        "%%13#*[@-@]###(#),%%13#*[@-@]##(#),%%13#*[@-@]#(#)"
  209.               )
  210.               (progn
  211.                 (setq i1 (vl-string-search "@" text))
  212.                 (setq i2 (vl-string-search "(" text))
  213.                 (setq d (atof (substr text 6 (- i1 6 -1))))
  214.                 (setq s1 (atof (substr text (+ i1 2) (- i2 i1))))
  215.                 (setq n (atof (substr text (+ i2 2) (- (strlen text) i2 2))))
  216.                 (setq as1 (/ (* pi d d 0.25 100 n) s1 100)) ; 换成100间距时?
  217.                                        ; 墓拷蠲婊?
  218.                 (setq fy (fylisp (substr text 1 5)))
  219.                 (setq fyjisuan 210)    ; 计算时用一级钢则采用210,可根据情况
  220.                                        ; 修改*******************************
  221.                                        ; ***

  222.                 (if (= fy 210)
  223.                   (setq lst (list (strcat "G" (rtos as1 2 2))))
  224.                   (setq lst (list (strcat "G" (rtos as1 2 2))
  225.                                   (strcat "G" (rtos (/ (* as1 fy) fyjisuan)
  226.                                                     2 2
  227.                                               )
  228.                                   )
  229.                             )
  230.                   )
  231.                 )
  232.               )
  233.             )

  234.             (if                        ; g6%%13112情况
  235.               (wcmatch text "G*%%13#*,N*%%13#*")
  236.               (progn                       ; (setq text "g12%%1318")
  237.                 (setq i (vl-string-search "%%13" text))
  238.                 (setq n (atof (substr text 2 i)))
  239.                 (setq d (atof (substr text (+ i 6))))

  240.                 (setq as1 (* pi d d 0.25 n 0.5 0.01))
  241.                 (setq lst (list (strcat "单边面积:" (rtos as1 2 2))))
  242.               )
  243.             )


  244.           )
  245.         )

  246.       )

  247.       (setq lst (list "非文字对象!"))
  248.     )

  249.     (setq ss (ssadd)
  250.           h (/ (getvar "viewsize") 10)
  251.     )
  252.     (setq ang (fx (angle (getvar "viewctr") pt)))
  253.     (setq n (* 1.4 (1+ (/ (apply
  254.                             'max
  255.                             (mapcar
  256.                               'strlen
  257.                               lst
  258.                             )
  259.                           ) 2.0
  260.                        )
  261.                    )
  262.             )
  263.     )
  264.     (ssadd (add_solid pt (polar pt (car ang) (* n h)) (setq pt
  265.                                                             (polar pt
  266.                                                                    (cadr ang)
  267.                                                                    (+ h
  268.                                                                       (* 1.8
  269.                                                                          h
  270.                                                                          (length lst)
  271.                                                                       )
  272.                                                                    )
  273.                                                             )
  274.                                                       )
  275.                       (polar pt (car ang) (* n h))
  276.            ) ss
  277.     )
  278.     (setq pt (polar pt (car ang) (/ (* n h) 2)))
  279.     (if (= (caddr ang) 0)
  280.       (setq pt (polar pt (/ pi 2) (* 0.4 h)))
  281.       (setq pt (polar pt (/ pi 2) (+ (* 1.4 h) (* 1.8 h (length lst)))))
  282.     )
  283.     (setq n -1)
  284.     (repeat (length lst)
  285.       (ssadd (add_text (setq pt (polar pt (+ pi (/ pi 2)) (* 1.8 h)))
  286.                        h 0 (nth (setq n (1+ n))
  287.                                 lst
  288.                            ) "STANDARD" 1
  289.              ) ss
  290.       )
  291.     )
  292.   )


  293.   (vl-load-com)
  294.   (command "_.undo" "_m")
  295.   (princ "动态显示梁、板主、箍筋面积\n")
  296.   (setq olderr *error*
  297.         *error* myerr
  298.   )
  299.   (setq oldos (getvar "osmode"))
  300.   (setq oldfill (getvar "fillmode"))
  301.   (setvar "osmode" 0)
  302.   (setvar "fillmode" 1)
  303.   (setvar "cmdecho" 0)
  304.   (command "_.style" "STANDARD" "tssdeng2.shx,tssdchn.shx" "" 0.7 "" "" ""
  305.            ""
  306.   )
  307.   (setq ss (ssadd))

  308.   (while (not pd)
  309.     (while (not (progn
  310.                   (setq gr (grread t 2))
  311.                   (if (= (car gr) 5)
  312.                     (setq pt (cadr gr)
  313.                           ent (nentselp pt)
  314.                           ent (if (and
  315.                                     ent
  316.                                     (= (type (last (last ent))) 'ename)
  317.                                   )
  318.                                 (last (last ent))
  319.                                 (car ent)
  320.                               )
  321.                     )
  322.                     (setq pd t)
  323.                   )
  324.                 )
  325.            )
  326.     )
  327.     (if (and
  328.           (not pd)
  329.           (not (equal ent entold))
  330.           (not (ssmemb ent ss))
  331.         )
  332.       (progn
  333.         (if entold
  334.           (redraw entold 4)
  335.         )
  336.         (if ss
  337.           (command "_.erase" ss "")
  338.         )
  339.         (redraw ent 3)
  340.         (dis ent)
  341.         (setq entold ent)
  342.       )
  343.     )
  344.   )
  345.   (if entold
  346.     (redraw entold 4)
  347.   )
  348.   (if ss
  349.     (command "_.erase" ss "")
  350.   )
  351.   (setvar "osmode" oldos)
  352.   (setvar "fillmode" oldfill)
  353.   (setq *error* olderr)
  354.   (princ)
  355. )
  356. ;;; bb定义完成


  357. (defun fylisp (ttt / fy)
  358.   (cond
  359.     ((= ttt "%%130")
  360.       (setq fy 210)
  361.     )
  362.     ((= ttt "%%131")
  363.       (setq fy 300)
  364.     )
  365.     ((= ttt "%%132")
  366.       (setq fy 360)
  367.     )
  368.     ((= ttt "%%133")
  369.       (setq fy 360)
  370.     )
  371.   )
  372.   (setq fy fy)
  373. )

  374.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-2-15 23:09:48 | 显示全部楼层
我是建筑的,突然要看结构的内容有点抓瞎。:)
以前也为结构兄弟写过,由pkpm的计算结果自动配梁筋之类的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-2-16 11:09:50 | 显示全部楼层
最初由 cy956 发布
.........,由pkpm的计算结果自动配梁筋之类的程序。 [/B]
可否发给我一份原程序?谢谢!我也正在编写相似的程序!想借鉴一下!shenfjliu@126.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 18:44 , Processed in 0.409211 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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