本帖最后由 wyl219 于 2019-9-29 22:59 编辑
能实现功能,按空格退出命令,按esc也能退出,但是不会取消亮显,可以参考一下.

- (defun c:ttt ( / wyl:err old_error fill pt_tmp pt_x1 pt_x2 pt_y1 pt_y2 ss_x1 ss_x2 ss_y1 ss_y2
- ss_new i en en_selold en_sel lst_pttoobj_dist obj bo )
- (vl-load-com)
- (setq old_error *error*)
- (setq *error* wyl:err) ;可以修改为自己的error函数
- ;start部分结束
- (setq fill (list '(0 . "LWPOLYLINE") '(70 . 1)));筛选条件为闭合的多段线
- (setq bo t)
- (while bo
- (if (= (car (setq pt_tmp (grread t 1 ))) 5);当获取到的为坐标点时
- (progn
- (setq pt_tmp (cadr pt_tmp))
- (setq pt_x1 (list (car pt_tmp) (expt 10 9) 0.0)
- pt_x2 (list (car pt_tmp) (expt -10 9) 0.0)
- pt_y1 (list (expt 10 9) (cadr pt_tmp) 0.0)
- pt_y2 (list (expt -10 9) (cadr pt_tmp) 0.0)
- )
- (setq ss_x1 (ssget "F" (list pt_x1 pt_tmp) fill)
- ss_x2 (ssget "F" (list pt_x2 pt_tmp) fill)
- ss_y1 (ssget "F" (list pt_y1 pt_tmp) fill)
- ss_y2 (ssget "F" (list pt_y2 pt_tmp) fill)
- );获取四个方向的闭合多段线
- (if (and ss_x1
- ss_x2
- ss_y1
- ss_y2);如果四个选择集都不为空
- (progn
- (setq ss_new (ssadd));新建一个选择集
- (repeat (setq i (sslength ss_x1));因为目标矩形同时在四个选择集中,任意选一个就行.
- (setq i (1- i)
- en (ssname ss_x1 i)
- )
- (if (and (ssmemb en ss_x2) (ssmemb en ss_y1) (ssmemb en ss_y2);如果同时在四个选择集
- (= 8 (length (Vlax-Get (Vlax-Ename->Vla-Object en) 'Coordinates)))
- );并且有四个顶点,这个可以省略,适配所有封闭多段线
- (ssadd en ss_new);加入到新选择集
- );endif
- );endrepeat
- (cond
- ((= 1 (sslength ss_new));如果只有一个候选项
- (progn
- (setq en_selold en_sel);备份一下上次亮显的对象
- (if (and (setq en_sel (ssname ss_new 0 ))
- (= (vl-princ-to-string en_selold) (vl-princ-to-string en_sel)) );如果两次获取到的对象相同,那么
- (redraw en_sel 3);直接将他亮显
- (progn ;else
- (redraw en_sel 3)
- (if en_selold (redraw en_selold 4));取消原来的亮显
- )
- );endif
- ))
- ((> (sslength ss_new) 1);如果不止一个
- (setq lst_pttoobj_dist nil)
- (repeat (setq i (sslength ss_new));判断距离
- (setq i (1- i)
- en (ssname ss_x1 i)
- obj (vlax-ename->vla-object en)
- )
- (setq lst_pttoobj_dist (append (list (list (distance (vlax-curve-getClosestPointTo obj pt_tmp) pt_tmp) en)) '() lst_pttoobj_dist))
- );endrepeat
- (setq lst_pttoobj_dist (vl-sort lst_pttoobj_dist '(lambda (x y) (< (car x) (car y)))) );对距离排序
- (setq en_selold en_sel);备份一下上次亮显的对象
- (if (and ;lst_pttoobj_dist
- (setq en_sel (cadr (nth 0 lst_pttoobj_dist) ))
- (= (vl-princ-to-string en_selold) (vl-princ-to-string en_sel));直接判断是不相等的
- );如果两次获取到的对象相同,那么
- (redraw en_sel 3);将他亮显
- (progn ;else
- (redraw en_sel 3)
- (if en_selold (redraw en_selold 4));取消原来的亮显
- )
- );endif
- );end progn
- );endcond
- ));end if
- );end progn
- );endif
- (if (equal (grread t 1 ) '(2 32)) ;如果输入空格
- (progn
- (if en_sel (redraw en_sel 4));取消对象亮显
- (setq bo nil));结束循环
- )
- );endwhile
- ;end部分开始
- (setvar "cmdecho" 1)
- (setq *error* old_error)
- )
- (princ)
|