明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1263|回复: 19

[提问] 文字对齐基点与对齐点固定距离该如何实现呢

[复制链接]
发表于 2021-7-2 02:31 | 显示全部楼层 |阅读模式
2明经币
http://bbs.mjtd.com/thread-182535-1-1.html原贴地址,请大佬看下能否实现如下效果呢,想最终实现对齐点和基点在文字角度的方向上 相距是25 或者50等固定距离该如何实现呢

  • ;;******************************************************
  • ;;                  文字对齐
  • ;;******************************************************
  • ;;源码来源明经社区,最终由whuluqw修改 2020.11.01
  • (defun c:wzdq (/ ss ent amode obj i ii p px jd jdx jdy ang)
  •   (setvar "cmdecho" 0)
  •   ;;-------------------------
  •   (defun getdxf (ent ii)
  •     (if (= (type ent) 'ename)
  •       (setq ent (entget ent))
  •     )
  •     (cdr (assoc ii ent))
  •   )
  •   ;;-------------------------
  •   (defun ch_dxf (en num ch / old_num new_num ent)
  •     (if
  •       (setq ent     (entget en)
  •             new_num (cons num ch)
  •             old_num (assoc num ent)
  •       )
  •       (entmod (subst new_num old_num ent))
  •       (entmod (reverse (cons new_num (reverse ent))))
  •     )
  •   )
  •   ;;-------------------------
  •   (princ "\n选择要对齐的文字<退出>:")
  •   (if (setq ss (ssget '((0 . "TEXT"))))
  •     (progn
  •       (setq p (getpoint "指定对齐基点:"))
  •       (setq px (car p)
  •             py (cadr p)
  •       );;基点x和y坐标
  •       (initget "L C R")
  •       (setq amode (getkword "\n选择对齐方式[左(L)/中(C)/右(R)]<左>:"))
  •       (if (not amode)
  •         (setq amode "L")
  •       )
  •       (cond
  •         ((= amode "L")
  •          (setq ii 10)
  •          (command "justifytext" ss "" "L")
  •         )
  •         ((= amode "C")
  •          (setq ii 11)
  •          (command "justifytext" ss "" "C")
  •         )
  •         ((= amode "R")
  •          (setq ii 11)
  •          (command "justifytext" ss "" "R")
  •         )
  •       )
  •       (setq i 0)
  •       (while (< i (sslength ss))
  •         (setq ent (ssname ss i))
  •         (setq jd (getdxf ent ii))
  •         (setq jdx (car jd)
  •               jdy (cadr jd)
  •         )
  •         (princ )
  •         ;;;;;;;;;;;;;;;以下为添加代码 by whuluqw
  •         (setq ang (getdxf ent 50)) ;;获取文字转角
  •         (setq dx  (- jdx px)
  •               dy  (- jdy py)
  •         ) ;;指定对齐点和文字基点距离
  •         (setq dx2 (+ (* dx (cos ang)) (* dy (sin ang)))
  •               dy2 (- (* dy (cos ang)) (* dx (sin ang)))
  •         ) ;;求移动距离
  •         (setq newx (- jdx (* dx2 (cos ang)))
  •               newy (- jdy (* dx2 (sin ang)))
  •         )
  •         ;;;;;;;;;;;;;;以上为添加代码
  •         (setq newjd (list newx newy))
  •         (apply '(lambda (x) (ch_dxf x ii newjd)) (list ent))
  •         ;(vl-cmdf "_move" (ssname ss i) "" "non" jd "non" (list px jdy))
  •         (setq i (+ i 1))
  •       )
  •     )
  •   )
  •   (princ)
  • )

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-7-2 02:31 | 显示全部楼层
  1. ;;******************************************************
  2. ;;                  文字对齐
  3. ;;******************************************************
  4. ;;源码来源明经社区,最终由xvjiex修改 2021.07.02
  5. (defun c:wzdq (/ ss ent amode obj i ii p px jd jdx jdy ang th1)
  6.   (setvar "cmdecho" 0)
  7.   ;;-------------------------
  8.   (defun getdxf (ent ii)
  9.     (if (= (type ent) 'ename)
  10.       (setq ent (entget ent))
  11.     )
  12.     (cdr (assoc ii ent))
  13.   )
  14.   ;;-------------------------
  15.   (defun ch_dxf (en num ch / old_num new_num ent)
  16.     (if
  17.       (setq ent     (entget en)
  18.             new_num (cons num ch)
  19.             old_num (assoc num ent)
  20.       )
  21.       (entmod (subst new_num old_num ent))
  22.       (entmod (reverse (cons new_num (reverse ent))))
  23.     )
  24.   )
  25.   ;;-------------------------
  26.   (or dis(setq dis 50))
  27.   (setq th1 (getreal (strcat"\n请输入对齐基点与对齐点固定距离<"(rtos dis 2 3)">:")))
  28.   (if th1 (setq dis th1))
  29.   (princ "\n选择要对齐的文字<退出>:")
  30.   (if (setq ss (ssget '((0 . "TEXT"))))
  31.     (progn
  32.       (setq p (getpoint "指定对齐基点:"))
  33.       (setq px (car p)
  34.             py (cadr p)
  35.       );;基点x和y坐标
  36.       (initget "L C R")
  37.       (setq amode (getkword "\n选择对齐方式[左(L)/中(C)/右(R)]<左>:"))
  38.       (if (not amode)
  39.         (setq amode "L")
  40.       )
  41.       (cond
  42.         ((= amode "L")
  43.          (setq ii 10)
  44.          (command "justifytext" ss "" "L")
  45.         )
  46.         ((= amode "C")
  47.          (setq ii 11)
  48.          (command "justifytext" ss "" "C")
  49.         )
  50.         ((= amode "R")
  51.          (setq ii 11)
  52.          (command "justifytext" ss "" "R")
  53.         )
  54.       )
  55.       (setq i 0)
  56.       (while (< i (sslength ss))
  57.         (setq ent (ssname ss i))
  58.         (setq jd (getdxf ent ii))
  59.         (setq jdx (car jd)
  60.               jdy (cadr jd)
  61.         )
  62.         (princ )
  63.         ;;;;;;;;;;;;;;;以下为添加代码 by whuluqw
  64.         (setq ang (getdxf ent 50)) ;;获取文字转角
  65.         (setq dx  (- jdx px)
  66.               dy  (- jdy py)
  67.         ) ;;指定对齐点和文字基点距离
  68.         (setq dx2 (-(+ (* dx (cos ang)) (* dy (sin ang)))dis)
  69.               dy2 (- (* dy (cos ang)) (* dx (sin ang)))
  70.         ) ;;求移动距离
  71.         (setq newx (- jdx (* dx2 (cos ang)))
  72.               newy (- jdy (* dx2 (sin ang)))
  73.         )
  74.         ;;;;;;;;;;;;;;以上为添加代码
  75.         (setq newjd (list newx newy))
  76.         (apply '(lambda (x) (ch_dxf x ii newjd)) (list ent))
  77.         ;(vl-cmdf "_move" (ssname ss i) "" "non" jd "non" (list px jdy))
  78.         (setq i (+ i 1))
  79.       )
  80.     )
  81.   )
  82.   (princ)
  83. )

评分

参与人数 1明经币 +1 收起 理由
yangchao2005090 + 1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-7-2 10:17 | 显示全部楼层

大佬,如果想把左右中那个取消,不用选择,默认就是左对齐方式,可以吗
回复

使用道具 举报

 楼主| 发表于 2021-7-2 13:45 | 显示全部楼层

大佬还想请教个问题,比如我的某些文字默认是中间对齐的,用程序后因为是左对齐的缘故,最终文字本身对齐点会变成左对齐,可否最后恢复到原有文字的对齐点呢

评分

参与人数 1明经币 +1 收起 理由
xvjiex + 1 淡定

查看全部评分

回复

使用道具 举报

发表于 2021-7-2 15:35 | 显示全部楼层
本帖最后由 xvjiex 于 2021-7-5 12:23 编辑

要做是可以的,但是用原来的程序会比较麻烦。原来的程序是先统一所选文字的对齐点(左、中、右对齐),然后计算目标对齐距离,再逐个移动到位。如果用原程序,必须先记住每行文字的原始对齐点,对齐后再逐个恢复原始对齐点,还不如另辟蹊径。
根据楼主要求更改如下:1.文字改为单选。2.偏移值通过单选时按S键开启设置。3.对齐点全部改为左对齐。4.能在编组内实现调整对齐。5.单选采用循环操作(常规优化)。


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
magicheno + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-7-2 20:47 | 显示全部楼层
本帖最后由 magicheno 于 2021-7-3 00:40 编辑
xvjiex 发表于 2021-7-2 15:35
要做是可以的,但是用原来的程序会比较麻烦。原来的程序是先统一所选文字的对齐点(左、中、右对齐),然后计 ...

大佬,很给力哈,不过测试后发现一个BUG,就是输入对起点与基点的位置是文字边界至基点的距离哈,但是有些字母对齐点不在文字边上上的,还偏一点的,这样子效果上就出差错啦,比如YL文字当shx字体为romand字体的时候,就有问题了
回复

使用道具 举报

发表于 2021-7-3 01:56 | 显示全部楼层
已经优化,请重新下载测试。没有测试文件,不知道情况如何。
回复

使用道具 举报

 楼主| 发表于 2021-7-3 02:08 | 显示全部楼层
xvjiex 发表于 2021-7-3 01:56
已经优化,请重新下载测试。没有测试文件,不知道情况如何。

大佬,测试了下,貌似还是有问题哈,测试文件上传喽,方便的时候看下哦

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2021-7-3 12:03 | 显示全部楼层
图纸里看到4个编组,没发现出差错的对齐文字。此插件不能应对编组。
回复

使用道具 举报

 楼主| 发表于 2021-7-3 12:11 | 显示全部楼层
本帖最后由 magicheno 于 2021-7-3 12:13 编辑
xvjiex 发表于 2021-7-3 12:03
图纸里看到4个编组,没发现出差错的对齐文字。此插件不能应对编组。

大佬,编组关掉后,文字对齐点至基点的位置不对的哈,还有就是怎样可以实现编组打开状态了不影响呢,之前改的那个可以的哈

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 15:25 , Processed in 0.164296 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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