明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1538|回复: 6

大侠帮忙完善,谢谢。

[复制链接]
发表于 2012-7-24 19:25:17 | 显示全部楼层 |阅读模式
各位大侠,下面的代码是本人在网上下载的文字与线对齐的lisp。但是选直线必须是针对非块内或参照内的直线才可以,请问如何能使选直线时,像剪切、延伸那样对于块内或者是参照内的直线都可以选择啊,谢谢。
;文字与直线对齐
(defun C:tt (/ x y laa lin lab pt1 pt2 v1 slin ang tex name index nang oang b)
  (setvar "cmdecho" 0)
  (while (= y nil)
    (progn
      (setq laa (entsel "\nselect the source obj. [or specify 2 point(2p)] "
))
      (if (/= laa nil)
(progn
   (setq lin (entget (car laa)))
   (setq x (cdr (assoc 0 lin)))
   (setq y (or (= x "LWPOLYLINE")
        (= x "LINE")
        (= x "TEXT")
        (= x "MTEXT")
))) ;progn
(progn
   (setq y 2)
   (setq pt1 (getpoint ":\nspecify first point"))
   (setq pt2 (getpoint pt1 ":\nspecify second point"))
   (coang)
) ;progn
      ) ;if
    ) ;progn
  ) ;while
(cond ((= (cdr (assoc 0 lin)) "LWPOLYLINE")
  (progn
    (setq pt1 (cdr (assoc 10 lin)))
    (setq v1 (cons 10 pt1))
    (setq slin (cdr (member v1 lin)))
    (setq pt2 (cdr (assoc 10 slin)))
    (coang)
)))
  (cond ((= (cdr (assoc 0 lin)) "LINE")
  (progn
    (setq pt1 (cdr (assoc 10 lin)))
    (setq pt2 (cdr (assoc 11 lin)))
    (coang)
)))
  (cond ((= (cdr (assoc 0 lin)) "TEXT")
  (progn
    (setq ang (cdr (assoc 50 lin)))
)))
  (cond ((= (cdr (assoc 0 lin)) "MTEXT")
  (progn
    (setq ang (cdr (assoc 50 lin)))
)))
  (prompt "\nselect the words to be turned: ")
  (while (= lab nil)
    (setq lab (ssget
  '((-4 . "<OR") (0 . "TEXT") (0 . "MTEXT") (-4 . "OR>"))
))) ;while
  (setq index 0)
  (setq n (sslength lab))
  (repeat n
    (setq name (ssname lab index))
    (setq tex (entget name))
    (setq index (+ index 1))
    (setq nang (cons 50 ang))
    (setq oang (assoc 50 tex))
    (setq b (subst nang oang tex))
    (entmod b)
  )
  (setvar "cmdecho" 1)
  (princ)
);;
(defun coang ()
  (setq ang (angle pt1 pt2))
  (if (and (> ang (/ pi 2)) (<= ang (* pi 1.5)))
    (progn
      (setq ang (+ ang pi))
)))
;文字与直线对齐
发表于 2012-7-24 20:01:14 | 显示全部楼层
(setq laa (entsel "\nselect the source obj. [or specify 2 point(2p)] "改成
(setq laa (nentsel "\nselect the source obj. [or specify 2 point(2p)] "
发表于 2012-7-24 22:50:10 | 显示全部楼层
才知道原来还有nentsel这么个函数,学习了
发表于 2012-7-24 23:20:38 | 显示全部楼层
  1. (defun C:tt (/ x y laa lin lab pt1 pt2 v1 slin ang tex name index nang oang b)
  2.   (setvar "cmdecho" 0)
  3.   (while (= y nil)
  4.     (progn
  5.       (setq laa (nentsel "\n选择直线或多义线. [直接回车点取两点]:";;--修改成中文,按指点改成nentsel
  6. ))
  7.       (if laa ;;--不必要
  8. (progn
  9.    (setq lin (entget (car laa)))
  10.    (setq x (cdr (assoc 0 lin)))
  11.    (setq y (or (= x "LWPOLYLINE")
  12.         (= x "LINE")
  13.         (= x "TEXT")
  14.         (= x "MTEXT")
  15. ))) ;progn
  16. (progn
  17.    (setq y t);;--直接t
  18.    (setq pt1 (getpoint ":\n第一点:"));;--修改成中文
  19.    (setq pt2 (getpoint pt1 ":\n第二点:"));;--修改成中文
  20.    (coang)
  21. ) ;progn
  22.       ) ;if
  23.     ) ;progn
  24.   ) ;while
  25. (cond ((= x "LWPOLYLINE");;--cond用法修正,(cdr (assoc 0 lin))直接可以用x代替以避免重复计算,下同
  26.   (progn
  27.     (setq pt1 (cdr (assoc 10 lin)))
  28.     (setq v1 (cons 10 pt1))
  29.     (setq slin (cdr (member v1 lin)))
  30.     (setq pt2 (cdr (assoc 10 slin)))
  31.     (coang)
  32. ))
  33.   ((= x "LINE")
  34.   (progn
  35.     (setq pt1 (cdr (assoc 10 lin)))
  36.     (setq pt2 (cdr (assoc 11 lin)))
  37.     (coang)
  38. ))
  39.   ((= x "TEXT")
  40.   (progn
  41.     (setq ang (cdr (assoc 50 lin)))
  42. ))
  43.   ((= x "MTEXT")
  44.   (progn
  45.     (setq ang (cdr (assoc 50 lin)))
  46. )))
  47.   (prompt "\n选择文字:");;--修改成中文
  48.   (while (= lab nil)
  49.     (setq lab (ssget
  50.   '((-4 . "<OR") (0 . "TEXT") (0 . "MTEXT") (-4 . "OR>"))
  51. ))) ;while
  52.   (setq index 0)
  53.   (setq n (sslength lab))
  54.   (repeat n
  55.     (setq name (ssname lab index))
  56.     (setq tex (entget name))
  57.     (setq index (+ index 1))
  58.     (setq nang (cons 50 ang))
  59.     (setq oang (assoc 50 tex))
  60.     (setq b (subst nang oang tex))
  61.     (entmod b)
  62.   )
  63.   (setvar "cmdecho" 1)
  64.   (princ)
  65. );;
  66. (defun coang ()
  67.   (setq ang (angle pt1 pt2))
  68.   (if (and (> ang (/ pi 2)) (<= ang (* pi 1.5)))
  69.     (progn
  70.       (setq ang (+ ang pi))
  71. )))
  72. ;文字与直线对齐
在楼主的基础上简单做了修改,没有进行较大改动。
发表于 2012-7-25 11:17:21 | 显示全部楼层
soga~~~~~~~~~~~~~~~~~
发表于 2012-8-2 22:14:08 | 显示全部楼层
duuudu 发表于 2012-7-24 23:20
在楼主的基础上简单做了修改,没有进行较大改动。

不够完善:1,不支持天正文字。2,对齐后,如果文字能和直线保持一定的距离就好了,例如1/2字高。3,楼上的修改,的确可以支持块中的直线,但对于自定义坐标系,文字无法对齐
 楼主| 发表于 2012-8-3 08:54:25 | 显示全部楼层
lshpool 发表于 2012-8-2 22:14
不够完善:1,不支持天正文字。2,对齐后,如果文字能和直线保持一定的距离就好了,例如1/2字高。3,楼上 ...

使用这个命令时,定义为世界坐标系,命令结束后回到自定义坐标系不就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-21 23:34 , Processed in 0.200231 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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