Revit二次开发最好用的开源进度条封装!

🧩 项目仓库

GitHub:https://github.com/ViewSuSu/Su.Revit.UI.StatusBarEx

Gitee:https://gitee.com/SususuChang/status-bar-ex

本文介绍一款专为 Revit 二次开发设计的进度条封装组件,支持 Revit 2011-2026 全系列版本,提供更加友好的中文 UI 和自定义选项。

🧩 效果演示


🧩 项目背景

本项目是基于原开源项目 ricaun.Revit.UI.StatusBar 进行拓展开发的 Revit 进度条组件。

开发初衷:

  • 原项目不支持 Revit 2018 及以下版本

  • 不支持修改进度条样式或默认文本

  • 为适应 国内 Revit 二次开发现状(仍普遍使用 2020 以下版本,且要求中文 UI)

题外话:

原作者不支持Revit低版本的大概意思是Revit2018以下版本的界面内容都是以Form的形式进行承载,而新版是WPF窗体。原作者的思路是以WPF控件替换Status状态栏的控件,这就间接导致了注定无法支持旧版本。

而18以下Status的部分难以通过控件进行替代,故笔者通过抓取Dock的Form的句柄进行控件嵌入,达到曲线救国的效果。(浅浅吐槽一下:笔者通过身边调研发现大多数Revit用户甚至都不知道主界面的左下角居然有个状态栏信息,故嵌入Ribbon下停靠栏也算是一举两得)


✨ 新增功能

功能项描述
✅ 支持旧版本 Revit新增支持 Revit 2011 - Revit 2026 全系列版本
🎯 界面优化进度条位置调整至 Ribbon 下方,更贴合 Revit 操作体验
🧰 可定制样式支持传入 Options 参数来自定义进度条样式(目前支持取消按钮的 Content 等)

🧱 版本支持情况

Revit 版本支持情况
2011-2018✅ 全支持
2019-2026✅ 全支持

🧩 安装方法

在 Revit 二次开发中使用 Su.Revit.UI.StatusBarEx 组件,你可以通过三种方式进行安装,下面详细说明:


方法一:Package Manager 控制台

Visual StudioPackage Manager 控制台 中运行以下命令,根据你的 Revit 版本选择对应的包:

# Revit 2018

Install-Package Su.Revit.UI.StatusBarEx.2018 -Version 1.0.0

# Revit 2019

Install-Package Su.Revit.UI.StatusBarEx.2019 -Version 1.0.0

# Revit 2020

Install-Package Su.Revit.UI.StatusBarEx.2020 -Version 1.0.0

⚠️ 注意:确保控制台中选择的默认项目是你要安装组件的项目。


方法二:.NET CLI

如果你使用 .NET CLI,可以通过以下命令安装:

# Revit 2018

dotnet add package Su.Revit.UI.StatusBarEx.2018 --version 1.0.0

# Revit 2019 dotnet

add package Su.Revit.UI.StatusBarEx.2019 --version 1.0.0

# Revit 2020 dotnet

add package Su.Revit.UI.StatusBarEx.2020 --version 1.0.0

⚡ 适合熟悉命令行操作或者在 CI/CD 环境中自动化安装。


方法三:Visual Studio NuGet 包管理器

  1. 解决方案资源管理器 中右键点击项目 → 管理 NuGet 程序包

  2. 进入 浏览 选项卡,搜索:Su.Revit.UI.StatusBarEx

  3. 选择对应你 Revit 版本的包 → 点击 安装

✅ 这种方式适合不熟悉命令行的开发者,操作直观简洁。

🪄 使用方法

1️⃣ 基础用法 —— 遍历集合元素

csharp

// 示例:批量处理墙元素
var walls = new FilteredElementCollector(doc)
    .OfCategory(BuiltInCategory.OST_Walls)
    .WhereElementIsNotElementType()
    .Cast<Wall>();

ProgressBarExUtils.Run(
    elements: walls,
    loopAction: wall =>
    {
        wall.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)
           ?.Set("已处理");
    }
);

2️⃣ 使用整数计数循环

csharp

int count = 50;
ProgressBarExUtils.Run(
    count: count,
    loopAction: i =>
    {
        // i 从 0 到 count-1
        Task.Delay(50).Wait(); // 模拟耗时操作
    }
);

3️⃣ 可取消的事务内循环(Transaction)

csharp

var walls = new FilteredElementCollector(doc)
    .OfCategory(BuiltInCategory.OST_Walls)
    .WhereElementIsNotElementType()
    .Cast<Wall>();

using (var tx = new Transaction(doc, "批量修改"))
{
    tx.Start();
    ProgressBarExUtils.RunCancelable(
        transaction: tx,
        sources: walls,
        loopAction: wall =>
        {
            Thread.Sleep(100);
            wall.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)
                ?.Set("批量处理完成");
        }
    );
    if (tx.GetStatus() == TransactionStatus.Started)
    {
        tx.Commit();
    }
}

4️⃣ 可取消的事务组内循环(TransactionGroup)

csharp

var walls = new FilteredElementCollector(doc)
    .OfCategory(BuiltInCategory.OST_Walls)
    .WhereElementIsNotElementType()
    .Cast<Wall>();

using (var tg = new TransactionGroup(doc, "事务组批量处理"))
{
    tg.Start();
    ProgressBarExUtils.RunCancelable(
        transactionGroup: tg,
        sources: walls,
        loopAction: wall =>
        {
            wall.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)
                ?.Set("事务组处理完成");
        }
    );
    tg.Assimilate(); // 合并事务组
}
posted @ 2025-10-23 13:13  SuSuChang  阅读(0)  评论(0)    收藏  举报  来源