找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1618|回复: 16

[教学]:获取字符串长度----textbox

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-4-5 12:20:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
[php];|
在程序中经常用到标注文字下面画线,或者画表格时确定列宽,有的程序用
的是固定的长度这样在实际使用中在文字的多少变化或者更换字体后线长显
的不是很协调,用这个函数可以求得要标注字串的实际长度,最后再增加一
定的比例长度就会显得美观一些(经常使用的一个例子就是坐标标注,
理正、天正II都是固定块,实践中总觉得有时线长不美)

求文字长度当然用到 textbox 先看看其功能,

测量一个指定文本对象的尺寸,并返回围住该文本的一个矩形框的对角坐标
(textbox elist)

参数

elist

图元定义数据表,定义文字对象,其格式与 entget 函数返回的表的格式相同。
如果在 elist 表中定义文本参数(而不是文本本身)的域被省略,则使用
当前值或缺省值。

textbox 函数可以接受的最小的表是文本本身。

返回值

如果成功则返回一个包括两个点的表;否则返回 nil。
textbox 函数返回的点描述了文本对象的边框,假定该文本对象的插入点是
(0,0,0),而旋转角度是 0。通常,除非该文本对象是倾斜的、或者是垂直书写的、
或者它包含的字符串中有下行字符(如 g 和 p),否则函数返回的第一个子表是
点 (0.0 0.0 0.0)。
第一个点表的值指定从文本的插入点到围住该文本的最小矩形的左下角的偏移量。
第二个点表的值指定该矩形框的右上角。无论被测量文本的方向怎样,返回的两
个点表总是描述围住文本的矩形框的左下角和右上角。

样例

下面的命令提供文字,并使用其他参数的当前缺省设置:

命令:(textbox '((1 . "Hello world.")))

((0.000124126 -0.00823364 0.0) (3.03623 0.310345 0.0))

函数 textbox 返回文字对象矩形边框的对角点坐标。该函数的唯一参数是一个
图元定义表,该表的格式与 entget 返回表(组码及其值的关联表)的类型相同。
该表可以包含文字对象的完整关联表,也可以仅包括描述文字字符串的表。
函数 textbox 返回的点描述了文字对象的边框(一个假想的包含文字对象的框),
假定它的插入点位于 (0,0,0),且它的旋转角度为 0。返回的第一个表是点
(0.0 0.0 0.0),除非文字对象是斜的或垂直的,或者它包含下行字符
(例如 g 和 p)。第一个点表的值指定从文字插入点到边框左下角的距离,
该边框是包含此文字对象的最小矩形。第二个点表指定该边框的右上角。所返回
的点表总是该边框的左下角点和右上角点,而与文字测量的方向无关。

不管文字方向或样式如何,由 textbox 返回的点是用原点位于文字插入点
(组码 10)的对象坐标系 (OCS) 来表示的。当把由 textbox 返回的坐标
转换为定义了文字实际区域的点时,这个点可以被参照。

textbox返回值是text的对角点坐标,这里我们仅需要其长度----- X 坐标

在实际应用中,只要给textbox必要的信息就够了

str ------ 字符串,必须
h   ------ 标注字高,肯定要用的
wid ------ 宽度因子,影响线长

至于字体,在程序中一般会先行设定当前字体样式,这里取当前
|;

;;;获取字符串的实际长度
;;
;;pl - 字串表 hi - 字高 bl -比例
;;
(defun ea:text_length (str h wid /)
  (caadr (textbox
           (list (cons 40 h);字高
                 (cons 1 str);字串
                 (cons 41 wid);宽度因子
                 (cons 7 (getvar "textstyle"));字体样式
           )
         )
  )
)

;|

Examples

求测点坐标字串的最大长度

|;
(apply 'max
       (mapcar '(lambda (x) (ea:text_length (rtos x 2 3) 2.5 0.75))
               pt
       )
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-5 20:21:21 | 显示全部楼层
求教eachy斑竹,为什么textbox返回值函数第一点常不是(0.0 0.0 0.0)而(0.1。。e-14之类的浮点呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-5 21:01:49 | 显示全部楼层
不对吧!

既然是:
((0.000124126 -0.00823364 0.0) (3.03623 0.310345 0.0))   
要减一下的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-5 23:04:53 | 显示全部楼层
出题:求"abc  cde"(带空格)的每个字符(包括空格)所占的长度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-5 23:45:02 | 显示全部楼层
这么小的数值,会不会是计算机浮点运算误差?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-5 23:59:20 | 显示全部楼层
最初由 cy956 发布
[B]出题:求"abc  cde"(带空格)的每个字符(包括空格)所占的长度。 [/B]


晓东工具箱的 XDLSP.LSP 里面提供了很多字符串处理的通用函数,“中间有空格,前后有空格”的字符串都可以准确的求出长度。这些也是晓东工具箱里面排版的工具的基础。大家可以看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-6 00:08:06 | 显示全部楼层
最初由 陌生人 发布
[B]这么小的数值,会不会是计算机浮点运算误差? [/B]


那你写一个10000高的字试试

最初由 CY956 发布[B]
出题:求"abc cde"(带空格)的每个字符(包括空格)所占的长度。[/B]

一个个求咯.
"a" "ab""abc...,(还是应该倒过来?)
因为好象还跟字距有关系.(每个形不一样)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-6 06:19:19 | 显示全部楼层
最初由 cy956 发布
[B]出题:求"abc  cde"(带空格)的每个字符(包括空格)所占的长度。 [/B]

首尾空格没有意义,中间的和字符一样。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-4-6 08:26:29 | 显示全部楼层
最初由 eachy 发布
[B]
首尾空格没有意义,中间的和字符一样。 [/B]


首空格有意义的,排版的时候要考虑的。这样才能保持文字的位置关系。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-6 12:00:07 | 显示全部楼层
最初由 XDSoft 发布
[B]

首空格有意义的,排版的时候要考虑的。这样才能保持文字的位置关系。 [/B]

哦,看在什么方面的用途,空格不是一定要考虑的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-4-6 15:53:44 | 显示全部楼层
textbox只求出文本中能显示的笔划所占的范围,以插入点为(0,0)点,对于很多字体(如roman*系列),求出的第一坐标一般不是(0,0),而对于有倾角(Obliquing)的文字一般第一坐标也不为(0,0),至于很小的一个的数值(如7.7e-14),我理解应该是浮点误差,即使字高再大,相对值仍然很小。
字符间的间隔与字符空格都是在shx文件中定义的,只表示从上一字符结束到下一字符开始的“行笔”,没有实际绘制“图形”,所以,使用textbox函数是无法求出长度的。
以我的理解,求一个字符串的实际“包围盒”时,可以使用相减的办法。这里需要注意的是对于有倾角的字符串,应该按正串求(51组码替换为0),然后按字高、倾角计算“出界”的部分,否则容易出错。
对于前后包含空格的字符串,可以使用另加字符的方法,先加上,再减去,这个字符与下一个字符间的间距可以事先求得。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-6 16:33:09 | 显示全部楼层
我觉得首空格还是要考虑。
如果有空格,尽量能体现,这样才原滋原味
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-7 01:10:25 | 显示全部楼层
最初由 ll_j 发布
[B]textbox只求出文本中能显示的笔划所占的范围,以插入点为(0,0)点,对于很多字体(如roman*系列),求出的第一坐标一般不是(0,0),而对于有倾角(Obliquing)的文字一般第一坐标也不为(0,0),至于很小的一个的数值(?.. [/B]


不管你怎么写,都是包围盒


命令: (textbox(entget(car(entsel))))

选择对象: ((19.6875 -37.5 0.0) (1980.0 281.25 0.0))

如果是0,0 就不会提供我们两个点了.

你们为什么不自己试一下呢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-4-7 10:23:19 | 显示全部楼层
最初由 aeo 发布


其实我的意思是,在程序中进行插入点计算时,带有倾角的文本的包围盒计算价值不高这里包含了倾角的影响因素,比如:倾斜的“a”、“b”的包围盒相加在加上理论上的字符间距,不能求出倾斜的“ab”的包围盒。当然这种倾角的影响也可以在求出“a”、“b”的包围盒后分别去除,但我个人认为,不如先求正的文字的包围盒,然后再加上影响更方便些。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-25 08:48:29 | 显示全部楼层
我理解:
1.TEXTBOX忽略前后空格.
2.TEXTBOX不能直接求出中间空格的包围盒,需依计算.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-22 13:29 , Processed in 0.497284 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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