Базовый инструмент для работы с Revit Server внутри Revit-плагинов на .NET Framework 4.8.
Проект можно использовать как готовый браузер моделей на Revit Server и как основу для своих инструментов: пакетного экспорта, проверок моделей, публикации, аудита структуры сервера, выборки наборов моделей по папкам и любых других сценариев, где нужно дать пользователю удобный UI для выбора моделей с Revit Server.
- автоматически определяет версию Revit из
ExternalCommandData; - автоматически читает список серверов из
RSN.INI; - показывает WinForms-интерфейс с деревом структуры Revit Server;
- лениво загружает папки и модели по мере раскрытия дерева;
- позволяет выбрать одну или несколько моделей;
- возвращает выбранные модели в формате
RSN://..., пригодном для дальнейшей работы через Revit API; - дополнительно хранит "сырые" внутренние пути вида
|Folder|SubFolder|Model.rvt.
Базовый результат работы инструмента: список путей выбранных моделей.
RevitServerBrowser не привязан к одному сценарию. Это именно базовый слой, на котором удобно строить прикладные инструменты:
- экспорт моделей с Revit Server;
- открытие выбранных моделей в фоновом режиме;
- запуск пакетных проверок;
- сбор реестров моделей;
- массовая обработка выбранных файлов;
- построение собственных UI-обвязок поверх стандартного браузера.
Версия берётся из:
commandData.Application.Application.VersionNumberДальше эта версия используется для:
- чтения правильного
RSN.INI; - формирования URL к
RevitServerAdminRESTService{year}.
Список серверов читается из файла:
C:\ProgramData\Autodesk\Revit Server <YEAR>\Config\RSN.INI
Например для Revit 2026:
C:\ProgramData\Autodesk\Revit Server 2026\Config\RSN.INI
Поддерживается простой формат: один сервер на строку. Пустые строки и комментарии пропускаются.
Пример:
192.168.10.20
rs-main
# backup
rs-backupUI построен на WinForms и содержит:
- выпадающий список серверов;
- дерево структуры Revit Server;
- выбор моделей кликом;
- кнопку подтверждения выбора;
- кнопку сброса;
- строку статуса.
Дерево загружает содержимое не целиком, а по раскрытию узлов. Это удобно для больших серверных структур.
После выбора моделей форма возвращает:
SelectedModelPaths- список путей в форматеRSN://server/path/model.rvt;SelectedModelPathsRaw- список внутренних путей вида|Folder|SubFolder|Model.rvt.
|ProjectA|AR|Building_01.rvt
Такой путь используется внутри дерева и при обращении к REST API Revit Server.
RSN://rs-main/ProjectA/AR/Building_01.rvt
Именно этот формат удобно передавать дальше в свои инструменты для открытия модели, экспорта, анализа и т.д.
Проект удобно использовать как библиотеку. Основные точки входа:
RevitServerConfigReader.ReadServers(int revitYear)- получить список серверов;RevitServerBrowserForm- готовая форма выбора моделей;RevitServerClient- низкоуровневый клиент к REST API Revit Server;RevitServerItem- элемент структуры сервера: папка или модель.
Самый удобный сценарий - просто показать форму и получить выбранные модели.
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Linq;
using System.Windows.Forms;
namespace MyTool
{
[Transaction(TransactionMode.Manual)]
public class MyCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
var apiYear = int.Parse(commandData.Application.Application.VersionNumber);
var servers = RevitServerBrowser.RevitServerConfigReader.ReadServers(apiYear);
using (var form = new RevitServerBrowser.RevitServerBrowserForm(servers, apiYear))
{
form.ConfirmButton.Click += (s, e) =>
{
var selected = form.SelectedModelPaths;
if (!selected.Any())
{
MessageBox.Show(form, "Выберите хотя бы одну модель");
return;
}
foreach (var rsnPath in selected)
{
TaskDialog.Show("Выбранная модель", rsnPath);
}
};
form.ShowDialog();
}
return Result.Succeeded;
}
}
}Если свой UI уже есть, можно использовать только клиент.
using System;
using System.Collections.Generic;
namespace MyTool
{
public class ServerReader
{
public List<RevitServerBrowser.RevitServerItem> ReadRoot(string host, int apiYear)
{
using (var client = new RevitServerBrowser.RevitServerClient(host, apiYear))
{
return client.GetContents("|");
}
}
}
}В проекте BatchIfcExporter этот инструмент используется как слой выбора моделей с Revit Server перед пакетным IFC-экспортом.
Сценарий там такой:
- Команда получает
apiYearиз текущего Revit. - Читает список серверов через
RevitServerConfigReader. - Показывает
RevitServerBrowserForm. - Получает
SelectedModelPaths. - Передаёт эти
RSN://пути в собственный пайплайн открытия моделей и экспорта IFC.
Ниже упрощённый фрагмент по мотивам ExportFromServerCommand:
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace BatchExportIfc
{
[Transaction(TransactionMode.Manual)]
public class ExportFromServerCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
var apiYear = int.Parse(commandData.Application.Application.VersionNumber);
var servers = RevitServerBrowser.RevitServerConfigReader.ReadServers(apiYear);
var form = new RevitServerBrowser.RevitServerBrowserForm(servers, apiYear);
form.ConfirmButton.Click += (s, e) =>
{
var selectedPaths = form.SelectedModelPaths;
if (!selectedPaths.Any())
{
MessageBox.Show(form, "Выберите хотя бы одну модель для экспорта");
return;
}
string outputFolder = @"C:\IFC_Output";
foreach (var rsnPath in selectedPaths)
{
ExportModelToIfc(commandData.Application.Application, rsnPath, outputFolder);
}
};
form.ShowDialog();
return Result.Succeeded;
}
private void ExportModelToIfc(
Autodesk.Revit.ApplicationServices.Application app,
string rsnPath,
string outputFolder)
{
var fileName = Path.GetFileName(rsnPath);
// Дальше уже ваш прикладной пайплайн:
// 1. открыть модель по RSN:// пути
// 2. подготовить IFCExportOptions
// 3. вызвать doc.Export(...)
}
}
}RevitServerBrowser ничего не знает про IFC, экспорт, настройки видов, JSON-конфиги и логику обработки документов. Он решает только одну задачу, но решает её полноценно:
- находит доступные Revit Server;
- показывает структуру;
- даёт пользователю выбрать модели;
- возвращает готовые пути.
А весь прикладной сценарий остаётся в вашем проекте. За счёт этого инструмент легко переиспользовать.
Если вы строите свой инструмент поверх этого проекта, удобно разделять ответственность так:
RevitServerBrowserотвечает за выбор моделей;- ваш проект отвечает за дальнейшую бизнес-логику.
Например:
var selectedModels = form.SelectedModelPaths;
foreach (var rsnPath in selectedModels)
{
var doc = myDocumentOpener.Open(rsnPath);
var report = myChecker.Run(doc);
myExporter.Save(report);
}Это позволяет:
- не смешивать UI выбора и прикладную обработку;
- переиспользовать браузер в нескольких командах;
- проще тестировать собственную бизнес-логику;
- не дублировать код работы с
RSN.INIи REST API.
.NET Framework 4.8Autodesk Revit APISystem.Windows.FormsWebClientдля вызова REST API Revit Server
Клиент формирует URL в виде:
http://<host>/RevitServerAdminRESTService<year>/AdminRESTService.svc/<path>/contents
Пример:
http://rs-main/RevitServerAdminRESTService2026/AdminRESTService.svc/|/contents
Для обращения к Revit Server используются служебные заголовки:
User-NameUser-Machine-NameOperation-GUID
Элемент структуры сервера описывается типом RevitServerItem:
public class RevitServerItem
{
public string Name { get; }
public string ItemType { get; }
public string Path { get; }
public bool IsFolder { get; }
public bool IsModel { get; }
}При старте форма не загружает всё дерево целиком. В корень добавляется placeholder, а реальная загрузка происходит в обработчике раскрытия узла. Это важно для больших серверов и длинных списков моделей.
RevitServerBrowser/Command.cs- пример готовой Revit-команды, запускающей браузерRevitServerBrowser/RevitServerBrowserForm.cs- основная WinForms-формаRevitServerBrowser/RevitServerClient.cs- REST-клиент Revit ServerRevitServerBrowser/RevitServerConfigReader.cs- чтениеRSN.INIRevitServerBrowser/RevitServerItem.cs- модель папки/файлаRevitServerBrowser/TimeoutWebClient.cs-WebClientс настраиваемым таймаутом
Проект собирается как библиотека:
RevitServerBrowser.dll
Основные зависимости:
RevitAPI.dllRevitAPIUI.dll
В репозитории уже лежат локальные копии Revit API DLL, поэтому проект можно открыть и собрать в Visual Studio без дополнительной ручной раскладки ссылок, если структура репозитория не менялась.
- библиотека работает внутри процесса Revit;
- список серверов берётся из локального
RSN.INI, поэтому он должен быть настроен на машине пользователя; - доступность моделей зависит от сетевой доступности Revit Server и прав пользователя;
- инструмент не открывает и не обрабатывает модели сам по себе, он только возвращает выбранные пути.
Используйте RevitServerBrowser, если вам нужен базовый, расширяемый слой выбора моделей с Revit Server без необходимости каждый раз заново писать:
- чтение
RSN.INI; - выбор сервера по версии Revit;
- REST-клиент к структуре Revit Server;
- дерево папок и моделей;
- конвертацию внутренних путей в
RSN://.
Если нужна прикладная логика поверх этого выбора, её лучше строить отдельным проектом, как это сделано в BatchIfcExporter.