本帖最后由 mokson 于 2025-7-24 14:07 编辑

我的图框是块对象,我想将鼠标悬停在图框上时(只是移上去不需要单击选中它),然后获取它的块名称和比例。这是不是需要用到反应器,我不懂使用反应器,各位师兄能不能提供一个精简的实例?我的具体用意见9楼。谢谢你们的帮助。


网友答: 可以用grread实现,不停的鼠标位置点附近选图块。不过需要命令启动执行,而不是空闲时也能触发。

网友答: 给个简单的例子.
  1. (defun GetA3Blocks (/ ss i ent blk_info minpt maxpt scale bbox_list)
  2.   ;;; 搜索图中所有名为"A3图框"的图块并返回包围盒信息
  3.   (setq bbox_list '())
  4.   (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "A3图框"))))
  5.     (progn
  6.       (setq i 0)
  7.       (repeat (sslength ss)
  8.         (setq ent (ssname ss i)
  9.               blk_info (entget ent))
  10.         (setq scale (cdr (assoc 41 blk_info)))  ; 获取X方向比例因子
  11.         (setq blk_obj (vlax-ename->vla-object ent))
  12.         (vla-getboundingbox blk_obj 'minpt 'maxpt)
  13.         (setq minpt (vlax-safearray->list minpt)
  14.               maxpt (vlax-safearray->list maxpt))
  15.         ; 添加到返回列表: (比例 ((左下点) (右上点)))
  16.         (setq bbox_list (cons (list scale (list minpt maxpt)) bbox_list))
  17.         (setq i (1+ i))
  18.       )
  19.     )
  20.   )
  21.   (reverse bbox_list)  ; 返回结果列表
  22. )

  23. (defun PointInBoundingBox (pt minpt maxpt)
  24.   ;;; 判断点是否在包围盒内
  25.   (and
  26.     (>= (car pt) (car minpt))
  27.     (>= (cadr pt) (cadr minpt))
  28.     (<= (car pt) (car maxpt))
  29.     (<= (cadr pt) (cadr maxpt))
  30.   )
  31. )

  32. (defun c:Dli ( / pt block_list found scale dimstyle oldDimStyle currDimStyle)
  33.   ;;; 主命令函数
  34.   (setq block_list (GetA3Blocks))  ; 获取所有A3图框信息
  35.   
  36.   (if (null block_list)
  37.     (princ "\n未找到A3图框!")
  38.     (progn
  39.       (setq pt (getpoint "\n请拾取标注点: "))
  40.       (if pt
  41.         (progn
  42.           ; 查找包含点的图框
  43.           (setq found nil)
  44.           (foreach block_info block_list
  45.             (setq minpt (caadr block_info)
  46.                   maxpt (cadadr block_info))
  47.             (if (PointInBoundingBox pt minpt maxpt)
  48.               (setq found block_info)
  49.             )
  50.           )
  51.          
  52.           (if found
  53.             (progn
  54.               (setq scale (car found)
  55.                     dimstyle (strcat "dim-" (itoa (fix scale))))
  56.               
  57.               ; 检查标注样式是否存在
  58.               (if (tblsearch "DIMSTYLE" dimstyle)
  59.                 (progn
  60.                   (setq doc(vla-get-activedocument (vlax-get-acad-object)))
  61.                   (setq oldDimStyle(vla-get-activeDimStyle doc))
  62.                   (setq currDimStyle(vla-item (vla-get-dimstyles doc) dimstyle))
  63.                   
  64.                   (vla-put-ActiveDimStyle doc currDimStyle)
  65.                   (princ (strcat "\n切换到标注样式: " dimstyle))
  66.                   
  67.                   ; 绘制标注
  68.                   (command "_.DIMLINEAR" pt pause pause)
  69.                   (vla-put-ActiveDimStyle doc oldDimStyle)
  70.                 )
  71.                 (princ (strcat "\n标注样式" dimstyle "不存在!"))
  72.               )
  73.             )
  74.             (princ "\n拾取点不在任何A3图框范围内!")
  75.           )
  76.         )
  77.         (princ "\n未拾取点!")
  78.       )
  79.     )
  80.   )
  81.   (princ)
  82. )

  83. (princ "\nDli命令已加载,输入Dli启动")
  84. (princ)


网友答:
mokson 发表于 2025-7-25 08:40
射线与图框相交,就获取图框的属性。我才疏学浅摸不着头脑呀。



      假如在红色图框内的点处要添加尺寸标注,需要确定该点所在的图框即红色图框,然后才能获取其属性,那么就可以从该点开始画一条射线,图中的绿色线,然后用红色射线与 所有的图框块儿求交点(需要炸开图框块儿),得到有交点的三个图框,然后再通过该点与三个图框中心点的距离长短来筛选出距离最短的红色图框,然后得到其属性,这种画射线的方法在当前屏幕内看不见(ssget选不了)图框线的时候也可以


网友答: AcEdInputPointMonitor::monitorInputPoint   这个应该可以

网友答: :VLR-Mouse-Reactor
:VLR-beginDoubleClick
:VLR-beginRightClick
鼠标反应器只有双击和右击,鼠标悬停在图框上时,用反应器办不到呀

网友答: cui 鼠标悬停工具提示 里面勾上对应的就行了

网友答: 不知道具体目的是啥    如果只是想鼠标靠近图框   显示 图框块儿的名称   可以用grread  获取  坐标  再用ssget "C" pt pt  选中图框,然后 生成一个文字  即可   但是  要执行命令 或运行函数   结束后 就不行了  不晓得lisp如何实现 多函数同时执行?

网友答: CAD自带啊,5楼是对的,鼠标悬停还可以显示很多对象的不同属性

网友答:
嘒彼小星 发表于 2025-7-23 15:30
cui 鼠标悬停工具提示 里面勾上对应的就行了

介绍下怎样操作?

网友答: 本帖最后由 mokson 于 2025-7-25 07:58 编辑
guosheyang 发表于 2025-7-23 15:36
不知道具体目的是啥    如果只是想鼠标靠近图框   显示 图框块儿的名称   可以用grread  获取  坐标  再用s ...

我的具体目的是:当鼠标悬停在图框上时,获取它的名称和比例,比如是10倍,然后在图框内的其它线段打标注时,自动将标注的全局比例 dimscale 设置为10,这样就使标注与图框的比例相匹配。

网友答: 嗯   的却如此   cui  鼠标悬停工具即可
  • 上一篇:组合物体选择
  • 下一篇:没有了