明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4288|回复: 10

[讨论] 关于取文本四个角点的通用函数(get-textbox)的解析与测试源码

[复制链接]
发表于 2014-1-4 19:36:14 | 显示全部楼层 |阅读模式
本帖最后由 林霄云 于 2014-1-4 21:03 编辑

关于取文本四个角点的通用函数(get-textbox)的解析与测试源码
江湖上取文本框四角点的函数各种各种,本文贴出自认为较为合适的可读性可改造性较强的做法。欢迎指点!
为了方便测试,代码加入while循环与entsel选择。
  1. (defun get-textbox ( /  ang-self ang en ent pt0-ll pt0-tr pt-ins pt-2 pt-3 pt-4 pt-list x y ) ;获取文本四角点Designed by 林霄云 2014年1月4日
  2. ;(setq oldosmode (getvar "osmode"))
  3. ;(setvar "osmode" 0)

  4. (princ "\n取文本")
  5. (while (setq en (car (entsel)));当作为通用函数时,en作用参数,取消while循环

  6. (setq ent (entget en))
  7. (setq pt-ins (cdr (assoc 10 ent)))  ;第一对齐点(在 OCS 中)插入点(非UCS下坐标点)
  8. (setq ang (cdr (assoc 50 ent)))    ;a 文字旋转角度 弧度
  9.         
  10. (setq pt-list (textbox ent))    ;取虚拟框
  11. (setq pt0-ll (car pt-list))      ;取左下点
  12. (setq pt0-tr (cadr pt-list))    ;取右上点

  13. (setq box-tr (mapcar '(lambda (x y) (+ x y)) pt0-ll pt0-tr)) ;取对应原点的右上点。

  14. (setq  box-length (car box-tr))
  15. (setq  box-height (cadr box-tr))

  16. (setq ang-self (atan (cadr box-tr) (car box-tr)));取转角,基点为原点。 self-ang花了作者一晚上的时间,因为polar中的角度是从坐标轴开始的。需要加自身转角。

  17. (setq dis  (distance '(0.0 0.0 0.0) box-tr))
  18. (setq pt-3 (polar pt-ins (+ ang-self ang) dis));此句+ ang-self 表示逆时针(polar正方向)转角ang-self
  19. (setq pt-2 (polar pt-ins  ang box-length))
  20. (setq pt-4 (polar pt-ins (+ ang (*  0.5 pi) ) box-height)) ;此句+0.5pi 表示逆时针(polar正方向)转角90°
  21. ;(command "line" (trans pt-ins 0 1) (trans pt-2 0 1) (trans pt-3 0 1) (trans pt-4 0 1 ) "c") ;trans pt 0 1 wcs 转 ucs ,测试文本外框代码
  22. (list pt-ins pt-2 pt-3 pt-4) ;逆时针顺序,即polar函数规定的正方向

  23.   ) ;while 加入循环

  24. ;(setvar "osmode" oldosmode)    ;取消捕捉,当使用command命令时。
  25. ;(princ)
  26. );defun

  27. (princ "\nget-textbox 获取文本四角点 命令加载成功\nDesigned by 林霄云 2014年1月4日")
  28. (princ)
结论:本代码经过wcs和ucs下的测试。

本帖子中包含更多资源

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

x

评分

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

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-4-20 17:25:48 | 显示全部楼层
定义一牛函数点偏移offset_point
  1. (defun offset_point(pt x y x-ang / pt1 pt2 )
  2. ;Designed by 林霄云 2014年4月20日
  3. ;点偏移。x y 平移量,x-ang 基准线弧度
  4. (setq pt1 (polar pt x-ang x))
  5. (setq pt2 (polar pt1 (+ x-ang (* 0.5 pi)) y))
  6. pt2
  7. )
然后get_textbox函数修改如下,变得更具有可读性。
  1. (defun get_textbox ( en /  ang-self ang en ent pt0-ll pt0-tr pt-ins pt-2 pt-3 pt-4 box-tr box-length box-height pt-list x y )
  2. ;Designed by 林霄云 2014年4月20日
  3. ;获取文本四角点 Get TextBox ,坐下点起逆时针
  4. (setq ent (entget en))
  5. (setq pt-ins (cdr (assoc 10 ent)))  ;第一对齐点(在 OCS 中)插入点(非UCS下坐标点)
  6. (setq ang (cdr (assoc 50 ent)))    ;a 文字旋转角度 弧度
  7.         
  8. (setq pt-list (textbox ent))    ;取虚拟框
  9. (setq pt0-ll (car pt-list))      ;取左下点
  10. (setq pt0-tr (cadr pt-list))    ;取右上点

  11. (setq box-tr (mapcar '(lambda (x y) (+ x y)) pt0-ll pt0-tr)) ;取对应原点的右上点。

  12. (setq  box-length (car box-tr))
  13. (setq  box-height (cadr box-tr))

  14. (setq pt-2 (offset_point pt-ins box-length 0 ang)
  15.     pt-4 (offset_point pt-ins 0 box-height ang)
  16.     pt-3 (offset_point pt-ins box-length box-height ang))
  17. ;(command "line" (trans pt-ins 0 1) (trans pt-2 0 1) (trans pt-3 0 1) (trans pt-4 0 1 ) "c") ;trans pt 0 1 wcs 转 ucs ,测试文本外框代码
  18. (list pt-ins pt-2 pt-3 pt-4) ;逆时针顺序,即polar函数规定的正方向

  19. );defun
回复 支持 1 反对 0

使用道具 举报

发表于 2014-1-4 21:17:21 | 显示全部楼层
提点意见,不妥之处请原谅。
程序中没有坐标转换,估计仅适合于OCS与WCS一致的情况(即文字在WCS的XY平面上的情况)
发表于 2014-1-5 09:04:29 | 显示全部楼层
ucs测试没成功!
 楼主| 发表于 2014-1-5 16:03:19 来自手机 | 显示全部楼层
liu_kunlun 发表于 2014-1-4 21:17
提点意见,不妥之处请原谅。
程序中没有坐标转换,估计仅适合于OCS与WCS一致的情况(即文字在WCS的XY平面上 ...

对于本文,文字,其OCS与WCS是一致的,没有发现特例,如有望提供。
 楼主| 发表于 2014-1-5 16:05:24 来自手机 | 显示全部楼层
yoyoho 发表于 2014-1-5 09:04
ucs测试没成功!

本文提供的测试代码。UCS测试可行。请检查自己的测试代码。
发表于 2014-1-5 17:51:26 | 显示全部楼层
绝大情况下,为平面制图,OCS与WCS是一致的。
你新建一个UCS,(command "ucs" "n" "3" '(0. 0. 0.) '(1. 0. 0.) '(0. 1. 1.)),再写文字,其OCS与WCS肯定不一致。
 楼主| 发表于 2014-1-5 18:09:13 | 显示全部楼层
liu_kunlun 发表于 2014-1-5 17:51
绝大情况下,为平面制图,OCS与WCS是一致的。
你新建一个UCS,(command "ucs" "n" "3" '(0. 0. 0.) '(1. 0 ...

感谢提供实例。孤陋寡闻了。所以这篇文章标题得加上,支持与WCS某轴平行的UCS(受限的UCS),满足常见的工程应用。再次谢谢!
发表于 2014-4-21 12:49:44 | 显示全部楼层
感谢林工把体会让朋友们分享
发表于 2014-10-27 16:49:40 | 显示全部楼层
非常感谢,学习下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 15:06 , Processed in 0.195461 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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