Alexpivo394.Revit.Clash.Revit 2027.1.2

dotnet add package Alexpivo394.Revit.Clash.Revit --version 2027.1.2
                    
NuGet\Install-Package Alexpivo394.Revit.Clash.Revit -Version 2027.1.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Alexpivo394.Revit.Clash.Revit" Version="2027.1.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Alexpivo394.Revit.Clash.Revit" Version="2027.1.2" />
                    
Directory.Packages.props
<PackageReference Include="Alexpivo394.Revit.Clash.Revit" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Alexpivo394.Revit.Clash.Revit --version 2027.1.2
                    
#r "nuget: Alexpivo394.Revit.Clash.Revit, 2027.1.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Alexpivo394.Revit.Clash.Revit@2027.1.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Alexpivo394.Revit.Clash.Revit&version=2027.1.2
                    
Install as a Cake Addin
#tool nuget:?package=Alexpivo394.Revit.Clash.Revit&version=2027.1.2
                    
Install as a Cake Tool

<p align="center"> <h1 align="center">ToadClash</h1> <p align="center">Поиск коллизий в моделях Revit 2020–2027</p> </p>

Ядро поиска коллизий

ToadClash — ядро поиска коллизий сервиса ToadFlow и панели «Коллизии» в ToadTools. Ядро выгружает геометрию модели из Revit в слепок, отбирает элементы по правилам проверки, ищет пересечения сеток и рисует картинки коллизий. Интерфейса у ядра нет; каждая часть — отдельный пакет NuGet.

Коллизия — пересечение сеток двух элементов (или вложение одной сетки в другую) глубиной больше допуска клетки матрицы. Единицы — миллиметры, допуск по умолчанию — 20 мм, наименьший допуск — 0,05 мм. Элемент сам с собой, соединённые элементы MEP и вложенные семейства одного изделия друг с другом не проверяются.

Нашли ошибку или не хватает возможности? Напишите.

Пакеты

Пакет Платформы Revit API Назначение
Alexpivo394.Revit.Clash.Geometry net47, net8.0 нет Слепок модели: файлы .tcg (сетки) и .tcp (параметры)
Alexpivo394.Revit.Clash.Rules net48, net8.0 нет Группы, наборы выбора, матрица проверок, исключения
Alexpivo394.Revit.Clash.Engine net8.0 нет Поиск коллизий, повторный прогон по основе прошлого, сопоставление пересозданных элементов
Alexpivo394.Revit.Clash.Render net8.0 нет Картинка коллизии в PNG без видеокарты
Alexpivo394.Revit.Clash.Revit по году Revit да Выгрузка геометрии и параметров 3D-вида в слепок

Пакеты ядра выходят вместе под одной версией. Версия пакета выгрузки — год Revit, затем major и minor ядра: ядру 1.0.0 соответствует 2027.1.0 для Revit 2027. Исправление выгрузки выходит с новой minor-версией ядра.

Выгрузка из Revit

<PackageReference Include="Alexpivo394.Revit.Clash.Revit" Version="[$(RevitVersion).1.0]"/>

Выгрузка работает в контексте Revit API и берёт элементы, видимые на заданном 3D-виде:

var result = GeometryExtractor.Extract(document, new ExtractOptions(ModelKey: "ar-1", ViewName: "Navisworks"), ct);

using (var tcg = File.Create("model.tcg")) ModelGeometryFile.Write(tcg, result.Geometry);
using (var tcp = File.Create("model.tcp")) ModelParametersFile.Write(tcp, result.Parameters);

Элемент, на котором Revit выдал ошибку, не попадает в слепок и перечислен в result.Skipped; выгрузка остальных продолжается. Если 3D-вида с таким именем нет, Extract выбрасывает ArgumentException с ParamName == "viewName".

Поиск коллизий

<PackageReference Include="Alexpivo394.Revit.Clash.Engine" Version="1.*"/>
ModelInput Load(string discipline, string folder)
{
    using var tcg = File.OpenRead(Path.Combine(folder, "model.tcg"));
    using var tcp = File.OpenRead(Path.Combine(folder, "model.tcp"));
    return new ModelInput(discipline, ModelGeometryFile.Read(tcg), ModelParametersFile.Read(tcp));
}

var config = ConfigurationJson.Deserialize(File.ReadAllText("config.json"));
var models = new[] { Load("АР", @"snapshots\ar"), Load("ОВ", @"snapshots\ov") };

var result = new ClashEngine(new EngineOptions()).Run(models, config, ct);
foreach (var hit in result.Hits)
    Console.WriteLine($"{hit.A.UniqueId} × {hit.B.UniqueId}: {hit.DepthMm:0.#} мм");

EngineOptions.MaxDegreeOfParallelism ограничивает число потоков; 0 — все ядра. Результат не зависит от порядка моделей и числа потоков. Параметр previous метода Run принимает основу прошлого прогона той же конфигурации: пары неизменных элементов берутся из неё без повторной проверки. Основа с другим ClashEngine.AlgorithmVersion не годится, это проверяет вызывающий.

Картинка коллизии

<PackageReference Include="Alexpivo394.Revit.Clash.Render" Version="1.*"/>

CollisionScenes.Build собирает сцену по оглавлениям слепков: оба элемента коллизии и окружение в секущем кубе вокруг зоны пересечения. CollisionRenderer.Render рисует сцену и возвращает PNG:

SceneModel Open(string path)
{
    using var tcg = File.OpenRead(path);
    return new SceneModel(ModelGeometryFile.ReadIndex(tcg), () => File.OpenRead(path));
}

var scenes = new[] { Open(@"snapshots\ar\model.tcg"), Open(@"snapshots\ov\model.tcg") };
var scene = CollisionScenes.Build(scenes, new SceneTarget(hit.A.ModelKey, hit.A.UniqueId, hit.B.ModelKey, hit.B.UniqueId, hit.PointX, hit.PointY, hit.PointZ));
File.WriteAllBytes("collision.png", CollisionRenderer.Render(scene).Png);

Координаты

Слепок хранит координаты в общей системе координат документа (площадка ActiveProjectLocation), как выгрузка NWC по общим координатам. Модели разных разделов совмещаются без пересчёта.

Вершины записаны во float относительно начала слепка ModelHeader.OriginX/Y/Z. Начало — внутреннее начало документа в общих координатах, округлённое до метра; оно не зависит от элементов, и отпечатки неизменных элементов совпадают между выгрузками. Элементы дальше 1 км от внутреннего начала считаются в ExtractResult.FarElements: там шаг float грубее 0,06 мм.

Движок требует, чтобы модели проверки были совмещены. Если основная часть модели (габарит 98 % элементов) лежит дальше 10 м от остальных моделей, Run выбрасывает ModelsNotAlignedException с ключами этих моделей. Отдельные далёкие элементы модель несовмещённой не делают.

Точка коллизии ClashHit.PointX/Y/Z — в миллиметрах общей системы координат.

Сборка и тесты

dotnet build ToadClash.slnx
dotnet test --project tests/Alexpivo394.Revit.Clash.Tests

Тесты выгрузки без Revit собираются против API нужного года:

dotnet test --project tests/ToadClash.Extractor.Tests -p:ExtractorApiYear=2022

Пакеты собирает пайплайн build/ в папку output/:

cd build
$env:DOTNET_ENVIRONMENT = "Development"; $env:Publish__Version = "1.1.0-dev"; dotnet run -c Release -- pack

Выпуск

Тег X.Y.Z запускает .github/workflows/PublishRelease.yml. Workflow собирает пакеты ядра версии X.Y.Z и пакеты выгрузки {год}.X.Y для Revit 2020–2027, публикует их на nuget.org через trusted publishing и создаёт релиз на GitHub. Ключа nuget.org в репозитории нет; доверие к репозиторию настроено в профиле Alexpivo394 на nuget.org.

Каждый push проверяет .github/workflows/Build.yml: тесты ядра, тесты выгрузки и сборка выгрузки для Revit 2020 и 2027.

Инструменты разработки

tools/ToadClash.Bench — замеры и сверки из командной строки:

Команда Что делает
synth --elements 200000 --models 12 --seed 1 --profile dense --out <папка> Создаёт синтетические слепки
run --in <папка> --threads 8 Прогоняет config.json по всем слепкам папки и печатает время и память
identity --old <tcg> --new <tcg> Сопоставляет элементы двух выгрузок одной модели
navis-all --settings <xml> --reports <папка> --snapshots <папка> --out <папка> Сверяет все проверки Navisworks с результатом движка

Разделы реальных моделей для run задаёт model-disciplines.json в папке слепков: ключ модели из заголовка слепка — раздел.

tools/ToadClash.DevAddin — аддин Revit 2022 с кнопками выгрузки текущей модели и генерации синтетических моделей. Без установки в Revit он собирается так:

dotnet build tools/ToadClash.DevAddin -c Release.R22 -p:DeployAddin=false

Лицензия

MIT. Изменения по версиям — в Changelog.md.

Product Compatible and additional computed target framework versions.
.NET net10.0-windows7.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2027.1.2 66 11/5/2026
2027.1.1 56 11/4/2026
2027.1.0 62 11/2/2026
2026.1.2 42 11/5/2026
2026.1.1 44 11/4/2026
2026.1.0 61 11/2/2026
2025.1.2 39 11/5/2026
2025.1.1 46 11/4/2026
2025.1.0 74 11/2/2026
2024.1.2 45 11/5/2026
2024.1.1 44 11/4/2026
2024.1.0 56 11/2/2026
2023.1.2 39 11/5/2026
2023.1.1 38 11/4/2026
2022.1.2 43 11/5/2026
2022.1.1 40 11/4/2026
2021.1.2 41 11/5/2026
2021.1.1 52 11/4/2026
2020.1.2 42 11/5/2026
2020.1.1 41 11/4/2026
Loading failed