增加网格点可视化类型,立方体(可用)、点(不可用)

This commit is contained in:
tian 2025-10-17 18:47:35 +08:00
parent fb13b81259
commit 9c97633411
4 changed files with 264 additions and 2 deletions

1
$null Normal file
View File

@ -0,0 +1 @@
Active code page: 65001

View File

@ -23,6 +23,27 @@ namespace NavisworksTransport
VehicleSpace
}
/// <summary>
/// 网格点类型枚举
/// </summary>
public enum GridPointType
{
/// <summary>
/// 球形
/// </summary>
Sphere,
/// <summary>
/// 立方体
/// </summary>
Cube,
/// <summary>
/// 点
/// </summary>
Point
}
/// <summary>
/// 渲染颜色类型枚举
@ -283,6 +304,9 @@ namespace NavisworksTransport
// 路径可视化模式配置
private PathVisualizationMode _visualizationMode = PathVisualizationMode.StandardLine;
// 网格点类型配置
private GridPointType _gridPointType = GridPointType.Cube;
// 车辆参数必须通过SetVehicleParameters方法设置
private double _vehicleLength;
private double _vehicleWidth;
@ -319,6 +343,20 @@ namespace NavisworksTransport
}
}
/// <summary>
/// 网格点类型
/// </summary>
public GridPointType GridPointType
{
get { return _gridPointType; }
set
{
_gridPointType = value;
// 类型改变时刷新所有网格路径
RefreshGridPaths();
}
}
/// <summary>
/// 是否启用渲染
@ -406,7 +444,7 @@ namespace NavisworksTransport
foreach (var pointMarker in visualization.PointMarkers)
{
graphics.Color(pointMarker.Color, pointMarker.Alpha);
graphics.Sphere(pointMarker.Center, pointMarker.Radius);
RenderPointMarker(graphics, pointMarker);
}
// 渲染所有连线(删除频繁的调试日志以避免日志泛滥)
@ -428,7 +466,7 @@ namespace NavisworksTransport
if (_previewMarker != null && _previewMarker.IsVisible)
{
graphics.Color(_previewMarker.Color, 0.7); // 使用半透明效果
graphics.Sphere(_previewMarker.Position, _previewMarker.Radius);
RenderPointMarker(graphics, _previewMarker);
}
// 渲染预览连线(灰色)
@ -614,6 +652,32 @@ namespace NavisworksTransport
}
}
/// <summary>
/// 刷新所有网格路径
/// </summary>
private void RefreshGridPaths()
{
lock (_lockObject)
{
var gridPathIds = _pathVisualizations.Keys
.Where(id => IsGridVisualizationPath(id))
.ToList();
foreach (var pathId in gridPathIds)
{
if (_pathVisualizations.TryGetValue(pathId, out var visualization))
{
BuildPointMarkersOnly(visualization);
}
}
if (gridPathIds.Count > 0)
{
RequestViewRefresh();
}
}
}
/// <summary>
/// 移除路径
/// </summary>
@ -855,6 +919,7 @@ namespace NavisworksTransport
Alpha = isGridVisualization ? gridStyle.Alpha : 1.0,
Filled = true,
PointType = point.Type,
GridPointType = isGridVisualization ? _gridPointType : GridPointType.Sphere, // 网格点使用配置的类型,其他点使用球形
SequenceNumber = point.Index, // 使用Index而不是任意序号
CreatedTime = DateTime.Now
};
@ -1533,6 +1598,57 @@ namespace NavisworksTransport
}
/// <summary>
/// 渲染点标记
/// </summary>
/// <param name="graphics">图形上下文</param>
/// <param name="pointMarker">点标记</param>
private void RenderPointMarker(Graphics graphics, CircleMarker pointMarker)
{
switch (pointMarker.GridPointType)
{
case GridPointType.Cube:
// 渲染立方体
RenderCubeMarker(graphics, pointMarker);
break;
case GridPointType.Point:
// 渲染点
graphics.Point(pointMarker.Center);
break;
case GridPointType.Sphere:
default:
// 渲染球形(默认)
graphics.Sphere(pointMarker.Center, pointMarker.Radius);
break;
}
}
/// <summary>
/// 渲染立方体标记
/// </summary>
/// <param name="graphics">图形上下文</param>
/// <param name="pointMarker">点标记</param>
private void RenderCubeMarker(Graphics graphics, CircleMarker pointMarker)
{
// 计算立方体的边长(直径的一半)
double halfSide = pointMarker.Radius;
// 定义立方体的三个轴向量沿X、Y、Z轴
var xVector = new Vector3D(halfSide * 2, 0, 0);
var yVector = new Vector3D(0, halfSide * 2, 0);
var zVector = new Vector3D(0, 0, halfSide * 2);
// 计算立方体原点(中心点减去各轴向量的一半)
var origin = new Point3D(
pointMarker.Center.X - halfSide,
pointMarker.Center.Y - halfSide,
pointMarker.Center.Z - halfSide
);
// 使用Cuboid API渲染立方体
graphics.Cuboid(origin, xVector, yVector, zVector, pointMarker.Filled);
}
/// <summary>
/// 请求视图刷新(带防抖机制)
/// </summary>
@ -1683,6 +1799,11 @@ namespace NavisworksTransport
/// </summary>
public PathPointType PointType { get; set; }
/// <summary>
/// 网格点类型
/// </summary>
public GridPointType GridPointType { get; set; } = GridPointType.Sphere;
/// <summary>
/// 序号
/// </summary>

View File

@ -25,6 +25,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private bool _showObstacleGrid = false;
private bool _showUnknownGrid = false;
private bool _showDoorGrid = false;
// 网格点类型字段
private GridPointType _gridPointType = GridPointType.Cube;
private ObservableCollection<GridPointType> _gridPointTypes;
// 路径可视化模式字段
private bool _isStandardLineMode = true;
private bool _isVehicleSpaceMode = false;
@ -104,6 +109,71 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
}
/// <summary>
/// 网格点类型
/// </summary>
public GridPointType GridPointType
{
get => _gridPointType;
set
{
if (SetProperty(ref _gridPointType, value))
{
// 通知相关的单选按钮属性更新
OnPropertyChanged(nameof(IsCubePointType));
OnPropertyChanged(nameof(IsSpherePointType));
OnPropertyChanged(nameof(IsPointPointType));
OnGridPointTypeChanged();
}
}
}
/// <summary>
/// 是否使用立方体点类型
/// </summary>
public bool IsCubePointType
{
get => _gridPointType == GridPointType.Cube;
set
{
if (value)
{
GridPointType = GridPointType.Cube;
}
}
}
/// <summary>
/// 是否使用球形点类型
/// </summary>
public bool IsSpherePointType
{
get => _gridPointType == GridPointType.Sphere;
set
{
if (value)
{
GridPointType = GridPointType.Sphere;
}
}
}
/// <summary>
/// 是否使用点状点类型
/// </summary>
public bool IsPointPointType
{
get => _gridPointType == GridPointType.Point;
set
{
if (value)
{
GridPointType = GridPointType.Point;
}
}
}
/// <summary>
/// 是否使用标准连线模式
/// </summary>
@ -369,6 +439,36 @@ namespace NavisworksTransport.UI.WPF.ViewModels
UpdateMainStatus("网格可视化设置应用失败");
}
}
/// <summary>
/// 网格点类型变更事件处理
/// </summary>
private void OnGridPointTypeChanged()
{
try
{
LogManager.Info($"网格点类型已更改: {GridPointType}");
// 通知路径点渲染插件更新网格点类型
var renderPlugin = PathPointRenderPlugin.Instance;
if (renderPlugin != null)
{
renderPlugin.GridPointType = GridPointType;
UpdateMainStatus("网格点类型已更新");
}
else
{
LogManager.Warning("无法获取PathPointRenderPlugin实例网格点类型可能不会立即生效");
UpdateMainStatus("网格点类型已保存");
}
}
catch (Exception ex)
{
LogManager.Error($"应用网格点类型失败: {ex.Message}", ex);
UpdateMainStatus("网格点类型应用失败");
}
}
/// <summary>
/// 路径可视化模式变更事件处理
/// </summary>
@ -446,6 +546,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
var currentLevel = LogManager.GetLogLevel();
SelectedLogLevel = currentLevel.ToString();
// 设置默认网格点类型
GridPointType = GridPointType.Cube;
// 初始化系统信息
PluginVersion = "v1.0";
NavisworksVersion = "2026";

View File

@ -154,6 +154,43 @@ NavisworksTransport 系统管理页签视图 - 采用与其他页签一致的Nav
ToolTip="显示通行空间(矩形通道)"/>
</StackPanel>
</StackPanel>
</Grid>
<!-- 网格点类型设置 -->
<Grid Margin="0,10,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0"
Content="网格点类型:"
Style="{StaticResource ParameterLabelStyle}"
Width="100"
VerticalAlignment="Center"/>
<StackPanel Grid.Column="1"
Orientation="Horizontal"
VerticalAlignment="Center"
Margin="5,0,0,0">
<RadioButton Content="立方体"
GroupName="GridPointType"
IsChecked="{Binding IsCubePointType}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示立方体网格点"/>
<RadioButton Content="球形"
GroupName="GridPointType"
IsChecked="{Binding IsSpherePointType}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示球形网格点"/>
<RadioButton Content="点"
GroupName="GridPointType"
IsChecked="{Binding IsPointPointType}"
VerticalAlignment="Center"
ToolTip="显示点状网格点"/>
</StackPanel>
</Grid>
</StackPanel>
</Border>