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; }