如何在Sparx Enterprise Architect .NET插件中显示日志消息
Sparx Enterprise Architect .NET插件日志输出与进度提示方案
一、输出日志到EA内置的System Output窗口
EA的Repository接口提供了直接输出到System Output窗口的方法,这是最贴合EA原生体验的方案:
- 先调用
EnsureOutputVisible("System")确保窗口可见 - 用
WriteOutput方法写入日志,支持普通消息、警告、错误三种类型(对应不同颜色)
示例代码:
// 假设你已通过插件入口获取到EA.Repository实例 public void LogToSystemOutput(EA.Repository repo, string message, int messageType = 0) { // 确保System Output窗口显示 repo.EnsureOutputVisible("System"); // 写入日志:参数分别是标签、内容、类型(0=普通,1=警告,2=错误) repo.WriteOutput("System", $"[插件日志] {message}", messageType); } // 使用示例 LogToSystemOutput(repo, "开始执行批量导入操作...", 0); LogToSystemOutput(repo, "发现重复数据,已跳过", 1); LogToSystemOutput(repo, "数据库连接失败", 2);
二、自定义日志窗口实时显示
如果需要更灵活的日志展示(比如保留历史记录、自定义格式),可以创建一个非模态WinForm/WPF窗口:
实现步骤:
- 创建带多行文本框的窗口,用于日志展示
- 提供线程安全的日志追加方法(因为EA插件可能在非UI线程执行)
- 以非模态方式显示窗口,不阻塞插件运行
示例代码(WinForm):
private Form _logWindow; private TextBox _logTextBox; // 初始化日志窗口 private void InitLogWindow() { _logWindow = new Form { Text = "插件运行日志", Size = new Size(650, 450), StartPosition = FormStartPosition.CenterParent, ShowInTaskbar = false }; _logTextBox = new TextBox { Dock = DockStyle.Fill, Multiline = true, ReadOnly = true, ScrollBars = ScrollBars.Vertical, Font = new Font("Consolas", 9f) }; _logWindow.Controls.Add(_logTextBox); _logWindow.Show(); } // 线程安全的日志追加方法 private void AppendLog(string message) { if (_logTextBox.InvokeRequired) { _logTextBox.Invoke(new Action<string>(AppendLog), message); return; } var logLine = $"{DateTime.Now:HH:mm:ss.fff} | {message}{Environment.NewLine}"; _logTextBox.AppendText(logLine); // 自动滚动到最新日志 _logTextBox.SelectionStart = _logTextBox.Text.Length; _logTextBox.ScrollToCaret(); } // 使用示例 InitLogWindow(); AppendLog("插件初始化完成"); AppendLog("正在处理第5个元素...");
三、进度与状态提示
1. 沙漏光标(简单等待提示)
直接切换EA主窗口的光标,提示用户当前正在处理:
// 保存原光标 var originalCursor = Cursor.Current; // 设置为沙漏光标 Cursor.Current = Cursors.WaitCursor; // 执行耗时操作 // ... // 恢复原光标 Cursor.Current = originalCursor;
2. 自定义进度条
在之前的自定义日志窗口中添加进度条,实现可视化进度:
private ProgressBar _progressBar; // 修改InitLogWindow方法,添加进度条 private void InitLogWindow() { // ... 原有窗口初始化代码 ... _progressBar = new ProgressBar { Dock = DockStyle.Bottom, Minimum = 0, Maximum = 100, Height = 20 }; _logWindow.Controls.Add(_progressBar); } // 线程安全的进度更新方法 private void UpdateProgress(int percent) { if (_progressBar.InvokeRequired) { _progressBar.Invoke(new Action<int>(UpdateProgress), percent); return; } _progressBar.Value = Math.Clamp(percent, 0, 100); } // 使用示例 UpdateProgress(30); // 进度30%
为什么之前的方法无效?
Console.Write/Trace.Write:针对控制台程序设计,EA是GUI应用,不会捕获这些输出Session.Output:仅在EA的脚本环境(VBScript/JScript)中可用,.NET插件通过Interop.EA提供的Repository接口替代相关功能- 自定义消息框:模态窗口会阻塞插件执行,且不适合批量日志展示
内容的提问来源于stack exchange,提问作者sixdiamants
相关产品推荐
相关产品推荐

