You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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窗口:

实现步骤:

  1. 创建带多行文本框的窗口,用于日志展示
  2. 提供线程安全的日志追加方法(因为EA插件可能在非UI线程执行)
  3. 以非模态方式显示窗口,不阻塞插件运行

示例代码(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:25:06