测试各种绘图方式

This commit is contained in:
tian 2025-06-19 20:21:26 +08:00
parent e895317f44
commit 1a3d700ca2
2 changed files with 248 additions and 6 deletions

View File

@ -228,6 +228,9 @@ namespace NavisworksTransport
LogManager.Info("=== 重新打开插件界面 ===");
}
// RenderPlugin通过[Plugin]属性自动注册,无需手动处理
LogManager.WriteLog("[插件初始化] PathPointRenderPlugin将由Navisworks自动管理");
// 显示类别选择对话框
ShowCategorySelectionDialog();
@ -235,6 +238,11 @@ namespace NavisworksTransport
}, -1, "插件初始化");
}
/// <summary>
/// 注册PathPointRenderPlugin到Navisworks渲染管线
/// </summary>
/// <summary>
/// 显示主控制面板
/// </summary>

View File

@ -72,17 +72,155 @@ namespace NavisworksTransport
/// <param name="graphics">图形上下文</param>
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
}
}
/// <summary>
/// 2D覆盖层渲染方法
/// </summary>
/// <param name="view">当前视图</param>
/// <param name="graphics">图形上下文</param>
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}");
}
}
/// <summary>
/// 添加圆形标记
/// </summary>