默认打开手工指定碰撞检测对象,增加对象序号显示

This commit is contained in:
tian 2026-02-02 21:14:24 +08:00
parent 0be608be82
commit cb56910d68
3 changed files with 107 additions and 53 deletions

View File

@ -9,7 +9,7 @@
3、[x] (优化)修改吊装路径适应桁车空中路线(纵向+平移,有吊绳)
4、[x] (优化)对系统配置文件的修改即时起效
5、[ ] (优化)切换文档时重新加载数据库
6、[ ] (优化)默认大家指定碰撞物体
6、[ ] (优化)默认打开指定碰撞物体
7、[ ] (优化)动画运行视角优化设计,不能只用俯视图
8、[ ] BUG旧版配置文件要主动提示升级配置文件不能崩溃

View File

@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Input;
using Autodesk.Navisworks.Api;
@ -62,20 +64,43 @@ namespace NavisworksTransport.UI.WPF.ViewModels
/// <summary>
/// 手工指定的碰撞检测对象
/// </summary>
public class ManualCollisionTargetViewModel
public class ManualCollisionTargetViewModel : INotifyPropertyChanged
{
public ManualCollisionTargetViewModel(ModelItem modelItem, string displayName, string modelPath)
private int _index;
public ManualCollisionTargetViewModel(ModelItem modelItem, string displayName, string modelPath, int index = 0)
{
ModelItem = modelItem ?? throw new ArgumentNullException(nameof(modelItem));
DisplayName = displayName;
ModelPath = modelPath;
InstanceGuid = modelItem.InstanceGuid;
_index = index;
}
public ModelItem ModelItem { get; }
public string DisplayName { get; }
public string ModelPath { get; }
public Guid InstanceGuid { get; }
public int Index
{
get => _index;
set
{
if (_index != value)
{
_index = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
/// <summary>
@ -245,7 +270,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private double _objectOriginalHeight; // 物体原始高度Z方向
// 手工碰撞对象相关字段
private bool _isManualCollisionTargetEnabled = false;
private bool _isManualCollisionTargetEnabled = true;
private ObservableCollection<ManualCollisionTargetViewModel> _manualCollisionTargets;
private string _manualCollisionTargetSummary = "未指定碰撞检测对象";
private DateTime? _manualTargetsLastSyncTime;
@ -852,6 +877,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 初始化设置
InitializeAnimationSettings();
// 初始化生成动画按钮状态(启用手工指定模式时检查列表)
UpdateCanGenerateAnimation();
// 初始化命令
InitializeCommands();
@ -2001,6 +2029,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
_manualCollisionTargets.Add(entry);
}
// 更新序号
UpdateManualCollisionTargetIndices();
_manualTargetsLastSyncTime = DateTime.Now;
UpdateManualCollisionTargetSummary();
RefreshManualTargetHighlights();
@ -2342,12 +2373,16 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private void OnManualCollisionTargetsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// 先更新序号
UpdateManualCollisionTargetIndices();
UpdateManualCollisionTargetSummary();
OnPropertyChanged(nameof(HasManualCollisionTargets));
OnPropertyChanged(nameof(IsManualTargetModeActive));
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
RefreshManualTargetHighlights();
SyncManualCollisionTargetsToAnimationManager();
UpdateCanGenerateAnimation(); // 更新生成动画按钮状态
}
private void UpdateManualCollisionTargetSummary()
@ -2364,6 +2399,20 @@ namespace NavisworksTransport.UI.WPF.ViewModels
ManualCollisionTargetSummary = $"{_manualCollisionTargets.Count} 个对象{syncPart}";
}
/// <summary>
/// 更新手工碰撞对象的序号
/// </summary>
private void UpdateManualCollisionTargetIndices()
{
if (_manualCollisionTargets == null)
return;
for (int i = 0; i < _manualCollisionTargets.Count; i++)
{
_manualCollisionTargets[i].Index = i + 1; // 序号从1开始
}
}
private string BuildModelPath(ModelItem item)
{
try
@ -2534,6 +2583,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
RefreshManualTargetHighlights();
SyncManualCollisionTargetsToAnimationManager(true);
UpdateCanGenerateAnimation(); // 更新生成动画按钮状态
if (IsManualCollisionTargetEnabled && !HasManualCollisionTargets)
{
@ -3014,7 +3064,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels
hasValidObject = SelectedAnimatedObject != null;
}
CanGenerateAnimation = hasValidObject && hasPath;
// 启用手工指定模式时,必须指定碰撞检测对象
bool hasManualTargetsIfRequired = !IsManualCollisionTargetEnabled || HasManualCollisionTargets;
CanGenerateAnimation = hasValidObject && hasPath && hasManualTargetsIfRequired;
// 更新状态提示
if (IsManualCollisionTargetEnabled && !HasManualCollisionTargets)

View File

@ -142,58 +142,61 @@ NavisworksTransport 检测动画页签视图 - 采用与类别设置和分层管
</Border>
<!-- 区域2.5: 指定碰撞检测对象 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,10,0,0" Padding="5">
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,10,0,0" Padding="10">
<StackPanel>
<Expander Header="指定碰撞检测对象" IsExpanded="False">
<StackPanel Margin="5,5,0,0">
<TextBlock Text="{Binding ManualCollisionTargetSummary}"
Style="{StaticResource StatusTextStyle}"/>
<Label Content="指定碰撞检测对象" Style="{StaticResource SectionHeaderStyle}"/>
<TextBlock Text="{Binding ManualCollisionTargetSummary}"
Style="{StaticResource StatusTextStyle}"/>
<StackPanel Orientation="Vertical">
<CheckBox Content="启用手工指定模式"
IsChecked="{Binding IsManualCollisionTargetEnabled}"
FontWeight="SemiBold"/>
</StackPanel>
<StackPanel Orientation="Vertical" Margin="0,5,0,0">
<CheckBox Content="启用手工指定模式"
IsChecked="{Binding IsManualCollisionTargetEnabled}"
FontWeight="SemiBold"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
<Button Content="选择对象"
Command="{Binding ApplyManualTargetsFromSelectionCommand}"
Style="{StaticResource SecondaryButtonStyle}"/>
<Button Content="清除"
Command="{Binding ClearManualTargetsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"
Background="#FFFFE6E6"
Foreground="#FF8B0000"/>
<Button Content="高亮显示"
Command="{Binding HighlightManualTargetsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"/>
<Button Content="清除高亮"
Command="{Binding ClearManualHighlightsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
<Button Content="选择对象"
Command="{Binding ApplyManualTargetsFromSelectionCommand}"
Style="{StaticResource SecondaryButtonStyle}"/>
<Button Content="清除"
Command="{Binding ClearManualTargetsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"
Background="#FFFFE6E6"
Foreground="#FF8B0000"/>
<Button Content="高亮显示"
Command="{Binding HighlightManualTargetsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"/>
<Button Content="清除高亮"
Command="{Binding ClearManualHighlightsCommand}"
Style="{StaticResource SecondaryButtonStyle}"
IsEnabled="{Binding HasManualCollisionTargets}"/>
</StackPanel>
<StackPanel Margin="0,5,0,0"
IsEnabled="{Binding IsManualCollisionTargetEnabled}">
<Label Content="已选对象列表"
Style="{StaticResource SectionHeaderStyle}"/>
<StackPanel Margin="0,5,0,0"
IsEnabled="{Binding IsManualCollisionTargetEnabled}">
<Label Content="已选对象列表"
Style="{StaticResource SectionHeaderStyle}"/>
<TextBlock Text="当前未选择任何对象"
Style="{StaticResource StatusTextStyle}"
Foreground="#FF777777"
Visibility="{Binding HasManualCollisionTargets, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=Inverse}"/>
<ListView ItemsSource="{Binding ManualCollisionTargets}"
Margin="0,5,0,0"
Visibility="{Binding HasManualCollisionTargets, Converter={StaticResource BoolToVisibilityConverter}}"
MinHeight="80"
BorderBrush="#FFE2E8F0"
BorderThickness="1">
<ListView ItemsSource="{Binding ManualCollisionTargets}"
Margin="0,5,0,0"
Visibility="{Binding HasManualCollisionTargets, Converter={StaticResource BoolToVisibilityConverter}}"
MinHeight="80"
BorderBrush="#FFE2E8F0"
BorderThickness="1">
<ListView.View>
<GridView>
<GridViewColumn Header="检测对象" Width="240">
<GridViewColumn Header="序号" Width="45">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Index}"
HorizontalAlignment="Center"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="检测对象" Width="275">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel>
@ -219,9 +222,7 @@ NavisworksTransport 检测动画页签视图 - 采用与类别设置和分层管
</ListView>
</StackPanel>
</StackPanel>
</Expander>
</StackPanel>
</Border>
</Border>
<!-- 区域3: 生成动画 -->
<Border BorderBrush="#FFD4E7FF" BorderThickness="1" CornerRadius="0" Margin="0,10,0,0" Padding="10">