Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
1d569b1
Создан новый плагин RevitRoundingOfAreas
May 21, 2026
5a46e04
RevitRoundingOfAreas: добавление описание проекта, удаление лишней ло…
May 21, 2026
47a9ee0
RevitRoundingOfAreas: Создание класс основного окна
May 22, 2026
ef699f2
RevitRoundingOfAreas: Заполнение класса MaimViewModel
May 25, 2026
91ee91f
RevitRoundingOfAreas: Доработка View и ViewModel, добавление классов
May 25, 2026
b745310
RevitRoundingOfAreas: Исправление отступов кнопок в окне
May 27, 2026
97a66f8
RevitRoundingOfAreas: Добавление класса добавления параметра
May 27, 2026
a18ec3e
RevitRoundingOfAreas: Добавление класса по проверке помещений
May 28, 2026
1c5381e
RevitRoundingOfAreas: Доработка MainViewModel
May 28, 2026
12d8617
RevitRoundingOfAreas: Реализация предупреждений
May 28, 2026
1554939
RevitRoundingOfAreas: Исправление окна предупреждений
May 29, 2026
55565c2
RevitRoundingOfAreas: Добавление основных методов округления, рефакто…
Jun 2, 2026
188d20b
RevitRoundingOfAreas: Исправление локализации
Jun 2, 2026
fd1801f
RevitRoundingOfAreas: Небольшой рефакторинг кода, исправление названи…
Jun 2, 2026
ab96fec
RevitRoundingOfAreas: Применение фабрики параметров, получения значен…
Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/publish.RevitRoundingOfAreas.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: publish RevitRoundingOfAreas

on:
workflow_dispatch:
pull_request:
types: [ closed, synchronize, review_requested ]
branches: [ main, master ]
paths:
- '**RevitRoundingOfAreas**.cs'
- '**RevitRoundingOfAreas**.xaml'

env:
plugin-name: "RevitRoundingOfAreas"

jobs:
build:
name: build
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

# Install the .NET workload
- name: Install .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

# Add DevExrepress package source: https://nuget.devexpress.com/
- name: Add DevExpress package source
run: dotnet nuget add source https://nuget.devexpress.com/api -n DXFeed -u DevExpress -p ${{ secrets.DEVEXPRESS_FEED_AUTHORIZATION_KEY }}

- name: Run './build.cmd '
run: ./build.cmd publish --profile ${{ env.plugin-name }} --pull-request-merged ${{ github.event.pull_request.merged }} --extensions-app-token ${{ secrets.EXTENSIONS_APP_TOKEN }} --revit-plugins-app-token ${{ secrets.REVIT_PLUGINS_APP_TOKEN }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
15 changes: 15 additions & 0 deletions .nuke/parameters.RevitRoundingOfAreas.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"$schema": "./build.schema.json",
"Solution": "RevitPlugins.slnx",
"PluginName": "RevitRoundingOfAreas",
"PublishDirectory": "02.AR.extension\\АР.tab\\bin",
"RevitVersions": [
"Rv2022",
"Rv2023",
"Rv2024"
],
"IconUrl": "https://icons8.com/icon/79538/decrease-decimal",
"BundleName": "Рассчитать площади (соц. объекты)",
"BundleType": "InvokeButton",
"BundleOutput": "02.AR.extension\\АР.tab\\Квартирография.panel\\Помещения.pulldown"
}
3 changes: 3 additions & 0 deletions RevitPlugins.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,9 @@
</Project>
<Project Path="src/RevitRoomTagPlacement/RevitRoomTagPlacement.csproj">
<Platform Project="x64" />
</Project>
<Project Path="src/RevitRoundingOfAreas/RevitRoundingOfAreas.csproj">
<Platform Project="x64" />
</Project>
<Project Path="src/RevitRsnManager/RevitRsnManager.csproj">
<Platform Project="x64" />
Expand Down
26 changes: 26 additions & 0 deletions src/RevitRoundingOfAreas/Models/CheckProjectParams.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.DB;

using dosymep.Bim4Everyone.Templates;

namespace RevitRoundingOfAreas.Models;

internal class CheckProjectParams(SystemPluginConfig systemPluginConfig, Application application, Document document) {
private readonly ProjectParameters _projectParameters = ProjectParameters.Create(application);
private readonly bool _isChecked = true;

/// <summary>
/// Метод проверки загрузки параметров
/// </summary>
public bool GetIsChecked() {
return _isChecked;
}

/// <summary>
/// Метод копирования параметров проекта
/// </summary>
public CheckProjectParams CopyProjectParams() {
_projectParameters.SetupRevitParams(document, systemPluginConfig.RoomAreaParam);
return this;
}
}
12 changes: 12 additions & 0 deletions src/RevitRoundingOfAreas/Models/ConfigSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Autodesk.Revit.DB;

using dosymep.Bim4Everyone;

namespace RevitRoundingOfAreas.Models;

internal class ConfigSettings {
public ElementId SelectedPhaseId { get; set; }
public RevitParam SourceParam { get; set; }
public RevitParam TargetParam { get; set; }
public int Accuracy { get; set; }
}
6 changes: 6 additions & 0 deletions src/RevitRoundingOfAreas/Models/Enums/ElementsProviderType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace RevitRoundingOfAreas.Models.Enums;
internal enum ElementsProviderType {
AllElementsProvider,
CurrentViewProvider,
SelectedElementsProvider
}
6 changes: 6 additions & 0 deletions src/RevitRoundingOfAreas/Models/Enums/WarningType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace RevitRoundingOfAreas.Models.Enums;
internal enum WarningType {
NotEnclosed,
Redundant,
BrokenContour
}
19 changes: 19 additions & 0 deletions src/RevitRoundingOfAreas/Models/Factories/ProvidersFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using RevitRoundingOfAreas.Models.Enums;
using RevitRoundingOfAreas.Models.Interfaces;
using RevitRoundingOfAreas.Models.Providers;

namespace RevitRoundingOfAreas.Models.Factories;

internal class ProvidersFactory(RevitRepository revitRepository) {
/// <summary>
/// Метод получения провайдера элементов по Enum
/// </summary>
public IElementsProvider GetElementsProvider(ElementsProviderType type) {
return type switch {
ElementsProviderType.AllElementsProvider => new ElementsProviderAll(revitRepository),
ElementsProviderType.CurrentViewProvider => new ElementsProviderCurrentView(revitRepository),
ElementsProviderType.SelectedElementsProvider => new ElementsProviderSelected(revitRepository),
_ => new ElementsProviderAll(revitRepository)
};
}
}
18 changes: 18 additions & 0 deletions src/RevitRoundingOfAreas/Models/Interfaces/IElementsProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Generic;

using Autodesk.Revit.DB;

using RevitRoundingOfAreas.Models.Enums;

namespace RevitRoundingOfAreas.Models.Interfaces;

internal interface IElementsProvider {
/// <summary>
/// Тип провайдера элементов
/// </summary>
ElementsProviderType Type { get; }
/// <summary>
/// Метод получения элементов модели по стадиям
/// </summary>
List<SpatialModel> GetSpatialElements(ElementId phaseId);
}
29 changes: 29 additions & 0 deletions src/RevitRoundingOfAreas/Models/Interfaces/IWindowService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Collections.Generic;

using RevitRoundingOfAreas.Models.Warnings;

namespace RevitRoundingOfAreas.Models.Interfaces;

internal interface IWindowService {
/// <summary>
/// Метод закрытия основного окна
/// </summary>
/// <remarks>
/// В данном методе производится закрытие основного окна при появлении предупреждений
/// </remarks>
/// <returns>
/// Void.
/// </returns>
void CloseMainWindow();
/// <summary>
/// Метод открытия окна.
/// </summary>
/// <remarks>
/// В данном методе производится открытие кона предупреждений для отображения WarningElement.
/// </remarks>
/// <param name="warningElements">Коллекция предупреждений WarningElement.</param>
/// <returns>
/// Void.
/// </returns>
void ShowWarningWindow(IReadOnlyCollection<WarningElement> warningElements);
}
83 changes: 83 additions & 0 deletions src/RevitRoundingOfAreas/Models/ParamService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System.Collections.Generic;
using System.Linq;

using Autodesk.Revit.DB;

using dosymep.Bim4Everyone;
using dosymep.Bim4Everyone.SharedParams;
using dosymep.Bim4Everyone.SimpleServices;
using dosymep.Bim4Everyone.SystemParams;

namespace RevitRoundingOfAreas.Models;

internal class ParamService {
private readonly RevitRepository _revitRepository;
private readonly SystemPluginConfig _systemPluginConfig;
private readonly IRevitParamFactory _revitParamFactory;
private readonly ICollection<ElementId> _allParamElementIds;

public ParamService(
RevitRepository revitRepository,
SystemPluginConfig systemPluginConfig,
IRevitParamFactory revitParamFactory) {

_revitRepository = revitRepository;
_systemPluginConfig = systemPluginConfig;
_revitParamFactory = revitParamFactory;

_allParamElementIds = GetAllParamElementIds();

AllRevitParams = GetAllRevitParams().AsReadOnly();

DefaultSourceParam = GetDefaultSourceParam();
DefaultTargetParam = GetDefaultTargetParam();
}

public IReadOnlyList<RevitParam> AllRevitParams { get; }
public RevitParam DefaultSourceParam { get; }
public RevitParam DefaultTargetParam { get; }

private ICollection<ElementId> GetAllParamElementIds() {
var categoryId = new ElementId(BuiltInCategory.OST_Rooms);

return ParameterFilterUtilities
.GetFilterableParametersInCommon(_revitRepository.Document, [categoryId]);
}

private RevitParam GetDefaultSourceParam() {
return AllRevitParams
.OfType<SystemParam>()
.FirstOrDefault(x => x.SystemParamId == _systemPluginConfig.SystemRoomAreaParamId);
}

private RevitParam GetDefaultTargetParam() {
return AllRevitParams
.OfType<SharedParam>()
.FirstOrDefault(x => x.Name.Equals(_systemPluginConfig.RoomAreaParam.Name));
}

private List<RevitParam> GetAllRevitParams() {
if(_allParamElementIds.Count == 0) {
return [];
}

List<RevitParam> parameters = [];

foreach(var elementId in _allParamElementIds) {
var revitParam = _revitParamFactory.Create(_revitRepository.Document, elementId);

if(revitParam is null) {
continue;
}

if(IsSupportedStorageType(revitParam)) {
parameters.Add(revitParam);
}
}
return parameters;
}

private static bool IsSupportedStorageType(RevitParam revitParam) {
return revitParam.StorageType == StorageType.Double;
}
}
8 changes: 8 additions & 0 deletions src/RevitRoundingOfAreas/Models/PhaseModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Autodesk.Revit.DB;

namespace RevitRoundingOfAreas.Models;

internal class PhaseModel {
public ElementId ElementId { get; set; }
public string Name { get; set; }
}
68 changes: 68 additions & 0 deletions src/RevitRoundingOfAreas/Models/PluginConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System;

using Autodesk.Revit.DB;

using dosymep.Bim4Everyone;
using dosymep.Bim4Everyone.ProjectConfigs;
using dosymep.Bim4Everyone.SharedParams;

using pyRevitLabs.Json;

namespace RevitRoundingOfAreas.Models;

internal class PluginConfig : ProjectConfig<RevitSettings> {

[JsonIgnore]
public override string ProjectConfigPath { get; set; }

[JsonIgnore]
public override IConfigSerializer Serializer { get; set; }

/// <summary>
/// Метод создания конфигурации плагина.
/// </summary>
/// <returns>
/// <param name="configSerializer">Сериализатор конфигурации.</param>
/// Возвращает прочитанную конфигурацию плагина, либо созданный конфиг по умолчанию.
/// </returns>
public static PluginConfig GetPluginConfig(IConfigSerializer configSerializer) {
return new ProjectConfigBuilder()
.SetSerializer(configSerializer)
.SetPluginName(nameof(RevitRoundingOfAreas))
.SetRevitVersion(ModuleEnvironment.RevitVersion)
.SetProjectConfigName(nameof(PluginConfig) + ".json")
.Build<PluginConfig>();
}
}

internal class RevitSettings : ProjectSettings {
/// <summary>
/// Наименование проекта.
/// </summary>
public override string ProjectName { get; set; }

/// <summary>
/// Выбранная стадия проекта
/// </summary>
public ConfigSettings ConfigSettings { get; set; }
}

internal class SystemPluginConfig {
// Название стадии по умолчанию
public string DefaultPhaseName => "Основная планировка";

// Количество вариантов знаков по умолчанию
public int DefaultAccuracyRange => 3;

// Количество знаков по умолчанию
public int DefaultAccuracy => 1;

// Сторона округления
public MidpointRounding MidpointRounding => MidpointRounding.AwayFromZero;

// Системный параметр площади помещений по умолчанию
public BuiltInParameter SystemRoomAreaParamId => BuiltInParameter.ROOM_AREA;

// Общий параметр площади помещений по умолчанию
public RevitParam RoomAreaParam => SharedParamsConfig.Instance.RoomArea;
}
16 changes: 16 additions & 0 deletions src/RevitRoundingOfAreas/Models/Providers/ElementsProviderAll.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;

using Autodesk.Revit.DB;

using RevitRoundingOfAreas.Models.Enums;
using RevitRoundingOfAreas.Models.Interfaces;

namespace RevitRoundingOfAreas.Models.Providers;

internal class ElementsProviderAll(RevitRepository revitRepository) : IElementsProvider {
public ElementsProviderType Type => ElementsProviderType.AllElementsProvider;

public List<SpatialModel> GetSpatialElements(ElementId phaseId) {
return revitRepository.GetAllSpatialModels(phaseId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;

using Autodesk.Revit.DB;

using RevitRoundingOfAreas.Models.Enums;
using RevitRoundingOfAreas.Models.Interfaces;

namespace RevitRoundingOfAreas.Models.Providers;

internal class ElementsProviderCurrentView(RevitRepository revitRepository) : IElementsProvider {
public ElementsProviderType Type => ElementsProviderType.CurrentViewProvider;

public List<SpatialModel> GetSpatialElements(ElementId phaseId) {
return revitRepository.GetActiveViewSpatialModels(phaseId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;

using Autodesk.Revit.DB;

using RevitRoundingOfAreas.Models.Enums;
using RevitRoundingOfAreas.Models.Interfaces;

namespace RevitRoundingOfAreas.Models.Providers;

internal class ElementsProviderSelected(RevitRepository revitRepository) : IElementsProvider {
public ElementsProviderType Type => ElementsProviderType.SelectedElementsProvider;

public List<SpatialModel> GetSpatialElements(ElementId phaseId) {
return revitRepository.GetSelectedSpatialModels(phaseId);
}
}
Loading
Loading