明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14405|回复: 52

一个拖动函数

  [复制链接]
发表于 2004-4-15 09:59:00 | 显示全部楼层 |阅读模式
想到ET里有个拖动的函数,我也做了一个,效果比用MOVE应该好多了:;函数:(Drag ss pt)
;功能:实现拖动效果
;参数:ss——需要实现拖动效果的对象选择集
;           pt——拖动过程鼠标移动起点
;返回:左键拖动过程鼠标移动终点,否则返回nil(根据拖动过程的起点和终点就可以做需要做的事情了)
  1. (defun Drag (ss pt / blk ent ents m gr rVal mc-make-unname-block)
  2.    (defun mc-make-unname-block (pt ss / count entlist ent blk)
  3.        (entmake (list '(0 . "BLOCK")
  4.          '(2 . "*U")
  5.          '(70 . 1)
  6.          (cons 10 pt)
  7.            )
  8.        )
  9.        (setq count 0)
  10.        (repeat (sslength ss)
  11.            (setq entlist (entget (setq ent (ssname ss count))))
  12.            (setq count (1+ count))
  13.            (entmake entlist)
  14.        )
  15.        (setq count 0)
  16.        (repeat (sslength ss)
  17.            (setq ent (ssname ss count))
  18.            (setq count (1+ count))
  19.        )
  20.        (setq blk (entmake '((0 . "ENDBLK"))))
  21.    )
  22.    (if (setq blk (mc-make-unname-block pt ss))
  23.        (progn
  24.            (entmake (list (cons 0 "INSERT")
  25.              (cons 2 blk)
  26.              (cons 10 pt)
  27.                )
  28.            )
  29.            (setq ent (entlast))
  30.        )
  31.    )
  32.    (if ent
  33.        (progn
  34.            (setq ents (entget ent))
  35.            (setq m   t
  36.          rVal nil
  37.            )
  38.            (while m
  39.   (setq gr (grread 2 4))
  40.   (cond
  41.      ((= (car gr) 5)
  42.        (setq ents (subst (cons 10 (cadr gr)) (assoc 10 ents) ents))
  43.        (entmod ents)
  44.      )
  45.      ((= (car gr) 3)
  46.        (setq m nil)
  47.        (setq rVal (cadr gr))
  48.        (entdel ent)
  49.        (command "_.purge" "b" blk "n")
  50.      )
  51.      (t (setq m nil) (entdel ent)(command "_.purge" "b" blk "n"))
  52.   )
  53.            )
  54.        )
  55.    )
  56.    rVal
  57. )
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2004-4-15 11:50:00 | 显示全部楼层
;;建議:
;;1.無名BLOCK不用清除(因AUTOCAD會自動清除)
;;2.要是能改得像MOVE那樣的效果會更直覺
;;3.無名塊的程序對POLYLINE及屬性會有問題
 楼主| 发表于 2004-4-15 12:26:00 | 显示全部楼层
对于3,龙版有什么好办法?
发表于 2004-4-15 13:06:00 | 显示全部楼层
发表于 2004-4-15 13:49:00 | 显示全部楼层
比move好在哪里?我看不出来


move还可以捕捉,而且定义为块再删除,过程计算复杂,如果选中的实体很多,会很慢。


建议用矩阵变换的办法最直接。
 楼主| 发表于 2004-4-15 14:05:00 | 显示全部楼层
你用move做一个(注意,是使用它来做拖动效果,并不是单独使用MOVE命令)就知道了,在拖动时会很闪,而用我这个程序则会变的十分平滑...


计算过程应该相当简单吧,仅仅是把块的插入点改为当前鼠标所在点而已...如果多了,即使CAD内部的拖动也一样慢...


如果用距阵计算,那才应该叫计算复杂,要对每个对象,每个相关点都要计算,碰到椭圆等还得单独考虑,这样我想肯定慢...
发表于 2004-4-15 17:22:00 | 显示全部楼层
本帖最后由 作者 于 2004-4-15 18:06:31 编辑

這個我一直在尋找. 效果很好.



這個我一直在尋找. 效果很好.



我以前的做法是做成一個把選到的對象在LISP中以基點方式使用指令復制到剪切板. 然后粘貼出來. 做法可說比你的簡單. 但是不是生成無名塊的原因吧. 到要關系圖里要清理塊. 不知飛歌這個是不是改善了很多. 下載試試.
发表于 2004-4-15 19:23:00 | 显示全部楼层
本帖最后由 作者 于 2004-4-15 20:41:56 编辑

我认为矩阵变换是cad的基本位移旋转缩放镜向的基础,如move,虽然命令简单,但是也是根据矩阵来进行运算的,只不过这个运算已经已经固化到cad基本程序里面了,因此并不能说程序步骤简单运算就一定简单。



包子,我觉得你用的方法也很好


一个简单的测试:


写一个文字“测试程序”。用array原地复制20*20个。就知道move和drag的区别了。


顺便说一句。用dragp1,dragp2可条件拖曳时的采样率,越小显示越快。


结论:drag确实平滑,将以上两个系统变量调整到最高,也无法达到drag的平滑效果。


但是不建议在选择多个物体时候使用,因为那会很慢。
 楼主| 发表于 2004-4-15 20:01:00 | 显示全部楼层
包的方法确实不错,我用了有名的块的方法解决了龙版主的3问题,但还有很多问题,离真正的拖动效果还差很远,如:捕捉点,输入终点坐标及输入距离等...大家不凡说说...


其实运算复杂不复杂没关系,效果好才是硬道理...         :)
发表于 2004-4-15 20:56:00 | 显示全部楼层
效果是比move好,佩服斑竹们
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 04:24 , Processed in 0.189693 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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