明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4775|回复: 13

[提问] 改变文字的对齐方式

[复制链接]
发表于 2013-8-1 11:32 | 显示全部楼层 |阅读模式
(defun c:mb ()
(setvar "cmdecho" 0)
(setq ss (ssget))
(setq ent1 (entget (ssname ss 0)))
(setq oldsize (assoc 72 ent1))       
(setq newsize (cons 72 1))
(setq ent2 (subst newsize oldsize ent1))
(entmod ent2)
(setvar "cmdecho" 1)
(princ)
)
用编写的lisp改变字符的对齐方式后,虽然文字的对齐方式改了,却不在原来的位置上了。怎么做到,改变了文字的对齐方式,又不改变文字的位置呢?
发表于 2013-8-1 14:21 | 显示全部楼层
这个问题用AutoLisp是很复杂的,因为UCS、文字空格、转角、倾斜角、对齐方式这些因素的存在,即使计算包围盒,也不是个小工程量。
好在自动桌子已经为我们考虑了这一点,所以在ET工具中已经有了解决方案,那就是命令tjust,如果需要在自己的程序中借用这个函数,需要加载acetutil3.fas,函数为acet-tjust,函数调用格式为:
(acet-tjust ss j)
ss 文字选择集,j 对齐方式:Start Right等等(见tjust.lsp)。
回复 支持 0 反对 1

使用道具 举报

发表于 2013-8-1 13:07 | 显示全部楼层
用改变前后文字的包围盒的左下点。移动下文字。

楼主试试。
 楼主| 发表于 2013-8-1 13:35 | 显示全部楼层
wowan1314 发表于 2013-8-1 13:07
用改变前后文字的包围盒的左下点。移动下文字。

楼主试试。

知道lisp中存在什么问题吗?如果知道,就请指出来,谢了

点评

有什么问题? 你的代码不能运行? 还是什么  发表于 2013-8-1 13:38
发表于 2013-8-1 13:46 | 显示全部楼层
958620832 发表于 2013-8-1 13:35
知道lisp中存在什么问题吗?如果知道,就请指出来,谢了

帮你整理一下代码。
  1. (defun c:mb (/ ss a ent1 oldsize newsize ent2)
  2.     (setvar "cmdecho" 0)
  3.     (setq ss (ssget) a -1)
  4.     (while (setq ent1 (entget (ssname ss (setq a (1+ a)))))
  5.         (setq oldsize (assoc 72 ent1))
  6.         (setq newsize (cons 72 1)) ;;另外对齐样式 还与73组码有关。我没研究过
  7.         (setq ent2 (subst newsize oldsize ent1))
  8.         (entmod ent2)
  9.     )
  10.     (setvar "cmdecho" 1)
  11.     (princ)
  12. )
发表于 2013-8-1 14:28 | 显示全部楼层
ll_j 发表于 2013-8-1 14:21
这个问题用AutoLisp是很复杂的,因为UCS、文字空格、转角、倾斜角、对齐方式这些因素的存在,即使计算包围盒 ...

包围盒就用textbox函数。 这个函数不是已经 把 空格 角度 对齐方式都考虑了吗?
发表于 2013-8-1 14:35 | 显示全部楼层
wowan1314 发表于 2013-8-1 14:28
包围盒就用textbox函数。 这个函数不是已经 把 空格 角度 对齐方式都考虑了吗?

理论上是这样,但在不同的UCS和对齐方式下,尤其是有倾斜角的时候,计算这样的包围盒还是很复杂的,记得前一阵子晓东那个文字翻转的题目吧(http://www.xdcad.net/forum/thread-667619-1-1.html)?我是用ALisp写的(不会VLisp),那个代码可是长啊。

点评

那个帖子是3D的情况,2D情况会好弄些。  发表于 2013-8-1 14:47
发表于 2013-8-1 15:01 | 显示全部楼层
wowan1314 发表于 2013-8-1 14:28
包围盒就用textbox函数。 这个函数不是已经 把 空格 角度 对齐方式都考虑了吗?

你把中心对齐、文字样式带一个倾斜角的文字换一个对齐点试试。
发表于 2013-8-1 17:21 | 显示全部楼层
justifytext

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1

查看全部评分

发表于 2013-8-2 20:09 | 显示全部楼层
我的还是最简单的吧,贴给大家
;----------修改选定文字对象的对正点而不改变其位置
(defun c:GZ1 () (princ "文字工具 改字对正点:\n") (command "JUSTIFYTEXT")(princ))        ;改字对正点不改其位置

;----------放大或缩小文字对象,而不改变它们的位置
(defun c:GZ2 () (princ "文字工具 缩字不变位:\n") (command "SCALETEXT")(princ))          ;缩放字对正点不改其位置

;----------修改字对正点(都不改变其位置)开始
(defun c:jl (/ s) (princ "文字工具 改字左对正:\n")                                      ;文字左对正
  (setvar "cmdecho" 0)
  (setq s (ssget))
  (if (/= s nil)(command "_justifytext" s "" "l"))
  (setvar "cmdecho" 1)
  (setq s nil)
  (princ)
)
(defun c:jc (/ s) (princ "文字工具 改字中对正:\n")                                      ;文字中间对正
  (setvar "cmdecho" 0)
  (setq s (ssget))
  (if (/= s nil)(command "_justifytext" s "" "c"))
  (setvar "cmdecho" 1)
  (setq s nil)
  (princ)
)
(defun c:jm (/ s) (princ "文字工具 改字心对正:\n")                                      ;文字中心对正
  (setvar "cmdecho" 0)
  (setq s (ssget))
  (if (/= s nil)(command "_justifytext" s "" "m"))
  (setvar "cmdecho" 1)
  (setq s nil)
  (princ)
)
(defun c:jr (/ s) (princ "文字工具 改字右对正:\n")                                      ;文字右对正
  (setvar "cmdecho" 0)
  (setq s (ssget))
  (if (/= s nil)(command "_justifytext" s "" "r"))
  (setvar "cmdecho" 1)
  (setq s nil)
  (princ)
)
(defun c:jf (/ s) (princ "文字工具 改字调整对正:\n")                                    ;文字调整对正
  (setvar "cmdecho" 0)
  (setq s (ssget))
  (if (/= s nil)(command "_justifytext" s "" "f"))
  (setvar "cmdecho" 1)
  (setq s nil)
  (princ)
)
;----------修改字对正点(都不改变其位置)结束
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-6 00:48 , Processed in 0.280062 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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