Separate Release targets for Revit 2023–2027. Each links against that version's Revit API. Conditional flags REVIT2025/2026/2027 gate API features.
Compatibility shims (IsExternalInit, PathCompat, ZipFileCompat) support .NET Framework 4.8 targets for 2023–2024.
UI Specifications
Editor layout & dimensions.
Key structural, behavioral, and visual specifications for the editor window.
Window Architecture
TypeWPF Window (modal)
Threading modelRevit API thread (ShowDialog)
PatternMVVM + INotifyPropertyChanged
Slide transitionsConfigurable (enabled by default)
Layout Panels
Palette list (left)~200px sidebar
Tab list (center-left)Scrollable ListBox
Button list (center)Drag-reorderable ListBox
Properties panel (right)Contextual form
Status barBottom — always visible
Fetch Tab Settings (Fields)
Category slots6 slots (OR logic)
Filter rows4 rows (AND logic)
Script slots2 script paths
Template pathsPer-version (2023–2027)
Save & Persistence
Palette JSONWritten on Save button
Meta JSONTab order, format, settings
Config JSONPalette registry, UI settings
Indented outputWriteIndented = true
Developer Reference
How the editor is built.
Key architecture patterns, services, and extension points for developers working with the editor codebase.
🏗️ MVVM Architecture
PaletteEditorViewModel is the single root ViewModel. It exposes ObservableCollections for palettes, tabs, and button rows. Code-behind is limited to UI-only concerns (drag, focus, animation).
public ObservableCollection<EditorTabRow> Tabs { get; }
public ObservableCollection<EditorPaletteRow> ButtonRows { get; }
public bool IsDirty => SelectedButtonRow?.IsDirty ?? false;
💾 PaletteEditorDataService
All JSON read/write is centralized here. Loads config.json, per-palette JSON files, and _meta.json sidecars. Save operations are atomic — full file written with WriteIndented = true.
Both EditorPaletteRow and EditorTabRow follow the same dirty-tracking pattern. CaptureLoadedState() snapshots all field values. IsDirty compares to the snapshot. ResetToLoadedState() reverts.
row.CaptureLoadedState(); // snapshot after loadbool changed = row.IsDirty; // any field changed?
row.ResetToLoadedState(); // revert to snapshot
🩺 PaletteValidationService
Accepts EditorPaletteRow objects, produces a PaletteHealthReport. Checks icon paths, source paths, action IDs, required parameters, and meta-JSON consistency. Results scoped by tab.
var report = newPaletteValidationService()
.Validate(paletteRows, metaJson);
foreach (var issue in report.Issues)
Console.WriteLine($"[{issue.Severity}] {issue.Message}");
Installer download notice
Your browser or security software may warn about or block this installer because it is an uncommon or unfamiliar file. Depending on your settings, the download may require confirmation.
Windows or your security tools may also show a warning when you run the installer. Continue only if you downloaded it from BIMGrove and intended to install this BIMGrove Revit add-in.
✓
Support request sent.
Your support request was submitted successfully. BIMGrove support will follow up using the email you provided.