明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: meflying

一个拖动函数

  [复制链接]
 楼主| 发表于 2004-4-15 20:58:00 | 显示全部楼层
无痕发表于2004-4-15 19:23:00我认为矩阵变换是cad的基本位移旋转缩放镜向的基础,如move,虽然命令简单,但是也是根据矩阵来进行运算的,只不过这个运算已经已经固化到cad基本程序里面了,因...

我知道我的DRAG和MOVE里的拖动效果差距很大,我的意思是和通过循环使用MOVE来达到拖动效果(见过这样的程序)来比较...之前我已经用括号解释不是和MOVE比,是和使用MOVE达到拖动效果比...
发表于 2004-4-15 21:30:00 | 显示全部楼层
我不明白move 和托动有什么本质的区别
发表于 2004-4-15 22:33:00 | 显示全部楼层
区别是托动时候的显示效果。myflying的程序显示更好一些,闪动更少,不可否认,在选取实体不多的时候,的确不错。
发表于 2004-4-15 23:00:00 | 显示全部楼层

这是我以前写的拖动函数

  1. 我的思路比较偏门:
复制代码
  1. (defun SSDrag_Move (ss pt) (ssDrag ss pt ".Move"))
  2. ;; (defun SSDrag_Rotate (ss pt) (ssDrag ss pt ".Rotate"))
  1. (defun SSDrag (ss pt DragCommand / get-ss ss2 e cmdecho ret catchit)
  2.    (Defun get-ss (e / ss ep)
  3.        (setq ss (ssadd)
  4.                    ep e
  5.        )
  6.        (if (not ep)
  7.            (setq ep (entnext))
  8.        )
  9.        (while (/= (setq ep (entnext ep)) nil) (ssadd ep ss))
  10.        ss
  11.    )
  12.    ;; ssdrag main:
  13.    (setq cmdecho (getvar "cmdecho"))
  14.    (setvar "cmdecho" 0)
  15.    (setq e (entlast))
  16.    (command "_.copy" ss "" "_non" "0,0,0" "_non" "0,0,0")
  17.    (setq ss2 (get-ss e))
  18.    (setq
  19.        catchit (vl-catch-all-apply
  20.                            (function
  21.                                (lambda ()
  22.                                    (command DragCommand ss2 "" pt)
  23.                                    (while (/= "" (getvar "cmdnames")) (command pause))
  24.                                    (setq ret (getvar "lastpoint"))
  25.                                    (setvar "cmdecho" 0)
  26.                                    (command "_.erase" ss2 "")
  27.                                    (setvar "cmdecho" cmdecho)
  28.                                    ret
  29.                                )
  30.                            )
  31.                            nil
  32.                        )
  33.    )
  34.    (if (vl-catch-all-error-p catchit)
  35.        (progn
  36.            (command "_.erase" ss2 "")
  37.            (setvar "cmdecho" cmdecho)
  38.            nil
  39.        )
  40.        ret
  41.    )
  42. )
自认为比飞兄的效果理想一点~~直接用的Move。原计划把Rotate,Scale形式的拖动也写进去的,不成功。哪位有好的办法和思路,拿出来讨论讨论。
发表于 2004-4-16 01:09:00 | 显示全部楼层
阿飞强调的是托动时候的效果,而不是程序的结构等等



Rotate,Scale形式的拖动,我还是推荐用矩阵


我试了你的程序。用rotate是可以的阿,用scale按理也没问题,但是scale容易放大到屏幕外面,因此难以看到效果,应该在程序中用 r (reference)参数。这样看起来才直观。较好的效果是:取得所选实体的最大外框,r取外框对角点x(or y)值差的一半。
发表于 2004-4-16 07:57:00 | 显示全部楼层

无痕弄个矩阵的例子来看看好吗?

(其实EA对矩阵研究比较多,就看他要不要出手)

 楼主| 发表于 2004-4-16 08:32:00 | 显示全部楼层
秋枫的方法好,我试了一下,发现一个奇怪问题,在拖动属性块的时候会删除属性块...看了一会也没看出所以然... 就拿下面这个图,你试试看:

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-4-16 08:47:00 | 显示全部楼层
找到原因了,就是使用entnext的时候会将其跟随对象包含在内,...对于POLYLINE也一样...



至于删除子对象是否就将这个对象给删了,还没研究过这个问题
发表于 2004-4-16 09:30:00 | 显示全部楼层
无痕发表于2004-4-16 1:09:00我试了你的程序。用rotate是可以的阿,用scale按理也没问题,但是scale容易放大到屏幕外面,因此难以看到效果,应该在程序中用 r (reference)参数。这样看起来才直观。较好的效果是:取得所选

1。用rotate与scale得到的返回值不对。一试就知。 2。用R参数也是可以的。在ssdrag程序中打开cmdecho,就可以直接使用Rotate与scale 的命令行提示。 比较理想的是SSdrag_Rotate应返回角度,SSdrag_Scale应返回比例。
发表于 2004-4-16 11:16:00 | 显示全部楼层
那就在程序里面用cond分别处理cmdnames返回值


矩阵的等忙完手上的工作再弄吧。快周末了,应该有时间的:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 06:45 , Processed in 0.190556 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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