找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1011|回复: 10

[求助] [求助]:如何实现动态拖动?

[复制链接]
发表于 2005-10-12 16:18:04 | 显示全部楼层 |阅读模式

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

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

×
请问各位,如何实现动态拖动?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-10-12 21:33:04 | 显示全部楼层
你问的是鼠标拖动吧?如果是的话可以用grread函数获得鼠标当前位置,用subst函数和assoc函数配合修改实体数据表,entmod函数更新数据表,论坛有很多源码,具体可下一个看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-13 11:11:43 | 显示全部楼层
对,举个例子吧,比如实现鼠标动态拖动画直线,我在论坛里翻了一下,没找到,还请赐教!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-10-13 12:45:00 | 显示全部楼层
目前我看到的论坛中的动态拖动都不太好用,看来用LSP实现不是很理想。最好是ARX,但又很复杂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-13 12:49:21 | 显示全部楼层
最初由 wangwangnn 发布
[B]对,举个例子吧,比如实现鼠标动态拖动画直线,我在论坛里翻了一下,没找到,还请赐教! [/B]

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

使用道具 举报

发表于 2005-10-13 13:27:08 | 显示全部楼层
动态画直线
(setq point1 (getpoint "\n请输入起点坐标:")
point2 (getpoint point1 "\n请输入终点坐标:")
)
(command "line" point1 point2 "")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-13 15:16:54 | 显示全部楼层
不是这个意思,我是说实现这样的功能:
1.选取一条线(起点为p1,终点为p2),再选取线上的一点(可是与别的险段的交点)p3,
2.在p3位置拖动鼠标,可以看到p1、p2 和p3形成的菱形线段。
以下是我编的程序,不是动态显示的,那位高手能帮我改成动态拖动?

(defun c:jihao_lingsheng()
(setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (setq en (car (entsel "\n选取一条线:")))
  (setq endata (entget  en))
  (setq pt1 (cdr (assoc 10 endata)))
  (setq pt2 (cdr (assoc 11 endata)))
  (setq pt3 (getpoint "\n选取中间点:"))
  (setq ang (angle pt1 pt2))
  (setq dd (getreal "\n输入宽度:"))
  (setq pp1 (polar pt3  (- ang (* pi 0.5)) (* dd 0.5 )))
  (setq pp2 (polar pt3  (+ ang (* pi 0.5)) (* dd 0.5 )))
  (setvar "osmode" 0)
  (command "line" pt1 pp1 pt2 "")
  (command "line" pt1 pp2 pt2 "")
  (setvar "osmode"  os)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-10-13 23:28:40 | 显示全部楼层
这是grread函数的语法,自己看看吧:

    (grread [track] [allkeys [curtype]])

功能及参数

    此函数可以让您直接读取 AutoCAD 的输入设备, 只要它们一移动, 您就可以追踪得到它们的位置。只有在很特殊的情况下才需要使用这个函数, 通常AutoLISP 都是使用像 getstring、getreal 等这样的 getxxx 函数来作输入的工作的。追踪的参数如果不为 nil, 则只要输入设备移动, 就可以返回此点的坐标值, 您并不需要按输入设备上的选取按键, 这就是 AutoCAD 拖放 (Dragging) 的原理。

    如果 track 参数有给予且非 nil, 那么它将赋予由指向设备的移动上 (但按键尚未按下)返回坐标值。allkeys 参数是一可选择的整型数值 (一个位标志项)。如果 allkeys 参数存在, grread 将视码来执行不同的功能。curtype 参数将能用来控制鼠标形式的显示。

    以下将为您详细解说其后参数的意义:

    track:如果不为 nil, 则追踪鼠标位置。

    Allkeys:如果提供, 那么allkeys参数必须为整型数, 且其值将被定义如下:

    值=1 (位0) 将返回拖放模式坐标。如果此位被设定, 同时用户移动指向设备, 则grread 将返回一个第一个数字是 type 5 以及第二个数字是目前指向设备的鼠标所在坐标 (X, Y)。

    值=2 (位1) 将返回所有键值。包含函数与鼠标键码, 及当用户按下鼠标键而非鼠标时。

    值=4 (位2) 使用一值来传至 curtype 参数中以控制鼠标显示。

    值=8 (位3) 当用户按下  Ctrl  +  C  键时, 不会显示error:console break信息。

    Curtype:如果提供, curtype 参数将定义鼠标形式的显示。它必须是一整型数值, 有效的选择项如下:

   0     显示正常的十字鼠标

   1     不显示鼠标(无十字鼠标)     

   2     显示图元选择“target”鼠标

    【注意】 curtype 参数仅当目前 grread 函数调用时, 影响到鼠标形式。在未来版本中可能再定义其他控制位。

    Grread 函数将返回一个表, 此表的第一个元素是一个指定输入形式的码。第二个元素是一个视输入形式而定的整数或点的表。其返回值如下所示:



第一个元素
第二个元素


输入形式

意  义

2
键盘输入
可变的
字符模式

3
选取点
3D 点
点坐标

4
屏幕/下拉式菜单项目(由指向设备)
0 至 999

1001至1999

2001 至 2999

3001 至 3999

.

.

16001至 16999
屏幕菜单

POP1菜单

POP2菜单

POP3菜单

.

.

POP16菜单

5
指向设备(仅在当追踪功能启动时返回)
3D 点
牵引模式坐标

6
BUTTONS 屏幕菜单项目
0至999

1000 至 1999

2000 至 2999

3000 至 3999
BUTTONS1菜单

BUTTONS2菜单

BUTTONS3菜单

BUTTONS4菜单

7
TABLET1 菜单项
0 至 32767
数字化仪1

8
TABLET2 菜单项
0 至 32767
数字化仪2

9
TABLET3 菜单项
0 至 32767
数字化仪3

10
TABLET4 菜单项
0 至 32767
数字化仪4

11
AUX 菜单项
0 至 999

1000至1999

2000 至 2999

3000 至 3999
AUX1菜单按键号AUX2菜单按键号AUX3菜单按键号AUX4菜单按键号

12
指向按键(跟随type6 或 type 11 返回)
3D 点
点坐标


   

     要使 grread 终止 AutoLISP 的执行时, 请按下  Ctrl  +  C  两个键即可。任何其他的键入, 将直接传到Grread上, 以允许它完全控制输入元件。如果用户在一个屏幕菜单中或在下拉式菜单列表中按下鼠标按钮, 则 grread 将会返回形态 11 的代码, 但是对于接下来的调用, 它并不会返回形态 12 的代码:形态 12 的代码只有当鼠标是在屏幕的绘图区域时, 才会跟随在形态 6 或形态 11 之后出现。

范例

    在企图以一个鼠标按钮或一个辅助的功能方框来启动其他的操作前, 将代码 12 的数据从缓冲区中清除是很重要的。要完成这件事, 您可执行一个类似下面的嵌套式 grread:

        (setq code_12 (grread (setq code (grread))))

则此序列将获取代码 12 表的值来当做一个由元件上输入的串流(streaming)。



    【注意】在不同的电脑系统中 (例如, DOS 与 UNIX), 由于处理的方式不同。所以, grreed 函数将返回不同的结果。例如:

    ① 缺省的定位设备(如鼠标或数字化仪)所使用的鼠标返回码是11, 不是6。

    ② 在麦金托斯 (Machintosh) 的电脑中, 下拉式菜单的返回码是11, 不是4。按下按键两下则将返回11, 不是6。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-16 15:03:38 | 显示全部楼层
我改成动态拖动了,但在鼠标经过的地方,都会出现线段,应该怎么改正呀?

(defun c:jihao_lingsheng()
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  ;(setq osmode "end,int")
  (setq en (car (entsel "\n选取一条线:")))
  (setq endata (entget  en))
  (setq pt1 (cdr (assoc 10 endata)))
  (setq pt2 (cdr (assoc 11 endata)))
  (setq pt3 (getpoint "\n选取中间点:"))
  (setq ang (angle pt1 pt2))
  ;(setq dd (getreal "\n输入省道宽:"))
  ;(setq pp1 (polar pt3  (- ang (* pi 0.5)) (* (distance pt3 p) 0.5 )))
  ;(setq pp2 (polar pt3  (+ ang (* pi 0.5)) (* (distance pt3 p) 0.5 )))
  ;(setvar "osmode" 0)
  (while (= 5 (car (setq p (grread T 4 0))))
    (setq p (cadr p))
    (if        (osnap p osmode)
      (setq p (osnap p osmode))
  (setq pp1 (polar pt3  (- ang (* pi 0.5)) (distance pt3 p) ))
  (setq pp2 (polar pt3  (+ ang (* pi 0.5)) (distance pt3 p) ))
  (setvar "osmode" 0)
  (command "line" pt1 pp1 pt2  "")
  (command "line" pt1 pp2 pt2 "")
  )
  (if (= 3 (car p));;;点击鼠标
    (progn
      (setq p (cadr p))
      (if (osnap p osmode)
        (setq p (osnap p osmode))
      )
      (setq pp1 (polar pt3  (- ang (* pi 0.5))  (distance pt3 p) ))
      (setq pp2 (polar pt3  (+ ang (* pi 0.5))  (distance pt3 p) ))
      ;(setvar "osmode" 0)
      (command "line" pt1 pp1 pt2  "")
      (command "line" pt1 pp2 pt2 "")
      
    )
  )
  (setvar "osmode"  os)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 18:50 , Processed in 0.768645 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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