找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1292|回复: 20

[已解决] 求把不规则文字或数字对齐并居中到线段的lisp程序!求赐教

[复制链接]

已领礼包: 272个

财富等级: 日进斗金

发表于 2020-3-20 06:27:26 | 显示全部楼层 |阅读模式
悬赏20D豆已解决
本帖最后由 相信自己666 于 2020-3-20 06:36 编辑

求把不规则文字或数字对齐并居中到线段,文字距离线段可选填间距或固定间距1.5左右,求大师赐教lisp程序,十分感谢!
把不规则文字或数字对齐并居中到线段.jpg

把不规则文字或数字对齐并居中到线段.rar

22.6 KB, 下载次数: 15, 下载积分: D豆 -1 , 活跃度 1

最佳答案

查看完整内容

已更新,这个是通用式的。当然,还是应你的需求写在下面 (defun c:tt2(/ olddyn ss i ent type_e line poend pomid ang s_text text potext height poinsert ang0) (defun lr(l_st) (- (apply '+ (mapcar '(lambda (x y)(* (car x)(cadr y))) l_st (append (cdr l_st) (list (car l_st))))) (apply '+ (mapcar '(lambda (x y)(* (car y)(cadr x))) l_st (append (cdr l_st) (list (car l_st))))))) (prompt ...

评分

参与人数 1D豆 +5 收起 理由
xdcad9819 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-3-20 06:27:27 | 显示全部楼层
本帖最后由 pxr201419 于 2020-3-22 10:47 编辑
相信自己666 发表于 2020-3-21 07:23
好的谢谢老师,最好可以框选文字2行文字批量对齐,这个就不用一个个选中了,感激!

已更新,这个是通用式的。当然,还是应你的需求写在下面
(defun c:tt2(/ olddyn ss i ent type_e line poend pomid ang s_text text potext height poinsert ang0)
   (defun lr(l_st)
      (- (apply '+ (mapcar '(lambda (x y)(* (car x)(cadr y))) l_st (append (cdr l_st) (list (car l_st)))))
         (apply '+ (mapcar '(lambda (x y)(* (car y)(cadr x))) l_st (append (cdr l_st) (list (car l_st)))))))
   (prompt "\n选择1根线和2个文字")
   (if (setq ss (ssget '((0 . "*polyline,Line,ARC,SPLINE,Text"))))
      (progn
         (setq i 0 s_text '() s_line '())
         (while (< i (sslength ss))
            (setq ent (ssname ss i) i (1+ i)
                  type_e (cdr (assoc 0 (entget ent))))
            (if (= type_e "TEXT")
               (setq s_text (cons ent s_text))
               (setq s_line (cons ent s_line))))
         (while (> (length s_text) 2);文字多于2个时处理
            (prompt "\n文字不能多于2个,请重新选择文字")
            (setq s_text '() i 0 ss (ssget '((0 . "TEXT"))))
            (while (< i (sslength ss))
               (setq s_text (cons (ssname ss i) s_text)
                     i (1+ i))))
         (if (/= (length s_line) 1);线段多于1条时处理
            (setq line (car(entsel "\n只能选择1条线段,请重新选择线段")))
            (setq line (car s_line)))
         (setq poend (vlax-curve-getendpoint line);线段终点
               pomid (vlax-curve-getpointatdist line (/ (vlax-curve-getdistatpoint line poend) 2));线段中点
               ang (angle '(0 0) (vlax-curve-getfirstderiv line (vlax-curve-getParamAtPoint line pomid))));中点处的切线角度
         (while (and poend pomid ang s_text)
            (setq text (car s_text) s_text (cdr s_text))
            (if (= (cdr (assoc 0 (entget text))) "TEXT")
               (progn
                  (setq potext (cdr (assoc 10 (entget text)));文字插入点
                        height (cdr (assoc 40 (entget text))));文字高度
                  (if (> (lr (list pomid poend potext)) 0)
                     (setq poinsert (polar pomid (+ ang (/ pi 2)) height));文字在线段左边时
                     (setq poinsert (polar pomid (- ang (/ pi 2)) height)));文字在线段右边时
                  (if (and (> ang (/ pi 2)) (< ang (* 1.5 pi)))(setq ang0 (+ ang pi)) (setq ang0 ang));保证文字转角在1 4象限
                  (if (= ang0 (* 1.5 pi)) (setq ang0 (/ pi 2)));线段垂直时使文字朝向左边
                  (vlax-put (vlax-ename->vla-object text) 'Alignment 4);置文字对齐方式为中间
                  (vlax-put (vlax-ename->vla-object text) 'Rotation ang0);置文字角度
                  (vlax-put (vlax-ename->vla-object text) 'TextAlignmentPoint poinsert))))));置文字新的对齐点
   (princ))
play.gif

点评

如果文字的对齐方式原先是对齐或调整,好像需要2次操作才能做到.  详情 回复 发表于 2020-3-21 15:57
厉害,厉害,高手啊,佩服,感谢  详情 回复 发表于 2020-3-21 14:00

评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 有始有终奖!

查看全部评分

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

使用道具 举报

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2020-3-20 10:47:46 | 显示全部楼层
好像有这个插件,论坛搜搜

点评

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

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-3-20 11:51:06 | 显示全部楼层
本帖最后由 pxr201419 于 2020-3-22 10:40 编辑

(defun c:tt()
   (defun lr(l_st)
      (- (apply '+ (mapcar '(lambda (x y)(* (car x)(cadr y))) l_st (append (cdr l_st) (list (car l_st)))))
         (apply '+ (mapcar '(lambda (x y)(* (car y)(cadr x))) l_st (append (cdr l_st) (list (car l_st)))))))
   (setq olddyn (getvar "DYNMODE"))
   (setvar "DYNMODE" 1)
   (cond ((and (setq text (car(entsel "\n选取文字")))
               (setq line (car(entsel "\n选取线段")))
               (= (cdr (assoc 0 (entget text))) "TEXT")
               (member (cdr (assoc 0 (entget line))) '("LINE" "SPLINE" "ARC" "POLYLINE" "LWPOLYLINE")))
          (setq potext (cdr (assoc 10 (entget text)))
                height (cdr (assoc 40 (entget text)))
                poend (vlax-curve-getendpoint line)
                pomid (vlax-curve-getpointatdist line (/ (vlax-curve-getdistatpoint line poend) 2))
                ang (angle '(0 0) (vlax-curve-getfirstderiv line (vlax-curve-getParamAtPoint line pomid))))
          (if (> (lr (list pomid poend potext)) 0)
             (setq poinsert (polar pomid (+ ang (/ pi 2)) height))
             (setq poinsert (polar pomid (- ang (/ pi 2)) height)))
          (if (and (> ang (/ pi 2)) (< ang (* 1.5 pi)))(setq ang (+ ang pi)))          (vlax-put (vlax-ename->vla-object text) 'Alignment 4)
          (vlax-put (vlax-ename->vla-object text) 'Rotation ang)
          (vlax-put (vlax-ename->vla-object text) 'TextAlignmentPoint poinsert)))
   (setvar "DYNMODE" olddyn)
   (princ))



play.gif

点评

注意有2个文字,需要分开到线的2侧  详情 回复 发表于 2020-3-20 12:31

评分

参与人数 1D豆 +10 收起 理由
xdcad9819 + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 586个

财富等级: 财运亨通

发表于 2020-3-20 12:31:16 | 显示全部楼层
pxr201419 发表于 2020-3-20 11:51
(defun c:tt()
   (defun lr(l_st)
      (- (apply '+ (mapcar '(lambda (x y)(* (car x)(cadr y))) l_s ...

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

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-3-20 13:04:42 | 显示全部楼层
王老师,两边都有文字,分别对两个文字操作
play1.gif

点评

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

使用道具 举报

已领礼包: 960个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 272个

财富等级: 日进斗金

 楼主| 发表于 2020-3-20 21:47:37 | 显示全部楼层
pxr201419 发表于 2020-3-20 13:04
王老师,两边都有文字,分别对两个文字操作

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

使用道具 举报

已领礼包: 272个

财富等级: 日进斗金

 楼主| 发表于 2020-3-20 22:02:07 | 显示全部楼层
laiyuming 发表于 2020-3-20 10:47
好像有这个插件,论坛搜搜

请问下知道不知道叫什么名称?谢谢

点评

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

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-3-20 22:23:28 | 显示全部楼层
本帖最后由 pxr201419 于 2020-3-20 23:24 编辑
相信自己666 发表于 2020-3-20 22:02
请问下知道不知道叫什么名称?谢谢

你可以用关键词"对齐"搜索站内,很多贴子可参考

点评

上面这个程序我试过了,只能用做把文字调整到直线上方,而直线下文字的文字也是调到上方,不是这种效果?还请老师赐教,十分感谢!  详情 回复 发表于 2020-3-20 22:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 272个

财富等级: 日进斗金

 楼主| 发表于 2020-3-20 22:29:54 | 显示全部楼层
pxr201419 发表于 2020-3-20 22:23
程序已经写在上面了,加载后运行命令tt。你可以用关键词"对齐"搜索站内,很多贴子可参考

上面这个程序我试过了,只能用做把文字调整到直线上方,而直线下文字的文字也是调到上方,不是这种效果?还请老师赐教,十分感谢!
把不规则文字或数字对齐并居中到线段2.gif

点评

略改,重新试一下 (defun c:tt(/ olddyn text line potext height poend pomid ang poinsert) (defun lr(l_st) (- (apply '+ (mapcar '(lambda (x y)(* (car x)(cadr y))) l_st (append (cdr l_st) (lis  详情 回复 发表于 2020-3-20 22:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 511个

财富等级: 财运亨通

发表于 2020-3-20 22:38:24 | 显示全部楼层
本帖最后由 pxr201419 于 2020-3-20 23:23 编辑
相信自己666 发表于 2020-3-20 22:29
上面这个程序我试过了,只能用做把文字调整到直线上方,而直线下文字的文字也是调到上方,不是这种效果? ...

试了下,有不行的情况,修改后再发你

点评

好的谢谢老师,最好可以框选文字2行文字批量对齐,这个就不用一个个选中了,感激!  详情 回复 发表于 2020-3-21 07:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 272个

财富等级: 日进斗金

 楼主| 发表于 2020-3-21 07:23:34 | 显示全部楼层
pxr201419 发表于 2020-3-20 22:38
试了下,有不行的情况,修改后再发你

好的谢谢老师,最好可以框选文字2行文字批量对齐,这个就不用一个个选中了,感激!

点评

已更新,这个是通用式的。当然,还是应你的需求写在下面 (defun c:tt(/ olddyn ss i ent type_e line poend pomid ang s_text text potext height poinsert ang0) (defun lr(l_st) (- (apply '+ (mapcar  详情 回复 发表于 2020-3-21 10:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 13:00 , Processed in 0.436449 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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