明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 582|回复: 8

预估字符串所占的宽度

[复制链接]
发表于 2024-8-26 03:20:53 | 显示全部楼层 |阅读模式
如果一个字符串,预估它所占的宽度
整体预估函数,这样即可,整体预估会不准确,
  • ;;166 [功能] 预测字符长度 by st788796
  • (defun XD::Stringen (sty str h scl)
  •   (and (or (not sty)
  •          (= sty "")
  •          (not (tblsearch "style" sty))
  •        )
  •     (setq sty (getvar "textstyle"))
  •   )
  •   (abs
  •     (car
  •       (apply
  •         'mapcar
  •         (cons
  •           '-
  •           (textbox
  •             (list (cons 1 str) (cons 7 sty) (cons 40 h) (cons 41 scl))
  •           )
  •         )
  •       )
  •     )
  •   )
  • )
准确点应该智能拆分,逐个预估求和,
以下基本都是是本坛的函数,整理下子,
  1. ;将字符串拆分成单字符列表-------(一级)------
  2. (defun sl_text:stringexplode (str / defined strdefined rtnstr pos)
  3.   (setq defined
  4.     (list
  5.       "%%130" "%%131" "%%132" "%%133" "%%134" ;1~4级钢筋符号+特殊钢筋
  6.       "%%135" "%%136" "%%137" "%%138" ;L型钢+H型钢+槽型钢+工字钢
  7.       "%%150" "%%151" "%%152" "%%153" "%%154" "%%155" "%%156" "%%157" "%%158" "%%159" ;罗马数字
  8.       "%%177" "%%p" "%%P" ;正负号
  9.       "%%c" "%%C" "%%D" "%%d" "%%%";直径符号+度数符号+%
  10.       '("%%140" "%%141") '("%%142" "%%143") ;上下标开关
  11.       '("%%200" "%%201") '("%%202" "%%203") '("%%204" "%%205") ;圆圈数字
  12.     )
  13.   )
  14.   (while (> (strlen str) 0)
  15.     (cond
  16.       ((setq strdefined
  17.          (vl-some
  18.            '(lambda (sub / strdefined) (setq strdefined (if (listp sub) (car sub) sub)) (if (eq (substr str 1 (strlen strdefined)) strdefined) sub))
  19.            defined
  20.          )
  21.        )
  22.         (if (listp strdefined)
  23.           (if (setq pos (vl-string-search (cadr strdefined) str))
  24.             (setq rtnstr (cons (substr str 1 (+ pos (strlen (cadr strdefined)))) rtnstr) str (substr str (+ 1 pos (strlen (cadr strdefined)))))
  25.             (setq rtnstr (cons str rtnstr) str "")
  26.           )
  27.           (setq rtnstr (cons strdefined rtnstr) str (substr str (1+ (strlen strdefined))))
  28.         )
  29.       )
  30.       ((> (ascii (substr str 1 1)) 128) ;大于128为汉字
  31.         (if (and (>= (atoi (substr (ver) 13)) 2021) (/= (getvar "lispsys") 0))
  32.           (setq rtnstr (cons (substr str 1 1) rtnstr) str (substr str 2))
  33.           (setq rtnstr (cons (substr str 1 2) rtnstr) str (substr str 3))
  34.         )
  35.       )
  36.       (t
  37.         (setq rtnstr (cons (substr str 1 1) rtnstr) str (substr str 2))
  38.       )
  39.     )
  40.   )
  41.   (reverse rtnstr)
  42. )
  43. ;取字符-文字(宽度)----(一级)---
  44. ;;str;需要检测的字符串,如果为nil则取 ent(nil)文字内码表
  45. (defun sl_text:gettextwidth (str ent / box1 bo2)
  46.   (if (not str) (setq str (dxf1 ent 1)))
  47.   (setq box1 (textbox (sl:list-substassoc (list (cons 1 (strcat "m" str "m"))) ent T)))
  48.   (setq box2 (textbox (sl:list-substassoc (list (cons 1 "mm")) ent T)))
  49.   (- (- (caadr box1) (caar box1))
  50.     (- (caadr box2) (caar box2))
  51.   )
  52. )
  53. ;;预测字符所占宽度-----(一级)-----
  54. ;;str 字符 "千万不要忘记阶级斗争"
  55. ;;hi 字高 3.0  sty 文字样式 scl 文字宽高比
  56. ;;SLdesign V3.0  Mofify-Arrange By 尘缘一生  QQ:15290049
  57. (defun text:slstringlen (str hi sty scl / strlis ent wid)
  58.   (setq strlis (sl_text:stringexplode str) wid 0)
  59.   (setq ent
  60.     (list
  61.       (cons 40 hi)
  62.       (cons 41 scl)
  63.       (cons 7 sty)
  64.     )
  65.   )
  66.   (while (setq str0 (car strlis))
  67.     (setq wid (+ (sl_text:gettextwidth str0 ent) wid))
  68.     (setq strlis (cdr strlis))
  69.   )
  70.   wid
  71. )
  72. ;;测试---
  73. (defun c:tt (/ len)
  74.   (setq len (text:slstringlen "千万不要忘记阶级斗争" 3.0 "standard" 0.7))
  75.   len ;27.7812
  76. )



评分

参与人数 2明经币 +2 收起 理由
hubeiwdlue + 1 赞一个!
tranque + 1 很给力!

查看全部评分

发表于 2024-8-26 08:45:26 | 显示全部楼层
这个要做笔记,应该用得上的!

点评

收着吧,指定有用。  发表于 2024-8-26 17:35
发表于 2024-8-26 13:57:26 来自手机 | 显示全部楼层
厉害,这也是个常用的函数。

点评

只是有个头疼问题,字库,这个有关。  发表于 2024-8-26 17:33
发表于 2024-8-26 21:10:50 | 显示全部楼层
我是直接写出来,再求包围盒

点评

这么作是可以的,写出来,求得宽度,再删除掉,拐了个弯。因为有时候,我们并不需要写出来。  发表于 2024-8-26 21:26
发表于 2024-8-27 02:12:00 | 显示全部楼层
虽然cad官方在.net工具类自带一个字符串宽度,
但是没有字体渲染出来的正确,
甚至我为此学会了自己渲染字体...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 19:36 , Processed in 0.192306 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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