{"id":2688,"date":"2024-08-14T08:08:11","date_gmt":"2024-08-14T08:08:11","guid":{"rendered":"https:\/\/infralligence.com\/?p=2688"},"modified":"2024-12-31T09:32:02","modified_gmt":"2024-12-31T09:32:02","slug":"revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes","status":"publish","type":"post","link":"https:\/\/infralligence.com\/pl\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/","title":{"rendered":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"2688\" class=\"elementor elementor-2688\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a636728 e-con-full kk-blog-post e-flex rael-particle-no e-con e-parent\" data-id=\"a636728\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-21e1291 elementor-widget elementor-widget-text-editor\" data-id=\"21e1291\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tYou can add <strong>your own panels, tabs, buttons, and other controls<\/strong> to the Revit menu when creating a Revit plugin. You can <strong>customize<\/strong> the controls with images, tooltips, or extended contextual help. However, especially in the new Revit 2025 .NET API, there are some caveats.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acc30ef elementor-widget elementor-widget-image\" data-id=\"acc30ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"2653\" height=\"1493\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\" class=\"attachment-full size-full wp-image-2698\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png 2653w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-300x169.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1024x576.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-768x432.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1536x864.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2048x1153.png 2048w\" sizes=\"(max-width: 2653px) 100vw, 2653px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a686351 elementor-widget elementor-widget-text-editor\" data-id=\"a686351\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\ud83d\udccc <strong>TLDR \u2013 Summary Upfront<\/strong>:<br \/>Modify the Revit menu (e.g., add <strong>your own ribbon tabs and panels<\/strong>) using the OnStartup method of your Application class.<\/p><p>\u27a1\ufe0f To create a <strong>Button<\/strong>, define the PushButtonData with name, text, and linked command.<br \/>\u27a1\ufe0f To create a <strong>TextBox<\/strong>, define the TextBoxData with name.<br \/>\u27a1\ufe0f To create a <strong>ComboBox<\/strong>, define the ComboBoxData with name and populate it with ComboBoxMembers.<\/p><p>You can <strong>customize<\/strong> controls with, e.g., tooltips, contextual help, and images (tricky for Revit 2025 API).<br \/>To retrieve inserted values, use <strong>events<\/strong>: EnterPressed for TextBoxes and CurrentChanged for ComboBoxes.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ecaaabc elementor-widget elementor-widget-rael-table-of-contents\" data-id=\"ecaaabc\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;rael_headings_by_tags&quot;:[&quot;h3&quot;,&quot;h4&quot;],&quot;rael_exclude_headings_by_selector&quot;:[],&quot;rael_min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;rael_marker_view&quot;:&quot;numbers&quot;,&quot;rael_hierarchical_view&quot;:&quot;yes&quot;,&quot;rael_min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;rael_min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"rael-table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<div class=\"rael-toc__header\">\n\t\t\t\t<h5 class=\"rael-toc__header-title\">\ud83d\udd0dContent: <\/h5>\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"rael-toc__body\">\n\t\t\t<div class=\"rael-toc__spinner-container\">\n\t\t\t\t<i class=\"rael-toc__spinner eicon-loading eicon-animation-spin\" aria-hidden=\"true\"><\/i>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-197d23e elementor-widget elementor-widget-text-editor\" data-id=\"197d23e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>Where to start \u2013 IExternalApplication.OnStartup<\/h3>\nTo modify the Revit menu, you need the <strong>Application<\/strong> plugin type. Implement the <strong>IExternalApplication<\/strong> interface and use the <strong>OnStartup<\/strong> method to insert your menu-modifying code, such as creating ribbon tabs and panels.\n<h6>To get along with the whole plugin creation process, check the <a href=\"https:\/\/infralligence.com\/pl\/resources\/#start-revit-programming-guide\">Start Revit API 2025 C# Programming Guide<\/a>.<\/h6>\nExample: Creating a ribbon tab called \u201cRevit Mastery\u201d and a panel.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e42a6c2 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"e42a6c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>using System.IO;\r\nusing System.Reflection;\r\nusing System.Windows.Media.Imaging;\r\nusing Autodesk.Revit.Attributes;\r\nusing Autodesk.Revit.DB;\r\nusing Autodesk.Revit.UI;\r\n\r\nnamespace RevitMastery.Revit\r\n{\r\n    [Transaction(TransactionMode.Manual)]\r\n    [Regeneration(RegenerationOption.Manual)]\r\n    public class RevitMasteryApplication : IExternalApplication\r\n    {\r\n        public Result OnStartup(UIControlledApplication application)\r\n        {\r\n            var ribbonTabName = &quot;Revit Mastery&quot;;\r\n            application.CreateRibbonTab(ribbonTabName);\r\n            var panel = application.CreateRibbonPanel(ribbonTabName, &quot;Revit Mastery Panel&quot;);\r\n\r\n            return Result.Succeeded;\r\n        }\r\n\r\n        public Result OnShutdown(UIControlledApplication application)\r\n        {\r\n            return Result.Succeeded;\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0bd6232 elementor-widget elementor-widget-image\" data-id=\"0bd6232\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"2227\" height=\"261\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1.png\" class=\"attachment-full size-full wp-image-2695\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1.png 2227w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1-300x35.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1-1024x120.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1-768x90.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1-1536x180.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-1-2048x240.png 2048w\" sizes=\"(max-width: 2227px) 100vw, 2227px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dcc6c71 elementor-widget elementor-widget-text-editor\" data-id=\"dcc6c71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tNow, you can add controls to the panel.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b5c492e elementor-widget elementor-widget-text-editor\" data-id=\"b5c492e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>Buttons: creating and customizing<\/h3><p>Buttons are the most popular and most useful control.<\/p><p>Start by defining a <strong>PushButtonData<\/strong> providing 4 attributes:<\/p><ul><li>name: the button\u2019s ID. It is not visible in the Revit menu and must be unique. I provide the same as the className.<\/li><li>text: the button name displayed in the Revit menu.<\/li><li>assemblyName: the location of the currently executing assembly (the same for each control, so you can simply copy it as boilerplate code).<\/li><li>className: command to execute when the button is clicked.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c6c44e1 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"c6c44e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>[Transaction(TransactionMode.Manual)]\n[Regeneration(RegenerationOption.Manual)]\npublic class ShowElementsDataCommand : IExternalCommand\n{\n\tpublic Result Execute(ExternalCommandData commandData, ref string message,\n\tElementSet elements)\n\t{\t\t\t\t\n\t\tTaskDialog.Show(&quot;Show elements data&quot;, &quot;The button has been clicked.&quot;);\n\t\treturn Result.Succeeded;\n\t}\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e737939 elementor-widget elementor-widget-text-editor\" data-id=\"e737939\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>After defining the PushButtonData, <strong>add it to a panel to create the actual PushButton<\/strong>.<\/p><p>Then, you can add a ToolTip and ContextualHelp (with, e.g., a website link).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e0ea5d elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"0e0ea5d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>var assemblyPath = Assembly.GetExecutingAssembly().Location; \/\/localization of the currently executing assembly. Don&#039;t worry, copy ;)\nvar assemblyDirectory = Path.GetDirectoryName(assemblyPath);\n\n\/\/ Button\nvar buttonData = new PushButtonData(\n  typeof(ShowElementsDataCommand).FullName,\n\t&quot;Show elements data&quot;, \n\tassemblyPath,\n\ttypeof(ShowElementsDataCommand).FullName);\n\t\t\t\nvar button = panel.AddItem(buttonData) as PushButton;\nbutton.ToolTip = &quot;Click to show data of elements of inserted number and selected type.&quot;;\n\nvar buttonContextualHelp = new ContextualHelp(ContextualHelpType.Url, &quot;https:\/\/revitmastery.com\/revit-plugin-types\/&quot;);\nbutton.SetContextualHelp(buttonContextualHelp);\t<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2ee7ebe elementor-widget elementor-widget-image\" data-id=\"2ee7ebe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"2229\" height=\"367\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5.png\" class=\"attachment-full size-full wp-image-2692\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5.png 2229w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5-300x49.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5-1024x169.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5-768x126.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5-1536x253.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-5-2048x337.png 2048w\" sizes=\"(max-width: 2229px) 100vw, 2229px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-191f227 elementor-widget elementor-widget-text-editor\" data-id=\"191f227\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tYou can also add a button image, but it requires some preparation.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-34eca1d elementor-widget elementor-widget-text-editor\" data-id=\"34eca1d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>Images (tricky in Revit 2025)<\/h3> To add a png\/jpg image to controls (Buttons, TextBoxes, ComboBoxes) in Revit 2025, you need the <strong>BitmapImage<\/strong> class from the `System.Windows.Media.Imaging` namespace. However, this namespace is not available by default in the .NET Class Library project and <strong>must be enabled in the project\u2019s <em>.csproj<\/em> file<\/strong>:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-43716d3 elementor-widget elementor-widget-text-editor\" data-id=\"43716d3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u27a1\ufe0f Open [YourProjectName].csproj file (Double-click your project name in the Visual Studio Solution Explorer).<\/p><p>\u27a1\ufe0f Change <em>&lt;TargetFramework&gt;net8.0&lt;\/TargetFramework&gt;<\/em>\u00a0to\u00a0<em>&lt;TargetFramework&gt;net8.0-windows&lt;\/TargetFramework&gt;<\/em>.<\/p><p>\u27a1\ufe0f Add <em>&lt;UseWPF&gt;true&lt;\/UseWPF&gt;<\/em>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f147943 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"f147943\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-xml'>&lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&gt;\n\n\t&lt;PropertyGroup&gt;\n\t\t&lt;TargetFramework&gt;net8.0-windows&lt;\/TargetFramework&gt;\n\t\t&lt;UseWPF&gt;true&lt;\/UseWPF&gt;\n\t\t&lt;ImplicitUsings&gt;enable&lt;\/ImplicitUsings&gt;\n\t\t&lt;Nullable&gt;enable&lt;\/Nullable&gt;\n\n\t&lt;\/PropertyGroup&gt;\n\n\t&lt;ItemGroup&gt;\n\t\t&lt;Reference Include=&quot;RevitAPI&quot;&gt;\n\t\t\t&lt;HintPath&gt;..\\ExternalLibraries\\RevitAPI.dll&lt;\/HintPath&gt;\n\t\t\t&lt;Private&gt;True&lt;\/Private&gt;\n\t\t&lt;\/Reference&gt;\n\t\t&lt;Reference Include=&quot;RevitAPIUI&quot;&gt;\n\t\t\t&lt;HintPath&gt;..\\ExternalLibraries\\RevitAPIUI.dll&lt;\/HintPath&gt;\n\t\t\t&lt;Private&gt;True&lt;\/Private&gt;\n\t\t&lt;\/Reference&gt;\n\t&lt;\/ItemGroup&gt;\n\n&lt;\/Project&gt;<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b0bec75 elementor-widget elementor-widget-text-editor\" data-id=\"b0bec75\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Now, you can use the BitmapImage class to add an image. For a button\u2019s <strong>LargeImage<\/strong>, the image size should be <strong>32\u00d732 px<\/strong>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef34a26 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"ef34a26\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>using System.Windows.Media.Imaging;\n\n\/\/ [...] previous code\n\npublic Result OnStartup(UIControlledApplication application)\n{\n\t\/\/ [...] previous code\n\n  var buttonImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;description_32.png&quot;)); \/\/ Image size: 32x32 px\t\n  var buttonImage = new BitmapImage(buttonImageUri);\n  button.LargeImage = buttonImage;\t\n\n\treturn Result.Succeeded;\n}\t<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37e95a9 elementor-widget elementor-widget-text-editor\" data-id=\"37e95a9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"kk-infobox-warning\">\u26a0\ufe0f When adding images to the solution\/project, set \u201c<strong>Copy to Output Directory<\/strong>\u201d in the Properties to \u201c<strong>Copy if newer<\/strong>\u201d or \u201c<strong>Copy always<\/strong>\u201c.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c8008c elementor-widget elementor-widget-image\" data-id=\"1c8008c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2225\" height=\"331\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4.png\" class=\"attachment-full size-full wp-image-2693\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4.png 2225w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4-300x45.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4-1024x152.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4-768x114.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4-1536x229.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-4-2048x305.png 2048w\" sizes=\"(max-width: 2225px) 100vw, 2225px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-350a3cd elementor-widget elementor-widget-text-editor\" data-id=\"350a3cd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>TextBoxes<\/h3><p>TextBoxes allow users to insert text.<\/p><p>Creating a TextBox is similar to creating a button. First, create a <strong>TextBoxData<\/strong>. Its constructor requires only one argument: name, which serves as the TextBox ID. The ID must be unique and is not visible in the Revit menu.<\/p><p>Add TextBoxData to the panel to create the TextBox. You can then attach prompt text (hint text shown in an empty TextBox), a tooltip, or an image (size 16\u00d716 px).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1732fee elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"1732fee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>public Result OnStartup(UIControlledApplication application)\n{\n\t\/\/ [...] previous code\n\n\t\/\/ TextBox\n\tvar textBoxData = new TextBoxData(&quot;nameTextBox&quot;);\n\tvar textBox = panel.AddItem(textBoxData) as TextBox;\n\n\ttextBox.PromptText = &quot;Number of elements&quot;;\n\ttextBox.ToolTip = &quot;Enter the number of elements to show and click Enter.&quot;;\n\n\tvar textBoxImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;numbers_16.png&quot;)); \/\/ Image size: 16x16 px\t\n\tvar textBoxImage = new BitmapImage(textBoxImageUri);\n\ttextBox.Image = textBoxImage;\n\t\n\ttextBox.EnterPressed += TextBox_EnterPressed; \/\/ event\t\n\n\treturn Result.Succeeded;\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8af1a8f elementor-widget elementor-widget-image\" data-id=\"8af1a8f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2225\" height=\"258\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2.png\" class=\"attachment-full size-full wp-image-2694\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2.png 2225w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2-300x35.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2-1024x119.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2-768x89.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2-1536x178.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-2-2048x237.png 2048w\" sizes=\"(max-width: 2225px) 100vw, 2225px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-651a27d elementor-widget elementor-widget-text-editor\" data-id=\"651a27d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"kk-infobox-warning\">\u26a0\ufe0f You must press\u00a0<strong>Enter\u00a0<\/strong>after inserting the textbox value in Revit, or the value will be cleared.<\/p><h3>Getting TextBoxes values with Events<\/h3><p>The purpose of the TextBox is to save the inserted value and\/or perform some action when the value is inserted. For that, use the <strong>EnterPressed<\/strong> event.<\/p><p class=\"kk-infobox-info\"><strong>\u2139\ufe0f C# events<\/strong>\u00a0trigger methods when specific actions occur, like pressing Enter. Multiple methods can be attached to a single event, but each method must meet the event\u2019s argument requirements.<br \/>While you can create custom events, attaching methods to existing ones is typically all you need for Revit programming.<\/p><p>The exemplary method attached to the event will retrieve the inserted value, convert it to an integer, and display a TaskDialog. It will also\u00a0<strong>persist the value<\/strong>\u00a0for further use by using a static property of the Application class.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd509a2 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"cd509a2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>[Transaction(TransactionMode.Manual)]\n[Regeneration(RegenerationOption.Manual)]\npublic class RevitMasteryApplication : IExternalApplication\n{\n  public static int SelectedElementsNumber { get; private set; } = 1;\n\n  public Result OnStartup(UIControlledApplication application)\n  {\n  \t\/\/ [...] previous code\n  \n  \t\/\/ TextBox\n  \tvar textBoxData = new TextBoxData(&quot;nameTextBox&quot;);\n  \tvar textBox = panel.AddItem(textBoxData) as TextBox;\n  \n  \ttextBox.PromptText = &quot;Number of elements&quot;;\n  \ttextBox.ToolTip = &quot;Enter the number of elements to show and click Enter.&quot;;\n  \n  \tvar textBoxImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;numbers_16.png&quot;)); \/\/ Image size: 16x16 px\t\n  \tvar textBoxImage = new BitmapImage(textBoxImageUri);\n  \ttextBox.Image = textBoxImage;\n  \t\n  \ttextBox.EnterPressed += TextBox_EnterPressed; \/\/ event\t\n  \n  \treturn Result.Succeeded;\n  }\n  \n  private void TextBox_EnterPressed(object? sender, Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs e)\n  {\n  \tvar textBox = sender as TextBox;\n  \tvar textBoxValue = textBox.Value.ToString();\n  \n  \tvar isTextBoxValueInt = int.TryParse(textBoxValue, out var intTextBoxValue);\n  \n  \tif(isTextBoxValueInt)\n  \t{\n  \t\tSelectedElementsNumber = intTextBoxValue; \/\/ assigning to a static property\n  \t\tTaskDialog.Show(&quot;TextBox&quot;, $&quot;Current texBox value is: {textBoxValue}&quot;);\n  \t}\n  \telse\n  \t{\n  \t\tTaskDialog.Show(&quot;TextBox&quot;, $&quot;Insert an integer!&quot;);\n  \t}\t\n  }\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5209487 elementor-widget elementor-widget-text-editor\" data-id=\"5209487\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"kk-infobox-info\">\u2139\ufe0f <strong>Static properties and classes are often not recommended by guides.<\/strong><br \/>However, static elements are not always harmful. For Revit programming, they can simplify actions such as persisting values.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d5efbd elementor-widget elementor-widget-text-editor\" data-id=\"8d5efbd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>ComboBoxes<\/h3><p>ComboBoxes allow users to select from predefined values.<\/p><p>Add ComboBoxData to the panel to create the ComboBox. The ComboBox must be populated with ComboBoxMembers. Each ComboBoxMemberData is defined by a name (ID-like, not visible in Revit, and unique) and the text shown in the Revit menu.<\/p><p>You can retrieve the ComboBox value with the CurrentChanged event.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-800fa27 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"800fa27\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>[Transaction(TransactionMode.Manual)]\n[Regeneration(RegenerationOption.Manual)]\npublic class RevitMasteryApplication : IExternalApplication\n{\n  public static Type SelectedElementType { get; private set; } = typeof(Wall);\n\n  public Result OnStartup(UIControlledApplication application)\n  {\n  \t\/\/ [...] previous code\n  \n  \t\/\/ ComboBox\n    var comboBoxData = new ComboBoxData(&quot;elementTypeComboBox&quot;);\n    var comboBox = panel.AddItem(comboBoxData) as ComboBox;\n    comboBox.ToolTip = &quot;Select elements type.&quot;;\t\t\t\n    \n    var comboBoxImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;list_16.png&quot;)); \/\/ Image size: 16x16 px\t\n    var comboBoxImage = new BitmapImage(comboBoxImageUri);\n    comboBox.Image = comboBoxImage;\n    \n    var comboBoxMemberData_wall = new ComboBoxMemberData(&quot;elementTypeComboBox_wall&quot;, &quot;Walls&quot;);\n    var comboBoxMember_wall = comboBox.AddItem(comboBoxMemberData_wall);\n    \n    var comboBoxMemberData_floor = new ComboBoxMemberData(&quot;elementTypeComboBox_floor&quot;, &quot;Floors&quot;);\n    var comboBoxMember_floor = comboBox.AddItem(comboBoxMemberData_floor);\n    \n    comboBox.CurrentChanged += ComboBox_CurrentChanged; \/\/event \n  \n  \treturn Result.Succeeded;\n  }\n  \n    private void ComboBox_CurrentChanged(object? sender, Autodesk.Revit.UI.Events.ComboBoxCurrentChangedEventArgs e)\n  {\n  \tvar comboBox = sender as ComboBox;\n  \tvar comboBoxValue = comboBox.Current.ItemText;\n  \n  \tvar elementType =  comboBoxValue == &quot;Walls&quot; ? typeof(Wall) : typeof(Floor);\n  \tSelectedElementType = elementType; \/\/ assigning to a static property\n  \n  \tTaskDialog.Show(&quot;ComboBox&quot;, $&quot;Current comboBox value is: {comboBoxValue}&quot;);\n  }  \t\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d28cda elementor-widget elementor-widget-image\" data-id=\"6d28cda\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"2227\" height=\"262\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6.png\" class=\"attachment-full size-full wp-image-2696\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6.png 2227w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6-300x35.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6-1024x120.png 1024w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6-768x90.png 768w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6-1536x181.png 1536w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-6-2048x241.png 2048w\" sizes=\"(max-width: 2227px) 100vw, 2227px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-989df78 elementor-widget elementor-widget-text-editor\" data-id=\"989df78\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>Putting it all into action \u2013 Command<\/h3><p>To bring everything together, modify the Command class to utilize the persisted values from the TextBox and the ComboBox.<\/p><p>The command method will show a TaskDialog with names of elements of the selected type (walls or floors) existing in the project. The number of names displayed will be limited by the number inserted in the TextBox (or the number of existing elements, if smaller).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-25e5489 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"25e5489\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>using Autodesk.Revit.Attributes;\nusing Autodesk.Revit.UI;\nusing Autodesk.Revit.DB;\n\nnamespace RevitMastery.Revit\n{\n\t[Transaction(TransactionMode.Manual)]\n\t[Regeneration(RegenerationOption.Manual)]\n\tpublic class ShowElementsDataCommand : IExternalCommand\n\t{\n\t\tpublic Result Execute(ExternalCommandData commandData, ref string message,\n\t\tElementSet elements)\n\t\t{\n\t\t\tUIApplication uiApp = commandData.Application;\n\t\t\tDocument doc = uiApp.ActiveUIDocument.Document;\n\n\t\t\tvar elementsNumber = RevitMasteryApplication.SelectedElementsNumber;\n\t\t\tvar elementsType = RevitMasteryApplication.SelectedElementType;\n\n\t\t\tvar collector = new FilteredElementCollector(doc).WhereElementIsNotElementType().OfClass(elementsType);\n\t\t\tvar collectedElements = collector.ToElements();\n\n\t\t\tvar numberToShow = Math.Min(collectedElements.Count, elementsNumber);\n\n\t\t\tvar elementsMessage = &quot;Elements names: \\n&quot;;\n\t\t\tfor ( var i = 0; i&lt;numberToShow; i++)\n\t\t\t{\n\t\t\t\tvar element = collectedElements[i];\n\t\t\t\tvar elementName = element.Name;\n\t\t\t\telementsMessage += $&quot;{i+1}. {elementName}\\n&quot;;\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tTaskDialog.Show(&quot;Show elements data&quot;, elementsMessage);\n\n\t\t\treturn Result.Succeeded;\n\t\t}\n\t}\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fe7d2d elementor-widget elementor-widget-image\" data-id=\"2fe7d2d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"506\" src=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-3.png\" class=\"attachment-large size-large wp-image-2697\" alt=\"\" srcset=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-3.png 800w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-3-300x190.png 300w, https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006-3-768x486.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-978bece elementor-widget elementor-widget-text-editor\" data-id=\"978bece\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"wp-block-uagb-container uagb-block-0ff3eb88\"><div class=\"wp-block-uagb-advanced-heading uagb-block-96cc3ce1\"><h3 class=\"uagb-heading-text\">The final code<\/h3><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8f7b1b8 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"8f7b1b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>using System.IO;\nusing System.Reflection;\nusing System.Windows.Media.Imaging;\nusing Autodesk.Revit.Attributes;\nusing Autodesk.Revit.DB;\nusing Autodesk.Revit.UI;\n\nnamespace RevitMastery.Revit\n{\n\t[Transaction(TransactionMode.Manual)]\n\t[Regeneration(RegenerationOption.Manual)]\n\tpublic class RevitMasteryApplication : IExternalApplication\n\t{\n\t\tpublic static int SelectedElementsNumber { get; private set; } = 1;\n\t\tpublic static Type SelectedElementType { get; private set; } = typeof(Wall);\n\n\n\t\tpublic Result OnStartup(UIControlledApplication application)\n\t\t{\n\t\t\tvar ribbonTabName = &quot;Revit Mastery&quot;;\n\t\t\tapplication.CreateRibbonTab(ribbonTabName);\n\t\t\tvar panel = application.CreateRibbonPanel(ribbonTabName, &quot;Revit Mastery Panel&quot;);\n\n\t\t\tvar assemblyPath = Assembly.GetExecutingAssembly().Location; \/\/localization of the currently executing assembly. Don&#039;t worry, copy ;)\n\t\t\tvar assemblyDirectory = Path.GetDirectoryName(assemblyPath);\n\n\t\t\t\/\/ Button\n\t\t\tvar buttonData = new PushButtonData(\n\t\t\t\ttypeof(ShowElementsDataCommand).FullName,\n\t\t\t\t&quot;Show elements data&quot;, \n\t\t\t\tassemblyPath,\n\t\t\t\ttypeof(ShowElementsDataCommand).FullName);\n\t\t\t\n\t\t\tvar button = panel.AddItem(buttonData) as PushButton;\n\t\t\tbutton.ToolTip = &quot;Click to show data of elements of inserted number and selected type.&quot;;\n\n\t\t\tvar buttonContextualHelp = new ContextualHelp(ContextualHelpType.Url, &quot;https:\/\/revitmastery.com\/revit-plugin-types\/&quot;);\n\t\t\tbutton.SetContextualHelp(buttonContextualHelp);\n\n\t\t\tvar buttonImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;description_32.png&quot;)); \/\/ Image size: 32x32 px\t\n\t\t\tvar buttonImage = new BitmapImage(buttonImageUri);\n\t\t\tbutton.LargeImage = buttonImage;\n\n\n\t\t\t\/\/ TextBox\n\t\t\tvar textBoxData = new TextBoxData(&quot;nameTextBox&quot;);\n\t\t\tvar textBox = panel.AddItem(textBoxData) as TextBox;\n\n\t\t\ttextBox.PromptText = &quot;Number of elements&quot;;\n\t\t\ttextBox.ToolTip = &quot;Enter the number of elements to show and click Enter.&quot;;\n\n\t\t\tvar textBoxImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;numbers_16.png&quot;)); \/\/ Image size: 16x16 px\t\n\t\t\tvar textBoxImage = new BitmapImage(textBoxImageUri);\n\t\t\ttextBox.Image = textBoxImage;\n\t\t\t\n\t\t\ttextBox.EnterPressed += TextBox_EnterPressed; \/\/ event\n\t\t\t\n\n\t\t\t\/\/ ComboBox\n\t\t\tvar comboBoxData = new ComboBoxData(&quot;elementTypeComboBox&quot;);\n\t\t\tvar comboBox = panel.AddItem(comboBoxData) as ComboBox;\n\t\t\tcomboBox.ToolTip = &quot;Select elements type.&quot;;\t\t\t\n\n\t\t\tvar comboBoxImageUri = new Uri(Path.Combine(assemblyDirectory, &quot;Resources&quot;, &quot;Images&quot;, &quot;list_16.png&quot;)); \/\/ Image size: 16x16 px\t\n\t\t\tvar comboBoxImage = new BitmapImage(comboBoxImageUri);\n\t\t\tcomboBox.Image = comboBoxImage;\n\n\t\t\tvar comboBoxMemberData_wall = new ComboBoxMemberData(&quot;elementTypeComboBox_wall&quot;, &quot;Walls&quot;);\n\t\t\tvar comboBoxMember_wall = comboBox.AddItem(comboBoxMemberData_wall);\n\n\t\t\tvar comboBoxMemberData_floor = new ComboBoxMemberData(&quot;elementTypeComboBox_floor&quot;, &quot;Floors&quot;);\n\t\t\tvar comboBoxMember_floor = comboBox.AddItem(comboBoxMemberData_floor);\n\n\t\t\tcomboBox.CurrentChanged += ComboBox_CurrentChanged; \/\/event \n\t\t\t\n\n\t\t\treturn Result.Succeeded;\n\t\t}\t\t\t\n\n\t\tprivate void TextBox_EnterPressed(object? sender, Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs e)\n\t\t{\n\t\t\tvar textBox = sender as TextBox;\n\t\t\tvar textBoxValue = textBox.Value.ToString();\n\n\t\t\tvar isTextBoxValueInt = int.TryParse(textBoxValue, out var intTextBoxValue);\n\n\t\t\tif(isTextBoxValueInt)\n\t\t\t{\n\t\t\t\tSelectedElementsNumber = intTextBoxValue; \/\/ assigning to a static property\n\t\t\t\tTaskDialog.Show(&quot;TextBox&quot;, $&quot;Current texBox value is: {textBoxValue}&quot;);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTaskDialog.Show(&quot;TextBox&quot;, $&quot;Insert an integer!&quot;);\n\t\t\t}\t\t\t\n\t\t}\n\n\t\tprivate void ComboBox_CurrentChanged(object? sender, Autodesk.Revit.UI.Events.ComboBoxCurrentChangedEventArgs e)\n\t\t{\n\t\t\tvar comboBox = sender as ComboBox;\n\t\t\tvar comboBoxValue = comboBox.Current.ItemText;\n\n\t\t\tvar elementType =  comboBoxValue == &quot;Walls&quot; ? typeof(Wall) : typeof(Floor);\n\t\t\tSelectedElementType = elementType; \/\/ assigning to a static property\n\n\t\t\tTaskDialog.Show(&quot;ComboBox&quot;, $&quot;Current comboBox value is: {comboBoxValue}&quot;);\n\t\t}\n\n\n\t\tpublic Result OnShutdown(UIControlledApplication application)\n\t\t{\n\t\t\treturn Result.Succeeded;\n\t\t}\n\t}\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c012c59 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"c012c59\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-default' data-show-toolbar='no'><code class='language-csharp'>using Autodesk.Revit.Attributes;\nusing Autodesk.Revit.UI;\nusing Autodesk.Revit.DB;\n\nnamespace RevitMastery.Revit\n{\n\t[Transaction(TransactionMode.Manual)]\n\t[Regeneration(RegenerationOption.Manual)]\n\tpublic class ShowElementsDataCommand : IExternalCommand\n\t{\n\t\tpublic Result Execute(ExternalCommandData commandData, ref string message,\n\t\tElementSet elements)\n\t\t{\n\t\t\tUIApplication uiApp = commandData.Application;\n\t\t\tDocument doc = uiApp.ActiveUIDocument.Document;\n\n\t\t\tvar elementsNumber = RevitMasteryApplication.SelectedElementsNumber;\n\t\t\tvar elementsType = RevitMasteryApplication.SelectedElementType;\n\n\t\t\tvar collector = new FilteredElementCollector(doc).WhereElementIsNotElementType().OfClass(elementsType);\n\t\t\tvar collectedElements = collector.ToElements();\n\n\t\t\tvar numberToShow = Math.Min(collectedElements.Count, elementsNumber);\n\n\t\t\tvar elementsMessage = &quot;Elements names: \\n&quot;;\n\t\t\tfor ( var i = 0; i&lt;numberToShow; i++)\n\t\t\t{\n\t\t\t\tvar element = collectedElements[i];\n\t\t\t\tvar elementName = element.Name;\n\t\t\t\telementsMessage += $&quot;{i+1}. {elementName}\\n&quot;;\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tTaskDialog.Show(&quot;Show elements data&quot;, elementsMessage);\n\n\t\t\treturn Result.Succeeded;\n\t\t}\n\t}\n}<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>You can add your own panels, tabs, buttons, and other controls to the Revit menu when creating a Revit plugin. You can customize the controls with images, tooltips, or extended contextual help. However, especially in the new Revit 2025 .NET API, there are some caveats. \ud83d\udccc TLDR \u2013 Summary Upfront:Modify the Revit menu (e.g., add [&hellip;]<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[6],"tags":[],"post_folder":[],"class_list":["post-2688","post","type-post","status-publish","format-standard","hentry","category-revit-api-basics"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence<\/title>\n<meta name=\"description\" content=\"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/infralligence.com\/pl\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence\" \/>\n<meta property=\"og:description\" content=\"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/infralligence.com\/pl\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\" \/>\n<meta property=\"og:site_name\" content=\"Infralligence\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-14T08:08:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-31T09:32:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2653\" \/>\n\t<meta property=\"og:image:height\" content=\"1493\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kamil Korus\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kamil Korus\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\"},\"author\":{\"name\":\"Kamil Korus\",\"@id\":\"https:\/\/infralligence.com\/#\/schema\/person\/838177275b7d3b8b217b13180a74aeda\"},\"headline\":\"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes\",\"datePublished\":\"2024-08-14T08:08:11+00:00\",\"dateModified\":\"2024-12-31T09:32:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\"},\"wordCount\":846,\"publisher\":{\"@id\":\"https:\/\/infralligence.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\",\"articleSection\":[\"Revit API Basics\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\",\"url\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\",\"name\":\"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence\",\"isPartOf\":{\"@id\":\"https:\/\/infralligence.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\",\"datePublished\":\"2024-08-14T08:08:11+00:00\",\"dateModified\":\"2024-12-31T09:32:02+00:00\",\"description\":\"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...\",\"breadcrumb\":{\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage\",\"url\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\",\"contentUrl\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/infralligence.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/infralligence.com\/#website\",\"url\":\"https:\/\/infralligence.com\/\",\"name\":\"Infralligence\",\"description\":\"Digital Automation and AI for civil engineering\",\"publisher\":{\"@id\":\"https:\/\/infralligence.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/infralligence.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/infralligence.com\/#organization\",\"name\":\"Infralligence\",\"url\":\"https:\/\/infralligence.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infralligence.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/11\/android-chrome-192x192-1.png\",\"contentUrl\":\"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/11\/android-chrome-192x192-1.png\",\"width\":192,\"height\":192,\"caption\":\"Infralligence\"},\"image\":{\"@id\":\"https:\/\/infralligence.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/infralligence.com\/#\/schema\/person\/838177275b7d3b8b217b13180a74aeda\",\"name\":\"Kamil Korus\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infralligence.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/95bd7da2ac29ff34a2ab9bf4ea30273b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/95bd7da2ac29ff34a2ab9bf4ea30273b?s=96&d=mm&r=g\",\"caption\":\"Kamil Korus\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/kamil-korus\/\"],\"url\":\"https:\/\/infralligence.com\/pl\/resources\/author\/kamil-korus\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence","description":"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/infralligence.com\/pl\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/","og_locale":"pl_PL","og_type":"article","og_title":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence","og_description":"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...","og_url":"https:\/\/infralligence.com\/pl\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/","og_site_name":"Infralligence","article_published_time":"2024-08-14T08:08:11+00:00","article_modified_time":"2024-12-31T09:32:02+00:00","og_image":[{"width":2653,"height":1493,"url":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png","type":"image\/png"}],"author":"Kamil Korus","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Kamil Korus","Szacowany czas czytania":"6 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#article","isPartOf":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/"},"author":{"name":"Kamil Korus","@id":"https:\/\/infralligence.com\/#\/schema\/person\/838177275b7d3b8b217b13180a74aeda"},"headline":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes","datePublished":"2024-08-14T08:08:11+00:00","dateModified":"2024-12-31T09:32:02+00:00","mainEntityOfPage":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/"},"wordCount":846,"publisher":{"@id":"https:\/\/infralligence.com\/#organization"},"image":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage"},"thumbnailUrl":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png","articleSection":["Revit API Basics"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/","url":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/","name":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes - Infralligence","isPartOf":{"@id":"https:\/\/infralligence.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage"},"image":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage"},"thumbnailUrl":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png","datePublished":"2024-08-14T08:08:11+00:00","dateModified":"2024-12-31T09:32:02+00:00","description":"You can modify the Revit menu by creating and customizing your own panels, tabs, buttons, textBoxes, and comboBoxes...","breadcrumb":{"@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#primaryimage","url":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png","contentUrl":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/12\/1aeb2301-adfa-46aa-b572-089dbe425006.png"},{"@type":"BreadcrumbList","@id":"https:\/\/infralligence.com\/resources\/revit-menu-customization-ribbon-tabs-panels-buttons-textboxes-comboboxes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/infralligence.com\/"},{"@type":"ListItem","position":2,"name":"Revit menu customization: ribbon tabs, panels, buttons, textBoxes, comboBoxes"}]},{"@type":"WebSite","@id":"https:\/\/infralligence.com\/#website","url":"https:\/\/infralligence.com\/","name":"Infralligence","description":"Digital Automation and AI for civil engineering","publisher":{"@id":"https:\/\/infralligence.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/infralligence.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/infralligence.com\/#organization","name":"Infralligence","url":"https:\/\/infralligence.com\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infralligence.com\/#\/schema\/logo\/image\/","url":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/11\/android-chrome-192x192-1.png","contentUrl":"https:\/\/infralligence.com\/wp-content\/uploads\/2024\/11\/android-chrome-192x192-1.png","width":192,"height":192,"caption":"Infralligence"},"image":{"@id":"https:\/\/infralligence.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/infralligence.com\/#\/schema\/person\/838177275b7d3b8b217b13180a74aeda","name":"Kamil Korus","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infralligence.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/95bd7da2ac29ff34a2ab9bf4ea30273b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/95bd7da2ac29ff34a2ab9bf4ea30273b?s=96&d=mm&r=g","caption":"Kamil Korus"},"sameAs":["https:\/\/www.linkedin.com\/in\/kamil-korus\/"],"url":"https:\/\/infralligence.com\/pl\/resources\/author\/kamil-korus\/"}]}},"_links":{"self":[{"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/posts\/2688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/comments?post=2688"}],"version-history":[{"count":18,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/posts\/2688\/revisions"}],"predecessor-version":[{"id":2723,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/posts\/2688\/revisions\/2723"}],"wp:attachment":[{"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/media?parent=2688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/categories?post=2688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/tags?post=2688"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/infralligence.com\/pl\/wp-json\/wp\/v2\/post_folder?post=2688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}