97 lines
3.7 KiB
C#
97 lines
3.7 KiB
C#
using System;
|
||
using Autodesk.Navisworks.Api;
|
||
using Autodesk.Navisworks.Api.Plugins;
|
||
|
||
namespace NavisworksTransport
|
||
{
|
||
/// <summary>
|
||
/// 自定义工具插件,用于获取精确的鼠标点击坐标
|
||
/// </summary>
|
||
[Plugin("PathClickTool", "NavisworksTransport")]
|
||
public class PathClickToolPlugin : ToolPlugin
|
||
{
|
||
/// <summary>
|
||
/// 插件构造函数
|
||
/// </summary>
|
||
public PathClickToolPlugin()
|
||
{
|
||
LogManager.WriteLog("[ToolPlugin] PathClickToolPlugin实例已创建");
|
||
}
|
||
/// <summary>
|
||
/// 点击事件,传递精确的点击坐标和对象
|
||
/// </summary>
|
||
public static event EventHandler<PickItemResult> MouseClicked;
|
||
|
||
/// <summary>
|
||
/// 获取插件的程序集路径(用于动态加载)
|
||
/// </summary>
|
||
public static string AssemblyPath
|
||
{
|
||
get
|
||
{
|
||
return System.Reflection.Assembly.GetExecutingAssembly().Location;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 重写鼠标按下事件,获取精确的点击坐标
|
||
/// </summary>
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 鼠标移动事件(可用于悬停显示坐标)
|
||
/// </summary>
|
||
public override bool MouseMove(View view, KeyModifiers modifiers, int x, int y, double timeOffset)
|
||
{
|
||
// 暂时不处理鼠标移动事件,避免日志过多
|
||
return false;
|
||
}
|
||
}
|
||
} |