找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1328|回复: 3

[抛砖引玉]对象预览函数(grread运用一例)

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-12-16 10:45:51 | 显示全部楼层 |阅读模式

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

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

×
实现对象预览功能并支持关键字
ET工具中有acet-ss-drag-move函数,但需要加载ARX,很不方便(我原来的坐标标注就是使用它)
后来决定用LISP来实现!下面的代码就是一个方法,但因为用着MOVE命令,所以对象不能太多。
大家来试试,帖出更优化的代码!

  1. ;;;======================
  2. ;;;NB-ss-drag-move v0.5 2005.12.12
  3. ;;;替代ET工具中的acet-ss-drag-move函数
  4. ;;调用(NB-ss-drag-move movess pt0 msg keyword linetf)
  5. ;;
  6. ;;movess:选择集 pt1:基点 msg:提示信息 -
  7. ;;;keyword:关键字 linetf:拉线显示模式0或nil=无、1=实线 2=虚线
  8. ;;;实例:[color=red](NB-ss-drag-move (ssget) (getpoint) "\n确定点或[方位角(A)/字高(H)/选择项(O)]<退出>:" "A H O" 1)[/color]
  9. (defun NB-ss-drag-move (movess         pt0          msg keyword linetf
  10.                         /         e0          roop           el            
  11.                         pt1         pt2          osmode_old   backvar errnew errold set_close
  12.                        )
  13.   (defun errnew(errmsg)
  14.     (set_close)
  15.     )
  16.   (defun set_close()
  17.       (setvar "cmdecho" 1)
  18.     (setq *error* errold)
  19.     (setvar "osmode" osmode_old)
  20.     )
  21.     ;;--------------------
  22.     (setq errold *error*
  23.           *error* errnew)
  24.   (setq osmode_old (getvar "osmode"))
  25.   (setvar "osmode" 0)
  26.   (setvar "cmdecho" 0)
  27.   (VL-CMDF "_.undo" "be")
  28.   (if (and linetf
  29.            (> linetf 0)
  30.       ) ;_ 结束and
  31.     (progn (VL-CMDF "_.line" '(0 0) '(1 0) "")
  32.            (setq l1   (entlast)
  33.                  entl (entget l1)
  34.            ) ;_ 结束setq
  35.     ) ;_ 结束progn
  36.   ) ;_ 结束if
  37.   (setq        roop T
  38.         pt1  pt0
  39.   ) ;_ 结束setq
  40.   (prompt (strcat msg "/<退出选择>:"))
  41.   (while roop
  42.     (setq el (grread t 2 0))
  43.     (cond
  44.       ;;若按下空格或回车
  45.       ((member el '((2 13) (2 32)))
  46.        (setq roop nil)
  47.       )
  48.       ;;按下其他键
  49.       ((= (car el) 2)
  50.        (if (or (vl-string-position (cadr el) (strcase keyword))
  51.                (vl-string-position (cadr el) (strcase keyword t))
  52.            ) ;_ 结束or
  53.          (progn
  54.            (setq backvar (strcase (chr (cadr el)))
  55.                  roop         nil
  56.            ) ;_ 结束setq
  57.          ) ;_ 结束progn
  58.          (progn
  59.            (princ (strcat "\n需要选择对象或关键字:" keyword))
  60.            (prompt (strcat msg "/<退出选择>:"))
  61.          ) ;_ 结束progn
  62.        ) ;_ 结束if
  63.       )
  64.       ((= (car el) 25)
  65.        ;;(menucmd "B2")
  66.        (setq el nil)
  67.        ;;(setq roop nil)
  68.       )
  69.       ;;移动鼠标
  70.       ((= (car el) 5)
  71.        (setq my_viewsize (getvar "viewsize")
  72.              pt2         (cadr el)
  73.              di                 (distance pt2 pt1)
  74.        ) ;_ 结束setq
  75.        ;;移动距离超过屏幕0.5%则刷新一次     
  76.        (if (> (/ di my_viewsize) 0.005)
  77.          (progn
  78.       (VL-CMDF "_.Move" movess "" pt1 pt2)
  79.        (setq pt1 pt2)
  80.        (if (and        linetf
  81.                 (> linetf 0)
  82.            ) ;_ 结束and
  83.          (progn        (setq entl (subst (cons 10 pt0) (assoc 10 entl) entl))
  84.                 (setq entl (subst (cons 11 pt2) (assoc 11 entl) entl))
  85.                 (entmod entl)
  86.          ) ;_ 结束progn
  87.        ) ;_ 结束if
  88.        (if (and        linetf
  89.                 (= linetf 2)
  90.            ) ;_ 结束and
  91.          (progn (redraw l1 3))
  92.        ) ;_ 结束if
  93.       )
  94.          )
  95.       )
  96.       ((= (car el) 3)
  97.        (setq backvar (cadr el))
  98.        (setq roop nil)
  99.       )
  100.     ) ;_ 结束cond
  101.   ) ;_ 结束while
  102.   (VL-CMDF "_.undo" "e")
  103.   (VL-CMDF "_.u")
  104.   (set_close)
  105.   backvar
  106. ) ;_ 结束defun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-12-16 23:56:34 | 显示全部楼层
;;移动距离超过屏幕0.5%则刷新一次     
       (if (> (/ di my_viewsize) 0.005)



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

使用道具 举报

发表于 2005-12-17 09:12:00 | 显示全部楼层
能支持相对点更好
比如取第一点之后,输入 100, 即鼠标拉出方向的100距离点。
再支持输入绝对坐标,如(100 100 100) 及 "@100,200,0"等
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2005-12-18 14:16:46 | 显示全部楼层
速度肯定是比不上用ARX的ACET-SS-DRAG-MOVE的啦!!!
这里只不过是在找一个LISP的方法而已。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 00:48 , Processed in 0.251750 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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