乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 145|回复: 8

一个拖动函数

[复制链接]

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 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. )
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2004-4-15 11:50:00 | 显示全部楼层
;;建議:
;;1.無名BLOCK不用清除(因AUTOCAD會自動清除)
;;2.要是能改得像MOVE那樣的效果會更直覺
;;3.無名塊的程序對POLYLINE及屬性會有問題
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-15 12:26:00 | 显示全部楼层
对于3,龙版有什么好办法?
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-4-15 13:49:00 | 显示全部楼层
比move好在哪里?我看不出来
move还可以捕捉,而且定义为块再删除,过程计算复杂,如果选中的实体很多,会很慢。
建议用矩阵变换的办法最直接。
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-15 14:05:00 | 显示全部楼层
你用move做一个(注意,是使用它来做拖动效果,并不是单独使用MOVE命令)就知道了,在拖动时会很闪,而用我这个程序则会变的十分平滑...
计算过程应该相当简单吧,仅仅是把块的插入点改为当前鼠标所在点而已...如果多了,即使CAD内部的拖动也一样慢...
如果用距阵计算,那才应该叫计算复杂,要对每个对象,每个相关点都要计算,碰到椭圆等还得单独考虑,这样我想肯定慢...
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2004-4-15 17:22:00 | 显示全部楼层

這個我一直在尋找. 效果很好. 這個我一直在尋找. 效果很好. 我以前的做法是做成一個把選到的對象在LISP中以基點方式使用指令復制到剪切板. 然后粘貼出來. 做法可說比你的簡單. 但是不是生成無名塊的原因吧. 到要關系圖里要清理塊. 不知飛歌這個是不是改善了很多. 下載試試.
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-4-15 19:23:00 | 显示全部楼层

我认为矩阵变换是cad的基本位移旋转缩放镜向的基础,如move,虽然命令简单,但是也是根据矩阵来进行运算的,只不过这个运算已经已经固化到cad基本程序里面了,因此并不能说程序步骤简单运算就一定简单。包子,我觉得你用的方法也很好
一个简单的测试:
写一个文字“测试程序”。用array原地复制20*20个。就知道move和drag的区别了。
顺便说一句。用dragp1,dragp2可条件拖曳时的采样率,越小显示越快。
结论:drag确实平滑,将以上两个系统变量调整到最高,也无法达到drag的平滑效果。
但是不建议在选择多个物体时候使用,因为那会很慢。
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-15 20:01:00 | 显示全部楼层
包的方法确实不错,我用了有名的块的方法解决了龙版主的3问题,但还有很多问题,离真正的拖动效果还差很远,如:捕捉点,输入终点坐标及输入距离等...大家不凡说说...
其实运算复杂不复杂没关系,效果好才是硬道理...         :)
回复

使用道具 举报

33

主题

253

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
385
发表于 2004-4-15 20:56:00 | 显示全部楼层
效果是比move好,佩服斑竹们
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-16 00:53 , Processed in 2.072840 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表