明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3982|回复: 10

[求助]如何更改文字的对齐方式之后,不改变文字位置

[复制链接]
发表于 2010-1-28 17:02:00 | 显示全部楼层 |阅读模式

如何更改文字的对齐方式之后,不改变文字位置

如何使用entmod实现命令: justifytext的效果

不使用command的情况下。

传上测试图形。

图形格式CAD2000

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2010-1-28 17:06:00 | 显示全部楼层
我发现只是单单的用entmod 是不够的。。
或许还得用textbox计算点位,然后再重新定位文字位置。
  1. ;; Rev By carrot1983
  2. (defun C-Text-Justifytext (ENT MODE / ELIST V10 V11)
  3.   (defun Subst-elist (item elist)
  4.     (foreach x item
  5.       (setq elist (subst x (assoc (car x) elist) elist))
  6.     )
  7.   )
  8.   (cond ((= (type ent) 'ENAME)
  9.   (setq elist (entget ent))
  10. )
  11. ((= (type ent) 'LIST)
  12.   (setq elist ent)
  13. )
  14.   )
  15.   ;; 第一对齐点
  16.   (setq v10 (assoc 10 elist))
  17.   ;; 第二对齐点
  18.   (setq v11 (assoc 11 elist))
  19.   (entmod
  20.     (cond
  21.       ((= (strcase mode) "L")
  22.        (Subst-elist (list v10 (cons 72 0) (cons 73 0)) elist)
  23.       )
  24.       ((= (strcase mode) "A")
  25.        (Subst-elist
  26.   (list v10 v11 (cons 72 3) (cons 73 0))
  27.   elist
  28.        )
  29.       )
  30.       ((= (strcase mode) "F")
  31.        (Subst-elist
  32.   (list v10 v11 (cons 72 5) (cons 73 0))
  33.   elist
  34.        )
  35.       )
  36.       ((= (strcase mode) "M")
  37.        (Subst-elist (list v11 (cons 72 4) (cons 73 0)) elist)
  38.       )
  39.       ((= (strcase mode) "R")
  40.        (Subst-elist (list v11 (cons 72 2) (cons 73 0)) elist)
  41.       )
  42.       ((= (strcase mode) "C")
  43.        (Subst-elist (list v11 (cons 72 1) (cons 73 0)) elist)
  44.       )
  45.       ((= (strcase mode) "TL")
  46.        (Subst-elist (list v11 (cons 72 0) (cons 73 3)) elist)
  47.       )
  48.       ((= (strcase mode) "TC")
  49.        (Subst-elist (list v11 (cons 72 1) (cons 73 3)) elist)
  50.       )
  51.       ((= (strcase mode) "TR")
  52.        (Subst-elist (list v11 (cons 72 2) (cons 73 3)) elist)
  53.       )
  54.       ((= (strcase mode) "ML")
  55.        (Subst-elist (list v11 (cons 72 0) (cons 73 2)) elist)
  56.       )
  57.       ((= (strcase mode) "MC")
  58.        (Subst-elist (list v11 (cons 72 1) (cons 73 2)) elist)
  59.       )
  60.       ((= (strcase mode) "MR")
  61.        (Subst-elist (list v11 (cons 72 2) (cons 73 2)) elist)
  62.       )
  63.       ((= (strcase mode) "BL")
  64.        (Subst-elist (list v11 (cons 72 0) (cons 73 1)) elist)
  65.       )
  66.       ((= (strcase mode) "BC")
  67.        (Subst-elist (list v11 (cons 72 1) (cons 73 1)) elist)
  68.       )
  69.       ((= (strcase mode) "BR")
  70.        (Subst-elist (list v11 (cons 72 2) (cons 73 1)) elist)
  71.       )
  72.       (t elist)
  73.     )
  74.   )
  75. )
  76. (defun c:tt ()
  77.   (princ "\n如何更改文字的对齐方式之后,不改变文字位置")
  78.   (setq mode
  79.   (getstring
  80.     "\n[左(L)/对齐(A)/调整(F)/中心(C)/中间(M)/右(R)/左上(TL)/中上(TC)/右上(TR)/左中(ML)/正中(MC)/右中(MR)/左下(
  81. BL)/中下(BC)/右下(BR)]"
  82.   )
  83.   )
  84.   (setq ss (ssget))
  85.   (foreach e (C-SS->ENAMES SS)
  86.     (setq elist (entget e))
  87.     (setq elist (C-Text-Justifytext elist mode))
  88.     (entmod elist)
  89.   )
  90.   (princ)
  91. )
发表于 2010-1-31 15:20:00 | 显示全部楼层
;;;***********************************************
;;; No.1 修改选定文字对象的对正点而不改变其位置  
;;;***********************************************
(defun C:ayJT(/ SS1 p1 p2 p3 p4 xType)
 (prompt "\n【提示】选择文本对象...")
 (while (not (setq SS1 (ssget '((0 . "*TEXT"))))))
 (initget "L A F C M R TL TC TR ML MC MR BL BC BR")
 (setq xType (getkword (strcat "对齐点: 左(L)/对齐(A)/调整(F)/中心(C)/中间(M)/右(R)/左上(TL)/中上(TC)/右上(TR)"
                "/左中(ML)/正中(MC)/右中(MR)/左下(BL)/中下(BC)/右下(BR)<MC>: ")))
 (if (= xType nil) (setq xType "MC"))
 (vl-cmdf "_.JustifyText" SS1 "" xType)
 (prin1)
);end_defun
发表于 2010-2-1 10:10:00 | 显示全部楼层

提一个想法:

首先记录下10组坐标,然后修改对齐方式

最后,根据新的对其方式,将10组修改成原坐标值,或根据新的10组坐标和原10组坐标的差别修改11组,即可。

有兴趣者试验一下。

发表于 2010-2-1 12:22:00 | 显示全部楼层

取文字的包围盒子,记录下来盒子的左下角点

改变文字对齐方式,记录新的盒子的左下角点

移动文字从新盒子左下角点到原来的盒子左下角点

发表于 2010-2-1 22:04:00 | 显示全部楼层

太好了,正在找这个代码。

发表于 2010-2-2 02:46:00 | 显示全部楼层
  1. ;原位修改文字对齐方式
  2. (defun EF_Text:AlignMod (ename ;文字图元名
  3.     mode ;对齐模式 字符 L C R M A F
  4.     /
  5.     pt10 ;插入点
  6.     pt11 ;对齐点
  7.     edata
  8.     box a b c d ang
  9.     ptdiv newpt10
  10.     )
  11.   (setq edata (entget ename))
  12.   (setq pt10 (cdr (assoc 10 edata)))
  13.   (setq box (textbox edata))
  14.   (setq a (car box) b (cadr box))
  15.   (setq ang (cdr (assoc 50 edata)))
  16.   (setq edata
  17.   (entmod
  18.     (cond
  19.       ((= (strcase mode) "L") ;左对齐
  20.        (EF:List-SubstAssoc (list (cons 10 pt10) '(72 . 0) '(73 . 0)) edata T)
  21.        )
  22.       ((= (strcase mode) "C") ;中对齐
  23.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 1) '(73 . 0)) edata T)
  24.        )
  25.       ((= (strcase mode) "R") ;右对齐
  26.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 2) '(73 . 0)) edata T)
  27.        )
  28.       ((= (strcase mode) "M") ;中心对齐
  29.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 4) '(73 . 0)) edata T)
  30.        )
  31.       ((= (strcase mode) "A") ;对齐
  32.        (setq pt11 (polar pt10 ang (car b)))
  33.        (EF:List-SubstAssoc (list (cons 10 pt10) (cons 11 pt11) '(72 . 3) '(73 . 0)) edata T)
  34.        )
  35.       ((= (strcase mode) "F") ;调整
  36.        (setq pt11 (polar pt10 ang (car b)))
  37.        (EF:List-SubstAssoc (list (cons 10 pt10) (cons 11 pt11) '(72 . 5) '(73 . 0)) edata T)
  38.        )
  39.       ((= (strcase mode) "BL") ;左下
  40.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 0) '(73 . 1)) edata T)
  41.        )
  42.       ((= (strcase mode) "BC") ;中下
  43.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 1) '(73 . 1)) edata T)
  44.        )
  45.       ((= (strcase mode) "BR") ;右下
  46.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 2) '(73 . 1)) edata T)
  47.        )
  48.       ((= (strcase mode) "ML") ;左中
  49.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 0) '(73 . 2)) edata T)
  50.        )
  51.       ((= (strcase mode) "MC") ;正中
  52.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 1) '(73 . 2)) edata T)
  53.        )
  54.       ((= (strcase mode) "MR") ;右中
  55.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 2) '(73 . 2)) edata T)
  56.        )
  57.       ((= (strcase mode) "TL") ;左上
  58.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 0) '(73 . 3)) edata T)
  59.        )
  60.       ((= (strcase mode) "TC") ;中上
  61.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 1) '(73 . 3)) edata T)
  62.        )
  63.       ((= (strcase mode) "TR") ;右上
  64.        (EF:List-SubstAssoc (list (cons 11 pt10) '(72 . 2) '(73 . 3)) edata T)
  65.        )
  66.       (T edata)
  67.       ) ;end cond
  68.     ) ;entmode
  69. )
  70.   (setq edata (entget (cdr (assoc -1 edata)))) ;发现部分字形 entmake返回值错误所以重新生成一次edata
  71.   (setq newpt10 (cdr (assoc 10 edata)))
  72.   (setq ptdiv (mapcar '- pt10 newpt10))
  73.   (setq pt11 (cdr (assoc 11 edata)))
  74.   (setq pt11 (mapcar '+ ptdiv pt11))
  75.   (entmod (EF:List-SubstAssoc (list (cons 10 pt10) (cons 11 pt11)) edata T))
  76.   ) ;end defun
发表于 2010-2-2 02:47:00 | 显示全部楼层
  1. ;根据 lstSub 子表中的首元素 替换 lstSource 中对应表元
  2. (defun EF:List-SubstAssoc (lstSub ;需要替换的列表
  3.       lstSource ;源列表
  4.       bAdd  ;是否向源列表中追加 原本没有的元素
  5.       )
  6.   (foreach e lstSub
  7.     (if (setq e1 (assoc (car e) lstSource))
  8.       (setq lstSource (subst e (assoc (car e) lstSource) lstSource))
  9.       (if bAdd (setq lstSource (append lstSource (list e))))
  10.       )
  11.     )
  12.   )
 楼主| 发表于 2010-2-14 11:33:00 | 显示全部楼层

谢谢 elitefish

虎年快乐~~

发表于 2010-2-15 13:44:00 | 显示全部楼层
上面的程序好像对A和F两种对齐方式有点问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-1 23:43 , Processed in 0.201532 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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