默认打开手工指定碰撞检测对象,增加对象序号显示
This commit is contained in:
parent
0be608be82
commit
cb56910d68
@ -9,7 +9,7 @@
|
||||
3、[x] (优化)修改吊装路径适应桁车空中路线(纵向+平移,有吊绳)
|
||||
4、[x] (优化)对系统配置文件的修改即时起效
|
||||
5、[ ] (优化)切换文档时重新加载数据库
|
||||
6、[ ] (优化)默认大家指定碰撞物体
|
||||
6、[ ] (优化)默认打开指定碰撞物体
|
||||
7、[ ] (优化)动画运行视角优化设计,不能只用俯视图
|
||||
8、[ ] (BUG)旧版配置文件要主动提示升级配置文件,不能崩溃
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user