From 94b71bb44a65cfc2025fd9472cf87b41bf062f74 Mon Sep 17 00:00:00 2001 From: Luiz Henrique Cassettari Date: Thu, 11 Jan 2024 12:35:56 -0300 Subject: [PATCH] Add project files. --- .github/workflows/Build.yml | 27 +++ Build/.editorconfig | 11 + Build/.nuke/parameters.json | 4 + Build/Build.cs | 10 + Build/Build.csproj | 21 ++ Build/build.cmd | 7 + Build/build.ps1 | 69 ++++++ Build/build.sh | 62 ++++++ CHANGELOG.md | 11 + LICENSE | 21 ++ README.md | 23 ++ RevitAddin.Icon.Example.sln | 35 +++ .../Resources/Images/Cube-Blue-Dark.ico | Bin 0 -> 639 bytes .../Resources/Images/Cube-Blue.ico | Bin 0 -> 651 bytes .../Resources/Images/Cube-Brown-Dark.ico | Bin 0 -> 644 bytes .../Resources/Images/Cube-Brown.ico | Bin 0 -> 656 bytes .../Resources/Images/Cube-Cyan-Dark.ico | Bin 0 -> 642 bytes .../Resources/Images/Cube-Cyan.ico | Bin 0 -> 662 bytes .../Resources/Images/Cube-Green-Dark.ico | Bin 0 -> 644 bytes .../Resources/Images/Cube-Green.ico | Bin 0 -> 651 bytes .../Resources/Images/Cube-Grey-Dark.ico | Bin 0 -> 625 bytes .../Resources/Images/Cube-Grey.ico | Bin 0 -> 635 bytes .../Resources/Images/Cube-Orange-Dark.ico | Bin 0 -> 643 bytes .../Resources/Images/Cube-Orange.ico | Bin 0 -> 655 bytes .../Resources/Images/Cube-Pink-Dark.ico | Bin 0 -> 640 bytes .../Resources/Images/Cube-Pink.ico | Bin 0 -> 663 bytes .../Resources/Images/Cube-Purple-Dark.ico | Bin 0 -> 639 bytes .../Resources/Images/Cube-Purple.ico | Bin 0 -> 657 bytes .../Resources/Images/Cube-Red-Dark.ico | Bin 0 -> 632 bytes .../Resources/Images/Cube-Red.ico | Bin 0 -> 650 bytes .../Resources/Images/Cube-Yellow-Dark.ico | Bin 0 -> 647 bytes .../Resources/Images/Cube-Yellow.ico | Bin 0 -> 662 bytes RevitAddin.Icon.Example/Resources/Revit.ico | Bin 0 -> 982 bytes RevitAddin.Icon.Example/Revit/App.cs | 41 ++++ .../Revit/Commands/Command.cs | 20 ++ .../Revit/RibbonImageThemeSelector.cs | 94 +++++++++ .../RevitAddin.Icon.Example.csproj | 199 ++++++++++++++++++ build.cmd | 3 + 38 files changed, 658 insertions(+) create mode 100644 .github/workflows/Build.yml create mode 100644 Build/.editorconfig create mode 100644 Build/.nuke/parameters.json create mode 100644 Build/Build.cs create mode 100644 Build/Build.csproj create mode 100644 Build/build.cmd create mode 100644 Build/build.ps1 create mode 100644 Build/build.sh create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 RevitAddin.Icon.Example.sln create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Blue-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Blue.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Brown-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Brown.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Cyan-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Cyan.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Green-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Green.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Grey-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Grey.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Orange-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Orange.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Pink-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Pink.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Purple-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Purple.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Red-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Red.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Yellow-Dark.ico create mode 100644 RevitAddin.Icon.Example/Resources/Images/Cube-Yellow.ico create mode 100644 RevitAddin.Icon.Example/Resources/Revit.ico create mode 100644 RevitAddin.Icon.Example/Revit/App.cs create mode 100644 RevitAddin.Icon.Example/Revit/Commands/Command.cs create mode 100644 RevitAddin.Icon.Example/Revit/RibbonImageThemeSelector.cs create mode 100644 RevitAddin.Icon.Example/RevitAddin.Icon.Example.csproj create mode 100644 build.cmd diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml new file mode 100644 index 0000000..cc3830b --- /dev/null +++ b/.github/workflows/Build.yml @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# Build.yml +# ------------------------------------------------------------------------------ + +name: Build + +on: + push: + pull_request: + branches-ignore: + - master + - main + workflow_dispatch: + +jobs: + Build: + name: Build + runs-on: windows-latest + steps: + - uses: actions/checkout@v1 + - name: Run './build/build.cmd' + run: ./build/build.cmd --root ./build + env: + GitHubToken: ${{ secrets.GITHUB_TOKEN }} + SignFile: ${{ secrets.SIGN_FILE }} + SignPassword: ${{ secrets.SIGN_PASSWORD }} + InstallationFiles: ${{ secrets.INSTALLATION_FILES }} \ No newline at end of file diff --git a/Build/.editorconfig b/Build/.editorconfig new file mode 100644 index 0000000..31e43dc --- /dev/null +++ b/Build/.editorconfig @@ -0,0 +1,11 @@ +[*.cs] +dotnet_style_qualification_for_field = false:warning +dotnet_style_qualification_for_property = false:warning +dotnet_style_qualification_for_method = false:warning +dotnet_style_qualification_for_event = false:warning +dotnet_style_require_accessibility_modifiers = never:warning + +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_properties = true:warning +csharp_style_expression_bodied_indexers = true:warning +csharp_style_expression_bodied_accessors = true:warning diff --git a/Build/.nuke/parameters.json b/Build/.nuke/parameters.json new file mode 100644 index 0000000..0d03d2c --- /dev/null +++ b/Build/.nuke/parameters.json @@ -0,0 +1,4 @@ +{ + "$schema": "./build.schema.json", + "Solution": "../RevitAddin.Icon.Example.sln" +} \ No newline at end of file diff --git a/Build/Build.cs b/Build/Build.cs new file mode 100644 index 0000000..a26ecc4 --- /dev/null +++ b/Build/Build.cs @@ -0,0 +1,10 @@ +using Nuke.Common; +using Nuke.Common.Execution; +using ricaun.Nuke; +using ricaun.Nuke.Components; + +class Build : NukeBuild, IPublishRevit +{ + string IHazRevitPackageBuilder.Application => "Revit.App"; + public static int Main() => Execute(x => x.From().Build); +} \ No newline at end of file diff --git a/Build/Build.csproj b/Build/Build.csproj new file mode 100644 index 0000000..8148d40 --- /dev/null +++ b/Build/Build.csproj @@ -0,0 +1,21 @@ + + + Exe + net7.0 + + CS0649;CS0169 + . + . + 1 + + + + + + + + + + + + diff --git a/Build/build.cmd b/Build/build.cmd new file mode 100644 index 0000000..b08cc59 --- /dev/null +++ b/Build/build.cmd @@ -0,0 +1,7 @@ +:; set -eo pipefail +:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) +:; ${SCRIPT_DIR}/build.sh "$@" +:; exit $? + +@ECHO OFF +powershell -ExecutionPolicy ByPass -NoProfile -File "%~dp0build.ps1" %* diff --git a/Build/build.ps1 b/Build/build.ps1 new file mode 100644 index 0000000..9583582 --- /dev/null +++ b/Build/build.ps1 @@ -0,0 +1,69 @@ +[CmdletBinding()] +Param( + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$BuildArguments +) + +Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)" + +Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { Write-Error $_ -ErrorAction Continue; exit 1 } +$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent + +########################################################################### +# CONFIGURATION +########################################################################### + +$BuildProjectFile = "$PSScriptRoot\Build.csproj" +$TempDirectory = "$PSScriptRoot\\.nuke\temp" + +$DotNetGlobalFile = "$PSScriptRoot\\global.json" +$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1" +$DotNetChannel = "Current" + +$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1 +$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 +$env:DOTNET_MULTILEVEL_LOOKUP = 0 + +########################################################################### +# EXECUTION +########################################################################### + +function ExecSafe([scriptblock] $cmd) { + & $cmd + if ($LASTEXITCODE) { exit $LASTEXITCODE } +} + +# If dotnet CLI is installed globally and it matches requested version, use for execution +if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and ` + $(dotnet --version) -and $LASTEXITCODE -eq 0) { + $env:DOTNET_EXE = (Get-Command "dotnet").Path +} +else { + # Download install script + $DotNetInstallFile = "$TempDirectory\dotnet-install.ps1" + New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile) + + # If global.json exists, load expected version + if (Test-Path $DotNetGlobalFile) { + $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json) + if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) { + $DotNetVersion = $DotNetGlobal.sdk.version + } + } + + # Install by channel or version + $DotNetDirectory = "$TempDirectory\dotnet-win" + if (!(Test-Path variable:DotNetVersion)) { + ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath } + } else { + ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } + } + $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" +} + +Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)" + +ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet } +ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } diff --git a/Build/build.sh b/Build/build.sh new file mode 100644 index 0000000..c6d1be3 --- /dev/null +++ b/Build/build.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +bash --version 2>&1 | head -n 1 + +set -eo pipefail +SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) + +########################################################################### +# CONFIGURATION +########################################################################### + +BUILD_PROJECT_FILE="$SCRIPT_DIR/Build.csproj" +TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp" + +DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" +DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh" +DOTNET_CHANNEL="Current" + +export DOTNET_CLI_TELEMETRY_OPTOUT=1 +export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 +export DOTNET_MULTILEVEL_LOOKUP=0 + +########################################################################### +# EXECUTION +########################################################################### + +function FirstJsonValue { + perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}" +} + +# If dotnet CLI is installed globally and it matches requested version, use for execution +if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then + export DOTNET_EXE="$(command -v dotnet)" +else + # Download install script + DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh" + mkdir -p "$TEMP_DIRECTORY" + curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL" + chmod +x "$DOTNET_INSTALL_FILE" + + # If global.json exists, load expected version + if [[ -f "$DOTNET_GLOBAL_FILE" ]]; then + DOTNET_VERSION=$(FirstJsonValue "version" "$(cat "$DOTNET_GLOBAL_FILE")") + if [[ "$DOTNET_VERSION" == "" ]]; then + unset DOTNET_VERSION + fi + fi + + # Install by channel or version + DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix" + if [[ -z ${DOTNET_VERSION+x} ]]; then + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path + else + "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path + fi + export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" +fi + +echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)" + +"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet +"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..861dfee --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.0.0] / 2024-01-11 +- First Release + +[vNext]: ../../compare/1.0.0...HEAD +[1.0.0]: ../../compare/1.0.0 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d0d880b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ricaun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1d1fb3 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# RevitAddin.Icon.Example + +[![Revit 2024](https://img.shields.io/badge/Revit-2024+-blue.svg)](../..) +[![Visual Studio 2022](https://img.shields.io/badge/Visual%20Studio-2022-blue)](../..) +[![Nuke](https://img.shields.io/badge/Nuke-Build-blue)](https://nuke.build/) +[![License MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) +[![Build](../../actions/workflows/Build.yml/badge.svg)](../../actions) + +Example to swap the icons when theme change in Revit 2024. + +This project was generated by the [ricaun.AppLoader](https://ricaun.com/AppLoader/) Revit plugin. + +## Installation + +* Download and install [RevitAddin.Icon.Example.exe](../../releases/latest/download/RevitAddin.Icon.Example.zip) + +## License + +This project is [licensed](LICENSE) under the [MIT Licence](https://en.wikipedia.org/wiki/MIT_License). + +--- + +Do you like this project? Please [star this project on GitHub](../../stargazers)! \ No newline at end of file diff --git a/RevitAddin.Icon.Example.sln b/RevitAddin.Icon.Example.sln new file mode 100644 index 0000000..e6c823b --- /dev/null +++ b/RevitAddin.Icon.Example.sln @@ -0,0 +1,35 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34316.72 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RevitAddin.Icon.Example", "RevitAddin.Icon.Example\RevitAddin.Icon.Example.csproj", "{A206D7F5-A69C-4011-BD5B-9E419B5DE41E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Build", "Build\Build.csproj", "{D1EE1E8F-357F-4FCC-929B-78DFC6900C6B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution", "Solution", "{372F3C47-52A7-4DB1-BC05-3F8056E317A8}" + ProjectSection(SolutionItems) = preProject + CHANGELOG.md = CHANGELOG.md + LICENSE = LICENSE + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + 2024|Any CPU = 2024|Any CPU + Debug 2024|Any CPU = Debug 2024|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A206D7F5-A69C-4011-BD5B-9E419B5DE41E}.2024|Any CPU.ActiveCfg = 2024|Any CPU + {A206D7F5-A69C-4011-BD5B-9E419B5DE41E}.2024|Any CPU.Build.0 = 2024|Any CPU + {A206D7F5-A69C-4011-BD5B-9E419B5DE41E}.Debug 2024|Any CPU.ActiveCfg = Debug 2024|Any CPU + {A206D7F5-A69C-4011-BD5B-9E419B5DE41E}.Debug 2024|Any CPU.Build.0 = Debug 2024|Any CPU + {D1EE1E8F-357F-4FCC-929B-78DFC6900C6B}.2024|Any CPU.ActiveCfg = Debug|Any CPU + {D1EE1E8F-357F-4FCC-929B-78DFC6900C6B}.2024|Any CPU.Build.0 = Debug|Any CPU + {D1EE1E8F-357F-4FCC-929B-78DFC6900C6B}.Debug 2024|Any CPU.ActiveCfg = Debug|Any CPU + {D1EE1E8F-357F-4FCC-929B-78DFC6900C6B}.Debug 2024|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Blue-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Blue-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..801e142a2a3171fc631a1d8a38584506cc5f1829 GIT binary patch literal 639 zcmZQzU}Ruo5D;Jh(h3aBj0_BF3=9kk3J`u6kgo~EodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_Gg$-~Zn;eXMud@%_m1{{guI4y&Gh={+yNHes>k(S~)C@9+CQ=ij&a0(sWIB-a5& z&RyRBPq#t8O)B}C^&ntzuwR! zm`y^0;bKH~(Z8pQ%z)N2c)I$ztaD0e!V&}uKxqYV5ENHceF1W46a>dWK@j2ow(lSp zW1&F%bI(0p#|xjlc(8`!eN#~gAJ=c5*|UodU(>pDW93irvTJc^=~I7RE&ubi_QU1b z$8XGdYk1Bf_tS{lKVAD0Ad{e|&$D4tH{-NVF%4V)=q}*1JXqE6&}?ttB9W~x z*9!;AB-kEM*p(<+GF=_W-pgLm07eJqvz3S)w|@PW`PR&uP2RKCZ09|3GV@Yo^Ld6q yzscvM_OOYZ0&xXCgo3yM4lC!V%{6_o_FR8ZkZ%seodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G@F*TzR~*+wYHhOLO)1zwKGg3^Sh1ddvU6eBQrS@${UEKleA)7#?B>GTrTO+nnWa zZ<4V8>g|H-B@Z_&*eCn{vbmjdN8&7ZUI`vHi!HhT-v?~}#UEmw$>w0P{-?0%`z_od z)*smtuJSM`Fn1h`Fb!stkYL#FD!WEdt}qJd7zR&QKbLh*2~Ai6L;)zR01lAis;VzQ z4vhlj2q-`z+><4)EGRiD`E-x!a=GWaRv+izve;36yMBe~4aPH{pdsQKI%ng!vjubTK#mD*NMq z|3}X&iP=XDY+f}4viDdeTwz?yCsBIfL|KFL?Qj42N>~4PSi5{Zv%)lJxLv9GWy!Gm zse%JP`-3eqEE#VZ_DpML(3N$#P$aNmDs#ss85Re=1*~ePJ~guP@G!{hA8)O=@^u+7 InBZXw0H5{d%>V!Z literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Brown-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Brown-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..afcffbfb9cee1aba670d370bb6a2537595bd35d2 GIT binary patch literal 644 zcmZQzU}Ruo5D;Jh(h3YLj0_BF3=9kk3J`u2kgo;AodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GnSHNM_v$Mut0&Ei&OCD{w9GzZczdQF?z0;2)ZJh;Y zHQ44bdI>du*Uy(XO$dzod+1 zJO%~~46cE0vuiJEiUI9s@O1TaS?83{ge43VfYJ)!Fet97`U2$8C=5=4!XU!^ZJ#X{ zlOvB?vC#TQOW)WuB&2U%)4Mi7_0+HC*4Ewy*&7owt;076Nb;sQ-0iuYvbpK!gHq1- z2mQ~_HP;Q-(O(x)nfXcQ0L~(La*}+gJBI*2_11x~!8qInI26%JIVU zLN#m~ie$d)9L#nI>3cj+m4h+(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_Gr~Gt77<>%HsW{F`RN`uD81KdX;j#(#(*$n<=6pSx+o z$tA0n-xe=Vy4ui_ILnad#rm$l`zzfz9eFO>WF1H_Sg>B_OMSHC2l*9cmv|a7<8I7- z&2-go4`YOBGs6jnB!jTCQyAIU7(N+)*VyUN;t6yPgQu&X%Q~loCM-ds0F+h$2T5^N z)fXU#MnQ5M6eJPu$r4u*j-E+-syaDaPJdp=*ZH?9l43vAuQ0vAc;*u{OeU|YcztKq z|I(RuJ7gWQPd_(3{NVfa6IkU5XPr)sz`vrvO#Qy#%Xpj0|N$zR4$(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_Gin2?*C-xLQFTecx`nQ0$OC%c>O0sOwJl1ylz5W00 zg)@x~9AIGBU0g2As}`yUbO3{=tDnm{r-UXffuI1CRsaV=aaGk9AcsbQa2yl}5$-3Em+&lyvd4&uUgcVP`IH0p)rs>%fr5*BdKP&m` zs=Ar1KTE6m2h7f>ce{2XJL+C^-XBJ>qWp%bF+3Zlgfp#qn$MVfg7X@)%W-c*@8TUitdeUFOb=);_e|%FIS_8?YnAQ5xD_Otu*LWN)=y>Z9~ge>>AiD!U{((dDR{5~ E0Lb{_iU0rr literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Cyan.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Cyan.ico new file mode 100644 index 0000000000000000000000000000000000000000..f653da9f321ed47ac346ebeff79966e98a35b5e6 GIT binary patch literal 662 zcmZQzU}Ruo5D;Jh(h3Y>j0_BF3=9kk3J`u2kZ%LTodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_Gbb8+3{Mw(K`hJ%6pZDK9GLwVZ%|*WF(syqYbA=W1e|hDJsP;T-jS+14GCfG%S2boFyt=akTdB~%oE(hA^E zDXyye0_4yrR8E0HCBi*f;>v=O_kmB}*tW~3zqR@@|CU9<&0YTkvNtf#cnS@c&Q%sq z|D64wCY=7LjA5;A`Mq88+nHY^TKchHI9;@cZ^81X5_}7`1Bny&YJX(@JUTmqcLB@e zO)@QkG7s3#O!jm*dga&+owkR8>^)WqR~Q%bNt7N~!R)q;IY(^$&wTUji}EYJeko-* zQ53!4DLC}jE}zf5A&QUbO96x5X~%|ZdCFHD literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Green-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Green-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..9c41fa48ae58e87875bd62b9ad823cb526757748 GIT binary patch literal 644 zcmZQzU}Ruo5D;Jh(h3aBj0_BF3=9kk3J`uYkgo~EodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G%6&V!ZWzub8xLfDqf$^6TE)o&N$Nr$t(-^Fh_Z=IaR(3U1}V3~xp-Y%P$`fX{a z7?_zEKDQezRIN3z1zOMG>FVdQ&MBb@OAsgkr4_(IP+V2@1<0XM5S#`DL4^C;K0~fU z4g#*vRpO3T-^j{M)NK;XK6vd=#?0i7gk;4V8fq2H+|t|=O_?_@NV{e-x${9y#nb1u zKVGU%FIC>TZj+3<@06o`CVy5<+iuoe(9mWhu|PGQ+2m;}L+;OL2ic;QFARr+YowQQ ztNZ>pNIoieiP`1&&ecut@(y*`F4@k&y#b7VTy8j5R-?YR&cS-R`}5SvUv@FFTJ~9c ze~>(Is_;%^)Afc0GRNnteqfA$YVl5ok!=cC^j_UBjj7kI8`RfCd~j=1_c#X(EqKrZ E0GQ|G{Qv*} literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Green.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Green.ico new file mode 100644 index 0000000000000000000000000000000000000000..f2f3b8c25c65458f608c5132cbb34853a97ba7e4 GIT binary patch literal 651 zcmZQzU}Ruo5D;Jh(h3ZMj0_BF3=9kk3J`t>kZ%seodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_Gz%ZB$?uKW+k6=1j=Q?=xO{pGViD+&*-+x6dV>pc!;kE=Q6>U>ul z&Xj)j_vRN~FL{`u|L4m8i~Ft%9x*t(n2m>xS*ObBU-UNC|BYGdXBj4>X)k#8U}~#g zz}q9z4WY&y4Lk~L$ya?O6A~C0lzMKZroVs20dx$5r>mdKI;VstECHeblvV%-NO4uw z7a)g50dfQsAQA4#5?2(;qo)^L`_*<_^7X6#!P4yKPXFTH%4XdV83zrKkfSS)NBxif z*8Z@JVXbcY{W-n28NY0hSZUatbTQjJTmG-# zD$c#M=WLRMTP_ zd3AgTvMf0+9A>o8WoL}CW?27J!NHqdV2cb(##4qxI_!)Sm@^tXH`OFCGBYzA-munT Ni`4sRz+i%hDF9t}=)nL0 literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Grey-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Grey-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..ed8a61cb5b59766f412130f5e5f332bfe9b592b0 GIT binary patch literal 625 zcmZQzU}Ruo5D;Jh(h3aBj0_BF3=9kk3J|^rkgo~EodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GGOKG|QqSN(P|vh&OR;q?jl7Vvh7WWz#9mJOQ6+Ro3l{x0rp zoZ8UH$gq@mri_0)+ex7H44$rjF6*2Uny>_c0#I5390bKxRbPM{8U?`)P!L48znx~t zcUXbPwRTe6Qug$wiH)s{5>;GmZ7UXSOj)w6aMsaMt*QEZFIMH7{P_}*b{*5|JMpzA)U`$a1eb z%tqla&kRQ61hz8`k{^~cp4-{_y}*Sy>X%tsO&xC8kys=-XCN(Xdf>; pF4WV|UnEnm!^kFc3M8x8@_XT*JB&6Ad$mp&3$;yh0|pH|908i%-J1Xa literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Grey.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Grey.ico new file mode 100644 index 0000000000000000000000000000000000000000..df6752532a772924bdb21e69116bfe74163c1495 GIT binary patch literal 635 zcmZQzU}Ruo5D;Jh(h3axj0_BF3=9kk3J|^(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G)kemwissZ;-33d+j9)vqw)Xvn;`E%)~S^YiT=AHBXl{=dAmbhkl6$l2ZH@7+un zEL`|dS96vj&xw;Kf7X9~=G!E(tny03!2}0?|MT?==Isx7yF`-V5|7WZ`sq56kC?Ce z?O}{CZDu&ZkYo^cb_ydK8$)t z&?q>zfr2B#{q41lyoVJ8S`)vW)QW86Okga(V9dg5e8GStseQ?!ZF+W`;u96i7^izY z^bG$WU-@Qv`r5sjYvoUGa(FN7 zaOwx6gRDKnlpz087Wbqbyf`(Nz6{!~cN+0}n+25M$pT literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Orange-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Orange-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..3840f65ddc312ad0aa7f7e26ab3f386d38ab51dc GIT binary patch literal 643 zcmZQzU}Ruo5D;Jh(h3Z$j0_BF3=9kk3J`t-kgpBIodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GVWL#*+ovCM=db+OR&_dSCtBYhULJ{M)ioavf0Q z{cWp%!p-;f^<_;H0wg~aIljwZQFe*9VyD9I@6UZ>zXiNqBH6G|l4XPDu{QfPtNwH^ zoN09600YCZ+$gQ(qCNY84q)(f^>bP0l+c7F5EOvY3gAE}uB!S1f52d!CQTa@gq5x4O>KmG$&3_I`QHF%at>;(u@S}@UQ=~ zhuz-R=AB!`2|xdU*@xCnF#Ysv+WhOn^$o3eq!U!dnRTA7Wyt;+eL$e7=_|uiyH#G| zi_MOfX?96R@CWSV`2Aqh%?hBZzsUD?1S Hg$P#wo@wQU literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Orange.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Orange.ico new file mode 100644 index 0000000000000000000000000000000000000000..6d403174225e8a101d6f00322aa44174eed8715c GIT binary patch literal 655 zcmZQzU}Ruo5D;Jh(h3a1j0_BF3=9kk3J`u6kZ%dZodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G%SZz;dZ`oBG^nPJAW-`=bK*WbU^D87Hj?2q-a(?kz31exB?`RHKE z@M6jG?_%MJR~vc~XBqO`2z>hg|IITgO%ls0uQVJ?IPkFO`2T2bng0%3C#Ny^d|vv` zLVQKpBi;k6Bv~BT1e!NyE#omTU|{&q%C|wi(;)!p90pHUKbLh*2~AjnL;)zR01lGk zs;VzQ4vm837$`_0+><4)JUDYE=;`ChpXKCdPx(FnRz-O1hx!$!HyF=+f`*A>=%1v# zWB*Gd!*<9zWS`F8R`H;W!B*$^ONOe*zN?I1w#Xc2{IU&59LV|j<=!K$HEaP*g^_%R zH27d)wJJGB?C^&b%xY(FjgKVP@t5A)V}`}i6n>sH#IW6iSt zE7NebNMJ!bb3qgz)0Q%ZxYLde)A$rJEIBTmVswe*V^Uzhz$Bdd^8gbY8^hF^23fls LK^nk-f`=*qJW=gm literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Pink-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Pink-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..4b022de6b48a4ce24c0e8c6aa08840fe0514a5e1 GIT binary patch literal 640 zcmZQzU}Ruo5D;Jh(h3Yrj0_BF3=9kk3J`t-kgoy6odJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GwBdT}?*02;-uygYpzh`_*>#dv z8}8Zu?>yL_b-iE8UP=q;bjL#$u2-C@kCySweQ+^V@I%myaS3}#1fe3;zkTW@F* z%qAhhz?K^E%IiQ_572f7Pgg&ebxsLQSVBMnD6Ievf#RyFFF+2BLf`}_1R~tu_8D>= zau9I+t`c{YJMt#C8CTalCxIm88ysrO1$0<0cl4_4Z9TDrdGms_YbKLBAJkMleQx{x za`V-N%%^MLF=n3fHAE#CMYi{UpHgf_M&Nx zCf6@c6J_^!&-_f%(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G^WY|wfwJo%XOFSf7-K}8D>1w{<`|#{&#nq#pCs(e$}sw7CgidWGdhJ!r3$- z|KOJ8(_e=tU2W(|oMp%pA%5-4|Fm;SO%ls0uQVJ?IKcM5?Z0=8_CJTMlhYU?Hpd^G ze|Y8Pm<6{w%^6mw2{1@H@Elt;)9Anf28Q1)f<&bRruDtt>$*RL?W!Fc8qG+dlR zYxZWm{J%5Lb%(4&_UV3?FAvKYY;}&mWT=YlyUO@wi_BrhFWZ1bHTN>xy)pZRRx?gX zh?&-G(8YYM)%5TFnVV<4l9+wez~)s$AbXEh!WG8Fd=jMxPLv@+Z|(B+%m=3Z4*g>} z$LcI=mhE4ehO0#a3)-0rqWGA$lrhAec5Il&r;uUEap4rBOC%qY0{aCf;nbf8nAq4D S`eyg;{(6XA3>aAOkOcsQEAh+# literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Purple-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Purple-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..d472346c3cb586cc18d4d006089a8baafef0aeb0 GIT binary patch literal 639 zcmZQzU}Ruo5D;Jh(h3Z$j0_BF3=9kk3J`t>kgpBIodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GfdN#H6ya3yT#ga!Gnm5z~lN^^Lm$>9^ zn;at&zCrGRiEB>tRSn^zqHDf0@P7cKAD0`ReyB>{Tgz~={PUXgRks^v%~6|c`h!Q{ zsmaSV2eTbQ{3f513So=~aT!@nPGw$-Y%ZB&FZJ{;-viD#d)dylzPZzY!2}Oe0G2r7 AX8-^I literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Purple.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Purple.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc82a8a9701a4ab63f4535ac3384bfa8e5fe3477 GIT binary patch literal 657 zcmZQzU}Ruo5D;Jh(h3YBj0_BF3=9kk3J`uckZ%RVodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GT`e8TdXf{``@0`%rN6wZ|wPh@-u(R>&M0Z|5ERHA*qFNN!Gj>Wo%a) zc7~?U&wEkR70PVXmU+xzfo)t&?rofgTf@jJz3&Pg5&4Zr{Efc+0S7S~G*Ltiy#Ofdx~UJ2uI%IPfiCRXg>mk(Gys;iC(K=<-a1 KDqu*#gB1Ynjpnfc literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Red-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Red-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..66dadf6d897a10eca2c1dce9a2415720559f6eb6 GIT binary patch literal 632 zcmZQzU}Ruo5D;Jh(h3Yrj0_BF3=9kk3J`t(kgoy6odJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_GEc}p zkBUSHaPo28o-hWmK|5d+Pj1sdP8D=Nt{P50x9nW)i z3L_gEgOakR%fvh0GC{RptJ%w1d6Mwz5qEi3V{Ql5QuPpJHe5w z*@4Hkcv9Tb_9E4HEYtO5@)tdSx$VI=F4rYK>Ju8brM*%+=JfgDTeUsM5BQ(|{`X}0 zUDXFmcWzy)&bxo_)9X6k>=`E}Ge#AeIRx+Hx-e}&tBj(%2fu-J`TWDqnag&i9TmLP zE}tQ_pFKHp(<6?Tx(Aqa!04Yzf<{;CmtTy|^Yj-Nr(b%_w&sb&yNIUq3}Jnb`&27< xJx&$g*~nt}V71I~S?>nM*+nwtItN2S`+a|IWUgT9T^xVM-QgiGFo@vc2>{b{;4c6G literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Red.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Red.ico new file mode 100644 index 0000000000000000000000000000000000000000..03d321d7901f59cbfb50c3338c106f9ab6f17321 GIT binary patch literal 650 zcmZQzU}Ruo5D;Jh(h3ZMj0_BF3=9kk3J`uUkZ%seodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G>S+n!!|NouBA0I7GP5m!kU8%^U5c+xM42clt zbJM2T)!w?&63T4UmU+w|fj!_sWTBxW&t;pe0|^ER)de5^n=&%iFSzAt%&_cdN!BXv z5bKX@30HZT6qq{>MwkY(Nk}kQE&DtD>kijRK*un6y85}Sb4qB!5+DjdX$5eA6jxP! z0di;*AcsK#65;;#oFQM6fyl9s_l~Z%Fr2tS$jpx+HK|FsfGxayPxFgMfduEicc!eKzv->yYaLzmF|qnEmnm(dYZvCE8Y`&tfa{6k-cF zzTAeN+2WBSL--x;2R-@>cRsQ{ShCeH_W9ojlev$6oX609{BTU@#q;82>I{q=4h&2J z2kM!R=``2Qx|cIg{K2E+o9^7Qkv|}PypW-(P{#B@s*F2lh4k@2#;~J>91C`Yethq@ T(t7R*!`&bGKk5TR2_B>X(;Mid literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Images/Cube-Yellow-Dark.ico b/RevitAddin.Icon.Example/Resources/Images/Cube-Yellow-Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..d57679200bc1b64dddb737351b1ce1059172af38 GIT binary patch literal 647 zcmZQzU}Ruo5D;Jh(h3ahj0_BF3=9kk3J`u2kgp5GodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G= zK#}FI*Z%K3=Q2QKh1-4IDWeE$5^ zKSwY4NG2pOFiexm(>%7JniuE<22WQ%mvv4FO<00K0Vu5i4u;~YsxLqeje_A6C>SE# z-}YH^9SRU|O;^o3%6l_Y`9@dAg6ht_zFr5F7C0I#jd-GbBZ5UzvV#ALkB{+8j&rTS zapxN6%Za^~d*;{_*>EZ4x2P5G{%uc>pIu<*;2bBtKsBA&%~yE&=j0_BF3=9kk3J`u2kZ%LTodJICyj)UTKq+2N50@Yy4b;IP zz`+J2(0r%1aer?9eo`c7&i8E|4C#8@;M7UB8wRq_zr_G7M5?R=qs{+H|()!(<%{PX`aYSt}`OS10mzaf5= zVZpQI=KRx=uQv1~&NAeQFjs!_|7@)#i=ofw6^zXX8%!t1{MUa~_?P*r-z>(2vv=3k z^R4eKZp>1@$FOFWBSQ*n!tpmD07@%> zL#4Q?>I;xVqfj{o3Y7@=WQi*eUi=DrdN_NtynNK;uk&wJ-2F1)e?ayI<{3|+!7_E# zk7xJJ{5PKcrog)4+O+raZ@Ou&VjZN_Z1o&VymJpRR=Wm_xD zux-!nuje0bEz}Em{qi}(nrY1pwlWQuiv$*IW&RMw$F!w{!SS?XLl~dJsUiUe%LcI- a8mHOC3=9|;^!H!=$Rr|=1Pm;A$N~Ut$L_8G literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Resources/Revit.ico b/RevitAddin.Icon.Example/Resources/Revit.ico new file mode 100644 index 0000000000000000000000000000000000000000..c44940179da1e3336534965e6b9cc41b0c1de8b2 GIT binary patch literal 982 zcmZQzU}Ruo5D;Jh(h3aij0_BF3=9kk3J|^~69dCqpjc;spF1y?6cNS%G}c0*}aI1_r*vAk26? ze?isc;7FDbxKi|Vf5HjPMTYBtOLZ`= zG@kct*_oPY$8wDy%1X02?kcV6q#@I=zT_HvrdZthJIZ5uO| zNVP?EGn^3Xw`!1JUtXfwiMOnL)o_iMqkGvqw+?*^ z69ztpRyLk9_8#i&UvgO0c0JnvKlb+jfAt@vv^ZEQxnDkE$Vqtpv;P0mO&edcCeE^Y zaO?7aU?gvN-JH0}ieU=dlHz~=>c6mQF|ZsIE?~Fk2)@gxuyNB1 zQTXxxf87If5&}B4*bj?XHw4+dYB>0|;l#Y?|DlJ&4~bqBa$ehR{Xlv}=$UMD&ecg# z2`j!Tu-n|_dBxvw!=ZEk3$D!8gVPo>>&@o;+%T!6kmbs$K!XVljf@O+og0-NY(97e J829jm0swF6qmKXp literal 0 HcmV?d00001 diff --git a/RevitAddin.Icon.Example/Revit/App.cs b/RevitAddin.Icon.Example/Revit/App.cs new file mode 100644 index 0000000..207f563 --- /dev/null +++ b/RevitAddin.Icon.Example/Revit/App.cs @@ -0,0 +1,41 @@ +using Autodesk.Revit.DB; +using Autodesk.Revit.UI; +using ricaun.Revit.UI; +using System.IO; + +namespace RevitAddin.Icon.Example.Revit +{ + [AppLoader] + public class App : IExternalApplication + { + private static RibbonPanel ribbonPanel; + private static RibbonImageThemeSelector ribbonImageThemeSelector; + public Result OnStartup(UIControlledApplication application) + { + ribbonImageThemeSelector = new RibbonImageThemeSelector(application); + + var icons = new[] { "Grey", "Red", "Yellow", "Green", "Cyan", "Blue", "Purple", "Pink", "Brown" }; + + ribbonPanel = application.CreatePanel("RevitAddin.Icon.Example"); + foreach (var icon in icons) + { + ribbonPanel.CreatePushButton(icon) + .SetLargeImage($"Resources/Images/Cube-{icon}.ico"); + } + + ribbonImageThemeSelector.AddRibbonItem(ribbonPanel.GetRibbonItems()); + + ribbonImageThemeSelector.UpdateImages(); + + return Result.Succeeded; + } + + public Result OnShutdown(UIControlledApplication application) + { + ribbonPanel?.Remove(); + ribbonImageThemeSelector?.Dispose(); + return Result.Succeeded; + } + } + +} \ No newline at end of file diff --git a/RevitAddin.Icon.Example/Revit/Commands/Command.cs b/RevitAddin.Icon.Example/Revit/Commands/Command.cs new file mode 100644 index 0000000..e8a82fa --- /dev/null +++ b/RevitAddin.Icon.Example/Revit/Commands/Command.cs @@ -0,0 +1,20 @@ +using Autodesk.Revit.Attributes; +using Autodesk.Revit.DB; +using Autodesk.Revit.UI; +using System; + +namespace RevitAddin.Icon.Example.Revit.Commands +{ + [Transaction(TransactionMode.Manual)] + public class Command : IExternalCommand + { + public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elementSet) + { + UIApplication uiapp = commandData.Application; + + UIThemeManager.CurrentTheme = UIThemeManager.CurrentTheme == UITheme.Light ? UITheme.Dark : UITheme.Light; + + return Result.Succeeded; + } + } +} diff --git a/RevitAddin.Icon.Example/Revit/RibbonImageThemeSelector.cs b/RevitAddin.Icon.Example/Revit/RibbonImageThemeSelector.cs new file mode 100644 index 0000000..7257412 --- /dev/null +++ b/RevitAddin.Icon.Example/Revit/RibbonImageThemeSelector.cs @@ -0,0 +1,94 @@ +using Autodesk.Revit.UI; +using ricaun.Revit.UI; +using System; +using System.Collections.Generic; +using System.Windows.Media.Imaging; + +namespace RevitAddin.Icon.Example.Revit +{ + public class RibbonImageThemeSelector : IDisposable + { + private readonly UIControlledApplication application; + private List ribbonItems = new List(); + public RibbonImageThemeSelector(UIControlledApplication application) + { + this.application = application; + this.application.ThemeChanged += Application_ThemeChanged; + } + + internal void AddRibbonItem(IList ribbonItems) + { + foreach (var ribbonItem in ribbonItems) + { + AddRibbonItem(ribbonItem); + } + } + + public void AddRibbonItem(RibbonItem ribbonItem) + { + ribbonItems.Add(ribbonItem); + } + + public void UpdateImages() + { + foreach (var ribbonItem in ribbonItems) + { + UpdateImageTheme(ribbonItem); + } + } + + private static string ReplaceLastOccurrence(string source, string find, string replace) + { + int place = source.LastIndexOf(find); + if (place == -1) + return source; + + string result = source.Remove(place, find.Length).Insert(place, replace); + return result; + } + + private void UpdateImageTheme(RibbonItem ribbonItem) + { + const string ICO = ".ico"; + const string ICO_DARK = "-dark.ico"; + + var theme = UIThemeManager.CurrentTheme; + if (ribbonItem is RibbonButton ribbonButton) + { + if (ribbonButton.LargeImage is BitmapSource source) + { + var sourceString = source.ToString().ToLowerInvariant(); + if (theme == UITheme.Dark) + { + if (ReplaceLastOccurrence(sourceString, ICO, ICO_DARK).GetBitmapSource() is BitmapSource darkSource) + { + ribbonButton.SetLargeImage(darkSource); + } + } + + if (theme == UITheme.Light) + { + if (ReplaceLastOccurrence(sourceString, ICO_DARK, ICO).GetBitmapSource() is BitmapSource lightSource) + { + ribbonButton.SetLargeImage(lightSource); + } + } + } + } + + } + + private void Application_ThemeChanged(object sender, Autodesk.Revit.UI.Events.ThemeChangedEventArgs e) + { + UpdateImages(); + } + + public void Dispose() + { + this.application.ThemeChanged -= Application_ThemeChanged; + } + + + } + +} \ No newline at end of file diff --git a/RevitAddin.Icon.Example/RevitAddin.Icon.Example.csproj b/RevitAddin.Icon.Example/RevitAddin.Icon.Example.csproj new file mode 100644 index 0000000..c1bd503 --- /dev/null +++ b/RevitAddin.Icon.Example/RevitAddin.Icon.Example.csproj @@ -0,0 +1,199 @@ + + + + + Library + AnyCPU + true + latest + false + None + + Debug 2024; 2024; + + + + + + + + 2017 + net46 + + + + + 2018 + net46 + + + + + 2019 + net47 + + + + + 2020 + net47 + + + + + 2021 + net48 + + + + + 2022 + net48 + + + + + 2023 + net48 + + + + + 2024 + net48 + + + + + 2017 + net46 + + + + + + + true + bin\Release\$(RevitVersion) + REVIT$(RevitVersion) + MSB3052 + None + + + + + true + bin\Debug\ + DEBUG;TRACE;REVIT$(RevitVersion) + Full + + + + + $(RevitVersion) + Program + C:\Program Files\Autodesk\Revit $(DebugRevitVersion)\Revit.exe + + + + RevitAddin.Icon.Example + 1.0.0 + {A206D7F5-A69C-4011-BD5B-9E419B5DE41E} + + + + + + + false + $([MSBuild]::Divide($([System.DateTime]::Now.TimeOfDay.TotalSeconds), 4).ToString('F0')) + .Dev.$(Version).$(Revision) + + + + ricaun + Luiz Henrique Cassettari + Revit Plugin Description for $(PackageId). + $([System.DateTime]::Now.ToString('yyyy')) + + + + $(PackageId)$(PackageAssemblyVersion) + $(PackageId) + Copyright © $(CopyrightYears) $(Company) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..07d4307 --- /dev/null +++ b/build.cmd @@ -0,0 +1,3 @@ +cd .\Build\ +call build.cmd %* +timeout 15 \ No newline at end of file