找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 580|回复: 2

[每日一码] 文字从指定位置断开两部分

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-1-18 12:55:01 | 显示全部楼层 |阅读模式

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

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

×
BreakTextInplace02.png

  1. (defun c:BreakTextInplace (/            ActDoc   Sel      Obj      Str
  2.                            Rot            Pt             tempText ll       ur
  3.                            cnt            DistList Dist     PtDist   Oldll
  4.                            *error*  Newll    tempList StrList  InsPt
  5.                            AliPt
  6.                           )

  7.                                         ; Breaks a text object selected at the character it is selected into two text objects, with them being
  8.                                         ;  in the same location as they were when they were one text object.  Only works with left and right
  9.                                         ;  justifications, and all that go along with them (top, bottom and center).
  10.                                         ; Sub's - 'FontLetterWidth 'DistPtsAng 'RemoveSpace 'IntersOfPoints

  11.   (defun *error* (msg)
  12.     (vla-EndUndoMark ActDoc)
  13.     (prompt (strcat "\n Error--> " msg))
  14.   )
  15.                                         ;---------------------------------------------------------------------
  16.   (setq ActDoc (vla-get-ActiveDocument (vlax-get-Acad-Object)))
  17.   (vla-EndUndoMark ActDoc)
  18.   (vla-StartUndoMark ActDoc)
  19.   (if
  20.     (and
  21.       (setq Sel
  22.              (entsel
  23.                "\n Select text object to break (in the middle of the character to break at): "
  24.              )
  25.       )
  26.       (setq Obj (vlax-ename->vla-object (car Sel)))
  27.       (= (vla-get-ObjectName Obj) "AcDbText")
  28.       (setq Str (vla-get-TextString Obj))
  29.       (setq Rot (vla-get-Rotation Obj))
  30.       (setq Pt (trans (cadr Sel) 1 0))
  31.       (vl-position (vla-get-Alignment Obj) '(0 2 6 8 9 11 12 14))
  32.     )
  33.      (progn
  34.        (vla-GetBoundingBox Obj 'll 'ur)
  35.        (setq Oldll (safearray-value ll))
  36.        (setq AliPt
  37.               (IntersOfPoints
  38.                 Oldll
  39.                 (vlax-get
  40.                   Obj
  41.                   (if (equal (vla-get-Alignment Obj) 0)
  42.                     'InsertionPoint
  43.                     'TextAlignmentPoint
  44.                   )
  45.                 )
  46.                 Rot
  47.               )
  48.        )
  49.        (setq tempText (vlax-invoke Obj 'Copy))
  50.        (vla-put-Rotation tempText 0.0)
  51.        (vla-GetBoundingBox tempText 'll 'ur)
  52.        (setq ll (safearray-value ll))
  53.        (setq cnt 0)
  54.        (setq Newll Oldll)
  55.        (setq tempList (FontLetterWidth ActDoc Obj))
  56.        (setq DistList (car tempList))
  57.        (setq Dist 0.0)
  58.        (setq PtDist (DistPtsAng Oldll Pt Rot))
  59.        (while (or (< Dist PtDist) (> cnt (strlen Str)))
  60.          (setq Dist (+ Dist (nth cnt DistList)))
  61.          (if (< Dist PtDist)
  62.            (progn
  63.              (setq Newll (polar Newll Rot (nth cnt DistList)))
  64.              (setq cnt (1+ cnt))
  65.            )
  66.          )
  67.        )
  68.        (setq StrList (cadr tempList))
  69.        (foreach        pair StrList
  70.          (if
  71.            (and
  72.              (<= (car pair) cnt)
  73.              (not (or (= (cdr pair) "%%U") (= (cdr pair) "%%O")))
  74.            )
  75.             (setq cnt (+ cnt 2))
  76.          )
  77.        )
  78.        (vla-put-TextString Obj (RemoveSpace (substr Str 1 cnt)))
  79.        (setq tempStr (vla-get-TextString Obj))
  80.        (setq tempStr2 (strcase (substr tempStr (- (strlen tempStr) 2))))
  81.        (if (or (= tempStr2 "%%U") (= tempStr2 "%%O"))
  82.          (vla-put-TextString
  83.            Obj
  84.            (RemoveSpace (substr tempStr 1 (- (strlen tempStr) 3)))
  85.          )
  86.        )
  87.        (vla-GetBoundingBox Obj 'll 'ur)
  88.        (setq ll (safearray-value ll))
  89.        (setq InsPt
  90.               (vlax-get
  91.                 Obj
  92.                 (if (equal (vla-get-Alignment tempText) 0)
  93.                   'InsertionPoint
  94.                   'TextAlignmentPoint
  95.                 )
  96.               )
  97.        )
  98.        (vlax-invoke Obj 'Move (IntersOfPoints ll InsPt Rot) AliPt)
  99.        (vla-put-TextString
  100.          tempText
  101.          (strcat
  102.            (if (and StrList (> (rem (length StrList) 2) 0))
  103.              (cdar StrList)
  104.              ""
  105.            )
  106.            (RemoveSpace (substr Str (1+ cnt)))
  107.          )
  108.        )
  109.        (vla-put-Rotation tempText Rot)
  110.        (vla-GetBoundingBox tempText 'll 'ur)
  111.        (setq ll (safearray-value ll))
  112.        (setq InsPt
  113.               (vlax-get
  114.                 tempText
  115.                 (if (equal (vla-get-Alignment tempText) 0)
  116.                   'InsertionPoint
  117.                   'TextAlignmentPoint
  118.                 )
  119.               )
  120.        )
  121.        (vlax-invoke
  122.          tempText
  123.          'Move
  124.          (IntersOfPoints ll InsPt Rot)
  125.          (IntersOfPoints Newll AliPt Rot)
  126.        )
  127.        (vla-Highlight tempText 1)
  128.      )
  129.      (cond
  130.        ((not Sel)
  131.         (prompt "\n No object selected.")
  132.        )
  133.        ((not Str)
  134.         (prompt "\n Object selected was not a plain text object.")
  135.        )
  136.        (T
  137.         (prompt
  138.           "\n Text object selected does not have an alignment that would work."
  139.         )
  140.        )
  141.      )
  142.   )
  143.   (vla-EndUndoMark ActDoc)
  144.   (princ)
  145. )
  146.                                         ;-------------------------------------------------------------------------------
  147. (defun DistPtsAng (Pt1 Pt2 Ang / Pt1a Pt2a Pt3)

  148.   (setq Pt1a (polar Pt1 Ang 0.001))
  149.   (setq Pt2a (polar Pt2 (+ 1.5708 Ang) 0.001))
  150.   (setq Pt3 (inters Pt1 Pt1a Pt2 Pt2a nil))
  151.   (distance Pt1 Pt3)
  152. )
  153.                                         ;-------------------------------------------------------------------------------
  154. (defun IntersOfPoints (Xval Yval Ang / Pt1 Pt2)

  155.   (setq Pt1 (polar Yval Ang 0.001))
  156.   (setq Pt2 (polar Xval (+ 1.5708 Ang) 0.001))
  157.   (inters Xval Pt2 Yval Pt1 nil)
  158. )
  159.                                         ;-------------------------------------------------------------------------------
  160. (defun FontLetterWidth (Doc           TextObj    /                 MdSpc
  161.                         StyCol           Sty              FontName         DictCol
  162.                         DictObj           cnt              CurLtr         tempText
  163.                         ll           ur              Dist         FontWidthList
  164.                         WidthList  StyName    String         TextWd
  165.                         TextHt           StyDictObj tempStrList
  166.                         tempList   tempStr
  167.                        )
  168.                                         ; Returns a list of distances for the text string of the object supplied.  The distances are that of each
  169.                                         ;  letter in the string starting from the lower left bounding box point of the text, when the text is rotated
  170.                                         ;  to 0.0 degrees.
  171.                                         ; Idea from 'SomeCallMeDave' @ theswamp.  Thanks again.

  172.   (setq StyName (vla-get-StyleName TextObj))
  173.   (setq String (vla-get-TextString TextObj))
  174.   (setq TextWd (vla-get-ScaleFactor TextObj))
  175.   (setq TextHt (vla-get-Height TextObj))
  176.   (setq TextLen (strlen String))
  177.   (setq cnt -1)
  178.   (while (setq cnt (vl-string-search "%%" String (setq cnt (1+ cnt))))
  179.     (setq tempStrList
  180.            (cons (cons (1+ cnt)
  181.                        (setq
  182.                          tempStr (strcase (substr String (1+ cnt) 3))
  183.                        )
  184.                  )
  185.                  tempStrList
  186.            )
  187.     )
  188.   )
  189.   (setq MdSpc (vla-get-ModelSpace Doc))
  190.   (setq StyCol (vla-get-TextStyles Doc))
  191.   (setq Sty (vla-Item StyCol StyName))
  192.   (setq        FontName
  193.          (if (findfile (vla-get-fontFile Sty))
  194.            (vl-filename-base (vla-get-fontFile Sty))
  195.            (vl-filename-base (getvar "fontalt"))
  196.          )
  197.   )
  198.                                         ;(setq DictCol (vla-get-Dictionaries Doc))
  199.                                         ;(if (vl-catch-all-error-p (setq DictObj (vl-catch-all-apply 'vla-Item (list DictCol "MyFontWidthDict"))))
  200.                                         ; (setq DictObj (vla-Add DictCol "MyFontWidthDict"))
  201.                                         ;)
  202.                                         ;(if (vl-catch-all-error-p (setq StyDictObj (vl-catch-all-apply 'vla-Item (list DictObj StyName))))
  203.                                         ; (setq StyDictObj (vla-Add DictObj StyName))
  204.                                         ;)
  205.   (setq cnt 1)
  206.   (while (<= cnt TextLen)
  207.     (if        (setq tempList (assoc cnt tempStrList))
  208.       (progn
  209.         (setq CurLtr (cdr tempList))
  210.         (setq cnt (+ cnt 2))
  211.       )
  212.       (setq CurLtr (substr String cnt 1))
  213.     )
  214.     (if        (not (assoc CurLtr FontWidthList))
  215.       (progn
  216.         (cond
  217.           ((= CurLtr " ")
  218.            (setq tempText (vlax-invoke
  219.                             MdSpc 'AddText "AA"        '(0.0 0.0 0.0) 1.0)
  220.            )
  221.            (vla-put-Height tempText 1.0)
  222.            (vla-put-ScaleFactor tempText 1.0)
  223.            (vla-put-StyleName tempText StyName)
  224.            (vla-GetBoundingBox tempText 'll 'ur)
  225.            (setq ll (safearray-value ll))
  226.            (setq ur (safearray-value ur))
  227.            (setq Dist (distance (cons (car ll) (cdr ur)) ur))
  228.            (vla-put-TextString tempText (strcat "A" CurLtr "A"))
  229.            (vla-GetBoundingBox tempText 'll 'ur)
  230.            (setq ll (safearray-value ll))
  231.            (setq ur (safearray-value ur))
  232.            (setq Dist
  233.                   (* TextWd
  234.                      (*        TextHt
  235.                         (- (distance (cons (car ll) (cdr ur)) ur) Dist)
  236.                      )
  237.                   )
  238.            )
  239.            (setq FontWidthList (cons (cons CurLtr Dist) FontWidthList))
  240.            (vla-Delete tempText)
  241.           )
  242.           ((and (equal cnt 3) (or (= CurLtr "%%U") (= CurLtr "%%O")))
  243.            (setq tempText (vlax-invoke
  244.                             MdSpc 'AddText "A" '(0.0 0.0 0.0) 1.0)
  245.            )
  246.            (vla-put-Height tempText 1.0)
  247.            (vla-put-ScaleFactor tempText 1.0)
  248.            (vla-put-StyleName tempText StyName)
  249.            (vla-GetBoundingBox tempText 'll 'ur)
  250.            (setq ll (safearray-value ll))
  251.            (setq ur (safearray-value ur))
  252.            (setq tempPt (cons (car ll) (cdr ur)))
  253.            (vla-put-TextString tempText (strcat CurLtr "A"))
  254.            (vla-GetBoundingBox tempText 'll 'ur)
  255.            (setq ll (safearray-value ll))
  256.            (setq ur (safearray-value ur))
  257.            (setq Dist (* TextWd
  258.                          (* TextHt
  259.                             (distance (cons (car ll) (cdr ur)) tempPt)
  260.                          )
  261.                       )
  262.            )
  263.            (setq FontWidthList (cons (cons CurLtr Dist) FontWidthList))
  264.            (vla-Delete tempText)
  265.           )
  266.           (T
  267.            (setq tempText (vlax-invoke
  268.                             MdSpc 'AddText CurLtr '(0.0 0.0 0.0) 1.0)
  269.            )
  270.            (vla-put-Height tempText 1.0)
  271.            (vla-put-ScaleFactor tempText 1.0)
  272.            (vla-put-StyleName tempText StyName)
  273.            (vla-GetBoundingBox tempText 'll 'ur)
  274.            (setq ll (safearray-value ll))
  275.            (setq ur (safearray-value ur))
  276.            (setq Dist (distance (cons (car ll) (cdr ur)) ur))
  277.            (vla-put-TextString tempText (strcat CurLtr CurLtr))
  278.            (vla-GetBoundingBox tempText 'll 'ur)
  279.            (setq ll (safearray-value ll))
  280.            (setq ur (safearray-value ur))
  281.            (setq Dist
  282.                   (* TextWd
  283.                      (*        TextHt
  284.                         (- (distance (cons (car ll) (cdr ur)) ur) Dist)
  285.                      )
  286.                   )
  287.            )
  288.            (setq FontWidthList (cons (cons CurLtr Dist) FontWidthList))
  289.            (vla-Delete tempText)
  290.           )
  291.         )
  292.       )
  293.     )
  294.     (if        (and (not (equal cnt 3))
  295.              (or (= CurLtr "%%U") (= CurLtr "%%O"))
  296.         )
  297.       (repeat 3
  298.         (setq WidthList (cons 0.0 WidthList))
  299.       )
  300.       (if (or (= CurLtr "%%U") (= CurLtr "%%O"))
  301.         (repeat        3
  302.           (setq
  303.             WidthList (cons (/ (cdr (assoc CurLtr FontWidthList)) 3.0)
  304.                             WidthList
  305.                       )
  306.           )
  307.         )
  308.         (setq WidthList
  309.                (cons (cdr (assoc CurLtr FontWidthList)) WidthList)
  310.         )
  311.       )
  312.     )
  313.     (setq cnt (1+ cnt))
  314.   )
  315.   (list (reverse WidthList) tempStrList)
  316. )
  317.                                         ;--------------------------------------------------------------------------
  318. (defun RemoveSpace (String / cnt)
  319.                                         ; Remove spaces from begining and end of string

  320.   (While (= (substr String 1 1) " ")
  321.     (setq String (substr String 2 (strlen String)))
  322.   )
  323.   (setq cnt (strlen String))
  324.   (while (= (substr String cnt 1) " ")
  325.     (setq cnt (1- cnt))
  326.   )
  327.   (substr String 1 cnt)
  328. )


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

已领礼包: 225个

财富等级: 日进斗金

发表于 2021-1-18 17:25:10 | 显示全部楼层
谢谢分享!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-4-5 13:09:03 | 显示全部楼层
可以拿来做排版的子函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 15:59 , Processed in 0.169270 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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