mokson 发表于 2025-7-23 10:33:27

如何用反应器取得块对象的名称?

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

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

kozmosovia 发表于 2025-7-23 11:52:35

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

edata 发表于 2025-7-25 15:23:05

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

(defun PointInBoundingBox (pt minpt maxpt)
;;; 判断点是否在包围盒内
(and
    (>= (car pt) (car minpt))
    (>= (cadr pt) (cadr minpt))
    (<= (car pt) (car maxpt))
    (<= (cadr pt) (cadr maxpt))
)
)

(defun c:Dli ( / pt block_list found scale dimstyle oldDimStyle currDimStyle)
;;; 主命令函数
(setq block_list (GetA3Blocks)); 获取所有A3图框信息

(if (null block_list)
    (princ "\n未找到A3图框!")
    (progn
      (setq pt (getpoint "\n请拾取标注点: "))
      (if pt
      (progn
          ; 查找包含点的图框
          (setq found nil)
          (foreach block_info block_list
            (setq minpt (caadr block_info)
                  maxpt (cadadr block_info))
            (if (PointInBoundingBox pt minpt maxpt)
            (setq found block_info)
            )
          )
         
          (if found
            (progn
            (setq scale (car found)
                  dimstyle (strcat "dim-" (itoa (fix scale))))
            
            ; 检查标注样式是否存在
            (if (tblsearch "DIMSTYLE" dimstyle)
                (progn
                  (setq doc(vla-get-activedocument (vlax-get-acad-object)))
                  (setq oldDimStyle(vla-get-activeDimStyle doc))
                  (setq currDimStyle(vla-item (vla-get-dimstyles doc) dimstyle))
                  
                  (vla-put-ActiveDimStyle doc currDimStyle)
                  (princ (strcat "\n切换到标注样式: " dimstyle))
                  
                  ; 绘制标注
                  (command "_.DIMLINEAR" pt pause pause)
                  (vla-put-ActiveDimStyle doc oldDimStyle)
                )
                (princ (strcat "\n标注样式" dimstyle "不存在!"))
            )
            )
            (princ "\n拾取点不在任何A3图框范围内!")
          )
      )
      (princ "\n未拾取点!")
      )
    )
)
(princ)
)

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

guosheyang 发表于 2025-7-25 14:52:14

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



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

Syu 发表于 2025-7-23 10:55:01

AcEdInputPointMonitor::monitorInputPoint   这个应该可以

自贡黄明儒 发表于 2025-7-23 11:16:41

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

嘒彼小星 发表于 2025-7-23 15:30:33

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

guosheyang 发表于 2025-7-23 15:36:10

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

Klein 发表于 2025-7-23 15:44:53

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

kozmosovia 发表于 2025-7-23 16:00:03

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

介绍下怎样操作?

mokson 发表于 2025-7-23 16:10:12

本帖最后由 mokson 于 2025-7-25 07:58 编辑

guosheyang 发表于 2025-7-23 15:36
不知道具体目的是啥    如果只是想鼠标靠近图框   显示 图框块儿的名称   可以用grread获取坐标再用s ...
我的具体目的是:当鼠标悬停在图框上时,获取它的名称和比例,比如是10倍,然后在图框内的其它线段打标注时,自动将标注的全局比例 dimscale 设置为10,这样就使标注与图框的比例相匹配。

guosheyang 发表于 2025-7-23 16:11:10

嗯   的却如此   cui鼠标悬停工具即可
页: [1] 2 3
查看完整版本: 如何用反应器取得块对象的名称?