找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 931|回复: 6

[LISP函数]:做结构的请注意了

[复制链接]
发表于 2006-7-20 20:27:34 | 显示全部楼层 |阅读模式

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

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

×
做结构的注意了,现有一显示梁配筋面积的程序,本人是借鉴XD里的一网友的帖子稍加修改,自认为很有用。我在XD里见过类似的,但不是原码,现我把我的源码拿出来给大家共享,希望能对大家有帮助:

  1. (defun C:bb (/             myerr   dxf     toang   fx             add_solid
  2.              add_text             dis     olderr  oldos   oldfill ss
  3.              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) (list pi (+ pi (/ pi 2)) 1))
  25.       ((>= pi ang (/ pi 2)) (list 0 (+ pi (/ pi 2)) 1))
  26.       ((>= (+ pi (/ pi 2)) ang pi) (list 0 (/ pi 2) 0))
  27.       ((>= (* 2 pi) ang (+ pi (/ pi 2))) (list pi (/ pi 2) 0))
  28.     )
  29.   )

  30.   (defun add_solid (p1 p2 p3 p4)
  31.     (entmakex (list (cons 0 "SOLID")
  32.                     (cons 100 "AcDbEntity")
  33.                     (cons 62 7)
  34.                     (cons 100 "AcDbTrace")
  35.                     (cons 10 p1)
  36.                     (cons 11 p2)
  37.                     (cons 12 p3)
  38.                     (cons 13 p4)
  39.               )
  40.     )
  41.   )

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

  77.   (defun mj (txt1 / k1 n1 d as)                ;计算诸如4%%13225所代表的面积:1963mm2
  78.     (setq k1 (vl-string-search "%%13" txt1)) ;k1=2   12%%13125 6/5
  79.     (setq n1 (atoi (substr txt1 1 k1)))
  80.     (setq d (atoi (substr txt1 (+ k1 6))))
  81.     (setq as (* pi d d 0.25 n1))
  82.   )

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


  103.   (defun dis (ent   /          obj        laynm name  st1          st2        st3   lst
  104.               h            ang          n        text  fenhao          ww1        ww2   ss1
  105.               ss2   i          d        s     i1    i2          i3        s1    s2
  106.               n            as1          as2        fyjisuan    fy
  107.              )
  108.     (setq obj (vlax-ename->vla-object ent))
  109.     (setq laynm        (strcat "图层:" (dxf ent 8))
  110.           name        (dxf ent 0)
  111.     )

  112.     (if        (or (= name "TEXT") (= name "MTEXT"))
  113.       (progn
  114.         (setq text (vla-get-textstring obj)) ;获得文字内容
  115.         (if (vl-string-search "%%13" text)
  116.           (progn
  117.                                         ;(setq text "2%%13114;3%%13114")
  118.             (setq fenhao (vl-string-search ";" text)) ;获得;所在位置
  119.                                         ;集中标注情况
  120.             (if        (>= fenhao 0)                ;有分号则输出面积
  121.               (progn
  122.                 (setq ww1 (substr text 1 fenhao)) ;分号前面的文字
  123.                 (setq ww2 (substr text (+ fenhao 2))) ;分号后面的文字
  124.                 (setq ss1 (/ (mjj ww1) 100))
  125.                 (setq ss2 (/ (mjj ww2) 100))
  126.                 (setq ss1 (rtos ss1 2 2))
  127.                 (setq ss2 (rtos ss2 2 2))
  128.                 (setq lst (list (strcat ss1 ";" ss2)))
  129.               )
  130.               (setq lst (list (rtos (/ (mjj text) 100) 2 2)))
  131.                                         ;如果没有;则将进行计算
  132.             )

  133.             (if                                ;%%1308@100板钢筋情况
  134.               (wcmatch text "%%13#*[@-@]###,%%13#*[@-@]##,%%13#*[@-@]#")
  135.                (progn
  136.                                         ;(setq text "%%13110@200")
  137.                  (setq i (vl-string-search "@" text))
  138.                  (setq d (atof (substr text 6 (- i 6 -1))))
  139.                  (setq s (atof (substr text (+ i 2))))
  140.                  (setq stellas (/ (* pi d d 0.25 1000) s))
  141.                  (setq fy (fylisp (substr text 1 5)))

  142.                  (setq fyjisuan 210)        ;计算时用一级钢则采用210,可根据情况修改**********************************
  143.                  (if (= fy 210)                ;如果是一级钢则只输出自身面积,否则输出自身及转换成一级钢后的面积
  144.                    (setq lst (list (strcat "板筋:" (rtos stellas 2 1))))
  145.                    (setq lst
  146.                           (list        (strcat        "板筋:"
  147.                                         (rtos stellas 2 1)
  148.                                         "/"
  149.                                         (rtos (/ (* stellas fy) fyjisuan) 2 1)
  150.                                 )
  151.                           )
  152.                    )
  153.                  )
  154.                )
  155.             )

  156.             (if                                ;%%1308@100/150(2)箍筋情况
  157.               (wcmatch text "%%13#*[@-@]*/*(#)")
  158.                (progn
  159.                  (setq i1 (vl-string-search "@" text))
  160.                  (setq i2 (vl-string-search "/" text))
  161.                  (setq i3 (vl-string-search "(" text))
  162.                  (setq d (atof (substr text 6 (- i1 6 -1))))
  163.                  (setq s1 (atof (substr text (+ i1 2) (- i2 i1))))
  164.                  (setq s2 (atof (substr text (+ i2 2) (- i3 i1))))
  165.                  (setq n
  166.                         (atof (substr text (+ i3 2) (- (strlen text) i3 2)))
  167.                  )
  168.                  (setq as1 (/ (* pi d d 0.25 100 n) s1 100))
  169.                                         ;换成100间距时的箍筋面积
  170.                  (setq as2 (/ (* pi d d 0.25 100 n) s2 100))
  171.                                         ;换成100间距时的箍筋面积
  172.                  (setq fy (fylisp (substr text 1 5)))
  173.                  (setq fyjisuan 210)        ;计算时用一级钢则采用210,可根据情况修改**********************************

  174.                  (if (= fy 210)
  175.                    (setq lst
  176.                           (list        (strcat "G" (rtos as1 2 2) "-" (rtos as2 2 2))
  177.                           )
  178.                    )
  179.                    (setq lst
  180.                           (list        (strcat "G" (rtos as1 2 2) "-" (rtos as2 2 2))
  181.                                 (strcat        "G"
  182.                                         (rtos (/ (* as1 fy) fyjisuan) 2 2)
  183.                                         "-"
  184.                                         (rtos (/ (* as2 fy) fyjisuan) 2 2)
  185.                                 )
  186.                           )
  187.                    )
  188.                  )
  189.                )
  190.             )


  191.             (if                                ;%%1308@100(2)箍筋情况
  192.               (wcmatch
  193.                 text
  194.                 "%%13#*[@-@]###(#),%%13#*[@-@]##(#),%%13#*[@-@]#(#)"
  195.               )
  196.                (progn
  197.                  (setq i1 (vl-string-search "@" text))
  198.                  (setq i2 (vl-string-search "(" text))
  199.                  (setq d (atof (substr text 6 (- i1 6 -1))))
  200.                  (setq s1 (atof (substr text (+ i1 2) (- i2 i1))))
  201.                  (setq n
  202.                         (atof (substr text (+ i2 2) (- (strlen text) i2 2)))
  203.                  )
  204.                  (setq as1 (/ (* pi d d 0.25 100 n) s1 100))
  205.                                         ;换成100间距时的箍筋面积
  206.                  (setq fy (fylisp (substr text 1 5)))
  207.                  (setq fyjisuan 210)        ;计算时用一级钢则采用210,可根据情况修改**********************************

  208.                  (if (= fy 210)
  209.                    (setq lst
  210.                           (list        (strcat "G" (rtos as1 2 2))
  211.                           )
  212.                    )
  213.                    (setq lst
  214.                           (list        (strcat "G" (rtos as1 2 2))
  215.                                 (strcat        "G"
  216.                                         (rtos (/ (* as1 fy) fyjisuan) 2 2)
  217.                                 )
  218.                           )
  219.                    )
  220.                  )
  221.                )
  222.             )

  223.             (if                                ;G6%%13112情况
  224.               (wcmatch
  225.                 text
  226.                 "G*%%13#*,N*%%13#*"
  227.               )
  228.                (progn
  229.                                         ;(setq text "G12%%1318")
  230.                  (setq i (vl-string-search "%%13" text))
  231.                  (setq n (atof (substr text 2 i)))
  232.                  (setq d (atof (substr text (+ i 6))))

  233.                  (setq as1 (* pi d d 0.25 n 0.5 0.01))
  234.                  (setq lst
  235.                         (list (strcat "单边面积:" (rtos as1 2 2))
  236.                         )
  237.                  )
  238.                )
  239.             )


  240.           )
  241.         )

  242.       )

  243.       (setq lst (list "非文字对象!"))
  244.     )

  245.     (setq ss (ssadd)
  246.           h  (/ (getvar "viewsize") 10)
  247.     )
  248.     (setq ang (fx (angle (getvar "viewctr") pt)))
  249.     (setq n (* 1.4 (1+ (/ (apply 'max (mapcar 'strlen lst)) 2.0))))
  250.     (ssadd (add_solid
  251.              pt
  252.              (polar pt (car ang) (* n h))
  253.              (setq pt (polar pt (cadr ang) (+ h (* 1.8 h (length lst)))))
  254.              (polar pt (car ang) (* n h))
  255.            )
  256.            ss
  257.     )
  258.     (setq pt (polar pt (car ang) (/ (* n h) 2)))
  259.     (if        (= (caddr ang) 0)
  260.       (setq pt (polar pt (/ pi 2) (* 0.4 h)))
  261.       (setq pt (polar pt (/ pi 2) (+ (* 1.4 h) (* 1.8 h (length lst)))))
  262.     )
  263.     (setq n -1)
  264.     (repeat (length lst)
  265.       (ssadd (add_text (setq pt (polar pt (+ pi (/ pi 2)) (* 1.8 h)))
  266.                        h
  267.                        0
  268.                        (nth (setq n (1+ n)) lst)
  269.                        "STANDARD"
  270.                        1
  271.              )
  272.              ss
  273.       )
  274.     )
  275.   )


  276.   (vl-load-com)
  277.   (command "_.undo" "_m")
  278.   (princ "动态显示梁、板主、箍筋面积\n")
  279.   (setq        olderr        *error*
  280.         *error*        myerr
  281.   )
  282.   (setq oldos (getvar "osmode"))
  283.   (setq oldfill (getvar "fillmode"))
  284.   (setvar "osmode" 0)
  285.   (setvar "fillmode" 1)
  286.   (setvar "cmdecho" 0)
  287.   (command "_.style"          "STANDARD"         "tssdeng2.shx,tssdchn.shx"
  288.            ""                  0.7                 ""                ""
  289.            ""                  ""
  290.           )
  291.   (setq ss (ssadd))

  292.   (while (not pd)
  293.     (while (not        (progn
  294.                   (setq gr (grread T 2))
  295.                   (if (= (car gr) 5)
  296.                     (setq pt  (cadr gr)
  297.                           ent (nentselp pt)
  298.                           ent (if (and ent (= (type (last (last ent))) 'ename))
  299.                                 (last (last ent))
  300.                                 (car ent)
  301.                               )
  302.                     )
  303.                     (setq pd T)
  304.                   )
  305.                 )
  306.            )
  307.     )
  308.     (if        (and (not pd)
  309.              (not (equal ent entold))
  310.              (not (ssmemb ent ss))
  311.         )
  312.       (progn
  313.         (if entold
  314.           (redraw entold 4)
  315.         )
  316.         (if ss
  317.           (command "_.erase" ss "")
  318.         )
  319.         (redraw ent 3)
  320.         (dis ent)
  321.         (setq entold ent)
  322.       )
  323.     )
  324.   )
  325.   (if entold
  326.     (redraw entold 4)
  327.   )
  328.   (if ss
  329.     (command "_.erase" ss "")
  330.   )
  331.   (setvar "osmode" oldos)
  332.   (setvar "fillmode" oldfill)
  333.   (setq *error* olderr)
  334.   (princ)
  335. )                                        ;bb定义完成


  336. (defun fylisp (ttt / fy)
  337.   (cond
  338.     ((= ttt "%%130") (setq fy 210))
  339.     ((= ttt "%%131") (setq fy 300))
  340.     ((= ttt "%%132") (setq fy 360))
  341.     ((= ttt "%%133") (setq fy 360))
  342.   )
  343.   (setq fy fy)
  344. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6809个

财富等级: 富甲天下

发表于 2006-7-20 20:45:34 | 显示全部楼层
qiaqiadeng  楼主,是那个版本的,在R14可用否?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-20 21:30:52 | 显示全部楼层
不能在R14下用.vl-string-search不能运行在R14下.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-22 14:21:40 | 显示全部楼层
好啊,俺先下来看看,与XD里的那个类似的有什么不同。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-5 11:16:49 | 显示全部楼层
我用的是2004版的,对R14,我是在2000年毕业设计时使用过,实在没时间去研究这些问题,其实我本人认为R14实在没什么好用的,画图太累了,建议各位用2004,用2006或2008都可以,刻舟求剑没什么好的,我之所以还没用2006,那是因为TSSD我只有2004版的,否则我用2006肯定很爽,对了,上面的程序我最近又有修改,只是今天没带到网吧来,抱歉,关于vl-string-search,可以对上面的代码捎加修改就行了,用substr,一 个个找,不难的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-5 12:07:56 | 显示全部楼层
与它山之石的东东有什么不同?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-14 15:07:51 | 显示全部楼层
HAO !下了线看看  再叫好  最好具体怎么使用再所说
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 13:44 , Processed in 0.392815 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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