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;
}
}
}