将文本移动到中点o
我对这个程序有意见。如果一行的长度发生变化,我让它的每一边(上面和下面)有两个文本移动到该行的中间。假设我想把一行缩短或加长。通过运行此例程,文本位置应更新到新的行中点。文本每侧偏移dimscale变量距离的一半。我利用句柄来选择文本,因为它们总是分别为行的句柄名+1和+2。
我不确定我做错了什么,但这两篇文章的位置不对。要么在直线的三分之一或三分之二,要么有时它正确居中,但在垂直于直线的方向上,它是不正确的(比应该的低一点)。
任何帮助都将不胜感激。
(defun c:ht (/)
(setq sslns (ssget '((0 . "LINE"))))
(setq cnthdl (sslength sslns))
(setq offset (/ (getvar "dimscale") 2))
(while (>= (setq cnthdl (1- cnthdl)) 0)
(setq tpent (ssname sslns cnthdl))
(setq lndt (entget tpent))
(setq lnlng (distance (cdr (assoc 10 lndt)) (cdr (assoc 11 lndt))))
(setq lndx (- (cadr (assoc 11 lndt)) (cadr (assoc 10 lndt))))
(setq lndy (- (caddr (assoc 11 lndt)) (caddr (assoc 10 lndt))))
(setq lndz (- (cadddr (assoc 11 lndt)) (cadddr (assoc 10 lndt))))
(setq gpln (list (+ (cadr (assoc 10 lndt)) (/ lndx 2)) (+ (caddr (assoc 10 lndt)) (/ lndy 2)) (+ (cadddr (assoc 10 lndt)) (/ lndz 2))))
(if (/= lndy 0)
(setq txtendpt (list (- (+ (cadr (assoc 10 lndt)) (/ lndx 2)) offset) (+ (caddr (assoc 10 lndt)) (/ lndy 2)) (+ (cadddr (assoc 10 lndt)) (/ lndz 2))))
(setq txtendpt (list (+ (cadr (assoc 10 lndt)) (/ lndx 2)) (+ (+ (caddr (assoc 10 lndt)) (/ lndy 2)) offset) (+ (cadddr (assoc 10 lndt)) (/ lndz 2))))
)
(setq txthdl (dec2hex (1+ (hex2dec (cdr (assoc 5 lndt))))))
(setq txtprop (entget (handent txthdl)))
(setq txtdimhdl (dec2hex (+ (hex2dec (cdr (assoc 5 lndt))) 2)))
(setq txtdimprop (entget (handent txtdimhdl)))
(setq 2txts (ssadd (handent txthdl) (ssadd (handent txtdimhdl))))
(setq gptxt1 (cdr (assoc 11 txtdimprop)))
(command "move" 2txts "" gptxt1 txtendpt)
)
(princ)
) 另一种不同的方法是拾取线,所以有10和11的起点和终点,你们得到距离stpt endpt,然后得到角度stpt endpt。避免所有协会
好的,现在在角度处使用距stpt的极分距离/2.0,然后添加到角度90+&90-再次使用极坐标计算txtpt1&2
(seqt stpt (cdr (assoc 10 lndt)))
(setq endpt (cdr (assoc 11 lndt)))
(setq lnlng (/ (distance stpt endpt )2.0))
(setq ang (angle stpt endpt))
(setq midpt (polar stpt lnlng ang))
(setq txt1 (polar midpt (getvar "dimscale") (+ (/ pi 2.0) ang)) ; note pi is a reserved variable name
(setq txt2 (polar midpt (getvar "dimscale") (- (/ pi 2.0) ang))
非常感谢。你的帮助对我很有启发。我确实根据您的代码调整了代码,但它的行为仍不符合预期。文本会飞到不同的位置。我真的不明白出了什么问题。上述两种代码都应该运行良好。你认为这与持有剩余值的变量有关吗?
下面我附上了两行文字和文件。下限是应该的。上限是在代码执行之后。
(defun c:ht (/)
(setq txtsta nil txtend nil)
(setq sslns (ssget '((0 . "LINE"))))
(setq cnthdl (sslength sslns))
(setq offset (/ (getvar "dimscale") 2))
(while (>= (setq cnthdl (1- cnthdl)) 0)
(setq tpent (ssname sslns cnthdl))
(setq lndt (entget tpent))
(setq lnlng (/ (distance (cdr (assoc 10 lndt)) (cdr (assoc 11 lndt))) 2))
(setq ang (angle (cdr (assoc 10 lndt)) (cdr (assoc 11 lndt))))
(setq midpt (polar (cdr (assoc 10 lndt)) lnlng ang))
(setq txthdl (dec2hex (1+ (hex2dec (cdr (assoc 5 lndt))))))
(setq txtprop (entget (handent txthdl)))
(setq txtdimhdl (dec2hex (+ (hex2dec (cdr (assoc 5 lndt))) 2)))
(setq txtdimprop (entget (handent txtdimhdl)))
(setq 2txts (ssadd (handent txthdl) (ssadd (handent txtdimhdl))))
(setq txtsta (cdr (assoc 11 txtdimprop)))
(setq txtend (polar midpt offset (+ (/ pi 2.0) ang)))
(command "move" 2txts "" txtsta txtend)
)
(princ)
)
第2行文字。图纸 虽然我不太明白您要做的一切,但这是一个使用entmake的简单线标签机:
(defun c:lnlabel (/ tof ss i en ed p10 p11 la ta mpt tp bp)
(setq tof (getvar "DIMSCALE"))
(while (setq ss (ssget '((0 . "LINE"))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en)
p10 (cdr (assoc 10 ed))
p11 (cdr (assoc 11 ed))
la (angle p10 p11)
ta (if (< (* pi 0.5) la (* pi 1.5)) (+ la pi) la)
mpt (mapcar '(lambda (a b) (* (+ a b) 0.5)) p10 p11)
tp (polar mpt (+ ta (* pi 0.5)) tof)
bp (polar mpt (+ ta (* pi 1.5)) tof))
(entmake (list (cons 0 "TEXT")
(cons 1 "ABOVE")
(cons 7 (getvar "TEXTSTYLE"))
(cons 8 (getvar "CLAYER"))
(cons 10 tp)
(cons 11 tp)
(cons 40 (getvar "TEXTSIZE"))
(cons 41 1.0)
(cons 50 ta)
(cons 72 4)))
(entmake (list (cons 0 "TEXT")
(cons 1 "BELOW")
(cons 7 (getvar "TEXTSTYLE"))
(cons 8 (getvar "CLAYER"))
(cons 10 bp)
(cons 11 bp)
(cons 40 (getvar "TEXTSIZE"))
(cons 41 1.0)
(cons 50 ta)
(cons 72 4)))
(setq i (1+ i))))
(prin1))
您可以使用相同的基本引擎(entmod)编辑组11和50的中点和文本角度。
-大卫 另一种方法是使用dims并关闭所有箭头,明显地,长度将更新,其他文本也将移动到中心,只需在末端做一个交叉窗口,这样它就会拾取隐藏的dim定位器。您将需要创建暗样式。 在David的帮助下,我设法解决了这个问题,因为我想让代码也适用于Z方向的行。再次感谢。 很高兴你成功了。
页:
[1]