乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 28|回复: 19

[编程交流] 文本框居中-来自ENTS

[复制链接]

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-5 18:32:56 | 显示全部楼层 |阅读模式
我在网上的某个地方找到了这段代码,它对单行文本非常有效。我想能够选择多行文字,并让它做同样的事情。
 
将现有矩形中的几行文字居中。
我希望有人已经有代码来做这件事,而不是希望有人
会为我编码。我不知道该怎么做。。
 
很多时候,我遇到的是多行单独的文本项。
所以它可能是文本,也可能是多行文字。
 
以下是适用于单行文本的现有代码:
 
很抱歉格式都不可靠,就是这样。。。
 
非常感谢!
回复

使用道具 举报

10

主题

52

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2022-7-5 18:36:45 | 显示全部楼层
夏威夷群岛
请查找随附的lisp。
可能对你有帮助。
 
非常感谢。
yathishkumar先生
CTR2RECT。LSP
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-5 18:40:21 | 显示全部楼层
谢谢你的回复,但是,这段代码和我的一样。。。
(一行文字)
 
我希望能够选择多行文本(即:SSGET)
 
代码需要根据
选择了多少项及其各自的高度。
如果它需要改变理由,那就好了。
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-5 18:43:49 | 显示全部楼层
我在Autodesk论坛上找到了此代码。。。
 
它“有些有效”
 
使用此代码,文本必须已经位于矩形内的某个位置。
它使文本居中,但多行都位于中心位置,并相互重叠。
但不适用于多行文字。
 
  1. (defun c:CenterText (/ ss i elast obj bent ipt)
  2. (defun getmid (ent)
  3.    (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget ent))))
  4.    (if (= (length lst) 4)
  5.      (mapcar '(lambda (a b) (/ (+ a b) 2.)) (car lst) (caddr lst))
  6.    )
  7. )
  8. (command "_undo" "begin")
  9. (prompt "\Selext text within the table.")
  10. (setq ss (ssget "_:L" '((0 . "TEXT"))))
  11. (setq i -1)
  12. (while (setq ename (ssname ss (setq i (1+ i))))
  13.    (setq obj (vlax-ename->vla-object ename))
  14.    (setq elast (entlast))
  15.    (setq ipt (vlax-get obj 'insertionpoint))
  16.    (if (vl-catch-all-error-p
  17.          (vl-catch-all-apply
  18.            '(lambda ()
  19.               (vl-cmdf "_-BOUNDARY" (trans ipt 0 1) "")
  20.               (while (> (getvar "CMDACTIVE") 0) (command ""))
  21.             )
  22.          )
  23.        )
  24.      (princ "\nText boundry not found.")
  25.      ;;  got a boundry
  26.      (progn
  27.        (if (and (not (eq elast (setq bent (entlast))))
  28.                 (setq midpt (getmid bent))
  29.            )
  30.          (progn
  31.            (vla-put-Alignment obj acAlignmentMiddleCenter)
  32.            (vla-put-TextAlignmentPoint Obj (vlax-3D-point MidPT))
  33.          )
  34.          (and (eq bent (entlast)) (entdel bent))
  35.        )
  36.      )
  37.    )
  38. )
  39. (command "_undo" "end")
  40. (princ)
  41. )
回复

使用道具 举报

88

主题

346

帖子

281

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
423
发表于 2022-7-5 18:47:50 | 显示全部楼层
嘘!
 
找到了上述代码的修改版本。
如果文本为多行文字,则此操作非常有效。
我不得不添加ERASE命令行,因为它已被引入
一个包围盒,然后把它留在那里。
 
你们所有的程序员可能都会嘲笑我的管道胶带修复,但它奏效了。。
 
它仍然将各个文本项都放在中心的顶部-\
 
如此接近。。。
 
 
  1. (defun c:ct2 (/ *error* vl ov i ss ent obj pt prop eLst poly)
  2. (vl-load-com)
  3. (defun *error* (msg)
  4.    (and ov (mapcar 'setvar vl ov))
  5.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  6.        (princ (strcat "\n** Error: " msg " **")))
  7.    (princ))
  8. (setq vl '("CMDECHO" "OSMODE") ov (mapcar 'getvar vl))
  9. (mapcar 'setvar vl '(0 0))
  10. (if (setq i -1 ss (ssget "_:L" '((0 . "MTEXT,TEXT"))))
  11.    (while (setq ent (ssname ss (setq i (1+ i))))
  12.      (setq obj (vlax-ename->vla-object ent))
  13.      (if (eq "AcDbText" (vla-get-ObjectName obj))
  14.        (if (eq AcAlignmentLeft (vla-get-Alignment obj))
  15.          (progn
  16.            (setq tmp (vla-get-InsertionPoint obj))
  17.            (vla-put-Alignment obj acAlignmentMiddleCenter)
  18.            (vla-put-TextAlignmentPoint obj tmp))
  19.          (vla-put-Alignment obj acAlignmentMiddleCenter))
  20.        (vla-put-AttachmentPoint obj acAttachmentPointMiddleCenter))
  21.      (setq pt (vlax-get obj
  22.                 (setq prop
  23.                   (if (eq "TEXT" (cdr (assoc 0 (entget ent))))
  24.                     'TextAlignmentPoint 'InsertionPoint))))
  25.      (setq eLst (entlast))
  26.      (vl-cmdf "_.-boundary" pt "")
  27.    
  28.      (if (not (eq eLst (setq poly (entlast))))
  29.        (progn
  30.          (vla-getBoundingBox (vlax-ename->vla-object poly) 'MiP 'MaP)
  31.          (setq pLst (mapcar 'vlax-safearray->list (list mIP maP)))
  32.          (vlax-put-property obj prop
  33.            (vlax-3D-point
  34.              (polar (car pLst) (apply 'angle pLst) (/ (apply 'distance pLst) 2.))))
  35.          (entdel poly))
  36.        (princ "\n ** Boundary not Found ** "))))
  37. (mapcar 'setvar vl ov)
  38. (Command "Erase" "L" "")
  39. (princ))
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:50:20 | 显示全部楼层
如果您获取多行文本,您看到它们的方式不一定是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
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:53:20 | 显示全部楼层
尝试以下程序:
上述内容应在任何旋转角度和任何对齐方式下适用于文本和多行文字。
 
如果要对齐文本,请在使用上述命令之前使用“对齐文本”程序(如果文本具有不同的对齐设置,请在此之前使用JUSTIFYTEXT命令)。
假设和注释:
[列表]
  • 假设所选内容中的所有文本具有相同的旋转。
  • 假设WCS(未针对所有UCS/视图设置进行测试/设计)
    [/列表]
  • 回复

    使用道具 举报

    88

    主题

    346

    帖子

    281

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    423
    发表于 2022-7-5 18:56:34 | 显示全部楼层
    非常感谢李!!
     
    我一回到办公室就会查出来。。。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-5 19:00:59 | 显示全部楼层
    不客气-我希望一切顺利
    回复

    使用道具 举报

    10

    主题

    52

    帖子

    42

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    51
    发表于 2022-7-5 19:03:21 | 显示全部楼层
    嗨,李,先生
     
    非常感谢你。
    i'ts working super。
     
    非常感谢。
    yathishkumar先生
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

    QQ|关于我们|小黑屋|乐筑天下 繁体中文

    GMT+8, 2025-3-12 13:57 , Processed in 0.594447 second(s), 72 queries .

    © 2020-2025 乐筑天下

    联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表