Skip to content
CAI
Software that uses CAICheck a score

rudderdon/case-apps

47.0

Weak · 6 October 2026

200.5k

lines of production code

VB.NET

with C#

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a suite of Revit add-ins designed to streamline MEP (Mechanical, Electrical, and Plumbing) workflows and general BIM management. It primarily provides tools for automatically classifying and orienting MEP elements to aid in clash detection, alongside utilities for managing ribbon interfaces, family types, and reporting. The codebase supports multiple Revit versions, including 2017 and 2018, and includes basic telemetry for usage tracking.

Features

Add Revit 2017 plugin support

The Case Apps Ribbon plugin now supports Revit 2017. This update adds the necessary .addin manifest, entry point, and utility modules to register the ribbon interface and commands for the 2017 version of the software.

Case.AppsRibbon.2017 · high confidence

Add Revit 2018 ribbon integration for CASE Apps

This change introduces the Revit 2018-specific add-in package for the CASE AppsRibbon extension. It registers the plugin via a new .addin manifest and implements the IExternalApplication entry point to dynamically build the "CASE Apps" ribbon tabs (including "CASE Apps \#1" and "CASE Apps \#2") with stacked and individual pushbuttons. The add-in includes a command to open the project's GitHub repository and provides utility functions for logging to a roaming ApplicationData folder, ensuring the ribbon UI is correctly loaded and managed within the Revit 2018 environment.

Case.AppsRibbon.2018 · high confidence

Initial release of the Revit 2017 MEP Systems Orientation add-in

This change introduces the complete source code and configuration for the 'Case.ApplySysOrient' Revit add-in, specifically built for Revit 2017. The add-in provides commands to automatically classify and orient MEP elements (ducts, pipes, conduits, and trays) by writing 'HORIZONTAL', 'VERTICAL', or 'SLOPED' values to a 'CurveOrientation' parameter, which aids in clash detection filtering. It includes a main orientation dialog for bulk processing and a secondary 'Branches' command for classifying trunk vs. branch elements based on size thresholds. The package also contains an API module that records usage statistics to an external server.

2017 · high confidence

New Revit 2018 add-in for classifying and orienting MEP elements

A new Revit 2018 add-in named 'Free MEP Systems Element Orientations' is introduced, providing two commands: 'Orient' and 'Branches'. The Orient command allows users to select ducts, pipes, conduits, and trays to automatically classify their orientation as HORIZONTAL, VERTICAL, or SLOPED based on geometric properties, writing the result to a 'CurveOrientation' parameter for clash detection filtering. The Branches command enables users to define maximum width, height, and size thresholds to classify duct and pipe elements as trunk or branch components. The add-in also includes usage tracking that reports anonymized system data to an external server.

2018 · high confidence

Behavioural changes

Add-in solutions updated for Revit 2017 and 2018 with simplified licensing

The repository now includes dedicated Visual Studio solution files for Revit 2017 (Case.Apps.2017.sln) and Revit 2018 (Case.Apps.2018.sln), organizing the existing add-in projects into year-specific folders. This update allows users to build and install the CASE Apps suite for these newer Revit versions. Additionally, the project license has been simplified from the GNU General Public License v3 to a shorter, custom license text, and the README has been updated to reflect the project's transition from CASE to WeWork stewardship.

(repo-wide) · high confidence

Simplified ribbon panel titles

The ribbon interface now displays shorter, cleaner panel names by removing the "Subscription" prefix from specific sections. Users will see "General Panel" instead of "General Subscription Panel", "Exceler8" instead of "Subscription Exceler8", and "Tools" instead of "Subscription Tools".

Case.AppsRibbon · high confidence

Dependencies

Add Revit 2017 project configurations for Case add-ins

Added new Visual Studio project files (\.csproj\ and \.vbproj\) for the 2017 version of the Case add-in suite, including Case.ApplySysOrient, Case.BasicReporting, Case.ChangeReplaceFamTypeNames, Case.DeleteViewsAndPurge, Case.DimensionOverrides, Case.Directionality, Case.DoorMarkRenumber, Case.Export.Families, Case.ExportSharedParameters, Case.ExtrudeRoomsToMass, Case.FamilySubcategories, and Case.FreeBenchmarking. These projects target the .NET Framework 4.5.2 (with one exception targeting 4.0) and reference the Revit 2017 APIs (\RevitAPI\ and \RevitAPIUI\), enabling the add-ins to build against and run in Revit 2017.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 47 → 47 (+0.2)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 46 → 44 (-2.4)
  • Architecture 83 → 84 (+0.7)
  • Maturity 56 → 61 (+5.2)
  • Readiness 33 → 33 (+0.0)
  • Security 100 → 100 (+0.0)

Resolved (32)

  • Duplicated block (10 lines × 2) (2015/Case.Subs.Xyz/Case.Subs.Xyz/UI/form_DataManager.xaml.vb)
  • Duplicated block (12 lines × 3) (2015/Case.Subs.Exceler8/Case.Subs.Exceler8/Data/clsExcel.vb)
  • Duplicated block (12 lines × 3) (2015/Case.Subs.Exceler8/Case.Subs.Exceler8/Data/clsExcel.vb)
  • Duplicated block (13 lines × 2) (2015/Case.RoomSync/Case.RoomSync/Data/clsSettings.vb)
  • Duplicated block (13 lines × 4) (2015/Case.HiddenParameterToParameter/Case.HiddenParameterToParameter/Data/clsSettings.vb)
  • Duplicated block (13 lines × 5) (2015/Case.ModeledRoomTags/Case.ModeledRoomTags/Data/clsSettings.vb)
  • Duplicated block (21–22 lines × 2) (2015/Case.ObjectStyles/Case.ObjectStyles/UI/form_Main.cs)
  • Duplicated block (21–22 lines × 2) (2015/Case.Subs.OpenNURBS/Case.Subs.OpenNURBS/UI/form_ImportMain.xaml.vb)
  • Duplicated block (26–27 lines × 2) (2015/Case.Subs.Exceler8/Case.Subs.Exceler8/UI/form_Sync.vb)
  • Duplicated block (28 lines × 2) (2015/Case.DimensionOverrides/Case.DimensionOverrides/UI/form_Main.cs)
  • Duplicated block (37 lines × 2) (2015/Case.ViewCreator/Case.ViewCreator/Forms/form_Main.cs)
  • Duplicated block (39–40 lines × 2) (2015/Case.Subs.ViewSync/Case.Subs.ViewSync/Entry/D9B42C3FEA6F4F9E8E1B62E993AA2512.vb)
  • Duplicated block (83 lines × 2) (2015/Case.Subs.Exceler8/Case.Subs.Exceler8/Data/clsRvtCategoryData.vb)
  • Edited copy of a member (82 corresponding lines) (2015/Case.Subs.OpenNURBS/Case.Subs.OpenNURBS/Data/Translators/RVTBrepEdgeUtils.vb)
  • Inconsistent casing in class names across modules. 'clsApi' is used in DimensionOverrides, UngroupAll, and others, while 'ClsApi' is used in ParallelWalls. This is a style inconsistency that affects maintainability and searchability.
  • Inconsistent naming for angle-related calculations. One method uses 'Original' to denote a base state, while the other uses 'Delta' to denote a difference. While semantically distinct, the lack of a consistent prefix pattern (e.g., both using 'Get' followed by a specific noun phrase structure) makes the API feel disjointed. More critically, 'GetOriginalAngles' implies a retrieval of existing data, whereas 'GetDeltaAngle' implies a calculation. If both are calculations, 'Calculate' or 'Compute' might be better, or if both are retrievals, the naming should reflect that. However, the primary inconsistency is the mix of 'Original' (state) vs 'Delta' (difference) without a clear parallel structure for similar operations.
  • Members sharing a duplicated core (11 members, 50+ identical tokens) (2015/Case.DoorMarkRenumber/Case.DoorMarkRenumber/Data/clsSortableBindingList.vb)
  • Members sharing a duplicated core (19 members, 50+ identical tokens) (2015/Case.BasicReporting/Case.BasicReporting/API/clsUsage.vb)
  • Members sharing a duplicated core (19 members, 50+ identical tokens) (2015/Case.BasicReporting/Case.BasicReporting/API/clsUsage.vb)
  • Members sharing a duplicated core (19 members, 50+ identical tokens) (2015/Case.BasicReporting/Case.BasicReporting/API/clsUsage.vb)
  • …and 12 more

New (5069)

  • AppMain.AddAsStackedAndButtons (cyclomatic 18) (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • AppMain.AddAsStackedAndButtons (cyclomatic 18) (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • AppMain.AddAsStackedAndButtons (cyclomatic 18) (Case.AppsRibbon/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cognitive 31) (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cognitive 31) (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cognitive 31) (Case.AppsRibbon/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cyclomatic 31) (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cyclomatic 31) (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • AppMain.LoadItemsOne (cyclomatic 31) (Case.AppsRibbon/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cognitive 19) (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cognitive 19) (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cognitive 19) (Case.AppsRibbon/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cyclomatic 18) (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cyclomatic 18) (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • AppMain.LoadItemsTwo (cyclomatic 18) (Case.AppsRibbon/Entry/AppMain.vb)
  • ClassTooLong: AppMain (Case.AppsRibbon.2017/Entry/AppMain.vb)
  • ClassTooLong: AppMain (Case.AppsRibbon.2018/Entry/AppMain.vb)
  • ClassTooLong: AppMain (Case.AppsRibbon/Entry/AppMain.vb)
  • ClassTooLong: Form_Main (2015/Case.Subs.SuperTag/Case.Subs.SuperTag/UI/Form_Main.vb)
  • ClassTooLong: Form_Main (2016/Case.Subs.SuperTag/Case.Subs.SuperTag/UI/Form_Main.vb)
  • …and 5049 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

rudderdon/case-apps was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 6 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit e8c39e095c8013dbfa629f1bdc5543cf8273842c — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-1f9c535fa862.