NavisworksTransport/src/UI/WPF/Views/CollisionReportDialog.xaml

421 lines
24 KiB
XML
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.

<!--
NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Navisworks 2026风格
功能说明:
1. 显示详细的碰撞检测报告,包括统计信息和具体碰撞项目
2. 支持按类型分组显示碰撞(动画、独立检测、其他)
3. 提供导出、刷新、高亮等操作功能
4. 结构化展示替代原来的简单TextBox显示
设计原则参考HelpDialog的布局和样式使用统一的蓝色主题
-->
<Window x:Class="NavisworksTransport.UI.WPF.Views.CollisionReportDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:NavisworksTransport.UI.WPF.Converters"
mc:Ignorable="d"
Title="碰撞检测报告"
Height="1200"
Width="900"
ResizeMode="CanResize"
WindowStartupLocation="CenterOwner"
MinHeight="900"
MinWidth="700">
<Window.Resources>
<!-- 引用共享的Navisworks 2026样式资源 -->
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/NavisworksTransportPlugin;component/src/UI/WPF/Resources/NavisworksStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- 转换器定义 -->
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
<local:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter"/>
<local:CountToVisibilityConverter x:Key="CountToVisibilityConverter"/>
<!-- 碰撞报告专用样式 -->
<Style x:Key="StatisticItemStyle" TargetType="Border">
<Setter Property="Background" Value="#FFF8FBFF"/>
<Setter Property="BorderBrush" Value="#FFD4E7FF"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="3"/>
<Setter Property="Padding" Value="10,8"/>
<Setter Property="Margin" Value="0,2"/>
</Style>
<Style x:Key="StatisticLabelStyle" TargetType="TextBlock">
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="FontSize" Value="11"/>
<Setter Property="Foreground" Value="{StaticResource NavisworksSecondaryBrush}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="StatisticValueStyle" TargetType="TextBlock">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="{StaticResource NavisworksPrimaryBrush}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Right"/>
</Style>
<Style x:Key="CollisionItemStyle" TargetType="Border">
<Setter Property="Background" Value="White"/>
<Setter Property="BorderBrush" Value="#FFEEEEEE"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="2"/>
<Setter Property="Padding" Value="8"/>
<Setter Property="Margin" Value="0,1"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFF8FBFF"/>
<Setter Property="BorderBrush" Value="#FFD4E7FF"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="CollisionTitleStyle" TargetType="TextBlock">
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="FontSize" Value="11"/>
<Setter Property="Foreground" Value="#FF333333"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style x:Key="CollisionDescriptionStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="10"/>
<Setter Property="Foreground" Value="#FF666666"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="Margin" Value="0,2,0,0"/>
</Style>
<Style x:Key="StatusTagStyle" TargetType="Border">
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="6,2"/>
<Setter Property="Margin" Value="0,0,0,3"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
<Style x:Key="StatusTextStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="9"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Foreground" Value="White"/>
</Style>
<Style x:Key="SectionHeaderStyle" TargetType="Label">
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Foreground" Value="{StaticResource NavisworksPrimaryBrush}"/>
<Setter Property="Padding" Value="0,8,0,4"/>
</Style>
<Style x:Key="ProgressStyle" TargetType="ProgressBar">
<Setter Property="Height" Value="4"/>
<Setter Property="Margin" Value="0,5"/>
<Setter Property="Foreground" Value="{StaticResource NavisworksPrimaryBrush}"/>
<Setter Property="Background" Value="#FFEEEEEE"/>
</Style>
<!-- 数据模板:碰撞项目 -->
<DataTemplate x:Key="CollisionItemTemplate">
<Border Style="{StaticResource CollisionItemStyle}">
<Border.InputBindings>
<MouseBinding MouseAction="LeftClick"
Command="{Binding DataContext.HighlightCollisionCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"/>
</Border.InputBindings>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Title}" Style="{StaticResource CollisionDescriptionStyle}" FontWeight="SemiBold"/>
<Border Grid.Row="1" Style="{StaticResource StatusTagStyle}" Background="{Binding StatusColor}">
<TextBlock Text="{Binding StatusText}" Style="{StaticResource StatusTextStyle}"/>
</Border>
<TextBlock Grid.Row="2" Text="{Binding Description}" Style="{StaticResource CollisionDescriptionStyle}"/>
<TextBlock Grid.Row="3" Text="{Binding Details}" Style="{StaticResource CollisionDescriptionStyle}" Margin="0,3,0,0"/>
</Grid>
</Border>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 主内容区域 -->
<Border Grid.Row="0"
BorderBrush="#FFD4E7FF"
BorderThickness="1"
CornerRadius="0"
Background="White"
Margin="15,15,15,10">
<Grid>
<!-- 加载进度指示 -->
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"
Visibility="{Binding IsGenerating, Converter={StaticResource BooleanToVisibilityConverter}}">
<TextBlock Text="正在生成碰撞报告..." HorizontalAlignment="Center"
Style="{StaticResource DialogContentTextStyle}" Margin="0,0,0,10"/>
<ProgressBar Value="{Binding ProgressPercentage}" Maximum="100" Width="300" Style="{StaticResource ProgressStyle}"/>
<TextBlock Text="{Binding ProgressMessage}" HorizontalAlignment="Center"
Style="{StaticResource DialogContentTextStyle}" Margin="0,5,0,0"/>
</StackPanel>
<!-- 报告内容 -->
<ScrollViewer VerticalScrollBarVisibility="Auto"
Padding="15"
Visibility="{Binding IsGenerating, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
<StackPanel>
<!-- 报告标题 -->
<Label Content="{Binding ReportTitle}"
FontSize="16"
FontWeight="SemiBold"
Foreground="{StaticResource NavisworksPrimaryBrush}"
HorizontalAlignment="Center"
Margin="0,0,0,15"/>
<!-- 总体统计信息 -->
<Label Content="总体统计" Style="{StaticResource SectionHeaderStyle}"/>
<UniformGrid Columns="3" Margin="0,0,0,15">
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="总碰撞数" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Statistics.TotalCollisions}" Style="{StaticResource StatisticValueStyle}" FontSize="16"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="碰撞构件" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding UniqueCollidedObjectsCount}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="检测点" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Statistics.AnimationCollisions}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
</UniformGrid>
<!-- 检测参数信息 -->
<Label Content="检测参数" Style="{StaticResource SectionHeaderStyle}"/>
<UniformGrid Columns="4" Margin="0,0,0,15">
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="路径名称" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding PathName}" Style="{StaticResource StatisticValueStyle}" FontSize="11"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="帧率(FPS)" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding FrameRate}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="时长(秒)" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding Duration}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
<Border Style="{StaticResource StatisticItemStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="检测间隙(米)" Style="{StaticResource StatisticLabelStyle}"/>
<TextBlock Grid.Row="1" Text="{Binding DetectionGap, StringFormat={}{0:F2}}" Style="{StaticResource StatisticValueStyle}"/>
</Grid>
</Border>
</UniformGrid>
<!-- 碰撞场景截图区域 -->
<Label Content="碰撞场景截图" Style="{StaticResource SectionHeaderStyle}"/>
<GroupBox Margin="0,0,0,10" BorderBrush="#FFD4E7FF" BorderThickness="1">
<Grid>
<!-- 截图预览 -->
<Border BorderBrush="Gray"
BorderThickness="1"
Background="Black"
MinHeight="300">
<Image Source="{Binding ScreenshotPreviewSource}"
Stretch="Uniform"
RenderOptions.BitmapScalingMode="HighQuality">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding ScreenshotPreviewSource}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Border>
</Grid>
</GroupBox>
<!-- 运动构件信息 -->
<Border Style="{StaticResource StatisticItemStyle}"
Margin="0,0,0,10"
Background="#FFF0F8FF"
BorderBrush="#FFB0D4F1">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="🚛 运动构件信息"
FontSize="11"
FontWeight="SemiBold"
Foreground="{StaticResource NavisworksPrimaryBrush}"
HorizontalAlignment="Center"
Margin="0,0,0,5"/>
<TextBlock Text="{Binding MovingObjectInfo}"
FontSize="12"
FontWeight="Normal"
Foreground="#FF333333"
HorizontalAlignment="Center"
TextWrapping="Wrap"/>
</StackPanel>
</Border>
<!-- 碰撞构件清单 -->
<StackPanel Visibility="{Binding CollidedObjectsList.Count, Converter={StaticResource CountToVisibilityConverter}}" Margin="0,0,0,15">
<Label Content="碰撞构件清单" Style="{StaticResource SectionHeaderStyle}"/>
<Border Style="{StaticResource StatisticItemStyle}" MaxHeight="150">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding CollidedObjectsList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5,2">
<TextBlock Text="•" FontWeight="Bold" Foreground="{StaticResource NavisworksPrimaryBrush}" Margin="0,0,8,0"/>
<TextBlock Text="{Binding}"
Style="{StaticResource DialogContentTextStyle}"
TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</StackPanel>
<!-- 总结信息 -->
<Label Content="总结与建议" Style="{StaticResource SectionHeaderStyle}"/>
<Border Style="{StaticResource StatisticItemStyle}" Margin="0,0,0,10">
<StackPanel>
<TextBlock Text="{Binding SummaryMessage}"
FontWeight="SemiBold"
FontSize="12"
Foreground="{StaticResource NavisworksPrimaryBrush}"
TextWrapping="Wrap"/>
<TextBlock Text="{Binding RecommendationMessage}"
Style="{StaticResource DialogContentTextStyle}"
Margin="0,8,0,0"
TextWrapping="Wrap"/>
</StackPanel>
</Border>
<!-- 详细碰撞信息 -->
<StackPanel Visibility="{Binding HasCollisions, Converter={StaticResource BooleanToVisibilityConverter}}">
<!-- 碰撞详情 -->
<StackPanel Visibility="{Binding AnimationCollisions.Count, Converter={StaticResource CountToVisibilityConverter}}">
<Label Content="碰撞详情" Style="{StaticResource SectionHeaderStyle}"/>
<ItemsControl ItemsSource="{Binding AnimationCollisions}"
ItemTemplate="{StaticResource CollisionItemTemplate}"
Margin="0,0,0,10"/>
</StackPanel>
</StackPanel>
<!-- 无碰撞提示 -->
<Border Style="{StaticResource StatisticItemStyle}"
Visibility="{Binding HasCollisions, Converter={StaticResource InverseBooleanToVisibilityConverter}}"
Background="#FFF0F8FF"
BorderBrush="#FFB0D4F1">
<StackPanel HorizontalAlignment="Center" Margin="20">
<TextBlock Text="✅ 未发现碰撞问题"
FontSize="14"
FontWeight="SemiBold"
Foreground="#FF28A745"
HorizontalAlignment="Center"/>
<TextBlock Text="当前路径规划良好,无需调整。"
Style="{StaticResource DialogContentTextStyle}"
HorizontalAlignment="Center"
Margin="0,5,0,0"/>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Border>
<!-- 底部按钮区域 -->
<Border Grid.Row="1"
BorderBrush="#FFD4E7FF"
BorderThickness="1"
CornerRadius="0"
Background="#FFF8FBFF"
Margin="15,0,15,15"
Padding="15,10">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Right">
<Button Content="导出报告"
Command="{Binding ExportReportCommand}"
Style="{StaticResource SecondaryButtonStyle}"
Margin="0,0,10,0"
Visibility="{Binding HasCollisions, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<Button Content="重新截图"
Command="{Binding RetakeScreenshotCommand}"
Style="{StaticResource SecondaryButtonStyle}"
Margin="0,0,10,0"/>
<Button Content="关闭"
Click="CloseButton_Click"
Style="{StaticResource ActionButtonStyle}"/>
</StackPanel>
</Border>
</Grid>
</Window>