cad lisp程序

我画了一条线 线上面有平行的文字。我如果想把线左端不动右端改到另一个点而文字始终位于线正中且平行于线该怎么编代码呢?
线是有角度的,而且长度也应该可以变化。

可以用反应器实现,前提是画线和输入文字必须用定义的函数一次性操作完成.LISP代码如下:
(VL-Load-Com)
(defun c:Line_Txt(/ Pt Pt1 Pt2 EntLine HandTxt VlaObj Tmp)
(setq Pt1 (getpoint "\n指定第一点:"))
(setq Pt2 (getpoint "\n指定下一点:"))
(setq Pt (list (/ (+ (car Pt1) (car Pt2)) 2) (/ (+ (cadr Pt1) (cadr Pt2)) 2) (/ (+ (caddr Pt1) (caddr Pt2)) 2)))
(command "._Line" Pt1 Pt2 "")
(setq EntLine (entlast))
(setq VlaObj (cons (VLAX-EName->VLA-Object EntLine) '()));;将直线转换为VLA对象

(setq HandTxt '((0 . "TEXT"))
HandTxt (append HandTxt (list (append '(10) Pt1)))
HandTxt (append HandTxt (list (append '(11) Pt)))
HandTxt (append HandTxt (list (cons 40 (getdist "\n指定高度:"))))
HandTxt (append HandTxt (list (cons 72 1)))
HandTxt (append HandTxt (list (cons 73 0)))
HandTxt (append HandTxt (list (cons 50 (angle pt1 Pt2))))
HandTxt (append HandTxt (list (cons 1 (getstring "\n输入文字:>")))))
(entmake HandTxt)
(setq HandTxt (cdr (Assoc 5 (entget (entlast)))))
(VLR-Pers (VLR-Object-Reactor vlaObj HandTxt '((:vlr-modified . LineModefy))))
)

(defun LineModefy(EntLine EntTxt parameter-list / Pt Pt1 Pt2)
(setq EntTxt (entget (HandEnt (VLR-Data EntTxt))))
(setq EntLine (entget (VLAX-VLA-Object->EName EntLine)))
(setq Pt1 (cdr (assoc 10 EntLine)) Pt2 (cdr (assoc 11 EntLine)))
(setq Pt (list (/ (+ (car Pt1) (car Pt2)) 2) (/ (+ (cadr Pt1) (cadr Pt2)) 2) (/ (+ (caddr Pt1) (caddr Pt2)) 2)))
(setq EntTxt (subst (cons 50 (angle Pt1 Pt2)) (assoc 50 EntTxt) EntTxt)
EntTxt (subst (append '(10) Pt1) (assoc 10 EntTxt) EntTxt)
EntTxt (subst (append '(11) Pt) (assoc 11 EntTxt) EntTxt))
(entmod EntTxt)
)

也可以用属性块实现,将文字与直线定义成属性块,打开块编辑器,在参数选项板中设定点参数和旋转参数,在动作选项板中定义要执行的动作,……,具体的自己参照属性块的做吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-21
(defun c:xx1(/ en1 en2 en1_data en2_data pt1 old2_1 old2_2 pt2_1 pt2_2 pt2)
(setvar "cmdecho" 0)
(setq en1 (entsel "\n请选择一条直线:"))
(setq en2 (entsel "\n请选择一个文字:"))
(setq en1_data (entget (car en1)));;;获取直线的联合属性列表
(setq en2_data (entget (car en2)));;;获取文字的联合属性列表
(command "justifytext" en2 "" "c");;;将文字的对正方式设置为“中”
(setq pt1 (assoc 11 en2_data));;;获取文字的对正位置点坐标
(setq old2_1 (cdr (assoc 10 en1_data)));;;获取直线的起点坐标
(setq old2_2 (cdr (assoc 11 en1_data)));;;获取直线的终点坐标
(setq pt2_1 (/ (+ (car old2_1) (car old2_2)) 2));直线中点的横坐标
(setq pt2_2 (/ (+ (cadr old2_1) (cadr old2_2)) 2));直线中点的纵坐标
(setq pt2 (list 11 pt2_1 pt2_2 0.0));;;pt2为直线中点坐标
(setq en2_data (subst pt2 pt1 en2_data));设置文字的对正点到直线中点
(entmod en2_data);;;更新图形
(prin1);;;静默退出
)

写了个小程序,已经调试成功。程序没有判断直线是否水平,也就是说如果直线是斜线,也会将文字中点对正到直线中点,但是文字依然是水平的,如果要旋转文字,需要计算直线的角度,这个不难,自己加入几条代码就可以。

但是我的水平也只有这样了,如果要在改变直线长度的时候,自动更新文字位置,这个估计要用到反应器的技术,这个我还没学,所以无法给出代码了。

代码中已经加入简单的注释,应该可以看懂,如果有疑问,再找机会讨论。

= CAD技术智囊团 =
第2个回答  2010-07-24
你就不能在文字编辑里面给文字加‘下划线’吗
第3个回答  2010-07-21
请到晓东论坛发这样的帖子把
那上面这方面高手林立
而且注册开放本回答被网友采纳
相似回答