From 5b7661955a0f1d445a6d2a44e826552724966fa2 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Sun, 22 Jun 2025 17:32:28 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=A8=E7=94=BB=E6=92=AD?=
=?UTF-8?q?=E6=94=BE=E5=92=8CUI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
MainPlugin.cs | 474 +++++++++++++++++-----------------------
PathAnimationManager.cs | 113 ++++++----
2 files changed, 280 insertions(+), 307 deletions(-)
diff --git a/MainPlugin.cs b/MainPlugin.cs
index 589d215..3df5e1f 100644
--- a/MainPlugin.cs
+++ b/MainPlugin.cs
@@ -252,6 +252,12 @@ namespace NavisworksTransport
private static bool _isUpdatingLogisticsData = false;
private static ModelItemCollection _savedDocumentSelection = null;
+ // 动画播放控制 - 提升为类成员以便跨方法访问
+ private Button _startAnimationButton;
+ private Button _stopAnimationButton;
+ private Label _animationStatusLabel;
+ private ProgressBar _animationProgressBar;
+
public override int Execute(params string[] parameters)
{
return GlobalExceptionHandler.SafeExecute(() =>
@@ -359,9 +365,9 @@ namespace NavisworksTransport
_controlPanelForm = new Form
{
Text = "物流路径规划控制面板",
- Size = new Size(380, 700),
+ Size = new Size(420, 700),
StartPosition = FormStartPosition.Manual,
- Location = new Point(20, 140), // 避免遮挡菜单
+ Location = new Point(50, 200), // 避免遮挡菜单
TopMost = true,
ShowInTaskbar = false,
MaximizeBox = false,
@@ -430,7 +436,7 @@ namespace NavisworksTransport
{
Text = "关闭",
Size = new Size(60, 30),
- Location = new Point(290, 10),
+ Location = new Point(330, 10),
Font = new Font("微软雅黑", 8)
};
bottomPanel.Controls.Add(closeButton);
@@ -450,7 +456,7 @@ namespace NavisworksTransport
aboutButton.Click += (sender, e) =>
{
- MessageBox.Show("物流路径规划插件 v1.0\n\n适用于 Navisworks 2017\n开发:AI助手\n\n功能:3D路径规划、动画创建、碰撞检测",
+ MessageBox.Show("物流路径规划插件 v1.0\n\n适用于 Navisworks 2017\n\n功能:3D路径规划、动画创建、碰撞检测",
"关于插件", MessageBoxButtons.OK, MessageBoxIcon.Information);
};
@@ -528,7 +534,7 @@ namespace NavisworksTransport
ForeColor = System.Drawing.Color.DarkBlue,
AutoSize = true,
Location = new Point(10, currentY),
- MaximumSize = new Size(320, 0),
+ MaximumSize = new Size(360, 0),
Visible = false // 初始隐藏
};
scrollPanel.Controls.Add(_selectedModelsLabel);
@@ -539,24 +545,24 @@ namespace NavisworksTransport
{
Text = "类别属性设置",
Location = new Point(10, currentY),
- Size = new Size(340, 80),
+ Size = new Size(350, 70),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(categoryGroupBox);
CreateCategoryDropdown(categoryGroupBox);
- currentY += 100;
+ currentY += 85;
// 物流模型列表
GroupBox logisticsListGroupBox = new GroupBox
{
Text = "物流模型列表",
Location = new Point(10, currentY),
- Size = new Size(340, 180),
+ Size = new Size(350, 185),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(logisticsListGroupBox);
CreateLogisticsModelList(logisticsListGroupBox);
- currentY += 190;
+ currentY += 200;
// 统计信息(简化为一行,保存引用)
_statsLabel = new Label
@@ -576,7 +582,7 @@ namespace NavisworksTransport
{
Text = "可见性控制",
Location = new Point(10, currentY),
- Size = new Size(340, 100),
+ Size = new Size(350, 100),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(visibilityGroupBox);
@@ -610,7 +616,7 @@ namespace NavisworksTransport
{
Text = "路径列表管理",
Location = new Point(10, currentY),
- Size = new Size(320, 160),
+ Size = new Size(350, 160),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(pathListGroupBox);
@@ -622,7 +628,7 @@ namespace NavisworksTransport
{
Text = "当前路径编辑",
Location = new Point(10, currentY),
- Size = new Size(320, 250),
+ Size = new Size(350, 250),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(currentPathGroupBox);
@@ -634,7 +640,7 @@ namespace NavisworksTransport
{
Text = "路径文件管理",
Location = new Point(10, currentY),
- Size = new Size(320, 80),
+ Size = new Size(350, 70),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(fileManagementGroupBox);
@@ -644,11 +650,11 @@ namespace NavisworksTransport
}
///
- /// 创建动画控制Tab页
+ /// 创建检测动画Tab页
///
private void CreateAnimationControlTab(TabControl tabControl)
{
- TabPage animationTab = new TabPage("动画控制");
+ TabPage animationTab = new TabPage("检测动画");
animationTab.Padding = new Padding(10);
Panel scrollPanel = new Panel
@@ -660,36 +666,36 @@ namespace NavisworksTransport
int currentY = 10;
- // 动画参数设置
+ // 动画参数设置 - 减少高度
GroupBox animationGroupBox = new GroupBox
{
Text = "动画参数设置",
Location = new Point(10, currentY),
- Size = new Size(320, 190),
+ Size = new Size(350, 160),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(animationGroupBox);
CreateAnimationControls(animationGroupBox);
- currentY += 210;
+ currentY += 180;
- // 播放控制
+ // 播放控制 - 增加高度
GroupBox playbackGroupBox = new GroupBox
{
Text = "播放控制",
Location = new Point(10, currentY),
- Size = new Size(320, 100),
+ Size = new Size(350, 130),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(playbackGroupBox);
CreatePlaybackControls(playbackGroupBox);
- currentY += 120;
+ currentY += 150;
// 碰撞检测
GroupBox collisionGroupBox = new GroupBox
{
Text = "碰撞检测",
Location = new Point(10, currentY),
- Size = new Size(320, 100),
+ Size = new Size(350, 80),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(collisionGroupBox);
@@ -720,7 +726,7 @@ namespace NavisworksTransport
{
Text = "日志管理",
Location = new Point(10, currentY),
- Size = new Size(320, 120),
+ Size = new Size(350, 120),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(logGroupBox);
@@ -732,7 +738,7 @@ namespace NavisworksTransport
{
Text = "插件设置",
Location = new Point(10, currentY),
- Size = new Size(320, 100),
+ Size = new Size(350, 100),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(settingsGroupBox);
@@ -744,7 +750,7 @@ namespace NavisworksTransport
{
Text = "系统信息",
Location = new Point(10, currentY),
- Size = new Size(320, 150),
+ Size = new Size(350, 160),
Font = new Font("微软雅黑", 8, FontStyle.Bold)
};
scrollPanel.Controls.Add(systemInfoGroupBox);
@@ -799,16 +805,16 @@ namespace NavisworksTransport
_pathListView = new ListView
{
Location = new Point(15, 60),
- Size = new Size(290, 80),
+ Size = new Size(320, 80),
View = System.Windows.Forms.View.Details,
FullRowSelect = true,
GridLines = true,
Font = new Font("微软雅黑", 8)
};
- _pathListView.Columns.Add("路径名称", 150);
- _pathListView.Columns.Add("创建时间", 80);
- _pathListView.Columns.Add("点数", 50);
+ _pathListView.Columns.Add("路径名称", 140);
+ _pathListView.Columns.Add("创建时间", 100);
+ _pathListView.Columns.Add("点数", 60);
groupBox.Controls.Add(_pathListView);
@@ -975,7 +981,7 @@ namespace NavisworksTransport
_currentPathPointsListView = new ListView
{
Location = new Point(15, 105),
- Size = new Size(290, 100),
+ Size = new Size(320, 100),
Font = new Font("微软雅黑", 8),
View = System.Windows.Forms.View.Details, // 设置为详细信息视图
FullRowSelect = true,
@@ -986,7 +992,7 @@ namespace NavisworksTransport
_currentPathPointsListView.Columns.Add("序号", 40, HorizontalAlignment.Left);
_currentPathPointsListView.Columns.Add("名称", 80, HorizontalAlignment.Left);
_currentPathPointsListView.Columns.Add("类型", 60, HorizontalAlignment.Left);
- _currentPathPointsListView.Columns.Add("坐标 (X,Y,Z)", 110, HorizontalAlignment.Left);
+ _currentPathPointsListView.Columns.Add("坐标 (X,Y,Z)", 120, HorizontalAlignment.Left);
groupBox.Controls.Add(_currentPathPointsListView);
@@ -994,7 +1000,7 @@ namespace NavisworksTransport
Button finishButton = new Button
{
Text = "完成编辑",
- Location = new Point(120, 215),
+ Location = new Point(95, 215),
Size = new Size(80, 25),
Font = new Font("微软雅黑", 8),
Enabled = false
@@ -1004,7 +1010,7 @@ namespace NavisworksTransport
Button cancelButton = new Button
{
Text = "取消编辑",
- Location = new Point(210, 215),
+ Location = new Point(185, 215),
Size = new Size(80, 25),
Font = new Font("微软雅黑", 8),
Enabled = false
@@ -1104,9 +1110,9 @@ namespace NavisworksTransport
{
Button saveButton = new Button
{
- Text = "保存当前路径",
+ Text = "保存路径",
Location = new Point(15, 25),
- Size = new Size(90, 30),
+ Size = new Size(70, 30),
Font = new Font("微软雅黑", 8)
};
groupBox.Controls.Add(saveButton);
@@ -1114,8 +1120,8 @@ namespace NavisworksTransport
Button importButton = new Button
{
Text = "导入路径",
- Location = new Point(115, 25),
- Size = new Size(80, 30),
+ Location = new Point(95, 25),
+ Size = new Size(70, 30),
Font = new Font("微软雅黑", 8)
};
groupBox.Controls.Add(importButton);
@@ -1123,8 +1129,8 @@ namespace NavisworksTransport
Button exportButton = new Button
{
Text = "导出路径",
- Location = new Point(205, 25),
- Size = new Size(80, 30),
+ Location = new Point(175, 25),
+ Size = new Size(70, 30),
Font = new Font("微软雅黑", 8)
};
groupBox.Controls.Add(exportButton);
@@ -1132,8 +1138,8 @@ namespace NavisworksTransport
Button historyButton = new Button
{
Text = "查看历史",
- Location = new Point(15, 65),
- Size = new Size(80, 30),
+ Location = new Point(255, 25),
+ Size = new Size(70, 30),
Font = new Font("微软雅黑", 8)
};
groupBox.Controls.Add(historyButton);
@@ -1159,7 +1165,7 @@ namespace NavisworksTransport
DefaultExt = "xml"
};
- if (saveDialog.ShowDialog() == DialogResult.OK)
+ if (saveDialog.ShowDialog(_controlPanelForm) == DialogResult.OK)
{
bool saveResult = false;
var extension = System.IO.Path.GetExtension(saveDialog.FileName).ToLowerInvariant();
@@ -1210,7 +1216,7 @@ namespace NavisworksTransport
FilterIndex = 1
};
- if (openDialog.ShowDialog() == DialogResult.OK)
+ if (openDialog.ShowDialog(_controlPanelForm) == DialogResult.OK)
{
PathRoute importedRoute = null;
var fileFormat = PathFileSerializer.DetectFileFormat(openDialog.FileName);
@@ -1275,7 +1281,7 @@ namespace NavisworksTransport
DefaultExt = "xml"
};
- if (exportDialog.ShowDialog() == DialogResult.OK)
+ if (exportDialog.ShowDialog(_controlPanelForm) == DialogResult.OK)
{
bool exportResult = false;
var extension = System.IO.Path.GetExtension(exportDialog.FileName).ToLowerInvariant();
@@ -1337,82 +1343,42 @@ namespace NavisworksTransport
///
private void CreatePlaybackControls(GroupBox groupBox)
{
- Button playButton = new Button
+ // 播放按钮
+ if (_startAnimationButton != null)
{
- Text = "▶ 播放",
- Location = new Point(15, 25),
- Size = new Size(60, 25),
- Font = new Font("微软雅黑", 8)
- };
- groupBox.Controls.Add(playButton);
+ _startAnimationButton.Text = "▶ 播放";
+ _startAnimationButton.Location = new Point(15, 25);
+ _startAnimationButton.Size = new Size(70, 30);
+ groupBox.Controls.Add(_startAnimationButton);
+ }
+
+ // 停止按钮
+ if (_stopAnimationButton != null)
+ {
+ _stopAnimationButton.Text = "⏹ 停止";
+ _stopAnimationButton.Location = new Point(95, 25);
+ _stopAnimationButton.Size = new Size(70, 30);
+ groupBox.Controls.Add(_stopAnimationButton);
+ }
- Button pauseButton = new Button
+ // 状态标签
+ if (_animationStatusLabel != null)
{
- Text = "⏸ 暂停",
- Location = new Point(85, 25),
- Size = new Size(60, 25),
- Font = new Font("微软雅黑", 8)
- };
- groupBox.Controls.Add(pauseButton);
-
- Button stopButton = new Button
- {
- Text = "⏹ 停止",
- Location = new Point(155, 25),
- Size = new Size(60, 25),
- Font = new Font("微软雅黑", 8)
- };
- groupBox.Controls.Add(stopButton);
-
- Button resetButton = new Button
- {
- Text = "🔄 重置",
- Location = new Point(225, 25),
- Size = new Size(60, 25),
- Font = new Font("微软雅黑", 8)
- };
- groupBox.Controls.Add(resetButton);
+ _animationStatusLabel.Location = new Point(15, 65);
+ _animationStatusLabel.Size = new Size(250, 20);
+ groupBox.Controls.Add(_animationStatusLabel);
+ }
// 进度条
- ProgressBar progressBar = new ProgressBar
+ _animationProgressBar = new ProgressBar
{
- Location = new Point(15, 65),
- Size = new Size(270, 15)
- };
- groupBox.Controls.Add(progressBar);
-
- // 事件处理
- playButton.Click += (sender, e) =>
- {
- if (_animationManager != null)
- {
- _animationManager.StartAnimation();
- LogManager.Info("动画播放开始");
- }
- };
-
- pauseButton.Click += (sender, e) =>
- {
- LogManager.Info("动画暂停(功能待实现)");
- };
-
- stopButton.Click += (sender, e) =>
- {
- if (_animationManager != null)
- {
- _animationManager.StopAnimation();
- LogManager.Info("动画停止");
- }
- };
-
- resetButton.Click += (sender, e) =>
- {
- if (_animationManager != null)
- {
- _animationManager.ResetAnimation();
- LogManager.Info("动画重置");
- }
+ Location = new Point(15, 90),
+ Size = new Size(320, 18),
+ Minimum = 0,
+ Maximum = 100,
+ Value = 0
};
+ groupBox.Controls.Add(_animationProgressBar);
}
///
@@ -1722,8 +1688,8 @@ namespace NavisworksTransport
};
// 添加列标题
- _logisticsListView.Columns.Add("模型名称", 180);
- _logisticsListView.Columns.Add("物流类型", 120);
+ _logisticsListView.Columns.Add("模型名称", 160);
+ _logisticsListView.Columns.Add("物流类型", 140);
parent.Controls.Add(_logisticsListView);
@@ -1788,15 +1754,6 @@ namespace NavisworksTransport
Font = new Font("微软雅黑", 8)
};
groupBox.Controls.Add(highlightCheckBox);
-
- Label collisionStatusLabel = new Label
- {
- Text = "碰撞状态: 未检测",
- Location = new Point(15, 55),
- Size = new Size(200, 20),
- Font = new Font("微软雅黑", 8)
- };
- groupBox.Controls.Add(collisionStatusLabel);
}
///
@@ -2090,7 +2047,7 @@ namespace NavisworksTransport
ComboBox categoryComboBox = new ComboBox
{
Location = new Point(80, 25),
- Size = new Size(80, 25),
+ Size = new Size(100, 25),
Font = new Font("微软雅黑", 8),
DropDownStyle = ComboBoxStyle.DropDownList
};
@@ -2112,7 +2069,7 @@ namespace NavisworksTransport
Button applyButton = new Button
{
Text = "应用类别",
- Location = new Point(170, 25),
+ Location = new Point(200, 25),
Size = new Size(80, 25),
Font = new Font("微软雅黑", 8),
UseVisualStyleBackColor = true
@@ -2204,8 +2161,8 @@ namespace NavisworksTransport
Label vehicleInstructionLabel = new Label
{
Text = "请在选择树中选择部件",
- Location = new Point(20, 25),
- Size = new Size(200, 20),
+ Location = new Point(15, 25),
+ Size = new Size(140, 20),
Font = new Font("微软雅黑", 8),
ForeColor = System.Drawing.Color.Blue
};
@@ -2213,18 +2170,16 @@ namespace NavisworksTransport
Button getVehicleButton = new Button
{
Text = "获取选中部件",
- Location = new Point(230, 22),
- Size = new Size(90, 27),
- Font = new Font("微软雅黑", 8),
- BackColor = System.Drawing.Color.LightBlue,
- UseVisualStyleBackColor = false
+ Location = new Point(180, 22),
+ Size = new Size(85, 27),
+ Font = new Font("微软雅黑", 8)
};
Label vehicleStatusLabel = new Label
{
Text = "状态: 未选择",
- Location = new Point(20, 55),
- Size = new Size(300, 20),
+ Location = new Point(15, 55),
+ Size = new Size(290, 20),
Font = new Font("微软雅黑", 8),
ForeColor = System.Drawing.Color.Gray
};
@@ -2233,15 +2188,15 @@ namespace NavisworksTransport
Label pathLabel = new Label
{
Text = "路径选择:",
- Location = new Point(20, 85),
+ Location = new Point(15, 80),
Size = new Size(70, 20),
Font = new Font("微软雅黑", 8)
};
ComboBox pathComboBox = new ComboBox
{
- Location = new Point(95, 83),
- Size = new Size(150, 25),
+ Location = new Point(85, 78),
+ Size = new Size(120, 25),
Font = new Font("微软雅黑", 8),
DropDownStyle = ComboBoxStyle.DropDownList,
DisplayMember = "Name" // 显示路径的Name属性
@@ -2250,8 +2205,8 @@ namespace NavisworksTransport
Label pathInfoLabel = new Label
{
Text = "点数: 0",
- Location = new Point(255, 87),
- Size = new Size(60, 20),
+ Location = new Point(215, 82),
+ Size = new Size(50, 20),
Font = new Font("微软雅黑", 8),
ForeColor = System.Drawing.Color.Gray
};
@@ -2259,8 +2214,8 @@ namespace NavisworksTransport
Button refreshPathButton = new Button
{
Text = "刷新",
- Location = new Point(320, 83),
- Size = new Size(50, 25),
+ Location = new Point(270, 78),
+ Size = new Size(45, 25),
Font = new Font("微软雅黑", 8),
UseVisualStyleBackColor = true
};
@@ -2269,15 +2224,15 @@ namespace NavisworksTransport
Label durationLabel = new Label
{
Text = "动画时长(秒):",
- Location = new Point(20, 115),
+ Location = new Point(15, 115),
Size = new Size(80, 20),
Font = new Font("微软雅黑", 8)
};
NumericUpDown durationNumeric = new NumericUpDown
{
- Location = new Point(105, 113),
- Size = new Size(60, 25),
+ Location = new Point(100, 113),
+ Size = new Size(55, 25),
Font = new Font("微软雅黑", 8),
Minimum = 1,
Maximum = 300,
@@ -2289,48 +2244,37 @@ namespace NavisworksTransport
Button createAnimationButton = new Button
{
Text = "生成动画",
- Location = new Point(175, 112),
- Size = new Size(75, 27),
+ Location = new Point(180, 112),
+ Size = new Size(85, 27),
Font = new Font("微软雅黑", 8),
- BackColor = System.Drawing.Color.LightGreen,
- UseVisualStyleBackColor = false,
Enabled = false
};
- // 播放控制按钮
- Button startAnimationButton = new Button
+ // 播放控制按钮移到播放控制区域
+ _startAnimationButton = new Button
{
Text = "播放",
- Location = new Point(260, 112),
- Size = new Size(60, 27),
+ Location = new Point(245, 107),
+ Size = new Size(55, 27),
Font = new Font("微软雅黑", 8),
Enabled = false
};
- Button stopAnimationButton = new Button
+ _stopAnimationButton = new Button
{
Text = "停止",
- Location = new Point(20, 145),
- Size = new Size(60, 27),
- Font = new Font("微软雅黑", 8),
- Enabled = false
- };
-
- Button resetAnimationButton = new Button
- {
- Text = "重置",
- Location = new Point(90, 145),
- Size = new Size(60, 27),
+ Location = new Point(15, 140),
+ Size = new Size(55, 27),
Font = new Font("微软雅黑", 8),
Enabled = false
};
// 动画状态显示
- Label statusLabel = new Label
+ _animationStatusLabel = new Label
{
Text = "状态: 未生成动画",
- Location = new Point(160, 149),
- Size = new Size(160, 20),
+ Location = new Point(80, 144),
+ Size = new Size(150, 20),
Font = new Font("微软雅黑", 8),
ForeColor = System.Drawing.Color.Gray
};
@@ -2518,80 +2462,29 @@ namespace NavisworksTransport
{
_animationManager = new PathAnimationManager();
- // 监听动画完成事件
- _animationManager.AnimationCompleted += (animSender, animArgs) =>
+ // 订阅动画管理器的事件
+ _animationManager.StateChanged += (s, newState) =>
{
- GlobalExceptionHandler.SafeExecute(() =>
- {
- // 动画自动完成时更新UI状态
- statusLabel.Text = "状态: 动画播放完成";
- statusLabel.ForeColor = System.Drawing.Color.Green;
-
- startAnimationButton.Enabled = true;
- stopAnimationButton.Enabled = false;
- createAnimationButton.Enabled = true;
-
- LogManager.Info("动画自动完成,UI状态已更新");
- }, "动画完成事件处理");
+ // 在UI线程上更新状态
+ _controlPanelForm.Invoke(new Action(() => UpdateAnimationUI(newState)));
};
-
- // 快速测试TimeLiner API(可选功能)
- bool timelineAvailable = _animationManager.TestTimeLinerAPI();
- if (timelineAvailable)
+ _animationManager.ProgressChanged += (s, progress) =>
{
- LogManager.Info("TimeLiner API可用,但当前使用Timer方案");
- }
- }
+ // 在UI线程上更新进度条
+ if (_animationProgressBar != null && !_animationProgressBar.IsDisposed)
+ {
+ _controlPanelForm.Invoke(new Action(() => _animationProgressBar.Value = progress));
+ }
+ };
- // 设置动画参数
- var pathPoints = selectedPath.Points.Select(p => p.Position).ToList();
- double duration = (double)durationNumeric.Value;
-
- // 添加详细的路径点坐标调试信息
- LogManager.Info("=== 路径点坐标调试信息 ===");
- LogManager.Info($"选中路径: {selectedPath.Name}, 总点数: {selectedPath.Points?.Count ?? 0}");
-
- if (selectedPath.Points != null)
- {
- for (int i = 0; i < selectedPath.Points.Count; i++)
- {
- var point = selectedPath.Points[i];
- LogManager.Info($"路径点[{i}]: Name={point.Name}, Position=({point.Position.X:F2},{point.Position.Y:F2},{point.Position.Z:F2})");
- }
+ // 使用动画管理器生成动画
+ var pathPoints = selectedPath.GetSortedPoints().Select(p => new Point3D(p.X, p.Y, p.Z)).ToList();
+ _animationManager.CreateAnimation(selectedComponent, pathPoints, (double)durationNumeric.Value);
}
-
- LogManager.Info($"转换后pathPoints列表: 共{pathPoints.Count}个点");
- for (int i = 0; i < pathPoints.Count; i++)
- {
- var pos = pathPoints[i];
- LogManager.Info($"pathPoints[{i}]: ({pos.X:F2},{pos.Y:F2},{pos.Z:F2})");
- }
- LogManager.Info("=== 路径点坐标调试信息结束 ===");
-
- // 使用简化的动画设置方法
- bool success = _animationManager.SetupSimpleAnimation(selectedComponent, pathPoints, duration);
-
- if (!success)
- {
- MessageBox.Show("动画生成失败,请检查部件和路径设置", "错误",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
-
- statusLabel.Text = "状态: 动画已生成";
- statusLabel.ForeColor = System.Drawing.Color.Green;
-
- // 启用播放控制按钮
- startAnimationButton.Enabled = true;
- resetAnimationButton.Enabled = true;
- createAnimationButton.Enabled = false;
-
- MessageBox.Show($"动画生成成功!\n部件: {selectedComponent.DisplayName}\n路径: {selectedPath.Name}\n路径点: {pathPoints.Count}个\n时长: {duration}秒",
- "生成成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}, "生成动画");
};
- startAnimationButton.Click += (sender, e) =>
+ _startAnimationButton.Click += (sender, e) =>
{
GlobalExceptionHandler.SafeExecute(() =>
{
@@ -2599,17 +2492,17 @@ namespace NavisworksTransport
{
_animationManager.StartAnimation();
- statusLabel.Text = "状态: 动画播放中";
- statusLabel.ForeColor = System.Drawing.Color.Blue;
+ _animationStatusLabel.Text = "状态: 动画播放中";
+ _animationStatusLabel.ForeColor = System.Drawing.Color.Blue;
- startAnimationButton.Enabled = false;
- stopAnimationButton.Enabled = true;
+ _startAnimationButton.Enabled = false;
+ _stopAnimationButton.Enabled = true;
createAnimationButton.Enabled = false;
}
}, "播放动画");
};
- stopAnimationButton.Click += (sender, e) =>
+ _stopAnimationButton.Click += (sender, e) =>
{
GlobalExceptionHandler.SafeExecute(() =>
{
@@ -2617,35 +2510,17 @@ namespace NavisworksTransport
{
_animationManager.StopAnimation();
- statusLabel.Text = "状态: 动画已停止";
- statusLabel.ForeColor = System.Drawing.Color.Orange;
+ _animationStatusLabel.Text = "状态: 动画已停止";
+ _animationStatusLabel.ForeColor = System.Drawing.Color.Orange;
- startAnimationButton.Enabled = true;
- stopAnimationButton.Enabled = false;
+ _startAnimationButton.Enabled = true;
+ _stopAnimationButton.Enabled = false;
createAnimationButton.Enabled = true;
}
}, "停止动画");
};
- resetAnimationButton.Click += (sender, e) =>
- {
- GlobalExceptionHandler.SafeExecute(() =>
- {
- if (_animationManager != null)
- {
- _animationManager.ResetAnimation();
-
- statusLabel.Text = "状态: 动画已重置";
- statusLabel.ForeColor = System.Drawing.Color.Gray;
-
- startAnimationButton.Enabled = true;
- stopAnimationButton.Enabled = false;
- createAnimationButton.Enabled = true;
- }
- }, "重置动画");
- };
-
- // 添加控件到父容器
+ // 将控件添加到父容器
parent.Controls.Add(vehicleInstructionLabel);
parent.Controls.Add(getVehicleButton);
parent.Controls.Add(vehicleStatusLabel);
@@ -2656,10 +2531,67 @@ namespace NavisworksTransport
parent.Controls.Add(durationLabel);
parent.Controls.Add(durationNumeric);
parent.Controls.Add(createAnimationButton);
- parent.Controls.Add(startAnimationButton);
- parent.Controls.Add(stopAnimationButton);
- parent.Controls.Add(resetAnimationButton);
- parent.Controls.Add(statusLabel);
+ parent.Controls.Add(_startAnimationButton);
+ parent.Controls.Add(_stopAnimationButton);
+ parent.Controls.Add(_animationStatusLabel);
+ }
+
+ private void UpdateAnimationUI(AnimationState state)
+ {
+ if (_controlPanelForm == null || _controlPanelForm.IsDisposed) return;
+
+ string statusText = "";
+ System.Drawing.Color statusColor = System.Drawing.Color.Gray;
+ bool startEnabled = false;
+ bool stopEnabled = false;
+ int progressValue = 0;
+
+ switch (state)
+ {
+ case AnimationState.Idle:
+ statusText = "状态: 未生成动画";
+ statusColor = System.Drawing.Color.Gray;
+ break;
+ case AnimationState.Ready:
+ statusText = "状态: 动画已生成";
+ statusColor = System.Drawing.Color.Green;
+ startEnabled = true;
+ break;
+ case AnimationState.Playing:
+ statusText = "状态: 动画播放中";
+ statusColor = System.Drawing.Color.Blue;
+ stopEnabled = true;
+ break;
+ case AnimationState.Stopped:
+ statusText = "状态: 动画已停止";
+ statusColor = System.Drawing.Color.Orange;
+ startEnabled = true;
+ break;
+ case AnimationState.Finished:
+ statusText = "状态: 动画播放完成";
+ statusColor = System.Drawing.Color.Green;
+ progressValue = 100;
+ startEnabled = true;
+ break;
+ }
+
+ if (_animationStatusLabel != null && !_animationStatusLabel.IsDisposed)
+ {
+ _animationStatusLabel.Text = statusText;
+ _animationStatusLabel.ForeColor = statusColor;
+ }
+ if (_startAnimationButton != null && !_startAnimationButton.IsDisposed)
+ {
+ _startAnimationButton.Enabled = startEnabled;
+ }
+ if (_stopAnimationButton != null && !_stopAnimationButton.IsDisposed)
+ {
+ _stopAnimationButton.Enabled = stopEnabled;
+ }
+ if (_animationProgressBar != null && !_animationProgressBar.IsDisposed)
+ {
+ _animationProgressBar.Value = progressValue;
+ }
}
///
@@ -3357,10 +3289,12 @@ namespace NavisworksTransport
{
Text = "路径历史记录",
Size = new Size(600, 400),
- StartPosition = FormStartPosition.CenterParent,
+ StartPosition = FormStartPosition.CenterScreen,
FormBorderStyle = FormBorderStyle.FixedDialog,
MaximizeBox = false,
- MinimizeBox = false
+ MinimizeBox = false,
+ TopMost = true,
+ ShowInTaskbar = false
};
// 创建历史记录列表
@@ -3465,7 +3399,7 @@ namespace NavisworksTransport
DefaultExt = "txt"
};
- if (saveDialog.ShowDialog() == DialogResult.OK)
+ if (saveDialog.ShowDialog(historyForm) == DialogResult.OK)
{
var content = new StringBuilder();
content.AppendLine("路径历史记录导出");
@@ -3497,7 +3431,7 @@ namespace NavisworksTransport
historyForm.Controls.Add(exportButton);
historyForm.Controls.Add(closeButton);
- historyForm.ShowDialog();
+ historyForm.ShowDialog(_controlPanelForm);
}
///
diff --git a/PathAnimationManager.cs b/PathAnimationManager.cs
index 8c1a70f..d5066f0 100644
--- a/PathAnimationManager.cs
+++ b/PathAnimationManager.cs
@@ -7,6 +7,18 @@ using NavisApplication = Autodesk.Navisworks.Api.Application;
namespace NavisworksTransport
{
+ ///
+ /// 定义动画播放的状态
+ ///
+ public enum AnimationState
+ {
+ Idle, // 空闲,未生成动画
+ Ready, // 已就绪,动画已生成但未播放
+ Playing, // 播放中
+ Stopped, // 已停止
+ Finished // 已完成
+ }
+
///
/// 路径动画管理器 - 基于TimeLiner和动态变换实现沿路径的动画效果
/// 注意:由于Navisworks API限制,无法直接使用Animator API,因此使用OverridePermanentTransform实现动画
@@ -22,8 +34,20 @@ namespace NavisworksTransport
private Transform3D _originalTransform;
private Point3D _originalCenter; // 存储部件的原始中心位置
private Point3D _currentPosition; // 存储部件的当前位置
+ private AnimationState _currentState = AnimationState.Idle;
- // 动画完成事件
+ // --- 新增事件 ---
+ ///
+ /// 当动画状态发生改变时触发
+ ///
+ public event EventHandler StateChanged;
+
+ ///
+ /// 当动画进度更新时触发 (0-100)
+ ///
+ public event EventHandler ProgressChanged;
+
+ // 动画完成事件 (旧版,保留兼容性)
public event EventHandler AnimationCompleted;
public PathAnimationManager()
@@ -177,6 +201,7 @@ namespace NavisworksTransport
_animationTimer.Tick += AnimationTimer_Tick;
_animationTimer.Start();
+ SetState(AnimationState.Playing);
LogManager.Info("动画开始播放");
}
catch (Exception ex)
@@ -198,9 +223,10 @@ namespace NavisworksTransport
_animationTimer.Stop();
_animationTimer.Dispose();
_animationTimer = null;
- }
- LogManager.Info("动画已停止");
+ SetState(AnimationState.Stopped);
+ LogManager.Info("动画已停止");
+ }
}
catch (Exception ex)
{
@@ -215,30 +241,24 @@ namespace NavisworksTransport
{
try
{
- StopAnimation();
+ StopAnimation(); // 停止当前动画
+ // 恢复对象的原始变换
if (_animatedObject != null)
{
- var doc = NavisApplication.ActiveDocument;
var modelItems = new ModelItemCollection { _animatedObject };
-
- // 重置到原始位置(使用单位变换)
- var identityTransform = Transform3D.CreateTranslation(new Vector3D(0, 0, 0));
- doc.Models.OverridePermanentTransform(modelItems, identityTransform, true);
-
- // 重置当前位置为原始中心
- _currentPosition = _originalCenter;
-
- // 清除碰撞高亮
- doc.Models.ResetAllTemporaryMaterials();
+ NavisApplication.ActiveDocument.Models.OverridePermanentTransform(modelItems, _originalTransform, false);
+ LogManager.Info($"部件 {_animatedObject.DisplayName} 已重置到原始位置");
}
_currentPathIndex = 0;
- LogManager.Info("动画已重置到初始状态");
+ ProgressChanged?.Invoke(this, 0); // 重置进度条
+ SetState(AnimationState.Ready); // 重置后回到就绪状态
}
catch (Exception ex)
{
LogManager.Error($"重置动画失败: {ex.Message}");
+ throw;
}
}
@@ -249,36 +269,30 @@ namespace NavisworksTransport
{
try
{
- var elapsedTime = (DateTime.Now - _animationStartTime).TotalSeconds;
- var progress = elapsedTime / _animationDuration;
+ double elapsedSeconds = (DateTime.Now - _animationStartTime).TotalSeconds;
+ double progress = Math.Min(elapsedSeconds / _animationDuration, 1.0);
+
+ // 更新UI进度条
+ ProgressChanged?.Invoke(this, (int)(progress * 100));
+
+ Point3D newPosition = InterpolatePosition(progress);
+ UpdateObjectPosition(newPosition);
+
+ // 检查碰撞
+ CheckAndHighlightCollisions();
if (progress >= 1.0)
{
- // 动画完成
StopAnimation();
+ SetState(AnimationState.Finished); // 标记为完成
+ AnimationCompleted?.Invoke(this, EventArgs.Empty); // 触发旧版完成事件
LogManager.Info("动画播放完成");
-
- // 触发动画完成事件
- AnimationCompleted?.Invoke(this, EventArgs.Empty);
- return;
}
-
- // 计算当前应该在的位置
- var currentPosition = InterpolatePosition(progress);
-
- // 添加调试信息
- LogManager.Debug($"动画进度: {progress:F4}, 目标位置: ({currentPosition.X:F2},{currentPosition.Y:F2},{currentPosition.Z:F2})");
-
- // 更新模型位置
- UpdateObjectPosition(currentPosition);
-
- // 检查碰撞(简化版本)
- CheckAndHighlightCollisions();
}
catch (Exception ex)
{
- LogManager.Error($"动画更新失败: {ex.Message}");
- StopAnimation();
+ LogManager.Error($"动画帧更新失败: {ex.Message}");
+ StopAnimation(); // 发生错误时停止动画
}
}
@@ -705,5 +719,30 @@ namespace NavisworksTransport
return null;
}
}
+
+ ///
+ /// 设置并触发状态变更事件
+ ///
+ /// 新的动画状态
+ private void SetState(AnimationState newState)
+ {
+ if (_currentState != newState)
+ {
+ _currentState = newState;
+ StateChanged?.Invoke(this, _currentState);
+ }
+ }
+
+ ///
+ /// 创建动画
+ ///
+ /// 要动画化的模型对象
+ /// 路径点列表
+ /// 动画持续时间(秒)
+ public void CreateAnimation(ModelItem animatedObject, List pathPoints, double durationSeconds = 10.0)
+ {
+ SetupAnimation(animatedObject, pathPoints, durationSeconds);
+ SetState(AnimationState.Ready);
+ }
}
}
\ No newline at end of file