找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1555|回复: 8

[求助] [求助]:如何实现沿轴向的动态约束拖动

[复制链接]
发表于 2002-11-19 23:31:49 | 显示全部楼层 |阅读模式

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

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

×
如何实现沿轴向的动态约束拖动?

程序目的:沿X、Y或Z轴有约束地Move或Copy,要求可以用点捕捉
用户界面:输入基点,沿指定轴向动态约束拖动,选定目标点(捕捉或自由点取)
程序要求:目标点的指定轴坐标与基点有相同数值
附加设想:像ortho那样可以以快捷键设定或取消

尝试用晓东的xdrx_dragssmove,但不能实现有约束的拖动,
尝试用以下代码,但不能实现目标点捕捉,且拖动得比较勉强:

请大家指点。



  1. (defun c:mm (/ ss1 pt1 pt2)
  2.   (setq ss1 (ssget))
  3.   (setq pt1 (getpoint "\n  point:"))
  4.   (setq pt2 (Drag_Axis pt1 "z" ss1))
  5. );end

  6. (defun Drag_Axis (pt_in str_in  ss_in / dist1 inpt key pt pt_draw pt_old chk_id
  7.                        pto_d ptn_d dist2)
  8.   (setq pt_draw_old pt_in)
  9.   (setvar "cmdecho" 0)
  10.   
  11.   (if (and (= (type pt_in) 'LIST)
  12.            (= (type str_in) 'STR))(progn
  13.     (setq str_in (strcase str_in))
  14.     (if (member str_in (list "X" "Y" "Z"))
  15.       (setq chk_id T)
  16.     );if
  17.   ));if

  18.   (if chk_id
  19.     (progn
  20.       (setq key 5)
  21.       (while (or (= 12 key)(= 5 key)(= 2 key))
  22.         (setq inpt (grread T 1))
  23.         (setq key (car inpt))
  24.         (if (= 5 key)(progn
  25.           (setq pt  (cadr inpt))
  26.          
  27.           (if pt_old (setq dist1 (distance pt pt_old)))
  28.           (if (not dist1)(setq dist1 1))

  29.           (if (> dist1 0.0001)(progn
  30.             (if pt_draw (grdraw pt_draw pt_in -1))
  31.             (cond
  32.               ((= str_in "X")(setq pt_draw (list  (car pt)(cadr pt_in)(last pt_in))))
  33.               ((= str_in "Y")(setq pt_draw (list  (car pt_in)(cadr pt)(last pt_in))))
  34.               ((= str_in "Z")
  35.                (setq dist2 (distance pt pt_in))
  36.                (setq ptn_d (trans pt 1 2)
  37.                      pto_d (trans pt_in 1 2))
  38.                (if (< (cadr ptn_d)(cadr pto_d))
  39.                  (setq dist2 (- 0 dist2))
  40.                );if
  41.                      
  42.                (setq pt_draw (list  (car pt_in)(cadr pt_in) dist2))
  43.               )
  44.             );cond
  45.             (grdraw pt_draw pt_in -1)
  46.             (command "move" ss_in "" pt_draw_old pt_draw)
  47.           ));if
  48.           (setq pt_old pt pt_draw_old pt_draw)
  49.         ));if
  50.       );while

  51.       ;;;clear the mark lines
  52.       (if pt_draw
  53.         (grdraw pt_draw pt_in -1)
  54.       );if

  55.       (if (= key 3)
  56.         pt_draw
  57.         (setq pt_draw nil)
  58.       );if
  59.     );progn
  60.     (setq pt_draw nil)
  61.   );if
  62.   (setvar "cmdecho" 1)
  63.   pt_draw
  64. );end
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 00:02:03 | 显示全部楼层

Re: [求助]:如何实现沿轴向的动态约束拖动

最初由 Qlin 发布
[B]如何实现沿轴向的动态约束拖动?

程序目的:沿X、Y或Z轴有约束地Move或Copy,要求可以用点捕捉
用户界面:输入基点,沿指定轴向动态约束拖动,选定目标点(捕捉或自由点取)
程序要求:目标点的指定轴坐标与基点... [/B]


QLIN,你去看看XDLSP.LSP里面的超级DRAG,dragm函数,里面是使用XDRX_API的XDRX_PICKSET_DRAGGEN函数的综合应用,也就是晓东工具箱-自由拷贝、自由缩放、自由移动的核心LISP函数。

使用xdrx_Pickset_DragGen可以完成任意的拖放,因为可以自己设置需要的变换矩阵。动态在拖动中显示变换的效果。

函数里面还有些设置矩阵等的函数,如xdrx_drag_setmatrix等等,你先看函数,不清楚的再贴出来。

以后不要使用XDRX_DRAGMOVE等了,使用xdrx_Pickset_DragGen

回到你的问题,你可以在循环中监视前后的点,如果不在轴上,强制改变变换矩阵,就可以达到目的了。

下面的演示是“自由拷贝”的功能:


下载地址:http://www.xdcad.net/tech/xd_tbox/xdtb_xcopy.swf

<embed src=/tech/xd_tbox/xdtb_xcopy.swf quality=high width=800 height=482 loop=true type="application/x-shockwave-flash">
</embed>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-20 00:47:01 | 显示全部楼层
谢谢晓东!
能详细讲解下xdrx_Pickset_DragGen参数的意思吗?
我在帮助文件里找不到这个函数,最后两个参数的意思不太清楚。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-20 01:23:16 | 显示全部楼层
最初由 Qlin 发布
[B]谢谢晓东!
能详细讲解下xdrx_Pickset_DragGen参数的意思吗?
我在帮助文件里找不到这个函数,最后两个参数的意思不太清楚。 [/B]


看下面,QLIN,你试着写,不清楚的,我们一起讨论。

这个DRAG API 可以支持 POLAR SNAP 极轴跟踪

这个函数使用上,要对矩阵变换、向量操作熟悉,前一段贴过一些这方面的帖子。构造 translation 、scale 、mirror 等矩阵,用矩阵操作(乘积)进行矩阵组合运算,最后作用到选择集上完成变换。
XDRX_API对向量和矩阵运算都提供了完全的函数支持。


  1. [FONT=courier new]

  2. (xdrx_PickSet_dragGen prompt1 ss pj 1 (not tf)))

  3. 功能:超级DRAG拖动,可以随时修改拖动的变换矩阵

  4. 调用格式:(xdrx_PickSet_dragGen <提示串> <选择集> <基点> [光标类型] [拷贝、移动标记])

  5. 说明:
  6.            1、[光标类型]: 1-7
  7.                           1:kCrosshair
  8.                           2:kRubberBand
  9.                           3:kNoSpecialCursor
  10.                           4:kEntitySelect
  11.                           5:kParallelogram
  12.                           6:kInvisible

  13.             2、[拷贝、移动标记]:

  14.                        nil : 移动拖动
  15.                        T :  拷贝拖动

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-11-20 08:33:50 | 显示全部楼层

Re: [求助]:如何实现沿轴向的动态约束拖动

最初由 Qlin 发布
如何实现沿轴向的动态约束拖动?

程序目的:沿X、Y或Z轴有约束地Move或Copy,要求可以用点捕捉
用户界面:输入基点,沿指定轴向动态约束拖动,选定目标点(捕捉或自由点取)
程序要求:目标点的指定轴坐标与基点...


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

使用道具 举报

 楼主| 发表于 2002-11-20 14:22:19 | 显示全部楼层
还有问题:
想要的效果是在拖动过程中显示约束,而不仅仅是得到结果,
但xdrx_PickSet_dragGen函数好像只有在键盘输入或鼠标pick后
才能返回结果,如何才能取得拖动中光标点的坐标数据呢?

昨天上不了网,又实验了几种不同的思路,结合ortho和ucs,也许
不用取得光标坐标点也能达到要求,但关于xdrx_PickSet_dragGen
还有个疑问,它的调用格式:

(xdrx_PickSet_dragGen <提示串> <选择集> <基点> [光标类型] [拷贝、移动标记])

这个 <基点>不知应该按照哪个坐标系来计算?在wcs的情况下正常,在某些ucs
好像有些移位,具体情况请见附件的SWF文件。
为了看清基点的位置,我用以下函数调用dragm函数:

  1. (defun c:mm1 (/ ss1 pt1 pt2)
  2.   (setq ss1 (ssget))
  3.   (setq pt1 (getpoint "\n  Base point:"))
  4.   ($xdlsp_dragm ss1 pt1 nil)
  5. );end
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-21 23:47:03 | 显示全部楼层
最初由 Qlin 发布
[B]还有问题:
想要的效果是在拖动过程中显示约束,而不仅仅是得到结果,
但xdrx_PickSet_dragGen函数好像只有在键盘输入或鼠标pick后
才能返回结果,如何才能取得拖动中光标点的坐标数据呢?

昨天上不了网,又实... [/B]


XDLSP.LSP的DRAGM函数里面都有演示的。

(xdrx_drag_getLastPoint) 获得最后更新的拖动点的坐标。

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

使用道具 举报

 楼主| 发表于 2002-11-22 00:34:46 | 显示全部楼层
这是写了一半的程序,对于拖动基点有些疑惑,请晓东看看:
附件是我调试用的DWG图.


  1. (defun c:dmm (/ ss1 pt1 pt2 rt)
  2.   ;(defun *error* (st)
  3.   ;  (drag_err)
  4.   ;  (princ)
  5.   ;)

  6.   (setq ss1 (ssget))
  7.   (setq pt1 (getpoint "\n  Base point:"))
  8.   ($x_dragaxis ss1 pt1 nil)
  9. );end

  10. (defun $x_dragaxis (ss pj tf / box prompt1 pj pj1 tf1 mRMatrix mRMatrix1
  11.       mRMatrix2 mMatTrans mMatTrans1 mMatRot ang pt1 pt2
  12.       pt3 pt4 mVec1 mVec2
  13.         )
  14.   (xdrx_SysVar_Push "osmode" "CURSORSIZE")
  15.   (xdrx_begin)
  16.   (xdrx_ucson)
  17.   
  18.   (setvar "osmode" 545)
  19.   (setvar "CURSORSIZE" 5)
  20.   (setvar "Orthomode" 1)
  21.   
  22.   (if (not pj)
  23.     (progn
  24.       (setq box (xdrx_entity_box ss)
  25.       pj (car box)
  26.       )
  27.     )
  28.   )

  29.   (command "ucs" "d" "qaec_ucs_wk")
  30.   (command "ucs" "s" "qaec_ucs_wk")
  31.   (setq ucs_id 1)
  32.   (setq pt_wcs (trans pj 1 0))

  33.   (setq prompt1 "\n点取位置或{下一坐标平面[N]}<N>:"
  34.         mRMatrix t
  35.         tf1 t
  36.         mTMatrix0 (xdrx_matrix_identity 3)
  37.         mRMatrix t
  38.   );setq
  39.   
  40.   (xdrx_drag_setmatrix mTMatrix0 t)
  41.   (while (/= mRMatrix "quit")
  42.     (xdrx_drag_initget 1 "N")
  43.     (xdrx_drag_setmode "Move")
  44.     (setq pt_ucs2 (trans pt_wcs 0 1))
  45.     (setq mRMatrix (xdrx_PickSet_dragGen prompt1 ss pt_ucs2 2 (not tf)))

  46.     (princ "\nmRmatrix--------")(princ mRMatrix)
  47.    
  48.     (cond
  49.       (  (= (type mRMatrix) 'LIST)
  50.         (if tf
  51.           ($xdlsp_Pickset_TransFormedCopy ss mRMatrix)
  52.           (progn
  53.             ($xdlsp_Pickset_TransForm ss mRMatrix)
  54.             (setq mRMatrix "quit")
  55.           )
  56.         );if
  57.       )
  58.       (  (not mRMatrix)
  59.          (setq ucs_id (1+ ucs_id))
  60.          (if (> ucs_id 3)(setq ucs_id 1))
  61.          (set_ucs pj ucs_id)
  62.       )
  63.     );cond
  64.    
  65.   );while
  66.   
  67.   (xdrx_ucsoff)
  68.   (xdrx_end)
  69.   (xdrx_SysVar_Pop)

  70.   (command "ucs" "r" "qaec_ucs_wk")
  71.   
  72.   (princ)
  73. )

  74. (defun set_ucs (pt_in int_in / pt_wcs pt_ucs)
  75.   (setq pt_wcs (trans pt_in 1 0))
  76.   ;;;change ucs
  77.   (cond
  78.     (  (= int_in 1)
  79.       (command "ucs" "w")
  80.     )
  81.     (  (= int_in 2)
  82.       (command "ucs" "f")
  83.       (setq pt_ucs (trans pt_wcs 0 1))
  84.       (command "ucs" "o" pt_ucs)
  85.     )
  86.     (  (= int_in 3)
  87.       (command "ucs" "l")
  88.       (setq pt_ucs (trans pt_wcs 0 1))
  89.       (command "ucs" "o" pt_ucs)
  90.     )
  91.   );cond
  92. );end

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:10 , Processed in 0.315280 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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