{"id":31769487,"url":"https://github.com/dtducas/revitbase","last_synced_at":"2025-10-10T02:48:37.126Z","repository":{"id":314886536,"uuid":"1056013212","full_name":"DTDucas/RevitBase","owner":"DTDucas","description":"Revit API Base dev","archived":false,"fork":false,"pushed_at":"2025-09-13T09:20:15.000Z","size":32,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-15T12:45:02.279Z","etag":null,"topics":["package","revit","revit-addins","revit-api","revitapi"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DTDucas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-13T08:02:35.000Z","updated_at":"2025-09-14T04:09:41.000Z","dependencies_parsed_at":"2025-09-15T12:45:04.513Z","dependency_job_id":"b589144a-cafa-4e97-bf93-de381102afc3","html_url":"https://github.com/DTDucas/RevitBase","commit_stats":null,"previous_names":["dtducas/revitbase"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/DTDucas/RevitBase","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DTDucas%2FRevitBase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DTDucas%2FRevitBase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DTDucas%2FRevitBase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DTDucas%2FRevitBase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DTDucas","download_url":"https://codeload.github.com/DTDucas/RevitBase/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DTDucas%2FRevitBase/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002549,"owners_count":26083403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["package","revit","revit-addins","revit-api","revitapi"],"created_at":"2025-10-10T02:48:34.347Z","updated_at":"2025-10-10T02:48:37.117Z","avatar_url":"https://github.com/DTDucas.png","language":"C#","readme":"# DTDucas.RevitBase\n\n[![NuGet](https://img.shields.io/nuget/v/DTDucas.RevitBase.svg)](https://www.nuget.org/packages/DTDucas.RevitBase)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Revit Versions](https://img.shields.io/badge/Revit-2021--2026-blue.svg)](https://www.autodesk.com/products/revit)\n\nBase framework for Revit API development with comprehensive command handling, exception suppression, and external event management.\n\n## 🚀 Features\n\n- **Multi-Version Support**: Compatible with Revit 2021-2026\n- **Base External Command**: Comprehensive abstract base class for external commands\n- **Exception \u0026 Dialog Suppression**: Built-in support for handling Revit failures and dialogs\n- **External Event Framework**: Thread-safe execution of Revit API operations\n- **Command Model**: Data structure for command tracking and auditing\n- **License Utilities**: Command execution validation and tracking functionality\n- **Comprehensive Error Handling**: Standardized error management and reporting\n- **RevitAppContext**: Centralized context for accessing Revit application objects\n\n## 📦 Installation\n\nInstall the package for your target Revit version:\n\n### Package Manager Console\n```powershell\n# For Revit 2025\nInstall-Package DTDucas.RevitBase -Version 2025.1.0.0\n\n# For Revit 2024\nInstall-Package DTDucas.RevitBase -Version 2024.1.0.0\n```\n\n### .NET CLI\n```bash\n# For Revit 2025\ndotnet add package DTDucas.RevitBase --version 2025.1.0.0\n\n# For Revit 2024\ndotnet add package DTDucas.RevitBase --version 2024.1.0.0\n```\n\n### PackageReference (csproj)\n```xml\n\u003c!-- For Revit 2025 --\u003e\n\u003cPackageReference Include=\"DTDucas.RevitBase\" Version=\"2025.1.0.0\" /\u003e\n\n\u003c!-- For Revit 2024 --\u003e\n\u003cPackageReference Include=\"DTDucas.RevitBase\" Version=\"2024.1.0.0\" /\u003e\n\n\u003c!-- For Revit 2023 --\u003e\n\u003cPackageReference Include=\"DTDucas.RevitBase\" Version=\"2023.1.0.0\" /\u003e\n\n\u003c!-- For Revit 2022 --\u003e\n\u003cPackageReference Include=\"DTDucas.RevitBase\" Version=\"2022.1.0.0\" /\u003e\n\n\u003c!-- For Revit 2021 --\u003e\n\u003cPackageReference Include=\"DTDucas.RevitBase\" Version=\"2021.1.0.0\" /\u003e\n```\n\n## 🏗️ Architecture\n\n### Core Components\n\n1. **BaseExternalCommand**: Abstract base class for external commands\n2. **RevitAppContext**: Centralized application context management\n3. **ExternalEventHandlerAction**: Singleton external event handler\n4. **ExternalEventHandlers**: Multi-action external event handler\n5. **CommandModel**: Data model for command tracking\n6. **LicenseUtils**: License validation and command tracking\n\n## 🔧 Usage Examples\n\n### Creating a Custom External Command\n\n```csharp\nusing Autodesk.Revit.Attributes;\nusing Autodesk.Revit.DB;\nusing Autodesk.Revit.UI;\nusing RevitBase.Commands;\n\n[Transaction(TransactionMode.Manual)]\n[Regeneration(RegenerationOption.Manual)]\npublic class MyCustomCommand : BaseExternalCommand\n{\n    public override Result Execute()\n    {\n        try\n        {\n            // Initialize RevitAppContext\n            RevitAppContext.Initialize(ExternalCommandData);\n\n            // Your command logic here\n            var doc = RevitAppContext.Document;\n            var selection = RevitAppContext.Selection;\n\n            // Example: Get selected elements\n            var selectedIds = selection.GetElementIds();\n\n            using (var transaction = new Transaction(doc, \"My Custom Command\"))\n            {\n                transaction.Start();\n\n                // Your modifications here\n\n                transaction.Commit();\n            }\n\n            return Result.Succeeded;\n        }\n        catch (Exception ex)\n        {\n            ErrorMessage = ex.Message;\n            return Result.Failed;\n        }\n    }\n}\n```\n\n### Using Exception and Dialog Suppression\n\n```csharp\npublic class SuppressedCommand : BaseExternalCommand\n{\n    public override Result Execute()\n    {\n        // Suppress all exceptions\n        SuppressExceptions();\n\n        // Suppress failures (warnings/errors)\n        SuppressFailures();\n\n        try\n        {\n            // Your risky operations here\n            // Exceptions and failures will be automatically handled\n\n            return Result.Succeeded;\n        }\n        finally\n        {\n            // Cleanup is automatic in the base class\n        }\n    }\n}\n```\n\n### Using External Events\n\n```csharp\npublic class ExternalEventExample\n{\n    public void TriggerExternalEvent()\n    {\n        // Set the action to execute\n        RevitAppContext.HandlerAction.SetAction(() =\u003e\n        {\n            var doc = RevitAppContext.Document;\n            using (var transaction = new Transaction(doc, \"External Event Action\"))\n            {\n                transaction.Start();\n                // Your modifications here\n                transaction.Commit();\n            }\n        });\n\n        // Raise the external event\n        RevitAppContext.ExternalEvent.Raise();\n    }\n}\n```\n\n### Custom Exception Handling\n\n```csharp\npublic class CustomHandlingCommand : BaseExternalCommand\n{\n    public override Result Execute()\n    {\n        // Custom exception handler\n        SuppressExceptions(ex =\u003e\n        {\n            // Log the exception\n            Console.WriteLine($\"Error occurred: {ex.Message}\");\n\n            // Show custom dialog\n            TaskDialog.Show(\"Error\", $\"Command failed: {ex.Message}\");\n        });\n\n        // Your command logic here\n\n        return Result.Succeeded;\n    }\n}\n```\n\n### Command Tracking and Auditing\n\n```csharp\npublic class TrackedCommand : BaseExternalCommand\n{\n    public override Result Execute()\n    {\n        try\n        {\n            // Command execution logic\n\n            // The base class automatically tracks command execution\n            // using LicenseUtils.CreateCommand() extension method\n\n            return Result.Succeeded;\n        }\n        catch (Exception ex)\n        {\n            ErrorMessage = ex.Message;\n            return Result.Failed;\n        }\n    }\n}\n```\n\n## 🛡️ Error Handling\n\nThe framework provides comprehensive error handling:\n\n### Automatic Exception Suppression\n```csharp\n// Suppress all exceptions\nSuppressExceptions();\n\n// Suppress with custom handler\nSuppressExceptions(ex =\u003e\n{\n    // Custom error handling logic\n});\n```\n\n### Failure Management\n```csharp\n// Automatically resolve Revit failures/warnings\nSuppressFailures();\n\n// Failures are automatically restored in cleanup\n```\n\n### Status Tracking\n```csharp\npublic override Result Execute()\n{\n    // Status is automatically set based on Result\n    // Status.Success for Result.Succeeded\n    // Status.Error for Result.Failed\n\n    return Result.Succeeded;\n}\n```\n\n## 🔍 Context Management\n\n### RevitAppContext Usage\n```csharp\n// Initialize context (done automatically in BaseExternalCommand)\nRevitAppContext.Initialize(commandData);\n\n// Access Revit objects\nvar doc = RevitAppContext.Document;\nvar uiDoc = RevitAppContext.UiDoc;\nvar app = RevitAppContext.Application;\nvar uiApp = RevitAppContext.UiApplication;\nvar selection = RevitAppContext.Selection;\nvar activeView = RevitAppContext.ActiveView;\n\n// Access user information\nvar username = RevitAppContext.Username;\nvar version = RevitAppContext.Version;\n\n// Error logging\nRevitAppContext.ErrorLog = \"Custom error message\";\n```\n\n## 📚 API Reference\n\n### BaseExternalCommand Methods\n\n| Method | Description |\n|--------|-------------|\n| `Execute()` | Abstract method to implement command logic |\n| `SuppressExceptions()` | Suppress all exceptions |\n| `SuppressExceptions(Action\u003cException\u003e)` | Suppress with custom handler |\n| `SuppressFailures()` | Suppress Revit failures/warnings |\n| `RestoreDialogs()` | Restore dialog handling |\n| `RestoreFailures()` | Restore failure processing |\n\n### RevitAppContext Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `UiDoc` | `UIDocument?` | Current UI document |\n| `Document` | `Document?` | Current document |\n| `Application` | `Application?` | Revit application |\n| `UiApplication` | `UIApplication?` | UI application |\n| `Selection` | `Selection?` | Current selection |\n| `ActiveView` | `View?` | Active view |\n| `Username` | `string?` | Current user |\n| `ErrorLog` | `string` | Error log information |\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🔗 Links\n\n- [NuGet Package](https://www.nuget.org/packages/DTDucas.RevitBase)\n- [GitHub Repository](https://github.com/DTDucas/RevitBase)\n- [Issues](https://github.com/DTDucas/RevitBase/issues)\n\n## 🏷️ Version Compatibility\n\n| Revit Version | Package Version | .NET Framework |\n|---------------|-----------------|----------------|\n| 2021 | 2021.x.x.x | .NET Framework 4.8 |\n| 2022 | 2022.x.x.x | .NET Framework 4.8 |\n| 2023 | 2023.x.x.x | .NET Framework 4.8 |\n| 2024 | 2024.x.x.x | .NET Framework 4.8 |\n| 2025 | 2025.x.x.x | .NET 8.0 |\n| 2026 | 2026.x.x.x | .NET 8.0 |\n\n## ✨ Author\n\n**Duong Tran Quang - DTDucas**\n- GitHub: [@DTDucas](https://github.com/DTDucas)\n- Email: baymax.contact@gmail.com","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtducas%2Frevitbase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdtducas%2Frevitbase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtducas%2Frevitbase/lists"}