明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1008|回复: 5

[求助]程序优化

[复制链接]
发表于 2008-3-7 12:59 | 显示全部楼层 |阅读模式

请高手帮忙优化下面一段程序,要求简洁,可以在cad2004使用,且可以改变字高和圆圈及椭圆大小,谢谢!!
(defun C:BALLOON
  (/ tmp ts th nh ip sp ali le errexit bx acadver
     LBLOCK BLAYER TEXTGAP TEXTSIZE BWIDTH)
    (setq TEXTGAP 1)     ;希望的文本和“气泡”的间距(1单位=尺寸文本高)
    (setq TEXTSIZE 4)   ;1个单位高字符的平均宽度(仅用于R11)
    (setq BWIDTH 0.04)     ;“气泡”线宽:nil=无宽度(1单位=尺寸文本高,如果气泡是椭圆,无效,且在R13中PELLIPSE=0)
  (setq acadver (read (substr (getvar "ACADVER") 1 2)))
  (if (/= (type acadver) 'INT) (setq acadver 0))

  (defun errexit (s)
    (princ "\n错误:  ")
    (princ s)
    (restore)
  )

  (defun bx ()
    (if le (entdel le))
    (setvar "CMDECHO" (car oldvar))
    (setvar "BLIPMODE" (cadr oldvar))
    (setvar "OSMODE" (nth 2 oldvar))
    (setvar "CLAYER" (nth 3 oldvar))
    (setvar "DONUTID" (nth 4 oldvar))
    (setvar "DONUTOD" (nth 5 oldvar))
    (setq *error* olderr)
    (princ)
  )
  ;Main Program
  (setq T (not nil))
  (setq olderr  *error*
        restore bx
        *error* errexit
  )
  (setq oldvar
    (list
      (getvar "CMDECHO")
      (getvar "BLIPMODE")
      (getvar "OSMODE")
      (getvar "CLAYER")
      (getvar "DONUTID")
      (getvar "DONUTOD")
    )
  )
  (setvar "CMDECHO" 0)
  (setvar "BLIPMODE" 0)
  (setvar "OSMODE" 0)
  (terpri)
  (if (= acadver 11)            ;是R11吗?

    (defun textbox (elist)      ;如果是,定义一个定制的文本框函数
      (list
        '(0 0 0)
        (list
          (* (strlen (cdr (assoc 1 elist))) (cdr (assoc 40 elist)) TEXTSIZE)
          (cdr (assoc 40 elist))
          0
        )
      )
    )
  )
  (if
    (= 0
      (setq th
        (cdr (assoc '40 (tblsearch "style" (getvar "textstyle"))))
      )
    )
    (setq nh (setq th (* (getvar "DIMTXT") (getvar "DIMSCALE"))))
    (setq nh nil)
  )
  (if BLAYER 
    (command "._LAYER"
      (if (tblsearch "LAYER" BLAYER) "_S" "_M")
      BLAYER
      ""
    )
  )
  (if (setq ip (setq sp (getpoint "拾取旁注线起点: ")))
    (progn
      (entmake (list '(0 . "POINT") (cons 10 (trans sp 1 0))))
      (setq le (entlast))
      (command "._DIM1" "_LEADER")
      (setvar "CMDECHO" 1)
      (command sp)
      (while
        (progn
          (initget 128)
          (setq sp (getpoint sp))
        )
        (command sp)
      )
      (setvar "CMDECHO" 0)
      (command)
      (setq sp (trans (cdr (assoc '11 (entget (entlast)))) 0 1))
      (setq ali (angle (trans (cdr (assoc '10 (entget (entlast)))) 0 1) sp)) 
      (setq tmp (getstring T "键入文本:  "))
      (setq ts (textbox (list (cons '1 tmp) (cons '40 th))))
      (setq ts
        (list
          (+ (- (car (cadr ts)) (car (car ts))) (* 2 TEXTGAP th))
          (* 3 TEXTGAP th)
        )
      )
      (command "._TEXT"
               "_M"
               (polar
                 sp
                 ali
                 (* 0.5 (if (<= (strlen tmp) 2) (cadr ts) (car ts)))
               )
      )
      (if nh (command th))
      (command
        (if (<= (strlen tmp) 2)
          '0
          (rtd
            (if
              (and (< ali (* 3 (/ pi 2))) (> ali (/ pi 2)))
              (+ ali pi)
              ali
            )
          )
        )
        tmp
      )
      (if (<= (strlen tmp) 2)
        (command "._DONUT"
                 (cadr ts)
                 (cadr ts)
                 (polar
                   sp
                   ali
                   (* 0.5 (if (<= (strlen tmp) 2) (cadr ts) (car ts)))
                 )
                 ""
        )
        (command "._ELLIPSE"
                 sp
                 (polar sp ali (if (<= (strlen tmp) 2) (cadr ts) (car ts)))
                 (/ (cadr ts) 2)
        )
      )
      (if LBLOCK
        (progn
          (entmake (list
            (cons '0 "BLOCK")
            (cons '2 "*U")
            (cons '70 1)
            (cons '10 ip)
          ))
          (setq th (setq tmp le))
          (while (setq tmp (entnext tmp))
            (entmake (entget tmp))
          )
          (setq tmp (entmake (list (cons '0 "ENDBLK"))))
          (while (setq th (entnext th))
            (entdel th)
          )
          (entdel le)
          (setq le nil)
          (entmake (list
            (cons '0 "INSERT")
            (cons '2 tmp)
            (cons '10 ip)
          ))
        )
      )  
    ) 
  ) 
  (restore)
(princ)
)

 楼主| 发表于 2008-3-9 17:18 | 显示全部楼层

高手呢   帮帮忙啊   程序本身是没有问题的,只是需要优化一下

发表于 2008-3-9 22:04 | 显示全部楼层
本帖最后由 作者 于 2008-3-10 21:13:02 编辑

  1. (defun C:BALLOON (/ tmp ts th nh ip sp ali le errexit restore acadver TEXTGAP BWIDTH)
  2. (defun errexit (s)
  3.   (princ "\n错误 : ")
  4.   (princ s)
  5.   (restore)
  6. )
  7. (defun restore ()
  8.   (if le (entdel le))
  9.   (setvar "CMDECHO" (car oldvar))
  10.   (setvar "BLIPMODE" (cadr oldvar))
  11.   (setvar "OSMODE" (nth 2 oldvar))
  12.   (setvar "CLAYER" (nth 3 oldvar))
  13.   (setvar "DONUTID" (nth 4 oldvar))
  14.   (setvar "DONUTOD" (nth 5 oldvar))
  15.   (setq *error* olderr)
  16. )
  17.   ;Main Program
  18. (setq TEXTGAP 1)     ;希望的文本和“气泡”的间距(1单位=尺寸文本高)
  19. (setq BWIDTH 0.04)     ;“气泡”线宽:nil=无宽度(1单位=尺寸文本高,如果气泡是椭圆,无效,且在R13中PELLIPSE=0)
  20. (setq acadver (read (substr (getvar "ACADVER") 1 2)))
  21. (if (/= (type acadver) 'INT) (setq acadver 0))
  22. (setq olderr *error* *error* errexit)
  23. (setq oldvar
  24.   (list (getvar "CMDECHO")  (getvar "BLIPMODE")  (getvar "OSMODE")
  25.         (getvar "CLAYER") (getvar "DONUTID") (getvar "DONUTOD"))
  26. )
  27. (setvar "CMDECHO" 0)
  28. (setvar "BLIPMODE" 0)
  29. (setvar "OSMODE" 0)
  30. (if (= (setq th (cdr (assoc 40 (tblsearch "style" (getvar "textstyle"))))) 0)
  31.   (setq nh (setq th (* (getvar "DIMTXT") (getvar "DIMSCALE"))))
  32.   (setq nh nil)
  33. )
  34. (if (setq ip (setq sp (getpoint "\n拾取旁注线起点 :"))) (progn
  35.   (entmake (list '(0 . "POINT") (cons 10 (trans sp 1 0))))
  36.   (setq le (entlast))
  37.   (command "._DIM1" "_LEADER")
  38.   (setvar "CMDECHO" 1)
  39.   (command sp)
  40.   (while (setq sp (getpoint sp "\n下一点 :")) (command sp))
  41.   (setvar "CMDECHO" 0)
  42.   (command)
  43.   (setq sp (trans (cdr (assoc 11 (entget (entlast)))) 0 1))
  44.   (setq ali (angle (trans (cdr (assoc 10 (entget (entlast)))) 0 1) sp))
  45.   (setq tmp (getstring T "\n键入文本 : "))
  46.   (setq ts (textbox (list (cons 1 tmp) (cons 40 th))))
  47.   (setq ts (list
  48.             (+ (- (car (cadr ts)) (car (car ts))) (* 2 TEXTGAP th))
  49.             (* 3 TEXTGAP th)
  50.            )
  51.   )
  52.   (command "._TEXT" "_M" (polar sp ali (* 0.5 (if (<= (strlen tmp) 2) (cadr ts) (car ts)))))
  53.   (if nh (command th))
  54.   (command
  55.    (if (<= (strlen tmp) 2)
  56.      0
  57.     (rtd (if (and (< ali (* 3 (/ pi 2))) (> ali (/ pi 2))) (+ ali pi) ali))
  58.    )
  59.    tmp
  60.   )
  61.   (if (<= (strlen tmp) 2)
  62.    (command "._DONUT" (cadr ts) (cadr ts)
  63.                  (polar sp ali (* 0.5 (if (<= (strlen tmp) 2) (cadr ts) (car ts))))
  64.                  ""
  65.    )
  66.    (command "._ELLIPSE"
  67.                  sp
  68.                  (polar sp ali (if (<= (strlen tmp) 2) (cadr ts) (car ts)))
  69.                  (/ (cadr ts) 2)
  70.    )
  71.   )
  72. ))
  73. (restore)
  74. (princ)
  75. )
 楼主| 发表于 2008-3-10 15:01 | 显示全部楼层

谢谢ZZXXQQ版主,我运行了一下程序,当多于3个字符时提示“no function definition: RTD”

椭圆也无法绘制 ,请问应该怎么解决?

 楼主| 发表于 2008-3-10 16:04 | 显示全部楼层
文字高度也没有改变
发表于 2008-3-10 21:19 | 显示全部楼层
原程序就缺RTD函数,只好编了个。三楼已改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:33 , Processed in 0.323062 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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