文本框居中-来自ENTS
我在网上的某个地方找到了这段代码,它对单行文本非常有效。我想能够选择多行文字,并让它做同样的事情。将现有矩形中的几行文字居中。
我希望有人已经有代码来做这件事,而不是希望有人
会为我编码。我不知道该怎么做。。
很多时候,我遇到的是多行单独的文本项。
所以它可能是文本,也可能是多行文字。
以下是适用于单行文本的现有代码:
很抱歉格式都不可靠,就是这样。。。
非常感谢! 夏威夷群岛
请查找随附的lisp。
可能对你有帮助。
非常感谢。
yathishkumar先生
CTR2RECT。LSP 谢谢你的回复,但是,这段代码和我的一样。。。
(一行文字)
我希望能够选择多行文本(即:SSGET)
代码需要根据
选择了多少项及其各自的高度。
如果它需要改变理由,那就好了。 我在Autodesk论坛上找到了此代码。。。
它“有些有效”
使用此代码,文本必须已经位于矩形内的某个位置。
它使文本居中,但多行都位于中心位置,并相互重叠。
但不适用于多行文字。
(defun c:CenterText (/ ss i elast obj bent ipt)
(defun getmid (ent)
(setq lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget ent))))
(if (= (length lst) 4)
(mapcar '(lambda (a b) (/ (+ a b) 2.)) (car lst) (caddr lst))
)
)
(command "_undo" "begin")
(prompt "\Selext text within the table.")
(setq ss (ssget "_:L" '((0 . "TEXT"))))
(setq i -1)
(while (setq ename (ssname ss (setq i (1+ i))))
(setq obj (vlax-ename->vla-object ename))
(setq elast (entlast))
(setq ipt (vlax-get obj 'insertionpoint))
(if (vl-catch-all-error-p
(vl-catch-all-apply
'(lambda ()
(vl-cmdf "_-BOUNDARY" (trans ipt 0 1) "")
(while (> (getvar "CMDACTIVE") 0) (command ""))
)
)
)
(princ "\nText boundry not found.")
;;got a boundry
(progn
(if (and (not (eq elast (setq bent (entlast))))
(setq midpt (getmid bent))
)
(progn
(vla-put-Alignment obj acAlignmentMiddleCenter)
(vla-put-TextAlignmentPoint Obj (vlax-3D-point MidPT))
)
(and (eq bent (entlast)) (entdel bent))
)
)
)
)
(command "_undo" "end")
(princ)
) 嘘!
找到了上述代码的修改版本。
如果文本为多行文字,则此操作非常有效。
我不得不添加ERASE命令行,因为它已被引入
一个包围盒,然后把它留在那里。
你们所有的程序员可能都会嘲笑我的管道胶带修复,但它奏效了。。
它仍然将各个文本项都放在中心的顶部-\
如此接近。。。
(defun c:ct2 (/ *error* vl ov i ss ent obj pt prop eLst poly)
(vl-load-com)
(defun *error* (msg)
(and ov (mapcar 'setvar vl ov))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(setq vl '("CMDECHO" "OSMODE") ov (mapcar 'getvar vl))
(mapcar 'setvar vl '(0 0))
(if (setq i -1 ss (ssget "_:L" '((0 . "MTEXT,TEXT"))))
(while (setq ent (ssname ss (setq i (1+ i))))
(setq obj (vlax-ename->vla-object ent))
(if (eq "AcDbText" (vla-get-ObjectName obj))
(if (eq AcAlignmentLeft (vla-get-Alignment obj))
(progn
(setq tmp (vla-get-InsertionPoint obj))
(vla-put-Alignment obj acAlignmentMiddleCenter)
(vla-put-TextAlignmentPoint obj tmp))
(vla-put-Alignment obj acAlignmentMiddleCenter))
(vla-put-AttachmentPoint obj acAttachmentPointMiddleCenter))
(setq pt (vlax-get obj
(setq prop
(if (eq "TEXT" (cdr (assoc 0 (entget ent))))
'TextAlignmentPoint 'InsertionPoint))))
(setq eLst (entlast))
(vl-cmdf "_.-boundary" pt "")
(if (not (eq eLst (setq poly (entlast))))
(progn
(vla-getBoundingBox (vlax-ename->vla-object poly) 'MiP 'MaP)
(setq pLst (mapcar 'vlax-safearray->list (list mIP maP)))
(vlax-put-property obj prop
(vlax-3D-point
(polar (car pLst) (apply 'angle pLst) (/ (apply 'distance pLst) 2.))))
(entdel poly))
(princ "\n ** Boundary not Found ** "))))
(mapcar 'setvar vl ov)
(Command "Erase" "L" "")
(princ)) 如果您获取多行文本,您看到它们的方式不一定是ssget返回的顺序,您需要根据左下角文本插入的Y值对文本行进行排序。一旦你有了这个新的订单清单,你就可以很容易地把它放在一个盒子里。像行距之类的问题还有待解决。
有人来整理吗?
((y1 text1)(y2 text2)(y3 Text3))正确是((y2 text2)(y3 Text3)(y1 text1))
还有这个http://forums.autodesk.com/t5/drafting-techniques/autocad-tip-text-with-bounding-box/td-p/1195431 尝试以下程序:
上述内容应在任何旋转角度和任何对齐方式下适用于文本和多行文字。
如果要对齐文本,请在使用上述命令之前使用“对齐文本”程序(如果文本具有不同的对齐设置,请在此之前使用JUSTIFYTEXT命令)。
假设和注释:
[列表]
[*]假设所选内容中的所有文本具有相同的旋转。
[*]假设WCS(未针对所有UCS/视图设置进行测试/设计)
[/列表] 非常感谢李!!
我一回到办公室就会查出来。。。 不客气-我希望一切顺利 嗨,李,先生
非常感谢你。
i'ts working super。
非常感谢。
yathishkumar先生
页:
[1]
2