diff --git a/MainPlugin.cs b/MainPlugin.cs
index 3897964..e6c74b0 100644
--- a/MainPlugin.cs
+++ b/MainPlugin.cs
@@ -2069,10 +2069,10 @@ namespace NavisworksTransport
/// 父容器
private void CreateAnimationControls(GroupBox parent)
{
- // 车辆选择部分
+ // 部件选择部分
Label vehicleInstructionLabel = new Label
{
- Text = "请在选择树中选择车辆模型",
+ Text = "请在选择树中选择部件",
Location = new Point(20, 25),
Size = new Size(200, 20),
Font = new Font("微软雅黑", 8),
@@ -2081,7 +2081,7 @@ namespace NavisworksTransport
Button getVehicleButton = new Button
{
- Text = "获取选中车辆",
+ Text = "获取选中部件",
Location = new Point(230, 22),
Size = new Size(90, 27),
Font = new Font("微软雅黑", 8),
@@ -2204,8 +2204,8 @@ namespace NavisworksTransport
ForeColor = System.Drawing.Color.Gray
};
- // 存储选中的车辆
- ModelItem selectedVehicle = null;
+ // 存储选中的部件
+ ModelItem selectedComponent = null;
// 车辆选择事件处理
getVehicleButton.Click += (sender, e) =>
@@ -2217,20 +2217,20 @@ namespace NavisworksTransport
if (selectedItems.Count == 0)
{
- MessageBox.Show("请先在选择树中选择一个车辆模型", "提示",
+ MessageBox.Show("请先在选择树中选择一个部件", "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (selectedItems.Count > 1)
{
- MessageBox.Show("请只选择一个车辆模型", "提示",
+ MessageBox.Show("请只选择一个部件", "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
- selectedVehicle = selectedItems.First;
- vehicleStatusLabel.Text = $"状态: 已选择 {selectedVehicle.DisplayName}";
+ selectedComponent = selectedItems.First;
+ vehicleStatusLabel.Text = $"状态: 已选择 {selectedComponent.DisplayName}";
vehicleStatusLabel.ForeColor = System.Drawing.Color.Green;
// 检查是否可以启用生成动画按钮
@@ -2239,7 +2239,7 @@ namespace NavisworksTransport
createAnimationButton.Enabled = true;
}
- }, "获取选中车辆");
+ }, "获取选中部件");
};
// 路径选择事件处理
@@ -2255,7 +2255,7 @@ namespace NavisworksTransport
pathInfoLabel.Text = $"点数: {selectedPath.Points?.Count ?? 0}";
// 检查是否可以启用生成动画按钮
- if (selectedVehicle != null)
+ if (selectedComponent != null)
{
createAnimationButton.Enabled = true;
}
@@ -2322,9 +2322,9 @@ namespace NavisworksTransport
{
GlobalExceptionHandler.SafeExecute(() =>
{
- if (selectedVehicle == null)
+ if (selectedComponent == null)
{
- MessageBox.Show("请先选择车辆模型", "提示",
+ MessageBox.Show("请先选择部件模型", "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
@@ -2372,11 +2372,11 @@ namespace NavisworksTransport
double duration = (double)durationNumeric.Value;
// 使用简化的动画设置方法
- bool success = _animationManager.SetupSimpleAnimation(selectedVehicle, pathPoints, duration);
+ bool success = _animationManager.SetupSimpleAnimation(selectedComponent, pathPoints, duration);
if (!success)
{
- MessageBox.Show("动画生成失败,请检查车辆和路径设置", "错误",
+ MessageBox.Show("动画生成失败,请检查部件和路径设置", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
@@ -2389,7 +2389,7 @@ namespace NavisworksTransport
resetAnimationButton.Enabled = true;
createAnimationButton.Enabled = false;
- MessageBox.Show($"动画生成成功!\n车辆: {selectedVehicle.DisplayName}\n路径: {selectedPath.Name}\n路径点: {pathPoints.Count}个\n时长: {duration}秒",
+ MessageBox.Show($"动画生成成功!\n部件: {selectedComponent.DisplayName}\n路径: {selectedPath.Name}\n路径点: {pathPoints.Count}个\n时长: {duration}秒",
"生成成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}, "生成动画");
};
diff --git a/PathAnimationManager.cs b/PathAnimationManager.cs
index 8d218bb..ee4821a 100644
--- a/PathAnimationManager.cs
+++ b/PathAnimationManager.cs
@@ -20,7 +20,8 @@ namespace NavisworksTransport
private double _animationDuration = 10.0; // 动画总时长(秒)
private DateTime _animationStartTime;
private Transform3D _originalTransform;
- private Point3D _originalCenter; // 存储车辆的原始中心位置
+ private Point3D _originalCenter; // 存储部件的原始中心位置
+ private Point3D _currentPosition; // 存储部件的当前位置
// 动画完成事件
public event EventHandler AnimationCompleted;
@@ -58,26 +59,6 @@ namespace NavisworksTransport
var originalBoundingBox = animatedObject.BoundingBox();
_originalCenter = originalBoundingBox.Center;
- // 🔍 添加调试:检查车辆的变换矩阵
- LogManager.Info($"=== 坐标系统调试信息 ===");
- LogManager.Info($"车辆模型名称: {_animatedObject.DisplayName}");
- LogManager.Info($"车辆变换矩阵: {_animatedObject.Transform}");
- LogManager.Info($"车辆包围盒中心: ({_originalCenter.X:F2},{_originalCenter.Y:F2},{_originalCenter.Z:F2})");
-
- // 检查顶级模型组(场馆和车辆)
- var doc = NavisApplication.ActiveDocument;
- var rootItems = doc.Models.RootItemDescendantsAndSelf.Where(m => m.Parent == null).ToList();
- LogManager.Info($"文档中的顶级模型组数量: {rootItems.Count}");
- foreach (var rootModel in rootItems)
- {
- var modelCenter = rootModel.HasGeometry ? rootModel.BoundingBox().Center : new Point3D(0, 0, 0);
- LogManager.Info($" 顶级模型: {rootModel.DisplayName}");
- LogManager.Info($" 变换矩阵: {rootModel.Transform}");
- LogManager.Info($" 有几何体: {rootModel.HasGeometry}");
- LogManager.Info($" 包围盒中心: ({modelCenter.X:F2},{modelCenter.Y:F2},{modelCenter.Z:F2})");
- LogManager.Info($" 子项数量: {rootModel.Children.Count()}");
- }
-
// 关键修复:将车辆立即移动到路径起点
// 这样动画就从路径起点开始,而不是从车辆当前位置开始
MoveVehicleToPathStart();
@@ -115,7 +96,7 @@ namespace NavisworksTransport
var doc = NavisApplication.ActiveDocument;
var modelItems = new ModelItemCollection { _animatedObject };
- // 计算从车辆原始中心到路径起点的偏移
+ // 计算从部件原始中心到路径起点的偏移
var startOffset = new Vector3D(
_pathPoints[0].X - _originalCenter.X,
_pathPoints[0].Y - _originalCenter.Y,
@@ -126,11 +107,14 @@ namespace NavisworksTransport
var startTransform = Transform3D.CreateTranslation(startOffset);
doc.Models.OverridePermanentTransform(modelItems, startTransform, false);
- LogManager.Info($"车辆已移动到路径起点,偏移: ({startOffset.X:F2},{startOffset.Y:F2},{startOffset.Z:F2})");
+ // 更新当前位置为路径起点
+ _currentPosition = _pathPoints[0];
+
+ LogManager.Info($"部件已移动到路径起点,偏移: ({startOffset.X:F2},{startOffset.Y:F2},{startOffset.Z:F2})");
}
catch (Exception ex)
{
- LogManager.Error($"移动车辆到路径起点失败: {ex.Message}");
+ LogManager.Error($"移动部件到路径起点失败: {ex.Message}");
}
}
@@ -211,6 +195,9 @@ namespace NavisworksTransport
var identityTransform = Transform3D.CreateTranslation(new Vector3D(0, 0, 0));
doc.Models.OverridePermanentTransform(modelItems, identityTransform, true);
+ // 重置当前位置为原始中心
+ _currentPosition = _originalCenter;
+
// 清除碰撞高亮
doc.Models.ResetAllTemporaryMaterials();
}
@@ -353,58 +340,34 @@ namespace NavisworksTransport
var doc = NavisApplication.ActiveDocument;
var modelItems = new ModelItemCollection { _animatedObject };
- // 关键修复:基于路径起点计算偏移,而不是基于车辆原始位置
- // 因为车辆已经在SetupAnimation时移动到了路径起点
- var offsetFromPathStart = new Vector3D(
- newPosition.X - _pathPoints[0].X, // 相对于路径起点的偏移
- newPosition.Y - _pathPoints[0].Y,
- newPosition.Z - _pathPoints[0].Z
+ // 正确的增量变换:计算从当前位置到新位置的偏移
+ var incrementalOffset = new Vector3D(
+ newPosition.X - _currentPosition.X,
+ newPosition.Y - _currentPosition.Y,
+ newPosition.Z - _currentPosition.Z
);
- // 总偏移 = 原始到起点的偏移 + 起点到当前位置的偏移
- var totalOffset = new Vector3D(
- (_pathPoints[0].X - _originalCenter.X) + offsetFromPathStart.X,
- (_pathPoints[0].Y - _originalCenter.Y) + offsetFromPathStart.Y,
- (_pathPoints[0].Z - _originalCenter.Z) + offsetFromPathStart.Z
- );
+ // 创建增量变换
+ var incrementalTransform = Transform3D.CreateTranslation(incrementalOffset);
- // 🔧 动态获取车辆的真实缩放系数
- var vehicleScaleFactor = GetVehicleScaleFactor();
+ // 应用增量变换(不重置之前的变换)
+ doc.Models.OverridePermanentTransform(modelItems, incrementalTransform, false);
- // 🚨 关键修复:如果车辆有缩放,需要将偏移量除以缩放系数
- // 因为OverridePermanentTransform在世界坐标系中工作,但缩放后的车辆会放大变换
- Vector3D adjustedOffset;
- if (vehicleScaleFactor > 1.0)
- {
- adjustedOffset = new Vector3D(
- totalOffset.X / vehicleScaleFactor,
- totalOffset.Y / vehicleScaleFactor,
- totalOffset.Z / vehicleScaleFactor
- );
- LogManager.Debug($"车辆有缩放({vehicleScaleFactor:F2}),调整偏移量");
- }
- else
- {
- adjustedOffset = totalOffset;
- LogManager.Debug($"车辆无缩放,直接使用原始偏移量");
- }
+ LogManager.Debug($"部件位置更新:从({_currentPosition.X:F2},{_currentPosition.Y:F2},{_currentPosition.Z:F2})到({newPosition.X:F2},{newPosition.Y:F2},{newPosition.Z:F2}),增量偏移({incrementalOffset.X:F2},{incrementalOffset.Y:F2},{incrementalOffset.Z:F2})");
- // 创建基于调整后偏移的变换
- var transform = Transform3D.CreateTranslation(adjustedOffset);
-
- // 应用变换
- doc.Models.OverridePermanentTransform(modelItems, transform, false);
-
- LogManager.Debug($"车辆位置更新:目标位置({newPosition.X:F2},{newPosition.Y:F2},{newPosition.Z:F2}),原始偏移({totalOffset.X:F2},{totalOffset.Y:F2},{totalOffset.Z:F2}),调整后偏移({adjustedOffset.X:F2},{adjustedOffset.Y:F2},{adjustedOffset.Z:F2})");
+ // 更新当前位置
+ _currentPosition = newPosition;
}
catch (Exception ex)
{
- LogManager.Error($"更新车辆位置失败: {ex.Message}");
+ LogManager.Error($"更新部件位置失败: {ex.Message}");
}
}
///
/// 从车辆变换矩阵中获取真实的缩放系数
+ /// 注意:此方法已废弃但保留,用于车辆模型的缩放处理。
+ /// 现在使用场馆部件进行动画,通常不需要复杂的缩放计算。
///
private double GetVehicleScaleFactor()
{
@@ -610,18 +573,18 @@ namespace NavisworksTransport
}
///
- /// 简化的动画设置方法,支持直接传入车辆和路径
+ /// 简化的动画设置方法,支持直接传入部件和路径
///
- /// 车辆模型
+ /// 部件模型
/// 路径点列表
/// 动画持续时间(秒)
- public bool SetupSimpleAnimation(ModelItem vehicle, List pathPoints, double durationSeconds = 10.0)
+ public bool SetupSimpleAnimation(ModelItem component, List pathPoints, double durationSeconds = 10.0)
{
try
{
- if (vehicle == null)
+ if (component == null)
{
- LogManager.Error("车辆模型不能为空");
+ LogManager.Error("部件模型不能为空");
return false;
}
@@ -632,9 +595,9 @@ namespace NavisworksTransport
}
// 使用现有的SetupAnimation方法
- SetupAnimation(vehicle, pathPoints, durationSeconds);
+ SetupAnimation(component, pathPoints, durationSeconds);
- LogManager.Info($"简化动画设置成功:车辆={vehicle.DisplayName}, 路径点数={pathPoints.Count}, 时长={durationSeconds}秒");
+ LogManager.Info($"简化动画设置成功:部件={component.DisplayName}, 路径点数={pathPoints.Count}, 时长={durationSeconds}秒");
return true;
}
catch (Exception ex)
@@ -645,10 +608,10 @@ namespace NavisworksTransport
}
///
- /// 获取当前选中的车辆模型(简化版本)
+ /// 获取当前选中的部件模型(简化版本)
///
- /// 选中的车辆模型,如果没有选中或选中多个则返回null
- public static ModelItem GetSelectedVehicle()
+ /// 选中的部件模型,如果没有选中或选中多个则返回null
+ public static ModelItem GetSelectedComponent()
{
try
{
@@ -660,12 +623,12 @@ namespace NavisworksTransport
var item = selectedItems.First;
if (item.HasGeometry)
{
- LogManager.Info($"已获取选中车辆: {item.DisplayName}");
+ LogManager.Info($"已获取选中部件: {item.DisplayName}");
return item;
}
else
{
- LogManager.Warning("选中的项目没有几何体,可能不适合作为车辆");
+ LogManager.Warning("选中的项目没有几何体,可能不适合用于动画");
return null;
}
}
@@ -676,13 +639,13 @@ namespace NavisworksTransport
}
else
{
- LogManager.Info($"选中了{selectedItems.Count}个项目,请只选择一个车辆");
+ LogManager.Info($"选中了{selectedItems.Count}个项目,请只选择一个部件");
return null;
}
}
catch (Exception ex)
{
- LogManager.Error($"获取选中车辆失败: {ex.Message}");
+ LogManager.Error($"获取选中部件失败: {ex.Message}");
return null;
}
}
diff --git a/PathPointRenderPlugin.cs b/PathPointRenderPlugin.cs
index 3b4de11..4419ca2 100644
--- a/PathPointRenderPlugin.cs
+++ b/PathPointRenderPlugin.cs
@@ -105,7 +105,7 @@ namespace NavisworksTransport
// 绘制连接线段(作为圆柱体)
if (_circleMarkers.Count > 1)
{
- graphics.Color(Color.FromByteRGB(255, 255, 0), 1.0); // 高亮黄色
+ graphics.Color(Color.FromByteRGB(0, 0, 0), 1.0); // 黑色连线
// 定义连线的物理半径(例如:20厘米)
double lineRadiusInMeters = 0.2;