明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 668|回复: 5

单行文本动态神缩之(二)

[复制链接]
发表于 2024-8-3 08:02:08 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-8-3 08:04 编辑

此前哪,这个问题发过一贴:

http://bbs.mjtd.com/thread-190578-1-1.html

然而,还缺少一个“原位各自伸缩”的功能,如下所示:

完善,加一TAB键切换这个功能,代码如下:
  1. ;将角度修正到0~2π之间-----(一级)-------
  2. (defun Angle-Mod (ang /)
  3.   (while (>= ang 2pi) (setq ang (- ang 2pi)))
  4.   (while (< ang 0) (setq ang (+ ang 2pi)))
  5.   ang
  6. )
  7. ;角度转换至1,4象限----(一级)------
  8. ;(angle-sharp ang)
  9. (defun angle-sharp (ang)
  10.   (setq ang (Angle-Mod ang))
  11.   (if (and (> ang pi2) (< ang pi)) (setq ang (+ ang pi)))
  12.   (if (and (>= ang pi) (<= ang 3pi2)) (setq ang (- ang pi)))
  13.   (if (equal ang 3pi2 0.01) (setq ang pi2))
  14.   (if (equal ang 2pi 0.01) (setq ang 0))
  15.   ang
  16. )
  17. ;更新图元定义数据内容----(一级)------
  18. ;ent 为实体nam obj 或实体表 entget
  19. (defun emod (ent i n / tp)
  20.   (setq tp (type ent))
  21.   (cond
  22.     ((= tp 'VLA-OBJECT)
  23.       (setq ent (entget (obj2en ent) '("*")))
  24.     )
  25.     ((= tp 'ENAME)
  26.       (setq ent (entget ent '("*")))
  27.     )
  28.   )
  29.   (if (= (assoc i ent) nil)
  30.     (entmod (append ent (list (cons i n))))
  31.     (subst (cons i n) (assoc i ent) ent)
  32.   )
  33. )
  34. ;取得图元参数值内容-----(一级)-------
  35. ;(setq h (dxf1 ent 40))
  36. ;ent 为实体nam obj 或实体表 entget
  37. (defun dxf1 (ent i / tmp tp)
  38.   (setq tp (type ent))
  39.   (cond
  40.     ((= tp 'VLA-OBJECT)
  41.       (setq ent (entget (obj2en ent) '("*")))
  42.     )
  43.     ((= tp 'ENAME)
  44.       (setq ent (entget ent '("*")))
  45.     )
  46.   )
  47.   (setq tmp (cdr (assoc i (vl-remove-if-not '(lambda (x) (= (car x) i)) ent))))
  48.   (if (null tmp)
  49.     (cond
  50.       ((= i 66) 0)
  51.       ((= i 48) (getvar "CELTSCALE"))
  52.       ((member i '(6 62))
  53.         (cdr (assoc i (entget (tblobjname "LAYER" (cdr (assoc 8 ent)))))) ;对象所在图层颜色
  54.       )
  55.       ((= i 370) -1)
  56.       ((= i 7) $hz)
  57.     )
  58.     tmp
  59.   )
  60. )
  61. ;计算cp到p1 p2的垂足点----(一级)------
  62. (defun pertolinecz (cp p1 p2 / norm)
  63.   (setq norm (mapcar '- p2 p1)
  64.     p1 (trans p1 0 norm)
  65.     cp (trans cp 0 norm)
  66.   )
  67.   (trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
  68. )
  69. ;;返回 vla对象->ename对象名-------(一级)------
  70. (defun obj2en (object)
  71.   (if (equal (type object) 'vla-object)
  72.     (setq object (vlax-vla-object->ename object))
  73.     object
  74.   )
  75.   object
  76. )

  77. ;;^^^^^^^^^^^^^以上为三领集成的函数

  78. ;;单行TEXT文本选择集-动态拉伸---(一级)----
  79. ;;功能 程序去除文字的前面空格,后面的空格,进行整体(各自单独)动态伸缩,保持角度,定位点不变
  80. ;三领设计 V3.0 Modify by 尘缘一生  QQ:15290049 2024.8.3 (精简后代码)
  81. (defun macedit-text (ss / ms1 ms2 ms3 pt bb loop p0 kk)
  82.   (defun sskk (ss pt kk / enam ent p tx ang i n m)
  83.     (setq n (sslength ss) m 0)
  84.     (while (< m n)
  85.       (setq enam (ssname ss m))
  86.       (setq ent (entget enam) p (dxf1 ent 10) tx (dxf1 ent 1) ang (angle-sharp (dxf1 enam 50)))
  87.       (while (= (substr tx 1 1) " ")
  88.         (setq tx (substr tx 2))
  89.       )
  90.       (setq i (strlen tx))
  91.       (while (= (substr tx i 1) " ")
  92.         (setq tx (substr tx 1 (1- i)) i  (strlen tx))
  93.       )
  94.       (if kk
  95.         (entmod (emod (emod (emod (emod ent 1 tx) 11 (pertolinecz pt p (polar p ang 300.0))) 72 5) 73 0)) ;变F(双穴点)定位,去前后空格,确保右侧对齐光标点
  96.         (entmod (emod (emod (emod (emod ent 1 tx) 11 (polar p ang (* 0.2 (distance pt p0)))) 72 5) 73 0))
  97.       )
  98.       ;(if (if-color) (vla-put-color (en2obj enam) (atoi (slsjqs))))
  99.       (setq m (1+ m))
  100.     )
  101.   )
  102.   ;;-------------
  103.   (setq ms1 "\n 文本动态伸缩>>>[对齐方式切换(TAB)](左、右键>退出)"
  104.     ms2 "当前<整体对齐伸缩>:"
  105.     ms3 "当前<各自伸缩>:"
  106.   )
  107.   (princ (strcat ms1 ms2))
  108.   (setq loop t kk t p0 (cadr (grread 5)))
  109.   (while loop
  110.     (setq bb (grread t 15 2) pt (cadr bb))
  111.     (cond
  112.       ((member bb '((2 9)));;table 键
  113.         (if (= kk t)
  114.           (progn (setq kk nil) (princ (strcat ms1 ms3)))
  115.           (progn (setq kk t) (princ (strcat ms1 ms2)))
  116.         )
  117.       )
  118.       ((= (car bb) 5)
  119.         (sskk ss pt kk)
  120.       )
  121.       ((member (car bb) '(3 11 25))  ;;左键 右键 定位退出
  122.         (setq loop nil)
  123.       )
  124.     )
  125.   )
  126.   ;(while (setq enam (ssname ss 0)) ;等同于(vl-cmdf "_.JustifyText" ss "" "L")
  127.   ;  (text:alignmod enam "L")
  128.   ;  (ssdel enam ss)
  129.   ;)
  130.   (princ)
  131. )
  132. ;;测试:框选TEXT,文字实体动态拉伸
  133. (defun c:tt ()
  134.   (princ "请选择文字->")
  135.   (macedit-text (ssget ":S" '((0 . "TEXT"))))
  136. )
广而告之:画图的话,你想学技巧,和灵活性,哪你就应该看三领是怎么画图的。从而,你才能知道,你的还有很多你没有开发和支持。

本帖子中包含更多资源

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

x
发表于 2024-8-3 09:00:44 | 显示全部楼层
不错,就是只支持“text” 尺寸等别的类型还没放出来
 楼主| 发表于 2024-8-3 09:13:55 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-8-3 09:15 编辑
bai2000 发表于 2024-8-3 09:00
不错,就是只支持“text” 尺寸等别的类型还没放出来

这个有了,MTEXT的就好集成了,
三领有集成部分支持。
MTEXT本身代码不一样,也可以MTEXT->text->变换->MTEXT
  • ;;框选TEXT,MTEXT..文字实体动态拉伸--------
  • (defun c:macedit ()
  •   (princ (slmsg "请选择文字->" "叫匡拒ゅ->" "Please select text entitys->"))
  •   (macedit-text (sstoslss (ssget ":S" '((0 . "ATTDEF,DIMENSION,TEXT,MTEXT,INSERT,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,TCH_MTEXT,ATTRIB")))))
  • )
  • ;;单行TEXT,MTEXT文本动态拉伸 ---(一级)----
  • (defun macedit0 (enam)
  •   (if (= (dxf1 enam 0) "MTEXT")
  •     (macedit-mtext enam)
  •     (macedit-text (ssadd enam))
  •   )
  • )


发表于 2024-8-3 09:46:33 | 显示全部楼层
最近和文字有点过不去啊
发表于 2024-8-3 17:46:30 | 显示全部楼层
利用分散对齐来伸缩文字,确实是个好办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 03:58 , Processed in 0.175755 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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