找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1043|回复: 5

[LISP程序]:文字、对象对齐于某线段--你不再常常为标注管径、坡度时不能与线段对齐烦

[复制链接]
发表于 2003-6-25 10:26:21 | 显示全部楼层 |阅读模式

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

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

×
  1. ;;;文字、对象对齐于某线段
  2. (defun c:cheng_align( / e0 ss p0 p1 p2 p3 p4 r r0 m w x1 x2 y1 y2 x3 y3 x4 y4 c old_osmode tmp)
  3.   (princ "文字、对象对齐于某线段 cheng_align by CHENG")
  4.   (setq old_osmode (getvar "osmode"))
  5.   (setq tmp T)
  6.   (while (/= tmp "TEXT")
  7.     (setq e0 (entsel "\n选择一个文字对象:"))   
  8.     (if e0 (setq tmp (cdr (assoc 0 (entget (car e0))))) (setq tmp "TEXT"))   
  9.   )
  10.   (if e0
  11.     (progn
  12.       (princ "\n选择其他对象:")
  13.       (setq ss (ssget))
  14.       (if (= ss nil) (setq ss (ssadd)))
  15.       (ssadd (cdr (assoc -1 (entget (car e0)))) ss)
  16.       (setvar "osmode" 951)
  17.       (setq p1 (getpoint "\n选择第一对齐点:"))
  18.       (setq p2 (getpoint "\n选择第二对齐点:"))      
  19.       (if (= cheng_align_m nil) (setq cheng_align_m (/ (cdr (assoc 40 (entget (car e0)))) 3.5)))
  20.       (princ "\n对齐偏移量<") (princ cheng_align_m) (princ ">:")
  21.       (setq m (getreal))
  22.       (setq tmp2 nil)
  23.       (setq tmp2 (getstring "\n删除旧对象?<Y>"))
  24.       (if (or (= tmp2 "Y") (= tmp2 "") (= tmp2 "y") (= tmp2 nil)) (setq tmp2 "Y") (setq tmp2 nil))
  25.       (if (/= m nil) (setq cheng_align_m m))
  26.       (setq m cheng_align_m)
  27.       (setq r (angle p1 p2))
  28.       (setq w (cdr (assoc 40 (entget (car e0)))))
  29.       (setq p0 (cdr (assoc 10 (entget (car e0)))))      
  30.       (setq x0 (car p0))
  31.       (setq y0 (car(cdr p0)))
  32.       (setq x1 (car p1))
  33.       (setq y1 (car(cdr p1)))
  34.       (setq x2 (car p2))
  35.       (setq y2 (car(cdr p2)))
  36.       (setq r0 (cdr (assoc 50 (entget (car e0)))))               
  37.       (setq r0 (* (/ 180.0 pi) r0))
  38.       (setq r0 (- (* (/ 180.0 pi) r) r0))
  39.       (setq c (sqrt (+ (* (- x2 x1) (- x2 x1)) (* (- y2 y1) (- y2 y1)))))
  40.       (setq x3 (+ x0 (* c (sin r))))
  41.       (setq y3 (+ y0 (* c (cos r))))
  42.       (setq p3 (list x3 y3 0.0))
  43.       (setq x4 (- x1 (* m (sin r))))
  44.       (setq y4 (+ y1 (* m (cos r))))
  45.       (if (> x1 x2)
  46.         (progn
  47.           (setq r0 (+ r0 180))
  48.           (setq m (+ cheng_align_m w))         
  49.           (setq x4 (- x2 (* m (sin r))))
  50.           (setq y4 (+ y2 (* m (cos r))))
  51.         )
  52.       )
  53.       (setq p4 (list x4 y4 0.0))
  54.       (setq i 0)
  55.       (if (/= tmp2 "Y") (command "copy" ss "" p0 p0))
  56.       ;(repeat (sslength ss)
  57.        ; (setq e0 (ssname ss i))
  58.        ; (setq i (+ i 1))
  59.         (command "ROTATE" ss "" p0 r0)
  60.       ;)
  61.       (command "move" ss "" p0 p4)
  62.       (setvar "osmode" old_osmode)
  63.     )
  64.   )
  65.   (princ)
  66. );end cheng_align

  67. ;;;使用方法:
  68. ;;;1。必须先选择一个文字对象(e0),再选择其他对象(可不选)
  69. ;;;2。选择第一对齐点(p1)
  70. ;;;3。选择第一对齐点(p2)
  71. ;;;4。输入对齐偏移量(m)
  72. ;;;如果p1的x坐标<=p2的x坐标,那么文字e0将以p1为基点在p1,p2连线的上方;
  73. ;;;反之,如果p1的x坐标>p2的x坐标,那么文字e0将以p2为基点在p1,p2连线的下方;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-6-25 22:44:25 | 显示全部楼层
直接用align命令不是更简单?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2003-7-9 15:02:35 | 显示全部楼层
问题就是align 对于文字太难捕捉2个点了,所以才搞这个东东。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-16 00:05:57 | 显示全部楼层
对齐某线段,点p1就够了,请省去p2,自行判断
偏移量正值在上,负值在下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8644个

财富等级: 富甲天下

发表于 2003-7-22 09:18:01 | 显示全部楼层
还是这个好,可对文字、图块操作,单击就行了。很方便

;;;    This program will match text angle to a line angle selected
;;;--------------------------------------------------------------------
(defun c:ta ( / ang1 ang2 bob enttyp enttyp2 getit l1 nang oang oangprt p1 p2 sl st time time2 tx1 wait wait2 why x1 x2 )
(setvar "cmdecho" 1)

;finds the angle of the line
  (setq wait "T")
  (while wait
   (setq time "T")
   (while time
    (setq sl (entsel "\n Pick Angle To Match:"))
    (if (/= sl nil)(setq time nil))
   )
   (setq l1 (entget (car sl)))
   (setq enttyp (cdr (assoc 0 l1)))
   (if (= enttyp "LINE")(setq wait nil))
  )
  (setq p1 (cdr (assoc 10 l1)))
  (setq x1 (car p1))
  (setq p2 (cdr (assoc 11 l1)))
  (setq x2 (car p2))

(setq why (angle p1 p2))
        (if (>= why 0)
          (setq ang1 why)
        )
        (if (> why 1.5708);same as 90?
          (setq ang1 (+ 3.14159 why));add 180?
        )
        (if (>= why 4.71413);same as 270.1?
          (setq ang1 why)
        )

;finds angle of txt
  (setq wait2 "T")
  (while wait2
   (setq time2 "T")
   (while time2
    (setq st (entsel "\n Pick Text Or Block To Change:"))
    (if (/= st nil)(setq time2 nil))
   )
   (setq tx1 (entget (car st)))
   (setq enttyp2 (cdr (assoc 0 tx1)))
   (if (or(= enttyp2 "TEXT")(= enttyp2 "INSERT")(= enttyp2 "ATTDEF"))(setq wait2 nil))
  )
  (setq ang2 (cdr (assoc 50 tx1)))
  (setq oang (cons 50 ang2))
  (setq nang (cons 50 ang1))
  (setq tx1 (subst nang oang tx1))
  (entmod tx1)
  (terpri)
  (setq bob "T")
  (while bob
   (initget 6 "M m")
   (setq getit (getkword "\n Press M to rotate 180?or <ENTER> to quit "))
   (if (or (= getit "m") (= getit "M"))
       (progn
        (setq oang (assoc 50 tx1))
        (setq oangprt (cdr oang))
        (setq nang (cons 50 (+ 3.14159 oangprt)))
        (setq tx1 (subst nang oang tx1))
        (entmod tx1)
       )
       (setq bob nil)
   )
  )

  (setvar "cmdecho" 0)
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 12:56 , Processed in 0.177592 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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