品茗新秀 发表于 2012-9-18 20:01:46

如何在一条线上生成文字

如何在一条线上生成文字

wudechao 发表于 2012-9-18 20:01:47

;我自己编写的直线上写文字qx命令
(defun c:qx (/ oos oor old_lay old_sty pt ang0 tmq3 fyf s1 e1 tmq1 pt00 pt01 pt1x pt2x pt1y pt2y ang1 k pt1 tst pt0 ang2)
(defun ffg-getdxf (en dxf)
    (cdr (assoc dxf (entget en)))
)
(defun ffg-entsel (msg filter / ss sss)
    (setq ss (entsel msg))
    (if (/= ss nil)
      (progn
(command "_.select" (car ss) "")
(if (not (setq sss (ssget "P" filter)))
   (setq ss nil)
   (list (ssname sss 0) (cadr ss))
)
      )
    )
)
(setvar "cmdecho" 0)
(setq oor (getvar "orthomode"))
(setvar "orthomode" 0)
(setq oos (getvar "osmode"))
(setvar "osmode" 0)
(setq old_lay (getvar "clayer"))
(setq old_sty (getvar "textstyle"))
(setq fyf (getvar "useri2"))
(setq tmq3 (getvar "users4"))
(if (< fyf 0)
    (setq fyf (abs fyf))
)
(if (= fyf 0)
    (progn
      (setq fyf 300)
      (setvar "useri2" fyf)
    )
)
(if (= (tblobjname "LAYER" "Text") nil)
    (progn
      (entmake (list (quote (0 . "LAYER")) (quote (100 . "AcDbSymbolTableRecord")) (quote (100 . "AcDbLayerTableRecord"))
       (quote (6 . "CONTINUOUS")) (quote (62 . 7)) (quote (70 . 0)) (cons 2 "Text")
      )
      )
    )
)
(if (not (tblsearch "style" "TSSD_REIN"))
    (progn
      (command "-style" "TSSD_REIN" "txt.shx,hztxt.shx" "0" "0.7" "0" "N" "N" "N")
    )
)
(initget "R C")
(setq yesno (getkword "\n文字与直线对齐方式[边对齐(R)/中间对齐(C)] <C>:"))
(cond
    ((= yesno "C")
      (setq tst 1)
    )
    ((= yesno "c")
      (setq tst 1)
    )
    ((= yesno "R")
      (setq tst 2)
    )
    ((= yesno "r")
      (setq tst 2)
    )
    (t
      (setq tst 1)
    )
)
(setq fyf (getint (strcat "\n请输入文字高度< " (itoa fyf) " >:"))
fyf (if fyf
       fyf
       (getvar "useri2")
   )
)
(setvar "useri2" fyf)
(while (setq s1 (ffg-entsel "\n请选择一根直线(line或lwpolyline)<退出>: " (quote ((0 . "LINE,LWPOLYLINE")))))
    (setq e1 (car s1)
   tmq1 (ffg-getdxf e1 0)
   pt0 (cadr s1)
    )
    (if (= "LINE" tmq1)
      (progn
(setq pt00 (ffg-getdxf e1 10)
       pt01 (ffg-getdxf e1 11)
       ang0 (angle pt00 pt01)
       ang0 (/ (* ang0 180) pi)
       ang2 ang0
       pt1x (car pt00)
       pt1y (cadr pt00)
       pt2x (car pt01)
       pt2y (cadr pt01)
)
      )
    )
    (if (and
   (= "LWPOLYLINE" tmq1)
   (= (ffg-getdxf e1 90) 2)
)
      (progn
(setq pt00 (ffg-getdxf e1 10)
       pt01 (cdr (assoc 10 (reverse (entget e1))))
       ang0 (angle pt00 pt01)
       ang0 (/ (* ang0 180) pi)
       ang2 ang0
       pt1x (car pt00)
       pt1y (cadr pt00)
       pt2x (car pt01)
       pt2y (cadr pt01)
)
      )
    )
    (if (and
   (< (distance pt0 pt00) (distance pt0 pt01))
   (= tst 2)
)
      (setq k 0)
    )
    (if (and
   (> (distance pt0 pt00) (distance pt0 pt01))
   (= tst 2)
)
      (setq k 1)
    )
    (if (= tst 1)
      (setq k 0.5)
    )
    (setq ptx (+ pt1x (* (- pt2x pt1x) k))
   pty (+ pt1y (* (- pt2y pt1y) k))
   pt1 (list ptx pty)
    )
    (if (and
   (> ang0 90)
   (<= ang0 270)
)
      (progn
(setq ang0 (angle pt01 pt00)
       ang0 (/ (* ang0 180) pi)
       ang1 (+ ang0 90)
       ang1 (rem ang1 360)
       pt (polar pt1 (* (/ ang1 180) pi) 150)
)
      )
      (progn
(setq ang1 (+ ang0 90)
       ang1 (rem ang1 360)
       pt (polar pt1 (* (/ ang1 180) pi) 150)
)
      )
    )
    (setq tmq3 (getstring t (strcat "\n请输入标注文本< " tmq3 " >:"))
   tmq3 (if tmq3
   tmq3
   (getvar "users4")
      )
    )
    (if (= tmq3 "")
      (setq tmq3 (getvar "users4"))
    )
    (setvar "users4" tmq3)
    (if (/= old_sty "TSSD_REIN")
      (progn
(command "text" "style" "TSSD_REIN")
(command)
      )
    )
    (setvar "clayer" "Text")
    (if (= tst 1)
      (command "text" "j" "bc" pt fyf ang0 tmq3)
    )
    (if (and
   (< (distance pt0 pt00) (distance pt0 pt01))
   (= tst 2)
)
      (if (and
   (> ang2 90)
   (<= ang2 270)
   )
(command "text" "j" "bR" pt fyf ang0 tmq3)
(command "text" "j" "bl" pt fyf ang0 tmq3)
      )
    )
    (if (and
   (> (distance pt0 pt00) (distance pt0 pt01))
   (= tst 2)
)
      (if (and
   (> ang2 90)
   (<= ang2 270)
   )
(command "text" "j" "bl" pt fyf ang0 tmq3)
(command "text" "j" "br" pt fyf ang0 tmq3)
      )
    )
    (command "_clayer" old_lay)
    (command "_textstyle" old_sty)
)
(setvar "osmode" oos)
(setvar "orthomode" oor)
(setvar "cmdecho" 1)
(princ)
)

wudechao 发表于 2012-9-18 22:46:51

不知道符合你的要求否.
页: [1]
查看完整版本: 如何在一条线上生成文字