重命名“Vehicle”字段为“MovingObject”,更新相关逻辑以统一运动物体的命名

This commit is contained in:
tian 2026-01-28 13:09:20 +08:00
parent b99d4e82b6
commit ba51389df3
6 changed files with 103 additions and 61 deletions

View File

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

View File

@ -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" 表示碰撞检测目标
}

View File

@ -1407,7 +1407,7 @@ namespace NavisworksTransport
// 注意:运动物体和碰撞检测目标都存储在 ModelItemReferences 表中
// 这些数据在调用 CreateBatchQueueItemAsync 之前插入
// Role = "Vehicle" 表示运动物体
// Role = "MovingObject" 表示运动物体
// Role = "CollisionTarget" 表示碰撞检测目标
return queueItemId;
@ -1415,6 +1415,52 @@ namespace NavisworksTransport
});
}
/// <summary>
/// 从 SQLiteDataReader 读取 BatchQueueItem 对象
/// </summary>
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;
}
/// <summary>
/// 获取批处理队列项列表
/// </summary>
@ -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
});
}
/// <summary>
/// 获取指定 ReferenceId 和 Role 的所有 ModelItem 引用(同步版本,用于在 Task.Run 内部调用)
/// </summary>
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;
}
/// <summary>
/// 删除指定 ReferenceId 的所有 ModelItem 引用
/// </summary>

View File

@ -3604,7 +3604,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
pathIdInfo.PathId,
SelectedAnimatedObject.DisplayName,
SelectedAnimatedObject.DisplayName,
"Vehicle"
"MovingObject"
);
LogManager.Info($"[批处理] 已存储运动物体: {SelectedAnimatedObject.DisplayName}");
}

View File

@ -125,7 +125,7 @@ NavisworksTransport 批处理队列管理页签视图 - 采用与其他页签一
Height="300">
<DataGrid.Columns>
<DataGridTextColumn Header="路径名称" Binding="{Binding PathRouteName}" Width="*" MinWidth="80"/>
<DataGridTextColumn Header="物流对象" Binding="{Binding VehicleObjectName, Converter={StaticResource NullToDashConverter}}" Width="120"/>
<DataGridTextColumn Header="物流对象" Binding="{Binding MovingObjectName, Converter={StaticResource NullToDashConverter}}" Width="120"/>
<DataGridTextColumn Header="调整角度" Binding="{Binding ObjectRotationCorrection, StringFormat={}{0:F1}°}" Width="80"/>
<DataGridTextColumn Header="手工指定" Binding="{Binding DetectAllObjects, Converter={StaticResource BooleanToYesNoConverter}}" Width="80"/>
<DataGridTextColumn Header="状态" Binding="{Binding Status, Converter={StaticResource BatchQueueStatusConverter}}" Width="80"/>

View File

@ -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<string> DetectionItems { get; set; }
public bool DetectAllObjects { get; set; }
public bool UseOverrideConfig { get; set; }