NavisworksTransport/src/Core/PathClickToolPlugin.cs
tian 101c929f15 用ClashDetective API的标准用法重构碰撞检测部分,增加了碰撞分组;
三维视图选点光标改成十字形,当失去焦点时,按空格键切换回来。
2025-09-06 04:13:12 +08:00

121 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>
/// 公开方法,允许外部代码触发 MouseClicked 事件
/// 用于 PathInputMonitor 等备用输入机制
/// </summary>
/// <param name="sender">事件发送者</param>
/// <param name="result">点击结果</param>
public static void TriggerMouseClicked(object sender, PickItemResult result)
{
MouseClicked?.Invoke(sender, result);
}
/// <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;
}
/// <summary>
/// 重写光标样式,使用捕捉光标提供更好的视觉反馈
/// </summary>
/// <param name="view">当前视图</param>
/// <param name="modifier">键盘修饰键</param>
/// <returns>返回捕捉光标</returns>
public override Cursor GetCursor(View view, KeyModifiers modifier)
{
// 使用测量光标(十字线),提供更好的视觉反馈用于精确路径点选择
return Cursor.Measure;
}
}
}