找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2005|回复: 5

[拖动] (XD::Drag:MirrorByQuadrant)选择集四象限动态MIRROR

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-11-10 23:30:06 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Drag:MirrorByQuadrant
调用格式: ( XD::Drag:MirrorByQuadrant ss pj mode xAxis otherBack)
参数说明: SS ---- 选择集 或 实体名
PJ ---- 原点
mode -- 操作方式 0:四象限
1:绕Y轴左右翻转
2:绕X轴上下翻转
xAxis ---- 镜像的局部坐标系的X轴(绕Y轴镜像)
otherBcak----回调函数
返回值: T
函数简介: 根据鼠标位置,选择集四象限、左右、上下动态MIRROR
函数来源: 原创
函数作者: Newer
适用版本: XDRX API 
最后更新时间: 2013-11-10
备注: 文字根据象限调整通过回调函数otherCallBack 实现

2013.11.11第二版,整合了左右翻转和上下翻转
演示图片:

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

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

×
本帖最后由 newer 于 2013-11-11 18:39 编辑

本函数调用的演示结果如下图,实现上面演示图片文字位置随基线始终保持在上面的功能通过回调函数otherCallBack实现。

forum.php?mod=attachment&aid=NjQ0MnwwODllMzY5MHwxMzg0MDk3MzA2fDUyODB8NjcxNTI4&noupdate=yes.gif

左右翻转:

forum.php?mod=attachment&aid=NjQ1Nnw2MGU5MzhiYXwxMzg0MTY2MzA5fDUyODB8NjcxNTM4&noupdate=yes.gif


  1. ;|
  2. 选择集四象限MIRROR
  3. 参数:
  4.   SS ---- 选择集 或 实体名
  5.   PJ ---- 原点
  6.   mode -- 操作方式 0:四象限
  7.                    1:绕Y轴左右翻转
  8.                    2:绕X轴上下翻转
  9.   otherBcak----回调函数

  10. 返回值:T
  11. |;
  12. (defun XD::Drag:MirrorByQuadrant (ss pj mode xAxis otherCallBack /  _eq1 _eq2 _callback0 _callback1 _callback2 _callback an cen coord_from coord_to dynPt dynpt1 dynPt2 mat_1 mat0 mL mL1 mL2 mL3 mL4 ori q1 q2 qua1 qua2 ret yAxis zAxis)
  13.   (defun _eq1 (q1 q2)
  14.     (cond
  15.       ((= q1 q2)
  16.         t
  17.       )
  18.       ((and
  19.          (= q1 1)
  20.          (= q2 8)
  21.        )
  22.         t
  23.       )
  24.       ((and
  25.          (= q1 2)
  26.          (= q2 4)
  27.        )
  28.         t
  29.       )
  30.       ((and
  31.          (= q1 4)
  32.          (= q2 2)
  33.        )
  34.         t
  35.       )
  36.       ((and
  37.          (= q1 8)
  38.          (= q2 1)
  39.        )
  40.         t
  41.       )
  42.     )
  43.   )
  44.   (defun _eq2 (q1 q2)
  45.     (cond
  46.       ((= q1 q2)
  47.         t
  48.       )
  49.       ((and
  50.          (= q1 1)
  51.          (= q2 2)
  52.        )
  53.         t
  54.       )
  55.       ((and
  56.          (= q1 2)
  57.          (= q2 1)
  58.        )
  59.         t
  60.       )
  61.       ((and
  62.          (= q1 4)
  63.          (= q2 8)
  64.        )
  65.         t
  66.       )
  67.       ((and
  68.          (= q1 8)
  69.          (= q2 4)
  70.        )
  71.         t
  72.       )
  73.     )
  74.   )
  75.   (defun _callback1 (dynPt)
  76.     (if dynPt2
  77.       (progn
  78.         (setq dynpt1 (xdrx_point_transform dynPt mat_1)
  79.               qua1 (XD::Pnt:Quadrant dynpt2 '(0 0 0))
  80.               qua2 (XD::Pnt:Quadrant dynpt1 '(0 0 0))
  81.         )
  82.         (if (not (_eq1 qua1 qua2))
  83.           (progn
  84.             (xdrx_entity_mirror ss mL t)
  85.             (if (= (type otherCallBack) 'SUBR)
  86.               (eval (read (strcat "(" otherCallBack " ss pj)")))
  87.             )
  88.           )
  89.         )
  90.       )
  91.     )
  92.     (setq dynpt2 (xdrx_point_transform dynPt mat_1))
  93.   )
  94.   (defun _callback2 (dynPt)
  95.     (if dynPt2
  96.       (progn
  97.         (setq dynpt1 (xdrx_point_transform dynPt mat_1)
  98.               qua1 (XD::Pnt:Quadrant dynpt2 '(0 0 0))
  99.               qua2 (XD::Pnt:Quadrant dynpt1 '(0 0 0))
  100.         )
  101.         (if (not (_eq2 qua1 qua2))
  102.           (progn
  103.             (xdrx_entity_mirror ss mL t)
  104.             (if (= (type otherCallBack) 'SUBR)
  105.               (eval (read (strcat "(" otherCallBack " ss pj)")))
  106.             )
  107.           )
  108.         )
  109.       )
  110.     )
  111.     (setq dynpt2 (xdrx_point_transform dynPt mat_1))
  112.   )
  113.   (defun _callback0 (dynPt)
  114.     (setq cen (XD::Geom:Get9pt ss 5)
  115.           cen (xdrx_point_transform cen mat_1)
  116.           dynpt1 (xdrx_point_transform dynPt mat_1)
  117.           qua1 (XD::Pnt:Quadrant cen '(0 0 0))
  118.           qua2 (XD::Pnt:Quadrant dynpt1 '(0 0 0))
  119.     )
  120.     (if (/= qua1 qua2)
  121.       (progn
  122.         (cond
  123.           ((= qua1 1)
  124.             (cond
  125.               ((= qua2 2)
  126.                 (setq mL mL2)
  127.               )
  128.               ((= qua2 4)
  129.                 (setq mL mL4)
  130.               )
  131.               ((= qua2 8)
  132.                 (setq mL mL1)
  133.               )
  134.             )
  135.           )
  136.           ((= qua1 2)
  137.             (cond
  138.               ((= qua2 1)
  139.                 (setq mL mL2)
  140.               )
  141.               ((= qua2 4)
  142.                 (setq mL mL1)
  143.               )
  144.               ((= qua2 8)
  145.                 (setq mL mL3)
  146.               )
  147.             )
  148.           )
  149.           ((= qua1 4)
  150.             (cond
  151.               ((= qua2 1)
  152.                 (setq mL mL4)
  153.               )
  154.               ((= qua2 2)
  155.                 (setq mL mL1)
  156.               )
  157.               ((= qua2 8)
  158.                 (setq mL mL2)
  159.               )
  160.             )
  161.           )
  162.           ((= qua1 8)
  163.             (cond
  164.               ((= qua2 1)
  165.                 (setq mL mL1)
  166.               )
  167.               ((= qua2 2)
  168.                 (setq mL mL3)
  169.               )
  170.               ((= qua2 4)
  171.                 (setq mL mL2)
  172.               )
  173.             )
  174.           )
  175.         )
  176.         (xdrx_entity_mirror ss mL t)
  177.         (if (= (type otherCallBack) 'SUBR)
  178.           (eval (read (strcat "(" otherCallBack " ss pj)")))
  179.         )
  180.       )
  181.     )
  182.   )
  183.   (XD::Begin)
  184.   (xdrx_sysvar_push '("mirrtext" 0))
  185.   (setq mat0 (xdrx_matrix_identity 3)
  186.         coord_from (XD::UCS:CoordSys)
  187.         zAxis (getvar "viewdir")
  188.         yAxis (xdrx_vector_crossproduct zAxis xAxis)
  189.         coord_to (list pj xAxis yAxis zAxis)
  190.         mat_1 (xdrx_matrix_alignCoordSystem coord_to coord_from)
  191.         an (angle '(0 0 0) xAxis)
  192.   )
  193.   (XD::DOC:DRAWCROSSHAIR pj an 0.1)
  194.   (cond
  195.     ((= mode 0)
  196.       (setq mL1 (list pj (mapcar
  197.                            '+
  198.                            pj
  199.                            xAxis
  200.                          )
  201.                 )
  202.             mL2 (list pj (mapcar
  203.                            '+
  204.                            pj
  205.                            yAxis
  206.                          )
  207.                 )
  208.             mL3 (list pj (mapcar
  209.                            '+
  210.                            pj
  211.                            (xdrx_vector_rotate xAxis (/ pi 4) '(0 0 1))
  212.                          )
  213.                 )
  214.             mL4 (list pj (mapcar
  215.                            '+
  216.                            pj
  217.                            (xdrx_vector_rotate yAxis (* 3 (/ pi 4)) '(0 0 1))
  218.                          )
  219.                 )
  220.             _callback "_callback0"
  221.       )
  222.     )
  223.     ((= mode 1)
  224.       (setq mL (list pj (mapcar
  225.                           '+
  226.                           pj
  227.                           yAxis
  228.                         )
  229.                )
  230.             _callBack "_callback1"
  231.       )
  232.     )
  233.     ((= mode 2)
  234.       (setq mL (list pj (mapcar
  235.                           '+
  236.                           pj
  237.                           xAxis
  238.                         )
  239.                )
  240.             _callBack "_callback2"
  241.       )
  242.     )
  243.   )
  244.   (setq ret (xdrx_pointMonitor _callback ss))
  245.   (getpoint)
  246.   (XD::DOC:DRAWCROSSHAIR pj an 0.1)
  247.   (xdrx_pointMonitor)
  248.   (xdrx_sysvar_pop)
  249.   (XD::End)
  250.   t
  251. )


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

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2013-11-10 23:34:27 | 显示全部楼层
实现文字始终在基线上面的回调函数如下:(回调函数根据自己的程序需要编写)
下面代码是处理块带属性的实体的四象限镜像。


  1. (defun _callback1 (ss pj / blkent  e entl mat ml n)
  2.   (setq e (ssname ss 0))
  3.   (setq mat (xdrx_getpropertyvalue e "blocktransform"))
  4.   (setq blkent (xdrx_getpropertyvalue e "blocktablerecord")
  5.         entl (xdrx_getpropertyvalue (cadr blkent) "AllEntities")
  6.   )
  7.   (setq ml (xdrx_point_transform (list (xdrx_polyline_getpointat
  8.                                                                  (car entl)
  9.                                                                  1
  10.                                        ) (xdrx_polyline_getpointat
  11.                                                                    (car entl)
  12.                                                                    2
  13.                                          )
  14.                                  ) mat
  15.            )
  16.        ml (XD::Pnts:Sort ml "xY" 0.001)
  17.   )
  18.   (setq entl (xdrx_insert_getattribs e))
  19.   (foreach n entl
  20.      (setq cen (XD::Geom:Get9pt n 5)
  21.            dis (xdrx_point_dist2Line cen (car ml)(cadr ml))
  22.      )
  23.      (if (> dis 0)
  24.        (progn
  25.          (xdrx_entity_mirror n mL t)
  26.        )
  27.      )
  28.   )
  29.   (princ)         
  30. )



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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-11 00:38:31 来自手机 | 显示全部楼层
太复杂,不是一般水平能用的

点评

回调函数参数 给 "" 就是普通的镜像操作。 如果普通的镜像不能满足的时候给编程者一个 回调函数 处理特殊需要的机会。 把底层的四象限镜像的部分给封装起来了。  详情 回复 发表于 2013-11-11 00:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2013-11-11 00:44:48 | 显示全部楼层
本帖最后由 newer 于 2013-11-11 00:57 编辑
st788796 发表于 2013-11-11 00:38
太复杂,不是一般水平能用的

回调函数参数 给 "" 就是普通的镜像操作。 如果普通的镜像不能满足的时候给编程者一个 回调函数 处理特殊需要的机会。

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

使用道具 举报

发表于 2024-1-11 17:25:33 | 显示全部楼层
请问版主,此函数中的两个参数如何赋值?可以举例说明吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2024-1-11 17:29:23 | 显示全部楼层
(XD::Drag:MirrorByQuadrant ss pj mode xAxis otherBack)
xAxis ---- 镜像的局部坐标系的X轴(绕Y轴镜像)
otherBcak----回调函数
版主,函数中的xAxis和otherBcak 两个参数如何赋值?可以举例说明吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 18:15 , Processed in 0.405271 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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