找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 945|回复: 9

[推荐]:文字炸开成线段的程序等,很好的范例

[复制链接]
发表于 2004-4-17 22:12:10 | 显示全部楼层 |阅读模式

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

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

×
;;;  文字炸开成线段的程序 TXTEXP.LSP

[php]
(defun c:txtexp (/ grplst getgname mtextbox ucs_2_mtext FLTR GLST GDICT SS VIEW
                   UPLFT TMPFIL TMPFIL CNT PT1 PT2 ENT TXT TXTTYP PTLST ZM LOCKED)
  (init_bonus_error
        (list
         (list   "cmdecho" 0
                 "highlight" 1
         )
         T
        )
  )

; --------------------- GROUP LIST FUNCTION ----------------------
;   This function will return a list of all the group names in the
;   drawing and their entity names in the form:
;   ((<ename1> . <name1>) ... (<enamex> . <namex>))
; ----------------------------------------------------------------

  (defun grplst (/ GRP MSTR ITM NAM ENT GLST)

    (setq GRP  (dictsearch (namedobjdict) "ACAD_GROUP"))
    (while (setq ITM (car GRP))       ; While edata item is available
      (if (= (car ITM) 3)             ; if the item is a group name
        (setq NAM (cdr ITM)           ; get the name
              GRP (cdr GRP)           ; shorten the edata
              ITM (car GRP)           ; get the next item
              ENT (cdr ITM)           ; which is the ename
              GRP (cdr GRP)           ; shorten the edata
              GLST                    ; store the ename and name
                  (if GLST
                    (append GLST (list (cons ENT NAM)))
                    (list (cons ENT NAM))
                  )
        )
        (setq GRP (cdr GRP))          ; else shorten the edata
      )
    )
    GLST                              ; return the list
  )

; ------------------- GET GROUP NAME FUNCTION --------------------
;   This function returns a list of all the group names in GLST
;   where ENT is a member. The list has the same form as GLST
; ----------------------------------------------------------------

  (defun getgname (ENT GLST / MSTR GRP GDATA ITM NAM NLST)
    (if (and GLST (listp GLST))
      (progn
        (foreach GRP GLST
          (setq GDATA (entget (car GRP)))
          (foreach ITM GDATA                   ; step through the edata
            (if (and
                  (= (car ITM) 340)            ; if the item is a entity name
                  (eq (setq NAM (cdr ITM)) ENT) ; and the ename being looked for
                )
              (setq NLST                       ; store the ename and name
                      (if NLST
                        (append NLST (list (cons (car GRP) (cdr GRP))))
                        (list (cons (car GRP) (cdr GRP)))
                      )
              )
            )
          )
        )
      )
    )
    NLST
  )

; --------------------- MTEXTBOX FUNCTION ------------------------
;   This function returns a list of four points describing the
;   bounding box of the mtext (MTXT).
; ----------------------------------------------------------------

  (defun mtextbox (MTXT / WDTH HGHT INS JUST ANG P1 P2 P3 P4)
    (if (and (listp MTXT) (= "MTEXT" (cdr (assoc 0 MTXT))))
      (progn
        (setq WDTH (cdr (assoc 42 MTXT))
              HGHT (cdr (assoc 43 MTXT))
              INS  (trans (cdr (assoc 10 MTXT)) 0 1)
              JUST (cdr (assoc 71 MTXT))
              ANG  (cdr (assoc 50 MTXT))
        )
        (cond
          ((= JUST 1)
            (setq P1 (polar INS (- ANG (* Pi 0.5)) HGHT) ; lower-left
                  P2 (polar P1 ANG WDTH)                 ; lower-right
                  P3 (polar INS ANG WDTH)                ; upper-right
                  p4 INS                                 ; upper-left
            )
          )
          ((= JUST 2)
            (setq P3 (polar INS ANG (/ WDTH 2))
                  P4 (polar INS (+ ANG Pi) (/ WDTH 2))
                  P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
                  P2 (polar P1 ANG WDTH)
            )
          )
          ((= JUST 3)
            (setq P3 INS
                  P4 (polar INS (+ ANG Pi) WDTH)
                  P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
                  P2 (polar P1 ANG WDTH)
            )
          )
          ((= JUST 4)
            (setq P4 (polar INS (+ ANG (* Pi 0.5)) (/ HGHT 2))
                  P3 (polar P4 ANG WDTH)
                  P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
                  P2 (polar P1 ANG WDTH)
            )
          )
          ((= JUST 5)
            (setq P4 (polar INS (- ANG Pi) (/ WDTH 2))
                  P4 (polar P4 (+ ANG (* Pi 0.5)) (/ HGHT 2))
                  P3 (polar P4 ANG WDTH)
                  P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
                  P2 (polar P1 ANG WDTH)
            )
          )
          ((= JUST 6)
            (setq P3 (polar INS (+ ANG (* Pi 0.5)) (/ HGHT 2))
                  P4 (polar P3 (+ ANG Pi) WDTH)
                  P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
                  P2 (polar P1 ANG WDTH)
            )
          )
          ((= JUST 7)
            (setq P1 INS
                  P2 (polar P1 ANG WDTH)
                  P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
                  P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
            )
          )
          ((= JUST 8)
            (setq P1 (polar INS (+ ANG Pi) (/ WDTH 2))
                  P2 (polar P1 ANG WDTH)
                  P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
                  P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
            )
          )
          ((= JUST 9)
            (setq P2 INS
                  P1 (polar INS (+ ANG Pi) WDTH)
                  P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
                  P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
            )
          )
        )
      )
      (prompt "\nEntity Not Mtext!")
    )
    (list P1 P2 P3 P4)
  )

; ------------------- SET MTEXT UCS FUNCTION ---------------------
;   AutoCAD does not accept mtext as a valid object for setting
;   the ucs. This function will set the current ucs to the
;   mtext entity name ENT.
; ----------------------------------------------------------------

  (defun ucs_2_mtext (ENT / PTZ PTX PTY PTO)

    (setq PTZ (trans (cdr (assoc 210 (entget ENT))) ENT 1 T)
          PTX (trans (cdr (assoc 11 (entget ENT))) ENT 1 T)
          PTO (trans (cdr (assoc 10 (entget ENT))) ENT 1)
          PTY (list
                (-
                  (* (cadr PTZ) (caddr PTX))
                  (* (cadr PTX) (caddr PTZ))
                );minus
                (* -1
                  (-
                    (* (car PTZ) (caddr PTX))
                    (* (car PTX) (caddr PTZ))
                  );minus
                );multiply by -1
                (-
                  (* (car PTZ) (cadr PTX))
                  (* (car PTX) (cadr PTZ))
                );minus
              );list
          PTX (list (+ (car PTO) (car PTX))
                    (+ (cadr PTO) (cadr PTX))
                    (+ (caddr PTO) (caddr PTX))
              )
          PTY (list (+ (car PTO) (car PTY))
                    (+ (cadr PTO) (cadr PTY))
                    (+ (caddr PTO) (caddr PTY))
              )

    );setq
    (command "_.ucs" "_3" PTO PTX PTY)
  )

; ----------------------------------------------------------------
;                          MAIN PROGRAM
; ----------------------------------------------------------------

  (if (and                                                ; Are we in plan view?
        (equal (car (getvar "viewdir")) 0 0.00001)
        (equal (cadr (getvar "viewdir")) 0 0.00001)
        (> (caddr (getvar "viewdir")) 0)
      )
        
    (progn

      (prompt "\nSelect text to be EXPLODED: ")

      (Setq FLTR    '((-4 . "<AND")
                        (-4 . "<OR")                      ; filter for mtext and text
                          (0 . "MTEXT")
                          (0 . "TEXT")
                        (-4 . "OR>")
                        (-4 . "<NOT")
                          (102 . "{ACAD_REACTORS")        ; and not leader text
                        (-4 . "NOT>")
                      (-4 . "AND>")
                     )
            GLST     (grplst)                             ; Get all the groups in drawing
            GDICT    (if GLST
                       (dictsearch (namedobjdict) "ACAD_GROUP")
                     )
            SS       (ssget  FLTR)
            CNT      0
      )

      (if SS
        (progn
          (setq CNT (sslength SS))
          (princ (strcat "\n" (itoa CNT) " found."))       ; Report number of items found

          (command "_.move" SS "")                         ; filter out objects on locked layers

          (if (> (getvar "cmdactive") 0)                   ; if there are still objects left
            (progn
              (command "0,0" "0,0")
              (setq SS  (ssget "p" FLTR)
                    CNT (- CNT (sslength SS))              ; count them
              )
            )
            (setq SS nil)                                  ; else abort operation
          )

          (if (> CNT 0)                                    ; if items where filtered out
            (if (= CNT 1)
              (princ (strcat "\n" (itoa CNT) " was on a locked layer."))   ; report it.
              (princ (strcat "\n" (itoa CNT) " were on a locked layer."))
            )
          )
        )
      )

      (if SS
        (progn

          (setq CNT 0)                                 ; Reset counter
          (While (setq ENT (ssname SS CNT))            ; step through each object in set

            (and
              GLST                                     ; if groups are present in the drawing
              (setq GNAM (getgname ENT GLST))          ; and the text item is in one or more
              (foreach GRP GNAM                        ; step through those groups
                (command "_.-group" "_r"               ; and remove the text item
                  (cdr GRP) ENT ""
                )
              )
            )

            (setq TXT   (entget ENT)
                  TXTYP (cdr (assoc 0 TXT))            ; Text or Mtext
            )

            (if (= TXTYP "TEXT")
              (command "_.ucs" "_object" ENT)          ; set UCS to object
               (ucs_2_mtext ENT)
            )

            (if (= TXTYP "TEXT")                       ; get the points for the bounding box
              (progn
                (setq TBX (textbox TXT)                ; normal text
                      TBX (list (car TBX) (list (caadr TBX)(cadar TBX))
                                (cadr TBX) (list (caar TBX)(cadadr TBX))
                          )
                )
              )
              (setq TBX (mtextbox TXT))                ; Mtext
            )

            (setq TBX (mapcar '(lambda (x)
                                 (trans x 1 0)         ; convert the points to WCS
                               )
                        TBX
                      )
            )

            (setq PTLST (append PTLST TBX))            ; Build list of bounding box
                                                       ; points for text items selected


            (command "_.ucs" "_previous")              ; reset the ucs

            (setq CNT (1+ CNT))                        ; get the next text item
          ); while

          (setq PTLST (mapcar '(lambda (x)
                                 (trans x 0 1)         ; convert all the points
                               )                       ; to the current ucs
                      PTLST
                    )
          )

          (if (setq ZM (zoom_4_select PTLST))          ; If current view does not contain
            (progn                                     ; all bounding box points
              (setq ZM
                (list
                  (list (- (caar ZM) (pixel_unit))     ; increase zoom area by
                        (- (cadar ZM) (pixel_unit))    ; one pixel width to
                        (caddar ZM)                    ; sure nothing will be lost
                  )
                  (list (+ (caadr ZM) (pixel_unit))
                        (+ (cadadr ZM) (pixel_unit))
                        (caddr (cadr zm))
                  )
                )
              )
              (command "_.zoom" "_w" (car ZM) (cadr ZM))  ; zoom to include text objects
            )
          )

          (setq VIEW     (viewpnts)
                UPLFT    (list (caar VIEW) (cadadr VIEW))
                TMPFIL   (strcat (getvar "tempprefix") "txtexp.wmf")
                PT1      (getvar "viewctr")
                PT2      (list (car PT1) (cadadr VIEW))
          )

          (if (b_layer_locked (getvar "clayer"))       ; if current layer is locked
            (progn
              (command "_.layer" "_unl" (getvar "clayer") "")  ; unlock it
              (setq LOCKED T)
            )
          )

          (command "_.mirror" SS "" PT1 PT2 "_y"
                   "_.WMFOUT" TMPFIL SS ""
                   "_.ERASE" SS ""
                   "_.WMFIN" TMPFIL UPLFT  "2" "" ""
                   "_.mirror" (entlast) "" PT1 PT2 "_y"
                   "_.EXPLODE" (entlast)
          );end command
  

          (command "_.erase" (ssget "p") "_R" "_W"
                   (polar (car VIEW) (* 0.25 Pi) (pixel_unit))
                   (cadr VIEW)
                   ""
          )


          (if ZM (command "_.zoom" "_p"))              ; Restore original view if needed
          (if LOCKED (command "_.layer" "_lock" (getvar "clayer") "")) : relock if needed

          (prompt (strcat "\n" (itoa (sslength ss))
                          " text object(s) have been exploded to lines."
                  )
          )
          (prompt "\nThe line objects have been placed on layer 0.")
        )
      )
    )
    (prompt "\nView needs to be in plan (0 0 1).")
  );if equal
  (restore_old_error)                                  ; Retsore values
  (princ)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-18 08:43:46 | 显示全部楼层
好程序!但不完整。
楼主请检查一下是哪里贴错了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-18 10:05:22 | 显示全部楼层
可以详细说明出现什么错误吗?
这些程序是autodesk开发的bonus,在我这里都能运行,可能还需其他dll之类的支持?
以下是text的扩展编辑命令
包括textfit.lsp  textmask.lsp txtexp.lsp find.lsp 等
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-18 10:43:46 | 显示全部楼层
缺少某少涵數. 如下
;;;     INIT_BONUS_ERROR  --> AC_BONUS.LSP   Intializes bonus error routine
;;;     RESTORE_OLD_ERROR --> AC_BONUS.LSP   Restores old error routine
;;;     ZOOM_4_SELECT     --> AC_BONUS.LSP   Zoom boundry to include points given
;;;     B_LAYER_LOCKED    --> AC_BONUS.LSP   Checks to see if layer is locked
;;;     PIXEL_UNIT        --> AC_BONUS.LSP   Size of pixel in drawing units

你的下載這些LISP程序沒有, 所以出錯是正常的. 我機子沒有EXPRESSTOOLS工具(可能快速工作里面有這幾個涵數的定義吧我在猜想). 樓主的程序是屬於快速工具裡面的在功能吧.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-18 10:51:54 | 显示全部楼层
原来是ACAD BONUS里的,呵呵。
错误在MAIN段(SETQ FLTR...那一部分,贴漏了。
此外,程序需要加载AC_BONUS.LSP才能运行。
不过BONUS大家应该都有的。
作为补充,我贴一个吧:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-18 11:18:25 | 显示全部楼层

Re: [推荐]:文字炸开成线段的程序等,很好的范例

最初由 chstart 发布
[B];;;  文字炸开成线段的程序 TXTEXP.LSP... [/B]


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

使用道具 举报

 楼主| 发表于 2004-4-18 18:04:30 | 显示全部楼层
呵,觉得这些程序值得看。刚刚入门,对这些个东西痴迷的紧 : )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-18 23:00:40 | 显示全部楼层
核心是
(command "_.mirror" SS "" PT1 PT2 "_y"
                   "_.WMFOUT" TMPFIL SS ""
                   "_.ERASE" SS ""
                   "_.WMFIN" TMPFIL UPLFT  "2" "" ""
                   "_.mirror" (entlast) "" PT1 PT2 "_y"
                   "_.EXPLODE" (entlast)
          );
其实mirror不要也行,就是闪一下而已.

1.取text的box
2.到text的ucs
3.WMFOUT(zoom到包含text)
4.删text,WMFin(以box)
5.explode.(所以当前图层不能locked)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:04 , Processed in 0.568954 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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