明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1045|回复: 21

[提问] 已知文字样式及文字高度,有没有办法测算出未知文本宽度?

[复制链接]
发表于 2024-8-2 21:13:30 | 显示全部楼层 |阅读模式
已知文字样式及文字高度,有没有办法测算出未知文本宽度?

如果文字为宋体,字高100,假如写入10个汉字,在未写入这些文字之前能不能算出写这些文字包围框有多宽
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-8-4 15:02:46 | 显示全部楼层
ludaweb 发表于 2024-8-3 22:22
(setq st (vlax-ename->vla-object (tblobjname "style" "Standard")))
获取宽度因子(vla-get-width st) ...

我做个测试,有的正确,有的不对,不知道咋回事

;计算多行文字所需宽度
(defun c:tt( / txt len)
  (setq txt "C12@200\n均长2917×9根")
  (setq len (GetMtxtWide txt 100 "\n"))
  (vl-cmdf "_mtext" (getpoint "\n文字插入点:") "J" "BL" "H" 100 "W" len txt "")
)
;字符串,字高,分隔符
(defun GetMtxtWide(str ZiGao FGF / txtStyl txtSize tBox txtWide)
  ;获取多行文本最大行字符串
  (defun MaxStr (OrigStr Split / strL pos maxLen mStr)
    (setq maxLen 0)
    (if (/= (substr OrigStr (- (strlen OrigStr) 1) 1) Split)
      (setq OrigStr (strcat OrigStr Split))
    )
    (while (setq pos (vl-string-search Split OrigStr))
      (progn
        (setq strL (substr OrigStr 1 pos))
        (setq OrigStr (substr OrigStr (+ pos 1 (strlen Split))))
        (if (> (strlen strL) maxLen)
          (progn
            (setq maxLen (strlen strL))
            (setq mStr strL)
          )
        )
      )
    )
    mStr
  )
  ;计算最大行文字所需宽度
  (setq str (MaxStr str FGF))
  (setq txtStyl (getvar "textstyle"))
  (setq txtSize (getvar "textsize"))
  (setvar "textstyle" txtStyl)
  (setvar "textsize" ZiGao)
  (setq tBox (textbox (list (cons 1 str))))
  (setq txtWide (- (car (cadr tBox)) (car (car tBox))))
  (if (/= txtStyl nil) (setvar "textstyle" txtStyl))
  (if (/= txtSize nil) (setvar "textsize" txtSize))
  txtWide
)
发表于 2024-8-3 15:18:27 | 显示全部楼层
tender138 发表于 2024-8-3 07:26
试过textbox了,不行

应该可以的,你再试试看,假设你宋体的字体样式是"Standard"
(setvar "textstyle" "Standard")(setvar "textsize" 100.0)(setq tBox (textbox (list (cons 1 "Test123测试"))))(- (car (cadr tBox)) (car (car tBox)))
发表于 2024-8-3 22:22:39 | 显示全部楼层
tender138 发表于 2024-8-3 21:47
非常感谢!我试过了,不对的原因是我用 -text 的时候设置了宽度因子。请问怎么获取当前文字的宽度因子?

(setq st (vlax-ename->vla-object (tblobjname "style" "Standard")))
获取宽度因子(vla-get-width st)
设置宽度因子(vla-put-width st 0.75)
发表于 2024-8-2 21:18:01 | 显示全部楼层
文字貌似没法准确算出包围框宽度、主要是不同字的宽度都不一样、高度也会有差别
发表于 2024-8-2 21:31:55 | 显示全部楼层
用textbox试试
发表于 2024-8-3 07:10:46 | 显示全部楼层
那要看你设定的文字高宽比,假如是高宽比为1:1,那文字的高度即是文字的宽度,就用100*10=1000就是你预计的10个文字的宽度,如果是高宽比为1:0.8,就用100*10*0.8=800就是你预计的10个文字的宽度,这样就不论文字样式,但要预知有几个字符,不知是不是你想要的。
 楼主| 发表于 2024-8-3 07:24:08 | 显示全部楼层
技术工作室 发表于 2024-8-3 07:10
那要看你设定的文字高宽比,假如是高宽比为1:1,那文字的高度即是文字的宽度,就用100*10=1000就是你预计的 ...

这是好办法,我试试,多谢老大
 楼主| 发表于 2024-8-3 07:26:36 | 显示全部楼层

试过textbox了,不行
发表于 2024-8-3 08:16:49 | 显示全部楼层
每个汉字应该不是固定宽度
发表于 2024-8-3 09:08:15 | 显示全部楼层
先用command在模型空间下生成一个设定内容(用于确认字符串的占用字节数nString)的text,再用textbox计算文本长度Len(如果要更准确,就加上字符串的高宽比作为参数),通过计算其它文本串的占用字节数Nstr/nString*Len得到它的实际长度。大体思路如此。
发表于 2024-8-3 09:14:14 | 显示全部楼层
你要的是结果,在乎的不是过程,对吧?
如果是这样就好办了:
直接生成文字,测出你想要的结果,再把文字删除就可以了
 楼主| 发表于 2024-8-3 12:14:10 | 显示全部楼层
lijiao 发表于 2024-8-3 09:14
你要的是结果,在乎的不是过程,对吧?
如果是这样就好办了:
直接生成文字,测出你想要的结果,再把文字删除就 ...

我最早就是这样做的,但搞不懂啥原因还是不准确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:22 , Processed in 0.189771 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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