明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2032|回复: 28

[提问] 如何自动选中并亮显包围光标点的矩形?

[复制链接]
发表于 2019-9-15 22:43 | 显示全部楼层 |阅读模式
5明经币
如何自动选中并亮显特定的矩形
1:此矩形所在的图层为0层
2:光标点(setq o (cadr(grread 3)))刚好在此矩形内
3:此矩形可能不完全在屏幕内
4:此矩形距离o最近(可能矩形外还有更大的矩形)






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

最佳答案

查看完整内容

能实现功能,按空格退出命令,按esc也能退出,但是不会取消亮显,可以参考一下.
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-9-15 22:43 | 显示全部楼层
本帖最后由 wyl219 于 2019-9-29 22:59 编辑

能实现功能,按空格退出命令,按esc也能退出,但是不会取消亮显,可以参考一下.

  1. (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
  2.                ss_new i en  en_selold en_sel lst_pttoobj_dist obj bo )
  3.   (vl-load-com)
  4.   (setq old_error *error*)  
  5.   (setq *error* wyl:err) ;可以修改为自己的error函数
  6.   ;start部分结束
  7.   (setq fill (list '(0 . "LWPOLYLINE") '(70 . 1)));筛选条件为闭合的多段线
  8.   (setq bo t)
  9.   (while bo
  10.     (if (= (car (setq pt_tmp (grread t 1 ))) 5);当获取到的为坐标点时
  11.       (progn
  12.         (setq pt_tmp (cadr pt_tmp))
  13.         (setq pt_x1 (list  (car pt_tmp) (expt 10 9) 0.0)
  14.           pt_x2 (list (car pt_tmp) (expt -10 9) 0.0)
  15.           pt_y1 (list   (expt 10 9) (cadr pt_tmp) 0.0)
  16.           pt_y2 (list  (expt -10 9) (cadr pt_tmp) 0.0)
  17.         )
  18.         (setq ss_x1 (ssget "F" (list pt_x1 pt_tmp) fill)
  19.           ss_x2 (ssget "F" (list pt_x2 pt_tmp) fill)
  20.           ss_y1 (ssget "F" (list pt_y1 pt_tmp) fill)
  21.           ss_y2 (ssget "F" (list pt_y2 pt_tmp) fill)
  22.         );获取四个方向的闭合多段线
  23.         (if (and ss_x1
  24.               ss_x2
  25.               ss_y1
  26.               ss_y2);如果四个选择集都不为空
  27.           (progn
  28.             (setq ss_new (ssadd));新建一个选择集
  29.             (repeat (setq i (sslength ss_x1));因为目标矩形同时在四个选择集中,任意选一个就行.
  30.               (setq i (1- i)
  31.                 en (ssname  ss_x1 i)
  32.               )
  33.               (if (and (ssmemb en ss_x2) (ssmemb en ss_y1) (ssmemb en ss_y2);如果同时在四个选择集
  34.                     (= 8 (length (Vlax-Get (Vlax-Ename->Vla-Object en) 'Coordinates)))
  35.                   );并且有四个顶点,这个可以省略,适配所有封闭多段线
  36.                 (ssadd en ss_new);加入到新选择集
  37.               );endif
  38.             );endrepeat
  39.             (cond
  40.               ((= 1 (sslength ss_new));如果只有一个候选项
  41.                 (progn
  42.                   (setq en_selold en_sel);备份一下上次亮显的对象
  43.                   (if (and (setq en_sel (ssname  ss_new 0 ))
  44.                         (= (vl-princ-to-string en_selold) (vl-princ-to-string en_sel))  );如果两次获取到的对象相同,那么
  45.                     (redraw  en_sel  3);直接将他亮显
  46.                     (progn ;else
  47.                       (redraw  en_sel  3)
  48.                       (if  en_selold (redraw  en_selold  4));取消原来的亮显
  49.                     )
  50.                   );endif
  51.                 ))
  52.               ((>  (sslength ss_new) 1);如果不止一个
  53.                 (setq lst_pttoobj_dist nil)
  54.                 (repeat (setq i (sslength ss_new));判断距离
  55.                   (setq i (1- i)
  56.                     en (ssname  ss_x1 i)
  57.                     obj (vlax-ename->vla-object en)
  58.                   )
  59.                   (setq lst_pttoobj_dist (append (list (list (distance (vlax-curve-getClosestPointTo obj pt_tmp) pt_tmp) en)) '() lst_pttoobj_dist))
  60.                 );endrepeat
  61.                 (setq lst_pttoobj_dist (vl-sort lst_pttoobj_dist '(lambda (x y) (< (car x) (car y)))) );对距离排序
  62.                 (setq en_selold en_sel);备份一下上次亮显的对象
  63.                 (if (and ;lst_pttoobj_dist
  64.                       (setq en_sel (cadr (nth 0 lst_pttoobj_dist) ))
  65.                       (= (vl-princ-to-string en_selold) (vl-princ-to-string en_sel));直接判断是不相等的
  66.                     );如果两次获取到的对象相同,那么
  67.                   (redraw  en_sel  3);将他亮显
  68.                   (progn ;else
  69.                     (redraw  en_sel  3)
  70.                     (if en_selold (redraw  en_selold  4));取消原来的亮显
  71.                   )
  72.                 );endif
  73.               );end progn
  74.             );endcond
  75.           ));end if
  76.       );end progn
  77.     );endif
  78.     (if  (equal (grread t 1 ) '(2 32)) ;如果输入空格
  79.       (progn
  80.         (if en_sel (redraw  en_sel  4));取消对象亮显
  81.         (setq bo nil));结束循环
  82.     )
  83.   );endwhile
  84.   ;end部分开始
  85.   (setvar "cmdecho" 1)
  86.   (setq *error* old_error)  
  87. )
  88. (princ)


回复

使用道具 举报

发表于 2019-9-16 08:31 | 显示全部楼层
可以采用ssget 里面的栏选功能
回复

使用道具 举报

 楼主| 发表于 2019-9-16 09:07 | 显示全部楼层
菜卷鱼 发表于 2019-9-16 08:31
可以采用ssget 里面的栏选功能

不是啊,我要的是不用手动去选,让程序自动根据o点自动选中矩形
回复

使用道具 举报

发表于 2019-9-16 09:24 | 显示全部楼层
669423907 发表于 2019-9-16 09:07
不是啊,我要的是不用手动去选,让程序自动根据o点自动选中矩形

你不是grread得到了一个点吗?再通过这个点,再多算几个点pt1、2、3、4,
然后再(ssget "f" <pt-list> [filter-list]),不需要手动啊。
最后再提示你一下(getvar "viewsize") 是得到屏幕的比例,你应该可以算出光标的上下左右4个点
回复

使用道具 举报

 楼主| 发表于 2019-9-16 09:32 | 显示全部楼层
菜卷鱼 发表于 2019-9-16 09:24
你不是grread得到了一个点吗?再通过这个点,再多算几个点pt1、2、3、4,
然后再(ssget "f"  [filter-li ...

你看一下我第2和第4点的要求
回复

使用道具 举报

发表于 2019-9-16 11:38 | 显示全部楼层
669423907 发表于 2019-9-16 09:32
你看一下我第2和第4点的要求

你自己去试一下吧,水平这么菜脾气还这么臭,还不敢于尝试

  1. (defun c:tt (/ o s pt1 pt2 pt3 pt4 ss1 ss2)
  2. (setq o (cadr(grread 3)))
  3. (setq s(getvar "viewsize"))
  4. (setq pt1 (polar o 0 s))
  5. (setq pt2 (polar o (* 0.5 pi) s))
  6. (setq pt3 (polar o pi s))
  7. (setq pt4 (polar o (* 1.5 pi) s))
  8. (setq ss1 (ssget "f" (list pt1 pt3) '((0 .  "LWPOLYLINE" )(8 . "0"))))
  9. (setq ss2 (ssget "f" (list pt2 pt4) '((0 .  "LWPOLYLINE" )(8 . "0"))))
  10. (command "select" ss1 ss2)
  11. (prin1)
  12. )

回复

使用道具 举报

发表于 2019-9-16 11:50 | 显示全部楼层

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2019-9-16 12:00 | 显示全部楼层
菜卷鱼 发表于 2019-9-16 11:38
你自己去试一下吧,水平这么菜脾气还这么臭,还不敢于尝试

大哥,别误会哈,我脾气很好的,只是文字上表达欠佳,我是卡在第4点上了
回复

使用道具 举报

 楼主| 发表于 2019-9-16 12:03 | 显示全部楼层

院长是个传奇人物,厉害
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 06:38 , Processed in 0.206842 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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