From ba51389df3a12faec2e9f3712e49172497649440 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Wed, 28 Jan 2026 13:09:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E2=80=9CVehicle?= =?UTF-8?q?=E2=80=9D=E5=AD=97=E6=AE=B5=E4=B8=BA=E2=80=9CMovingObject?= =?UTF-8?q?=E2=80=9D=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E7=BB=9F=E4=B8=80=E8=BF=90=E5=8A=A8=E7=89=A9?= =?UTF-8?q?=E4=BD=93=E7=9A=84=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/BatchQueueManager.cs | 14 +- src/Core/Models/BatchQueueItem.cs | 3 +- src/Core/PathDatabase.cs | 135 ++++++++++++------ .../ViewModels/AnimationControlViewModel.cs | 2 +- src/UI/WPF/Views/BatchTaskManagementView.xaml | 2 +- src/UI/WPF/Views/PathConfigDialog.xaml.cs | 8 +- 6 files changed, 103 insertions(+), 61 deletions(-) diff --git a/src/Core/BatchQueueManager.cs b/src/Core/BatchQueueManager.cs index 56c47f4..b242a1a 100644 --- a/src/Core/BatchQueueManager.cs +++ b/src/Core/BatchQueueManager.cs @@ -290,21 +290,21 @@ namespace NavisworksTransport.Core else { // 从 ModelItemReferences 表查询运动物体 - var vehicleReferences = await _database.GetModelItemReferencesAsync( + var movingObjectReferences = await _database.GetModelItemReferencesAsync( item.Id, "BatchQueueItem", - "Vehicle" + "MovingObject" ); - if (vehicleReferences.Count > 0) + if (movingObjectReferences.Count > 0) { - var vehicleRef = vehicleReferences[0]; + var movingObjectRef = movingObjectReferences[0]; try { var pathIdObj = new Autodesk.Navisworks.Api.DocumentParts.ModelItemPathId { - ModelIndex = vehicleRef.Item1, - PathId = vehicleRef.Item2 + ModelIndex = movingObjectRef.Item1, + PathId = movingObjectRef.Item2 }; animatedObject = Application.ActiveDocument.Models.ResolvePathId(pathIdObj); @@ -317,7 +317,7 @@ namespace NavisworksTransport.Core } catch (Exception ex) { - LogManager.Error($"[批处理] 从 PathId 恢复运动物体失败: ModelIndex={vehicleRef.Item1}, PathId={vehicleRef.Item2}, 错误: {ex.Message}"); + LogManager.Error($"[批处理] 从 PathId 恢复运动物体失败: ModelIndex={movingObjectRef.Item1}, PathId={movingObjectRef.Item2}, 错误: {ex.Message}"); throw new InvalidOperationException("恢复运动物体失败", ex); } } diff --git a/src/Core/Models/BatchQueueItem.cs b/src/Core/Models/BatchQueueItem.cs index 57bf9da..a59d39f 100644 --- a/src/Core/Models/BatchQueueItem.cs +++ b/src/Core/Models/BatchQueueItem.cs @@ -29,6 +29,7 @@ namespace NavisworksTransport.Core.Models public double VirtualVehicleLength { get; set; } public double VirtualVehicleWidth { get; set; } public double VirtualVehicleHeight { get; set; } + public string MovingObjectName { get; set; } // 运动物体名称,虚拟车辆时为 null // 碰撞检测配置 public bool DetectAllObjects { get; set; } = true; @@ -42,7 +43,7 @@ namespace NavisworksTransport.Core.Models // 注意:运动物体和碰撞检测目标都存储在 ModelItemReferences 表中 // 使用 BatchQueueItem.Id 作为 ReferenceId 进行查询 - // Role = "Vehicle" 表示运动物体 + // Role = "MovingObject" 表示运动物体 // Role = "CollisionTarget" 表示碰撞检测目标 } diff --git a/src/Core/PathDatabase.cs b/src/Core/PathDatabase.cs index 54a8570..e7d3a4b 100644 --- a/src/Core/PathDatabase.cs +++ b/src/Core/PathDatabase.cs @@ -1407,7 +1407,7 @@ namespace NavisworksTransport // 注意:运动物体和碰撞检测目标都存储在 ModelItemReferences 表中 // 这些数据在调用 CreateBatchQueueItemAsync 之前插入 - // Role = "Vehicle" 表示运动物体 + // Role = "MovingObject" 表示运动物体 // Role = "CollisionTarget" 表示碰撞检测目标 return queueItemId; @@ -1415,6 +1415,52 @@ namespace NavisworksTransport }); } + /// + /// 从 SQLiteDataReader 读取 BatchQueueItem 对象 + /// + private BatchQueueItem ReadBatchQueueItemFromReader(SQLiteDataReader reader) + { + var itemId = Convert.ToInt32(reader["Id"]); + var isVirtualVehicle = Convert.ToBoolean(reader["IsVirtualVehicle"]); + + var item = new BatchQueueItem + { + Id = itemId, + PathRouteId = reader["PathRouteId"].ToString(), + PathRouteName = reader["PathRouteName"].ToString(), + Status = (BatchQueueStatus)Enum.Parse(typeof(BatchQueueStatus), reader["Status"].ToString()), + CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()), + StartTime = reader["StartTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["StartTime"].ToString()) : null, + EndTime = reader["EndTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["EndTime"].ToString()) : null, + ErrorMessage = reader["ErrorMessage"].ToString(), + FrameRate = Convert.ToInt32(reader["FrameRate"]), + DurationSeconds = Convert.ToDouble(reader["DurationSeconds"]), + DetectionToleranceMeters = Convert.ToDouble(reader["DetectionToleranceMeters"]), + IsVirtualVehicle = isVirtualVehicle, + VirtualVehicleLength = Convert.ToDouble(reader["VirtualVehicleLength"]), + VirtualVehicleWidth = Convert.ToDouble(reader["VirtualVehicleWidth"]), + VirtualVehicleHeight = Convert.ToDouble(reader["VirtualVehicleHeight"]), + DetectAllObjects = Convert.ToBoolean(reader["DetectAllObjects"]), + ClashDetectiveTestName = reader["ClashDetectiveTestName"].ToString(), + CollisionCount = !Convert.IsDBNull(reader["CollisionCount"]) ? (int?)Convert.ToInt32(reader["CollisionCount"]) : null, + ObjectRotationCorrection = Convert.ToDouble(reader["ObjectRotationCorrection"]) + }; + + // 填充 MovingObjectName 属性 + if (!isVirtualVehicle) + { + // 从 ModelItemReferences 表查询运动物体名称 + var movingObjectReferences = GetModelItemReferencesSync(itemId, "BatchQueueItem", "MovingObject"); + if (movingObjectReferences.Count > 0) + { + item.MovingObjectName = movingObjectReferences[0].Item3; // Item3 是 DisplayName + } + } + // 虚拟车辆时,MovingObjectName 保持 null + + return item; + } + /// /// 获取批处理队列项列表 /// @@ -1466,28 +1512,7 @@ namespace NavisworksTransport { while (reader.Read()) { - items.Add(new BatchQueueItem - { - Id = Convert.ToInt32(reader["Id"]), - PathRouteId = reader["PathRouteId"].ToString(), - PathRouteName = reader["PathRouteName"].ToString(), - Status = (BatchQueueStatus)Enum.Parse(typeof(BatchQueueStatus), reader["Status"].ToString()), - CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()), - StartTime = reader["StartTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["StartTime"].ToString()) : null, - EndTime = reader["EndTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["EndTime"].ToString()) : null, - ErrorMessage = reader["ErrorMessage"].ToString(), - FrameRate = Convert.ToInt32(reader["FrameRate"]), - DurationSeconds = Convert.ToDouble(reader["DurationSeconds"]), - DetectionToleranceMeters = Convert.ToDouble(reader["DetectionToleranceMeters"]), - IsVirtualVehicle = Convert.ToBoolean(reader["IsVirtualVehicle"]), - VirtualVehicleLength = Convert.ToDouble(reader["VirtualVehicleLength"]), - VirtualVehicleWidth = Convert.ToDouble(reader["VirtualVehicleWidth"]), - VirtualVehicleHeight = Convert.ToDouble(reader["VirtualVehicleHeight"]), - DetectAllObjects = Convert.ToBoolean(reader["DetectAllObjects"]), - ClashDetectiveTestName = reader["ClashDetectiveTestName"].ToString(), - CollisionCount = !Convert.IsDBNull(reader["CollisionCount"]) ? (int?)Convert.ToInt32(reader["CollisionCount"]) : null, - ObjectRotationCorrection = Convert.ToDouble(reader["ObjectRotationCorrection"]) - }); + items.Add(ReadBatchQueueItemFromReader(reader)); } } } @@ -1519,30 +1544,7 @@ namespace NavisworksTransport { if (reader.Read()) { - var item = new BatchQueueItem - { - Id = Convert.ToInt32(reader["Id"]), - PathRouteId = reader["PathRouteId"].ToString(), - PathRouteName = reader["PathRouteName"].ToString(), - Status = (BatchQueueStatus)Enum.Parse(typeof(BatchQueueStatus), reader["Status"].ToString()), - CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()), - StartTime = reader["StartTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["StartTime"].ToString()) : null, - EndTime = reader["EndTime"].ToString() != "" ? (DateTime?)DateTime.Parse(reader["EndTime"].ToString()) : null, - ErrorMessage = reader["ErrorMessage"].ToString(), - FrameRate = Convert.ToInt32(reader["FrameRate"]), - DurationSeconds = Convert.ToDouble(reader["DurationSeconds"]), - DetectionToleranceMeters = Convert.ToDouble(reader["DetectionToleranceMeters"]), - IsVirtualVehicle = Convert.ToBoolean(reader["IsVirtualVehicle"]), - VirtualVehicleLength = Convert.ToDouble(reader["VirtualVehicleLength"]), - VirtualVehicleWidth = Convert.ToDouble(reader["VirtualVehicleWidth"]), - VirtualVehicleHeight = Convert.ToDouble(reader["VirtualVehicleHeight"]), - DetectAllObjects = Convert.ToBoolean(reader["DetectAllObjects"]), - ClashDetectiveTestName = reader["ClashDetectiveTestName"].ToString(), - CollisionCount = !Convert.IsDBNull(reader["CollisionCount"]) ? (int?)Convert.ToInt32(reader["CollisionCount"]) : null, - ObjectRotationCorrection = Convert.ToDouble(reader["ObjectRotationCorrection"]) - }; - - return item; + return ReadBatchQueueItemFromReader(reader); } } } @@ -1663,6 +1665,45 @@ namespace NavisworksTransport }); } + /// + /// 获取指定 ReferenceId 和 Role 的所有 ModelItem 引用(同步版本,用于在 Task.Run 内部调用) + /// + private List<(int ModelIndex, string PathId, string DisplayName, string ObjectName)> GetModelItemReferencesSync(int referenceId, string referenceType, string role = null) + { + var items = new List<(int, string, string, string)>(); + using (var cmd = new SQLiteCommand(_connection)) + { + var sql = @" + SELECT ModelIndex, PathId, DisplayName, ObjectName + FROM ModelItemReferences + WHERE ReferenceId = @ReferenceId AND ReferenceType = @ReferenceType"; + + if (!string.IsNullOrEmpty(role)) + { + sql += " AND Role = @Role"; + cmd.Parameters.AddWithValue("@Role", role); + } + + cmd.CommandText = sql; + cmd.Parameters.AddWithValue("@ReferenceId", referenceId); + cmd.Parameters.AddWithValue("@ReferenceType", referenceType); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + items.Add(( + Convert.ToInt32(reader["ModelIndex"]), + reader["PathId"].ToString(), + reader["DisplayName"].ToString(), + reader["ObjectName"].ToString() + )); + } + } + } + return items; + } + /// /// 删除指定 ReferenceId 的所有 ModelItem 引用 /// diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index 1e5ecac..a103c4f 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -3604,7 +3604,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels pathIdInfo.PathId, SelectedAnimatedObject.DisplayName, SelectedAnimatedObject.DisplayName, - "Vehicle" + "MovingObject" ); LogManager.Info($"[批处理] 已存储运动物体: {SelectedAnimatedObject.DisplayName}"); } diff --git a/src/UI/WPF/Views/BatchTaskManagementView.xaml b/src/UI/WPF/Views/BatchTaskManagementView.xaml index 3cfa2a3..539bea4 100644 --- a/src/UI/WPF/Views/BatchTaskManagementView.xaml +++ b/src/UI/WPF/Views/BatchTaskManagementView.xaml @@ -125,7 +125,7 @@ NavisworksTransport 批处理队列管理页签视图 - 采用与其他页签一 Height="300"> - + diff --git a/src/UI/WPF/Views/PathConfigDialog.xaml.cs b/src/UI/WPF/Views/PathConfigDialog.xaml.cs index 6eb513f..fad20d4 100644 --- a/src/UI/WPF/Views/PathConfigDialog.xaml.cs +++ b/src/UI/WPF/Views/PathConfigDialog.xaml.cs @@ -51,8 +51,8 @@ namespace NavisworksTransport.UI.WPF.Views VirtualVehicleLength = double.Parse(txtVehicleLength.Text), VirtualVehicleWidth = double.Parse(txtVehicleWidth.Text), VirtualVehicleHeight = double.Parse(txtVehicleHeight.Text), - VehicleObjectId = _selectedObject?.ToString(), - VehicleObjectName = _selectedObject?.DisplayName, + MovingObjectId = _selectedObject?.ToString(), + MovingObjectName = _selectedObject?.DisplayName, DetectionItems = _detectionItems.Select(i => i.ToString()).ToList(), DetectAllObjects = rbDetectAll.IsChecked == true, UseOverrideConfig = cbOverrideConfig.IsChecked == true @@ -287,8 +287,8 @@ namespace NavisworksTransport.UI.WPF.Views public double VirtualVehicleLength { get; set; } public double VirtualVehicleWidth { get; set; } public double VirtualVehicleHeight { get; set; } - public string VehicleObjectId { get; set; } - public string VehicleObjectName { get; set; } + public string MovingObjectId { get; set; } + public string MovingObjectName { get; set; } public List DetectionItems { get; set; } public bool DetectAllObjects { get; set; } public bool UseOverrideConfig { get; set; }