Alexpivo394.Revit.Clash.Engine 1.2.1

dotnet add package Alexpivo394.Revit.Clash.Engine --version 1.2.1
                    
NuGet\Install-Package Alexpivo394.Revit.Clash.Engine -Version 1.2.1
                    
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.Engine" Version="1.2.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Alexpivo394.Revit.Clash.Engine" Version="1.2.1" />
                    
Directory.Packages.props
<PackageReference Include="Alexpivo394.Revit.Clash.Engine" />
                    
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.Engine --version 1.2.1
                    
#r "nuget: Alexpivo394.Revit.Clash.Engine, 1.2.1"
                    
#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.Engine@1.2.1
                    
#: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.Engine&version=1.2.1
                    
Install as a Cake Addin
#tool nuget:?package=Alexpivo394.Revit.Clash.Engine&version=1.2.1
                    
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 net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Alexpivo394.Revit.Clash.Engine:

Package Downloads
Alexpivo394.Revit.Clash.Render

Clash image renderer: CPU rasterization of a collision inside a section box to PNG, without the Revit API.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.1 73 11/5/2026
1.2.0 62 11/5/2026
1.1.0 78 11/4/2026
1.0.0 100 11/2/2026