using System; using Autodesk.Navisworks.Api; using Autodesk.Navisworks.Api.Plugins; namespace NavisworksTransport { /// /// 自定义工具插件,用于获取精确的鼠标点击坐标 /// [Plugin("PathClickTool", "NavisworksTransport")] public class PathClickToolPlugin : ToolPlugin { /// /// 插件构造函数 /// public PathClickToolPlugin() { LogManager.WriteLog("[ToolPlugin] PathClickToolPlugin实例已创建"); } /// /// 点击事件,传递精确的点击坐标和对象 /// public static event EventHandler MouseClicked; /// /// 获取插件的程序集路径(用于动态加载) /// public static string AssemblyPath { get { return System.Reflection.Assembly.GetExecutingAssembly().Location; } } /// /// 重写鼠标按下事件,获取精确的点击坐标 /// public override bool MouseDown(View view, KeyModifiers modifiers, ushort button, int x, int y, double timeOffset) { LogManager.WriteLog("[ToolPlugin] ★★★ MouseDown方法被调用 ★★★"); try { LogManager.WriteLog("[ToolPlugin] ===== 鼠标点击事件 ====="); LogManager.WriteLog($"[ToolPlugin] 屏幕坐标: ({x}, {y})"); LogManager.WriteLog($"[ToolPlugin] 按键: {button}, 修饰键: {modifiers}"); // 只处理左键点击 if (button == 1) // 左键 { LogManager.WriteLog("[ToolPlugin] 检测到左键点击,开始处理"); // 使用PickItemFromPoint获取精确的3D坐标 PickItemResult itemResult = view.PickItemFromPoint(x, y); if (itemResult != null) { LogManager.WriteLog("[ToolPlugin] ✓ PickItemFromPoint成功"); LogManager.WriteLog($"[ToolPlugin] 精确3D坐标: ({itemResult.Point.X:F3}, {itemResult.Point.Y:F3}, {itemResult.Point.Z:F3})"); LogManager.WriteLog($"[ToolPlugin] 选中对象: {itemResult.ModelItem?.DisplayName ?? "NULL"}"); // 触发事件,将精确坐标传递给PathPlanningManager MouseClicked?.Invoke(this, itemResult); LogManager.WriteLog("[ToolPlugin] 事件已触发"); } else { LogManager.WriteLog("[ToolPlugin] ✗ PickItemFromPoint返回null(未点击到对象)"); } } else { LogManager.WriteLog($"[ToolPlugin] 忽略非左键点击: {button}"); } // 返回false表示继续传递事件给其他处理程序 return false; } catch (Exception ex) { LogManager.WriteLog($"[ToolPlugin] 异常: {ex.Message}"); LogManager.WriteLog($"[ToolPlugin] 堆栈: {ex.StackTrace}"); return false; } } /// /// 鼠标移动事件(可用于悬停显示坐标) /// public override bool MouseMove(View view, KeyModifiers modifiers, int x, int y, double timeOffset) { // 暂时不处理鼠标移动事件,避免日志过多 return false; } } }