You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autodesk Inventor自定义类无法触发OnMouseClick事件求助

问题分析与解决方案

核心问题

你的代码中m_mouse对象的类型声明错误,导致无法正确绑定OnMouseClick事件:

  • 你将m_mouse声明为InteractionEvents类型,但m_interaction.MouseEvents返回的是MouseEvents对象,类型不匹配会使事件绑定失效,同时智能提示仅显示InteractionEvents的成员(Terminate、Suspend、Resume、Help)。

修正后的代码

Public Class Cls_GetDrawingPickPoint
    Private WithEvents m_interaction As Inventor.InteractionEvents
    ' 修正:将m_mouse类型改为MouseEvents
    Private WithEvents m_mouse As Inventor.MouseEvents
    Private m_position As Point2d
    Private m_button As MouseButtonEnum
    Private m_continue As Boolean

    Public Sub New()
    End Sub

    Public Function GetDrawingPoint(Prompt As String, button As MouseButtonEnum) As Point2d
        m_position = Nothing
        m_button = button

        ' 初始化交互事件
        m_interaction = g_inventorApplication.CommandManager.CreateInteractionEvents
        ' 正确获取MouseEvents对象
        m_mouse = m_interaction.MouseEvents

        ' 禁用选择功能(如果仅需捕获点击坐标,不需要选择对象)
        m_interaction.SelectEnable = False
        m_interaction.StatusBarText = Prompt
        m_interaction.Start()

        Do While m_continue
            g_inventorApplication.UserInterfaceManager.DoEvents()
        Loop

        ' 确保交互事件停止并释放资源
        If m_interaction.IsStarted Then
            m_interaction.Stop()
        End If

        GetDrawingPoint = m_position
        Return GetDrawingPoint
    End Function

    Private Sub m_mouse_OnMouseClick(button As MouseButtonEnum, ShiftKeys As ShiftStateEnum, ModelPosition As Point, ViewPosition As Point2d, View As Inventor.View) Handles m_mouse.OnMouseClick
        If button = m_button Then
            ' 注意:绘图界面中应该使用ViewPosition(屏幕坐标转视图坐标),而非ModelPosition(模型空间坐标)
            m_position = g_inventorApplication.TransientGeometry.CreatePoint2d(ViewPosition.X, ViewPosition.Y)
            Debug.Print("点击坐标:" & m_position.X & "," & m_position.Y)
        End If

        m_continue = False
    End Sub

    Private Sub m_interaction_OnTerminate() Handles m_interaction.OnTerminate
        m_continue = False
        If m_interaction.IsStarted Then
            m_interaction.Stop()
        End If
    End Sub

    Private Sub m_interaction_OnActivate() Handles m_interaction.OnActivate
        m_continue = True
    End Sub
End Class

关键修改说明

  1. 类型修正:将Private WithEvents m_mouse As InteractionEvents改为Private WithEvents m_mouse As Inventor.MouseEvents,确保类型匹配,正确绑定鼠标点击事件。
  2. 禁用选择功能:添加m_interaction.SelectEnable = False,避免Inventor的默认选择逻辑干扰鼠标点击事件的捕获。
  3. 坐标获取修正:在绘图界面中,ViewPosition是视图坐标系下的点击坐标,更符合绘图场景需求;ModelPosition是模型空间坐标,仅在3D模型界面适用。
  4. 资源安全处理:添加IsStarted判断,避免重复调用Stop()导致的异常。

额外注意事项

  • 确保g_inventorApplication是全局有效的Inventor应用实例,未被提前释放或赋值为空。
  • 如果在Inventor的不同环境(零件、装配、工程图)中使用,需根据场景调整坐标转换逻辑。
  • 避免在循环中过度调用DoEvents(),可考虑添加适当的延迟或使用更高效的事件驱动逻辑。

内容的提问来源于stack exchange,提问作者Kallo90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:25:17