From 1a3d700ca237c5537f0c7df230e28fedafbb6c51 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Thu, 19 Jun 2025 20:21:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=90=84=E7=A7=8D=E7=BB=98?= =?UTF-8?q?=E5=9B=BE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainPlugin.cs | 8 ++ PathPointRenderPlugin.cs | 246 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 248 insertions(+), 6 deletions(-) diff --git a/MainPlugin.cs b/MainPlugin.cs index 149e778..2e1a848 100644 --- a/MainPlugin.cs +++ b/MainPlugin.cs @@ -228,6 +228,9 @@ namespace NavisworksTransport LogManager.Info("=== 重新打开插件界面 ==="); } + // RenderPlugin通过[Plugin]属性自动注册,无需手动处理 + LogManager.WriteLog("[插件初始化] PathPointRenderPlugin将由Navisworks自动管理"); + // 显示类别选择对话框 ShowCategorySelectionDialog(); @@ -235,6 +238,11 @@ namespace NavisworksTransport }, -1, "插件初始化"); } + /// + /// 注册PathPointRenderPlugin到Navisworks渲染管线 + /// + + /// /// 显示主控制面板 /// diff --git a/PathPointRenderPlugin.cs b/PathPointRenderPlugin.cs index 63fc0d1..9e7fd25 100644 --- a/PathPointRenderPlugin.cs +++ b/PathPointRenderPlugin.cs @@ -72,17 +72,155 @@ namespace NavisworksTransport /// 图形上下文 public override void Render(View view, Graphics graphics) { + LogManager.WriteLog($"[Render入口] ✓ Render方法被调用, IsEnabled={_isEnabled}"); + if (!_isEnabled) return; try { - // 简单测试:画一条红色线段,看能否看到任何东西 + // 首先检查文档和模型状态 + var activeDoc = Application.ActiveDocument; + LogManager.WriteLog($"[文档状态] ActiveDocument: {activeDoc?.GetType().Name ?? "null"}"); + + if (activeDoc == null) + { + LogManager.WriteLog($"[文档状态] ❌ 没有活动文档,跳过渲染"); + return; + } + + if (activeDoc.Models == null || activeDoc.Models.Count == 0) + { + LogManager.WriteLog($"[文档状态] ❌ 没有加载的模型,跳过渲染"); + return; + } + + LogManager.WriteLog($"[文档状态] ✓ 文档正常,模型数量: {activeDoc.Models.Count}"); + LogManager.WriteLog($"[Graphics状态] Graphics对象: {graphics?.GetType().Name ?? "null"}"); + LogManager.WriteLog($"[Graphics状态] View对象: {view?.GetType().Name ?? "null"}"); + + // 详细的视图和相机诊断信息 + try + { + LogManager.WriteLog($"[视图诊断] 开始获取视图信息"); + + // 尝试获取第一个模型的信息 + var firstModel = activeDoc.Models.First(); + LogManager.WriteLog($"[视图诊断] 第一个模型文件名: {firstModel.FileName}"); + + // 尝试获取根项目信息 + var rootItem = firstModel.RootItem; + if (rootItem != null) + { + LogManager.WriteLog($"[视图诊断] 根项目显示名: {rootItem.DisplayName}"); + LogManager.WriteLog($"[视图诊断] 根项目子项数量: {rootItem.Children.Count()}"); + } + } + catch (Exception viewEx) + { + LogManager.WriteLog($"[视图诊断] 获取视图信息失败: {viewEx.Message}"); + } + + // 使用BeginModelContext确保正确的渲染上下文 + graphics.BeginModelContext(); + LogManager.WriteLog($"[Graphics状态] BeginModelContext完成"); + + // 超大超明显的测试线段 - 覆盖整个模型范围 graphics.Color(Color.Red, 0.0); - graphics.LineWidth(10); - var lineStart = new Point3D(19000, -18000, 2000); - var lineEnd = new Point3D(21000, -18000, 2000); - graphics.Line(lineStart, lineEnd); - LogManager.WriteLog($"[简单测试] 绘制测试线段: ({lineStart.X}, {lineStart.Y}, {lineStart.Z}) 到 ({lineEnd.X}, {lineEnd.Y}, {lineEnd.Z})"); + graphics.LineWidth(50); // 超粗线条 + + LogManager.WriteLog($"[Graphics状态] Color和LineWidth设置完成"); + + // 视线前方测试:使用正确的Navisworks API获取当前视点 + try + { + LogManager.WriteLog($"[视线测试] 开始获取当前视点信息"); + + // 使用正确的API获取当前视点 + var document = Application.ActiveDocument; + var currentViewpoint = document.CurrentViewpoint.CreateCopy(); + + // 获取相机位置和旋转 + var cameraPosition = currentViewpoint.Position; + var cameraRotation = currentViewpoint.Rotation; + + LogManager.WriteLog($"[视线测试] 相机位置: ({cameraPosition.X:F2}, {cameraPosition.Y:F2}, {cameraPosition.Z:F2})"); + + LogManager.WriteLog($"[视线测试] 相机旋转信息获取成功"); + + // 使用最简单的方法:在相机位置周围绘制球体 + graphics.Color(Color.Red, 0.0); // 完全不透明红色 + + // 在相机位置的前、后、左、右、上、下绘制红球 + var offsets = new[] + { + new Vector3D(0, 0, -50), // 前方 + new Vector3D(0, 0, 50), // 后方 + new Vector3D(-50, 0, 0), // 左侧 + new Vector3D(50, 0, 0), // 右侧 + new Vector3D(0, 50, 0), // 上方 + new Vector3D(0, -50, 0), // 下方 + }; + + foreach (var offset in offsets) + { + var ballPosition = new Point3D( + cameraPosition.X + offset.X, + cameraPosition.Y + offset.Y, + cameraPosition.Z + offset.Z + ); + + graphics.Sphere(ballPosition, 10.0); // 10单位半径 + LogManager.WriteLog($"[视线测试] 红球位置: ({ballPosition.X:F2}, {ballPosition.Y:F2}, {ballPosition.Z:F2})"); + } + + LogManager.WriteLog($"[视线测试] ✓ 完成在相机周围绘制 {offsets.Length} 个红球"); + } + catch (Exception viewEx) + { + LogManager.WriteLog($"[视线测试] ❌ 视线测试异常: {viewEx.Message}"); + + // 备用方案:简单位置绘制 + LogManager.WriteLog($"[视线测试] 使用备用方案:固定位置绘制"); + graphics.Color(Color.Red, 0.0); + var backupPositions = new[] + { + new Point3D(0, 0, 0), // 原点 + new Point3D(100, 100, 100), // 正方向 + new Point3D(-100, -100, -100), // 负方向 + }; + + foreach (var pos in backupPositions) + { + graphics.Sphere(pos, 20.0); + LogManager.WriteLog($"[视线测试] 备用红球: ({pos.X}, {pos.Y}, {pos.Z})"); + } + } + var sphereCenter = new Point3D(0, 0, 0); // 原点位置 + var sphereRadius = 50000.0; // 超大半径,50米 + + try + { + graphics.Sphere(sphereCenter, sphereRadius); + LogManager.WriteLog($"[球体测试] ✓ 绘制超大红色球体: 中心(0,0,0), 半径={sphereRadius}"); + } + catch (Exception sphereEx) + { + LogManager.WriteLog($"[球体测试] ❌ Sphere调用异常: {sphereEx.Message}"); + } + + // 再在模型区域绘制一个球体 + var modelCenter = new Point3D(27000.0, -10000.0, 1000.0); + var modelRadius = 5000.0; // 5米半径 + + try + { + graphics.Sphere(modelCenter, modelRadius); + LogManager.WriteLog($"[球体测试] ✓ 绘制模型区域球体: 中心({modelCenter.X}, {modelCenter.Y}, {modelCenter.Z}), 半径={modelRadius}"); + } + catch (Exception modelSphereEx) + { + LogManager.WriteLog($"[球体测试] ❌ 模型球体调用异常: {modelSphereEx.Message}"); + } // 先绘制测试大圆形 - 验证Graphics.Circle API var testCenter = new Point3D(19082.41, -18248.14, 4037.26); @@ -112,6 +250,12 @@ namespace NavisworksTransport LogManager.WriteLog($"[圆形渲染] 绘制圆形: 中心({marker.Center.X:F2}, {marker.Center.Y:F2}, {marker.Center.Z:F2}), 半径={marker.Radius:F2}, 序号={marker.SequenceNumber}"); } } + + // 结束ModelContext + graphics.EndModelContext(); + LogManager.WriteLog($"[Graphics状态] EndModelContext完成"); + + LogManager.WriteLog($"[Graphics状态] === 3D渲染完成,如果仍看不到图形,问题可能在Graphics API兼容性 ==="); } catch (Exception ex) { @@ -120,6 +264,96 @@ namespace NavisworksTransport } } + /// + /// 2D覆盖层渲染方法 + /// + /// 当前视图 + /// 图形上下文 + public override void OverlayRender(View view, Graphics graphics) + { + LogManager.WriteLog($"[OverlayRender入口] ✓ OverlayRender方法被调用, IsEnabled={_isEnabled}"); + + if (!_isEnabled) return; + + try + { + // 首先检查文档和模型状态 + var activeDoc = Application.ActiveDocument; + LogManager.WriteLog($"[OverlayRender] ActiveDocument: {activeDoc?.GetType().Name ?? "null"}"); + + if (activeDoc == null) + { + LogManager.WriteLog($"[OverlayRender] ❌ 没有活动文档,跳过2D渲染"); + return; + } + + if (activeDoc.Models == null || activeDoc.Models.Count == 0) + { + LogManager.WriteLog($"[OverlayRender] ❌ 没有加载的模型,跳过2D渲染"); + return; + } + + LogManager.WriteLog($"[OverlayRender] ✓ 文档正常,开始2D渲染"); + + // 检查Graphics对象状态 + LogManager.WriteLog($"[OverlayRender] Graphics对象类型: {graphics?.GetType().Name}"); + LogManager.WriteLog($"[OverlayRender] View对象: {view?.GetType().Name ?? "null"}"); + + // 使用最简单的API测试 + var red = Color.FromByteRGB(255, 0, 0); + graphics.Color(red, 0.0); // 完全不透明的红色 + LogManager.WriteLog($"[OverlayRender] 设置颜色: R=255, G=0, B=0, Alpha=0.0"); + + graphics.LineWidth(20); // 很粗的线 + LogManager.WriteLog($"[OverlayRender] 设置线宽: 20"); + + // 绘制一条从屏幕左上角到右下角的对角线 + try + { + var startPoint = new Point3D(0, 0, 0); + var endPoint = new Point3D(800, 600, 0); + graphics.Line(startPoint, endPoint); + LogManager.WriteLog($"[OverlayRender] ✓ 绘制对角线: (0,0) 到 (800,600)"); + } + catch (Exception lineEx) + { + LogManager.WriteLog($"[OverlayRender] ❌ Line调用异常: {lineEx.Message}"); + } + + // 尝试绘制一个简单的点 + try + { + graphics.Point(new Point3D(100, 100, 0)); + LogManager.WriteLog($"[OverlayRender] ✓ 绘制点: (100,100)"); + } + catch (Exception pointEx) + { + LogManager.WriteLog($"[OverlayRender] ❌ Point调用异常: {pointEx.Message}"); + } + + // 尝试强制刷新 + try + { + if (view != null) + { + view.RequestDelayedRedraw(ViewRedrawRequests.Render); + LogManager.WriteLog($"[OverlayRender] ✓ 请求覆盖层重绘"); + } + } + catch (Exception refreshEx) + { + LogManager.WriteLog($"[OverlayRender] ❌ 重绘请求异常: {refreshEx.Message}"); + } + + LogManager.WriteLog($"[OverlayRender] === 2D覆盖层绘制完成 ==="); + } + catch (Exception ex) + { + LogManager.WriteLog($"[OverlayRender] 渲染错误: {ex.Message}"); + LogManager.WriteLog($"[OverlayRender] 异常堆栈: {ex.StackTrace}"); + } + } + /// /// 添加圆形标记 ///