找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1346|回复: 7

[教学] 旋转属性块同时确保属性文字角度始终保持水平

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-9-10 16:24:15 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 newer 于 2016-9-10 16:25 编辑

旋转属性块同时确保属性文字角度始终保持水平

旋转属性块同时确保属性文字角度始终保持水平


下面代码实现上面图片的演示效果,做了详细的注释。

  1. (defun c:tt ()
  2.   (defun _attrib (e)
  3.     (setq attribs (xdrx_getpropertyvalue e "AttributeEntities"))
  4.     (mapcar
  5.       '(lambda (x)
  6.          (setq box (xdrx_text_box x);;属性实体的文字包围框
  7.                cen (xd::geom:get9pt x 5);;中心点
  8.          )
  9.          (xdrx_entity_align x cen (polar cen (angle (car box)(cadr box)) 10.0) cen (polar cen 0.0 10.0));;对齐变换矩阵,文字角度始终0度
  10.       )
  11.       attribs
  12.     )
  13.   )
  14.   (defun _callback (dynpt)
  15.     (setq mat (xdrx_matrix_identity 3)
  16.           m (xdrx_matrix_setrotation mat (angle pt dynpt) '(0 0 1) pt);;旋转变换矩阵,基点PT
  17.     )
  18.     (if (not (equal dynpt lastpnt 1e-3));;如果点变化了执行
  19.       (progn
  20.         (xdrx_entity_delete e1);;删除临时的旋转块
  21.         (xdrx_entity_transformedcopy e m);;原块旋转矩阵作用生成新的临时块
  22.         (setq e1 (entlast))
  23.         (_attrib e1) ;;处理块中所有的属性实体角度始终0度
  24.       )
  25.     )
  26.     (setq lastpnt dynpt);;保存上次鼠标的位置
  27.   )
  28.   (if (and
  29.         (setq e (car (xdrx_entsel "\n拾取属性块<退出>:" '((0 . "insert")
  30.                                    (66 . 1)
  31.                                   )
  32.                      )
  33.                 )
  34.         )
  35.         (setq pt (getpoint "\n旋转基点<退出>:"))
  36.       )
  37.     (progn
  38.       (xdrx_begin)
  39.       (setq e1 (xdrx_object_clone e))
  40.       (xdrx_pointmonitor "_callback") ;;点监视器,回调函数_callback
  41.       (if (getpoint pt)
  42.         (progn
  43.           (xdrx_entity_delete e)  ;;删除原对象
  44.           (xdrx_object_swapid e1 e);;旋转的块ID变成原块的ID
  45.         )
  46.       )
  47.       (xdrx_pointmonitor);;结束点监视器
  48.       (xdrx_end)
  49.     )
  50.   )
  51. )


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

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-9-10 17:23:12 | 显示全部楼层
本帖最后由 q3_2006 于 2016-9-10 18:37 编辑

(defun c:tt ( / ang att n obj pa pb pc ss)
  (setq ang (angle '(0 0 0) (getvar 'ucsxdir)))
  (if (setq ss (ssget '((0 . "insert") (66 . 1))))
    (repeat (setq n (sslength ss))
      (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
      (foreach att (vlax-invoke obj 'GetAttributes)
       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list att 'pa 'pb))))
      (progn
       (setq pa (vlax-safearray->list pa)
        pb (vlax-safearray->list pb)
        pc (mapcar '* '(0.5 0.5 0.5) (mapcar '+ pa pb))
       )
       (vla-rotate att (vlax-3d-point pc) (- ang (vla-get-Rotation att)))
   )  
       )
        )
      )
    )
  (princ)
  )

点评

再完善下代码吧,测试可以旋转属性到水平,但是位置变了,应该是围绕着文字的中心点旋转,看下图: 你的代码结果是右上边的图形。 [attachimg]54902[/attachimg]  详情 回复 发表于 2016-9-10 17:41

评分

参与人数 2D豆 +10 收起 理由
Lisphk + 5 有始有终奖!
newer + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-10 17:41:12 | 显示全部楼层
q3_2006 发表于 2016-9-10 17:23
(defun c:tt ( / ang att n obj ss)
  (setq ang (angle '(0 0 0) (getvar 'ucsxdir)))
  (if (setq ss ( ...

再完善下代码吧,测试可以旋转属性到水平,但是位置变了,应该是围绕着文字的中心点旋转,看下图:
你的代码结果是右上边的图形。


QQ截图20160910173705.png

点评

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-9-10 18:17:57 | 显示全部楼层
newer 发表于 2016-9-10 17:41
再完善下代码吧,测试可以旋转属性到水平,但是位置变了,应该是围绕着文字的中心点旋转,看下图:
你的 ...

加上了.....

点评

用你的代码测试了下,结果对了,看两位高手论剑受益匪浅。要是再加上LISP的GRREAD完成动态拖动显示效果,就更造福了。  详情 回复 发表于 2016-9-10 18:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-9-10 18:29:46 | 显示全部楼层

用你的代码测试了下,结果对了,看两位高手论剑受益匪浅。要是再加上LISP的GRREAD完成动态拖动显示效果,就更造福了。

点评

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-9-10 18:33:32 | 显示全部楼层
Lisphk 发表于 2016-9-10 18:29
用你的代码测试了下,结果对了,看两位高手论剑受益匪浅。要是再加上LISP的GRREAD完成动态拖动显示效果, ...

矩阵我是一点不懂的...比不了...

点评

开车不一定要会修车,知道怎么用函数就够了。  详情 回复 发表于 2016-9-10 18:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-9-10 18:37:12 | 显示全部楼层
q3_2006 发表于 2016-9-10 18:33
矩阵我是一点不懂的...比不了...

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2016-9-10 18:40:21 | 显示全部楼层
抄点矩阵函数用还是可以的...代码加了个判断...属性可能是空值...没有外包框的...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 14:48 , Processed in 0.410922 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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