乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 77|回复: 19

[编程交流] 文字拟合lisp

[复制链接]

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-5 13:20:12 | 显示全部楼层 |阅读模式
大家好,
 
我想知道是否有一个lisp例程,当你把一个dtext字符串放到一个矩形中时,它会缩小到适合里面?我查看了express工具中的“文字拟合”命令,但它只会收缩或拉伸长度。
 
谢谢
布瑞恩
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 13:26:30 | 显示全部楼层
文本属性之一是宽度因子,因此对于矩形,将文本高度设置为矩形高度宽度因子可能需要一个模糊因子,因为III与AAA的长度不同,因此取决于实际文本内容,这称为紧排。我会做一些像+或-或=重复接受的事情来获得效果。可能搜索Kern文本
 
使用多行文字和备用文本编辑器(带扩展(或收缩)字母间距的\T修饰符)发现此问题。
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 13:27:40 | 显示全部楼层
布莱恩,
“快速工具”命令“文本拟合”使用宽度因子收缩或拉伸文本字符串以匹配所需的长度,如果我理解正确,您还需要高度匹配。
也许是这样的
 
  1. (defun c:test (/      ss     esel   txtobj old_osm  ll ur
  2.        ll1    ur1    llpt   urpt   ulpt   brpt  llpt1 urpt1
  3.        ulpt1  brpt1  scf    nscf
  4.       )
  5. (prompt "\n Select the rectangle to fit text inside: ")
  6. (if
  7.    (and (setq ss (ssget "_:S:E" '((0 . "LWPOLYLINE"))))
  8. (setq esel (entsel "\nSelect the text to fit in the rectangle: "))
  9.    )
  10.     (progn
  11.       (setq txtobj (vlax-ename->vla-object (car esel)))
  12.       (if (equal (vla-get-ObjectName txtobj) "AcDbText")
  13. (progn
  14.    (setq old_osm (getvar "osmode"))
  15.    (setvar "osmode" 0)
  16.    (vla-getboundingbox
  17.      (vlax-ename->vla-object (ssname ss 0))
  18.      'll
  19.      'ur
  20.    )
  21.    (vla-getboundingbox txtobj 'll1 'ur1)
  22.    (setq llpt  (trans (vlax-safearray->list ll) 0 1)
  23.   urpt  (trans (vlax-safearray->list ur) 0 1)
  24.   ulpt  (list (car llpt) (cadr urpt) (caddr urpt))
  25.   brpt  (list (car urpt) (cadr llpt) (caddr llpt))
  26.   llpt1 (trans (vlax-safearray->list ll1) 0 1)
  27.    )
  28.    ;; setq
  29.    (vl-cmdf "move" (car esel) "" llpt1 llpt)
  30.    (vla-update txtobj)
  31.    (vla-getboundingbox txtobj 'll1 'ur1)
  32.    (setq llpt1 (trans (vlax-safearray->list ll1) 0 1)
  33.   urpt1 (trans (vlax-safearray->list ur1) 0 1)
  34.   ulpt1 (list (car llpt1) (cadr urpt1) (caddr urpt1))
  35.    )
  36.    ;; setq
  37.    (vl-cmdf "scale" (car esel) "" llpt "R" "@" ulpt1 ulpt "")
  38.    (vla-update txtobj)
  39.    (vla-getboundingbox txtobj 'll1 'ur1)
  40.    (setq llpt1 (trans (vlax-safearray->list ll1) 0 1)
  41.   urpt1 (trans (vlax-safearray->list ur1) 0 1)
  42.   brpt1 (list (car urpt1) (cadr llpt1) (caddr llpt1))
  43.   scf   (vla-get-scalefactor txtobj)
  44.   nscf  (/ (* (distance llpt brpt) scf) (distance llpt1 brpt1))
  45.    )
  46.    ;; setq
  47.    (vla-put-scalefactor txtobj nscf)
  48.    (setvar "osmode" old_osm)
  49. )
  50. ;; progn
  51.       )
  52.       ;; if
  53.     )
  54.     ;; progn
  55. )
  56. ;; if
  57. )

 
亨里克
回复

使用道具 举报

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-5 13:31:31 | 显示全部楼层
亨里克,
 
我想知道是否有办法缩小文本以适应内部,而不是拉伸和收缩以适应?
 
谢谢
布瑞恩
 
142014ps1fx22cvnl2o25n.jpg
文本收缩。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:35:44 | 显示全部楼层
尝试以下快速编写的代码:
 
  1. ([color=BLUE]defun[/color] c:tfit ( [color=BLUE]/[/color] ln pl pt tx )
  2.    ([color=BLUE]if[/color]
  3.        ([color=BLUE]and[/color]
  4.            ([color=BLUE]setq[/color] pl (LM:selectifobject [color=MAROON]"\nSelect LWPolyline: "[/color] [color=MAROON]"LWPOLYLINE"[/color]))
  5.            ([color=BLUE]setq[/color] tx (LM:selectifobject [color=MAROON]"\nSelect Text: "[/color] [color=MAROON]"TEXT"[/color]))
  6.            ([color=BLUE]setq[/color] pl ([color=BLUE]mapcar[/color] '[color=BLUE]cdr[/color] ([color=BLUE]vl-remove-if-not[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] x))) ([color=BLUE]entget[/color] pl)))
  7.                  ln ([color=BLUE]length[/color] pl)
  8.                  pt ([color=BLUE]mapcar[/color] '[color=BLUE]/[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]+[/color] pl)) ([color=BLUE]list[/color] ln ln))
  9.                  tx ([color=BLUE]entget[/color] tx)
  10.            )
  11.        )
  12.        ([color=BLUE]entmod[/color]
  13.            ([color=BLUE]subst[/color] '(72 . 1) ([color=BLUE]assoc[/color] 72 tx)
  14.                ([color=BLUE]subst[/color] '(73 . 2) ([color=BLUE]assoc[/color] 73 tx)
  15.                    ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 10 pt) ([color=BLUE]assoc[/color] 10 tx)
  16.                        ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 11 pt) ([color=BLUE]assoc[/color] 11 tx)
  17.                            ([color=BLUE]subst[/color]
  18.                                ([color=BLUE]cons[/color] 40
  19.                                    ([color=BLUE]*[/color] [highlight]0.8 [color=GREEN];; Text Gap[/highlight][/color]
  20.                                        ([color=BLUE]-[/color]
  21.                                            ([color=BLUE]cadr[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]max[/color] pl)))
  22.                                            ([color=BLUE]cadr[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]min[/color] pl)))
  23.                                        )
  24.                                    )
  25.                                )
  26.                                ([color=BLUE]assoc[/color] 40 tx)
  27.                                tx
  28.                            )
  29.                        )
  30.                    )
  31.                )
  32.            )
  33.        )
  34.    )
  35.    ([color=BLUE]princ[/color])
  36. )
  37.    
  38. [color=GREEN];; Select if Object  -  Lee Mac[/color]
  39. [color=GREEN];; Continuously prompts the user for a selection of a specific object[/color]
  40. ([color=BLUE]defun[/color] LM:SelectifObject ( msg obj [color=BLUE]/[/color] ent )
  41.    ([color=BLUE]while[/color]
  42.        ([color=BLUE]progn[/color] ([color=BLUE]setvar[/color] 'errno 0) ([color=BLUE]setq[/color] ent ([color=BLUE]car[/color] ([color=BLUE]entsel[/color] msg)))
  43.            ([color=BLUE]cond[/color]
  44.                (   ([color=BLUE]=[/color] 7 ([color=BLUE]getvar[/color] 'errno))
  45.                    ([color=BLUE]princ[/color] [color=MAROON]"\nMissed, try again."[/color])
  46.                )
  47.                (   ([color=BLUE]=[/color] 'ename ([color=BLUE]type[/color] ent))
  48.                    ([color=BLUE]if[/color] ([color=BLUE]/=[/color] obj ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 ([color=BLUE]entget[/color] ent))))
  49.                        ([color=BLUE]princ[/color] [color=MAROON]"\nInvalid Object Selected."[/color])
  50.                    )
  51.                )
  52.            )
  53.        )
  54.    )
  55.    ent
  56. )
  57. ([color=BLUE]princ[/color])

 
如有必要,调整突出显示的文字间距。
回复

使用道具 举报

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-5 13:38:13 | 显示全部楼层
李,
 
这正是我想要的,在看了你的代码后,我找到了一行,如果我需要把文本缩小,我可以。我真的很感谢你们在CadForum上给我的帮助。我正在慢慢地但肯定地学习如何编写小的简单例程,但我在阅读代码和学习每一行通过可视化Lisp编辑器所做的事情方面越来越好,Henrique aka(hmsilvia)向我展示了如何为Lisp例程设置动画,以便我能够理解它的工作原理。
 
再次感谢各位,
布瑞恩
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:40:22 | 显示全部楼层
欢迎您,Brian,当然,如果您对代码有任何问题,请提问。
回复

使用道具 举报

31

主题

106

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2022-7-5 13:42:41 | 显示全部楼层
你好
 
李,谢谢你的代码,它可以工作,但不是在所有情况下都可以。例如:

                               
登录/注册后可看大图

                               
登录/注册后可看大图


                               
登录/注册后可看大图
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:47:45 | 显示全部楼层
以下情况可能会更好:
  1. ([color=BLUE]defun[/color] c:tfit ( [color=BLUE]/[/color] ln pl pt tx )
  2.    ([color=BLUE]if[/color]
  3.        ([color=BLUE]and[/color]
  4.            ([color=BLUE]setq[/color] tx (LM:selectifobject [color=MAROON]"\nSelect text: "[/color] [color=MAROON]"TEXT"[/color]))
  5.            ([color=BLUE]setq[/color] pl (LM:selectifobject [color=MAROON]"\nSelect polyline: "[/color] [color=MAROON]"LWPOLYLINE"[/color]))
  6.            ([color=BLUE]setq[/color] pl ([color=BLUE]mapcar[/color] '[color=BLUE]cdr[/color] ([color=BLUE]vl-remove-if-not[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] x))) ([color=BLUE]entget[/color] pl)))
  7.                  pl ([color=BLUE]mapcar[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] x pl))) '([color=BLUE]min[/color] [color=BLUE]max[/color]))
  8.                  tx ([color=BLUE]entget[/color]  tx)
  9.                  tb ([color=BLUE]textbox[/color] tx)
  10.                  vc ([color=BLUE]mapcar[/color] '[color=BLUE]-[/color] (avgpt pl) ([color=BLUE]mapcar[/color] '[color=BLUE]+[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 tx)) (avgpt tb)))
  11.            )
  12.        )
  13.        ([color=BLUE]entmod[/color]
  14.            ([color=BLUE]subst[/color] '(72 . 1) ([color=BLUE]assoc[/color] 72 tx)
  15.                ([color=BLUE]subst[/color] '(73 . 2) ([color=BLUE]assoc[/color] 73 tx)
  16.                    ([color=BLUE]subst[/color] ([color=BLUE]cons[/color] 11 ([color=BLUE]mapcar[/color] '[color=BLUE]+[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 11 tx)) vc)) ([color=BLUE]assoc[/color] 11 tx)
  17.                        ([color=BLUE]subst[/color]
  18.                            ([color=BLUE]cons[/color] 40
  19.                                ([color=BLUE]*[/color]  ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 40 tx)) [highlight]0.9 [color=green];; Alter this to suit[/color][/highlight]
  20.                                    ([color=BLUE]apply[/color] '[color=BLUE]min[/color]
  21.                                        ([color=BLUE]mapcar[/color] '[color=BLUE]/[/color]
  22.                                            ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]-[/color] ([color=BLUE]reverse[/color] pl)))
  23.                                            ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]-[/color] ([color=BLUE]reverse[/color] ([color=BLUE]textbox[/color] tx))))
  24.                                        )
  25.                                    )
  26.                                )
  27.                            )
  28.                            ([color=BLUE]assoc[/color] 40 tx) tx
  29.                        )
  30.                    )
  31.                )
  32.            )
  33.        )
  34.    )
  35.    ([color=BLUE]princ[/color])
  36. )
  37. ([color=BLUE]defun[/color] avgpt ( lst )
  38.    (([color=BLUE]lambda[/color] ( len ) ([color=BLUE]mapcar[/color] '[color=BLUE]/[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]+[/color] lst)) ([color=BLUE]list[/color] len len))) ([color=BLUE]length[/color] lst))
  39. )
  40.    
  41. [color=GREEN];; Select if Object  -  Lee Mac[/color]
  42. [color=GREEN];; Continuously prompts the user for a selection of a specific object[/color]
  43. ([color=BLUE]defun[/color] LM:selectifobject ( msg obj [color=BLUE]/[/color] ent )
  44.    ([color=BLUE]while[/color]
  45.        ([color=BLUE]progn[/color] ([color=BLUE]setvar[/color] 'errno 0) ([color=BLUE]setq[/color] ent ([color=BLUE]car[/color] ([color=BLUE]entsel[/color] msg)))
  46.            ([color=BLUE]cond[/color]
  47.                (   ([color=BLUE]=[/color] 7 ([color=BLUE]getvar[/color] 'errno))
  48.                    ([color=BLUE]princ[/color] [color=MAROON]"\nMissed, try again."[/color])
  49.                )
  50.                (   ([color=BLUE]=[/color] 'ename ([color=BLUE]type[/color] ent))
  51.                    ([color=BLUE]if[/color] ([color=BLUE]/=[/color] obj ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 ([color=BLUE]entget[/color] ent))))
  52.                        ([color=BLUE]princ[/color] [color=MAROON]"\nInvalid Object Selected."[/color])
  53.                    )
  54.                )
  55.            )
  56.        )
  57.    )
  58.    ent
  59. )
  60. ([color=BLUE]princ[/color])
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:49:43 | 显示全部楼层
更新后的程序还好吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 23:30 , Processed in 1.285383 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表