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

538 lines
32 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. 路径文件管理:导入、导出全部、导出选中路径操作和状态显示
设计原则与Navisworks 2026风格一致480像素宽度现代化UI布局采用GroupBox分组
-->
<UserControl x:Class="NavisworksTransport.UI.WPF.Views.PathEditingView"
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:converters="clr-namespace:NavisworksTransport.UI.WPF.Converters"
mc:Ignorable="d"
d:DesignHeight="800" d:DesignWidth="480">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/NavisworksTransportPlugin;component/src/UI/WPF/Resources/NavisworksStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- 转换器资源 -->
<converters:BoolToVisibilityConverter x:Key="BoolToVisConverter"/>
<!-- 滑块样式 -->
<Style x:Key="SliderStyle" TargetType="Slider">
<Setter Property="Foreground" Value="{StaticResource NavisworksSecondaryBrush}"/>
<Setter Property="Height" Value="20"/>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
<StackPanel>
<!-- 区域1: 自动路径规划 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,15" Padding="12">
<StackPanel>
<Label Content="自动路径规划" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 起点和终点设置 -->
<StackPanel Margin="0,10,0,10">
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
<Button Content="选择起点"
Command="{Binding SelectStartPointCommand}"
Style="{StaticResource SecondaryButtonStyle}"
Width="80"
Margin="0,0,10,0"/>
<TextBox Text="{Binding AutoPathStartPoint}"
Style="{StaticResource ReadOnlyTextBoxStyle}"
Width="280"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="选择终点"
Command="{Binding SelectEndPointCommand}"
Style="{StaticResource SecondaryButtonStyle}"
Width="80"
Margin="0,0,10,0"/>
<TextBox Text="{Binding AutoPathEndPoint}"
Style="{StaticResource ReadOnlyTextBoxStyle}"
Width="280"/>
</StackPanel>
</StackPanel>
<!-- 车辆参数设置 - 改为三个独立参数 -->
<Grid Margin="0,5,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 车辆长度 -->
<Label Grid.Row="0" Grid.Column="0" Content="车辆长度:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBox Grid.Row="0" Grid.Column="1"
Text="{Binding VehicleLength, StringFormat=0.0###}"
Style="{StaticResource ParameterInputStyle}"
Width="60"/>
<Label Grid.Row="0" Grid.Column="2" Content="米" Style="{StaticResource UnitLabelStyle}" Margin="0,0,15,0"/>
<!-- 车辆宽度 -->
<Label Grid.Row="0" Grid.Column="3" Content="车辆宽度:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBox Grid.Row="0" Grid.Column="4"
Text="{Binding VehicleWidth, StringFormat=0.0###}"
Style="{StaticResource ParameterInputStyle}"
Width="60"/>
<Label Grid.Row="0" Grid.Column="5" Content="米" Style="{StaticResource UnitLabelStyle}"/>
<!-- 车辆高度 -->
<Label Grid.Row="1" Grid.Column="0" Content="车辆高度:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBox Grid.Row="1" Grid.Column="1"
Text="{Binding VehicleHeight, StringFormat=0.0###}"
Style="{StaticResource ParameterInputStyle}"
Width="60"/>
<Label Grid.Row="1" Grid.Column="2" Content="米" Style="{StaticResource UnitLabelStyle}" Margin="0,0,15,0"/>
<!-- 安全间隙 -->
<Label Grid.Row="1" Grid.Column="3" Content="安全间隙:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBox Grid.Row="1" Grid.Column="4"
Text="{Binding SafetyMargin, StringFormat=0.00###}"
Style="{StaticResource ParameterInputStyle}"
Width="60"/>
<Label Grid.Row="1" Grid.Column="5" Content="米" Style="{StaticResource UnitLabelStyle}"/>
</Grid>
<!-- 路径策略选择 -->
<StackPanel Orientation="Horizontal" Margin="0,10,0,5">
<Label Content="路径策略:" Style="{StaticResource ParameterLabelStyle}"/>
<ComboBox ItemsSource="{Binding PathStrategyOptions}"
SelectedItem="{Binding SelectedPathStrategy}"
DisplayMemberPath="DisplayName"
SelectedValuePath="Value"
Width="120"
ToolTip="选择路径规划算法策略"/>
<TextBlock Text="优化偏好设置,影响路径生成算法"
Style="{StaticResource StatusTextStyle}"
VerticalAlignment="Center"
Margin="10,0,0,0"
Foreground="#FF666666"/>
</StackPanel>
<!-- 高级设置区域 -->
<Expander Header="高级设置" IsExpanded="False" Margin="0,10,0,5">
<StackPanel Margin="10">
<!-- 网格大小设置 -->
<Grid Margin="0,5,0,15">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 启用选项 -->
<CheckBox Grid.Row="0"
Content="手动设置网格大小"
IsChecked="{Binding IsGridSizeManuallyEnabled}"
Margin="0,0,0,10"
ToolTip="启用后可手动设置路径规划的网格精度,否则系统根据模型大小自动选择"/>
<!-- 滑块控制 -->
<StackPanel Grid.Row="1" IsEnabled="{Binding IsGridSizeManuallyEnabled}">
<Label Content="网格大小(米)" Style="{StaticResource ParameterLabelStyle}"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Slider Grid.Column="0"
Value="{Binding GridSize}"
Minimum="0.1"
Maximum="5.0"
TickFrequency="0.1"
Style="{StaticResource SliderStyle}"/>
<TextBlock Grid.Column="1"
Text="{Binding GridSize, StringFormat={}{0:F1}}"
VerticalAlignment="Center"
Margin="10,0,0,0"
Width="40"/>
</Grid>
</StackPanel>
<!-- 建议信息 -->
<TextBlock Grid.Row="2"
Text="建议:大型厂区(&gt;1000m)用5米中型建筑(500-1000m)用2米小型建筑(100-500m)用1米精细规划(&lt;100m)用0.5米"
Style="{StaticResource StatusTextStyle}"
TextWrapping="Wrap"
Foreground="#FF666666"
FontStyle="Italic"
Margin="0,5,0,0"/>
</Grid>
</StackPanel>
</Expander>
<!-- 规划操作按钮 -->
<StackPanel Orientation="Horizontal" Margin="0,10,0,5">
<Button Content="自动规划路径"
Command="{Binding AutoPlanPathCommand}"
Style="{StaticResource ActionButtonStyle}"
IsEnabled="{Binding CanExecuteAutoPlanPath}"/>
<Button Content="重置参数"
Command="{Binding ClearAutoPathCommand}"
Style="{StaticResource SecondaryButtonStyle}"/>
</StackPanel>
</StackPanel>
</Border>
<!-- 区域2: 路径列表管理 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,15" Padding="12">
<StackPanel>
<Label Content="路径列表" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 路径管理按钮 -->
<Grid Margin="0,10,0,10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Button Content="手动创建"
Command="{Binding NewPathCommand}"
Style="{StaticResource ActionButtonStyle}"/>
<Button Content="删除"
Command="{Binding DeletePathCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding SelectedPathRoute, Converter={x:Static converters:BoolToVisibilityConverter.IsNotNullToBoolConverter}}"/>
<Button Content="重命名"
Command="{Binding RenamePathCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding SelectedPathRoute, Converter={x:Static converters:BoolToVisibilityConverter.IsNotNullToBoolConverter}}"/>
</StackPanel>
<Button Content="路径分析"
ToolTip="多路径对比分析..."
Style="{StaticResource SecondaryButtonStyle}"
Click="OnPathAnalysisButtonClick"
HorizontalAlignment="Right"
Margin="0,0,0,0"/>
</Grid>
<!-- 路径列表 -->
<ListView ItemsSource="{Binding PathRoutes}"
SelectedItem="{Binding SelectedPathRoute}"
Height="120"
BorderBrush="#FFCCCCCC"
BorderThickness="1">
<ListView.View>
<GridView>
<GridViewColumn Header="路径名称" DisplayMemberBinding="{Binding Name}" Width="160"/>
<GridViewColumn Header="点数" DisplayMemberBinding="{Binding PointCount}" Width="50"/>
<GridViewColumn Header="状态" DisplayMemberBinding="{Binding StatusString}" Width="60"/>
<GridViewColumn Header="创建时间" DisplayMemberBinding="{Binding CreatedTime, StringFormat='MM-dd HH:mm'}" Width="90"/>
<GridViewColumn Header="操作" Width="60">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="时标" ToolTip="时间标签..."
Padding="2" FontSize="10"
Width="44" Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="OnTimeTagButtonClick"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<!-- 当前路径信息 -->
<TextBlock Text="{Binding SelectedPathRoute.Name, StringFormat='当前选择: {0}', TargetNullValue='当前选择: 无'}"
Style="{StaticResource StatusTextStyle}"
FontWeight="SemiBold"
Foreground="#FF2B579A"
Margin="0,5,0,0"/>
</StackPanel>
</Border>
<!-- 区域3: 路径编辑 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,15" Padding="12">
<StackPanel>
<Label Content="路径编辑" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 编辑控制按钮 -->
<StackPanel Orientation="Horizontal" Margin="0,10,0,10">
<Button Content="添加路径点"
Command="{Binding StartEditCommand}"
Style="{StaticResource ActionButtonStyle}"
IsEnabled="{Binding CanExecuteStartEdit}"/>
<Button Content="修改路径点"
Command="{Binding ModifyPointCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanExecuteModifyPoint}"/>
<Button Content="结束"
Command="{Binding EndEditCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanExecuteEndEdit}"/>
<Button Content="清空"
Command="{Binding ClearPathCommand}"
Style="{StaticResource SecondaryButtonStyle}"
Background="#FFFFE6E6"
Foreground="#FF8B0000"
IsEnabled="{Binding CanExecuteClearPath}"/>
</StackPanel>
<!-- 当前路径信息 -->
<Grid Margin="0,5,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="编辑路径:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBlock Grid.Column="1"
Text="{Binding SelectedPathRoute.Name, TargetNullValue='未选择路径'}"
VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="{Binding SelectedPathRoute, Converter={x:Null}, TargetNullValue='#FF999999'}"
Background="#FFF5F5F5"
Padding="5,3"
Margin="5,0"/>
</Grid>
<!-- 路径点列表 -->
<ListView ItemsSource="{Binding SelectedPathRoute.Points}"
SelectedItem="{Binding SelectedPathPoint}"
Height="150"
BorderBrush="#FFCCCCCC"
BorderThickness="1">
<ListView.View>
<GridView>
<GridViewColumn Header="点名称" DisplayMemberBinding="{Binding Name}" Width="80"/>
<GridViewColumn Header="坐标" DisplayMemberBinding="{Binding CoordinateString}" Width="140"/>
<GridViewColumn Header="类型" DisplayMemberBinding="{Binding TypeDisplayString}" Width="60"/>
<GridViewColumn Header="操作" Width="120">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="坐标编辑"
ToolTip="编辑坐标..."
Command="{Binding DataContext.EditPointCoordinatesCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Padding="2"
FontSize="10"
Width="52"
Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0,0,2,0"/>
<Button Content="删除"
ToolTip="删除路径点"
Command="{Binding DataContext.DeletePointCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Background="#FFFFE6E6"
Foreground="#FF8B0000"
Padding="2"
FontSize="10"
Width="44"
Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Border>
<!-- 区域4: 路径文件管理 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,15" Padding="12">
<StackPanel>
<Label Content="路径文件管理" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 文件操作按钮 -->
<StackPanel Orientation="Horizontal" Margin="0,10,0,10">
<Button Content="导入"
Command="{Binding ImportPathCommand}"
Style="{StaticResource SecondaryButtonStyle}"/>
<Button Content="导出全部"
Command="{Binding ExportPathCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanExecuteExportPath}"/>
<Button Content="导出选中路径"
Command="{Binding SaveAsPathCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanExecuteSaveAsPath}"/>
<Button Content="生成导航地图"
Click="OnGenerateNavigationMapButtonClick"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding CanExecuteSaveAsPath}"/>
</StackPanel>
</StackPanel>
</Border>
<!-- 区域5: 可视化设置 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,15" Padding="12">
<StackPanel>
<Label Content="可视化设置" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 网格可视化开关 -->
<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">
<CheckBox Content="通行"
IsChecked="{Binding ShowWalkableGrid}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示可通行的网格点"/>
<CheckBox Content="障碍物"
IsChecked="{Binding ShowObstacleGrid}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示障碍物网格点"/>
<CheckBox Content="未知"
IsChecked="{Binding ShowUnknownGrid}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示未知区域网格点"/>
<CheckBox Content="门"
IsChecked="{Binding ShowDoorGrid}"
VerticalAlignment="Center"
ToolTip="显示门网格点50%透明绿色)"/>
</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="Vertical"
Margin="5,0,0,0">
<!-- 可视化模式选择 -->
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<RadioButton Content="标准连线"
GroupName="PathVisualizationMode"
IsChecked="{Binding IsStandardLineMode}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示标准圆柱形连线"/>
<RadioButton Content="通行空间"
GroupName="PathVisualizationMode"
IsChecked="{Binding IsVehicleSpaceMode}"
VerticalAlignment="Center"
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 IsRectanglePointType}"
Margin="0,0,20,0"
VerticalAlignment="Center"
ToolTip="显示立方体网格点"/>
<RadioButton Content="圆"
GroupName="GridPointType"
IsChecked="{Binding IsCirclePointType}"
VerticalAlignment="Center"
ToolTip="显示圆形网格点"/>
</StackPanel>
</Grid>
</StackPanel>
</Border>
<!-- 区域6: 3D交互指南 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,0,0,0" Padding="12">
<StackPanel>
<Label Content="3D交互操作指南" Style="{StaticResource SectionHeaderStyle}"/>
<!-- 操作说明 -->
<StackPanel Margin="0,5,0,0">
<TextBlock Text="自动路径规划:"
FontWeight="SemiBold"
Margin="0,2"/>
<TextBlock Text="• 点击&quot;选择&quot;按钮后在3D视图中点击设置起点和终点"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
<TextBlock Text="• 调整车辆尺寸和安全间隙参数后点击&quot;自动规划路径&quot;"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
<TextBlock Text="路径编辑:"
FontWeight="SemiBold"
Margin="0,8,0,2"/>
<TextBlock Text="• 选择路径后点击&quot;编辑&quot;进入编辑模式"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
<TextBlock Text="• 在3D视图中点击可通行的物流模型添加路径点"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
<TextBlock Text="• 使用列表中的&quot;删除&quot;按钮移除不需要的路径点"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
<TextBlock Text="• 编辑完成后点击&quot;结束&quot;保存修改"
Style="{StaticResource StatusTextStyle}"
Margin="10,2"/>
</StackPanel>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</UserControl>