пятница, 27 сентября 2024 г.

[Revit API] - Простой макрос

 


По мотивам сообщения https://t.me/bimsapr/175492 сделал видеоролик с решением подобной задачи с помощью макроса Revit

 

Из видео узнаете:

- как найти BuiltInParameter для получения системного параметра

- как получить все типы стен в документе

- как получить строковое значение параметра

- как изменить имя типа

- как использовать транзакцию для внесения изменений


Три важных момента по применению макросов в Revit:

1. Макросы рекомендую использовать для таких мелких задачек или если что-то нужно пощупать по-быстрому в Revit API

2. Если видите что код разрастается или есть необходимость передачи пользователям - значит пора переходить к написанию плагина 

3. Рекомендую использовать макросы приложения, а не документа. При использовании макросов документа SharpDevelop время от времени падает. Отыскать исходный текст макроса можно, но сложно. Код макроса приложения же никуда не теряется, лежит себе спокойно в

%programdata%\Autodesk\Revit\Macros


Успехов!

воскресенье, 30 июня 2024 г.

[Revit API] - Пример csproj для сборки под разные версии Revit

Написать заметку меня побудила статья Александра Зуева:

https://weandrevit.ru/obnovlenie-na-revit-api-2025-net8/

Благодарю Александра за труд и за то что делится своими наработками!

 

При чтении глаз зацепился за этот момент:

 

Сам когда-то писал точно так же. Если используется две-три версии Revit, то ещё терпимо, а при большом числе поддерживать такой файл проекта окзалось весьма затруднительно.

Чтобы утоптать эту часть задал переменную  RvtVersion

<PropertyGroup Condition="$(Configuration.Contains('RVT2015'))">
  <RvtVersion>2015</RvtVersion>
  <TargetFramework>net45</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2016'))">
  <RvtVersion>2016</RvtVersion>
  <TargetFramework>net45</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2017'))">
  <RvtVersion>2017</RvtVersion>
  <TargetFramework>net452</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2018'))">
  <RvtVersion>2018</RvtVersion>
  <TargetFramework>net452</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2019'))">
  <RvtVersion>2019</RvtVersion>
  <TargetFramework>net47</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2020'))">
  <RvtVersion>2020</RvtVersion>
  <TargetFramework>net47</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2021'))">
  <RvtVersion>2021</RvtVersion>
  <TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2022'))">
  <RvtVersion>2022</RvtVersion>
  <TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2023'))">
  <RvtVersion>2023</RvtVersion>
  <TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2024'))">
  <RvtVersion>2024</RvtVersion>
  <TargetFramework>net48</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('RVT2025'))">
  <RvtVersion>2025</RvtVersion>
  <TargetFramework>net8-windows</TargetFramework>
</PropertyGroup>


Для задания условий по конфигурациям типа Debug и Release сделал два блока с условиями:

<PropertyGroup Condition="$(Configuration.Contains('Debug'))">
  <DefineConstants>TRACE;DEBUG;RVT$(RvtVersion)</DefineConstants>
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
</PropertyGroup>

<PropertyGroup Condition="$(Configuration.Contains('Release'))">
  <DefineConstants>RVT$(RvtVersion)</DefineConstants>
  <Optimize>true</Optimize>
  <DebugType>pdbonly</DebugType>
</PropertyGroup>

 

Таким образом, для задания путей к библиотекам Revit API можно использовать переменную RvtVersion, не требуется громадный блок Choose-When

<ItemGroup>
    <Reference Include="AdWindows">
      <HintPath>C:\Program Files\Autodesk\Revit $(RvtVersion)\AdWindows.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RevitAPI">
      <HintPath>C:\Program Files\Autodesk\Revit $(RvtVersion)\RevitAPI.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RevitAPIUI">
      <HintPath>C:\Program Files\Autodesk\Revit $(RvtVersion)\RevitAPIUI.dll</HintPath>
      <Private>False</Private>
    </Reference>
</ItemGroup>

 

В <PostBuildEvent> также компактная запись:

<PropertyGroup>
  <OutputPath>bin\$(Configuration)</OutputPath>
  <InstallAddinPath>$(MSBuildProjectDirectory)\..\Publish\Release\Autodesk\REVIT\Addins\$(RvtVersion)</InstallAddinPath>
  <StartAction>Program</StartAction>
  <StartProgram>$(ProgramW6432)\Autodesk\Revit $(RvtVersion)\Revit.exe</StartProgram>
  <StartArguments>/viewer</StartArguments>
  <PostBuildEvent>
    echo "$(AppData)\Autodesk\REVIT\Addins\$(RvtVersion)"

    if $(Configuration) == RVT$(RvtVersion)Release (
    mkdir "$(AppData)\Autodesk\REVIT\Addins\$(RvtVersion)"
    copy "$(MSBuildProjectDirectory)\ConnectToElPanel.addin" "$(AppData)\Autodesk\REVIT\Addins\$(RvtVersion)"
    copy "$(MSBuildProjectDirectory)\$(OutputPath)\$(TargetFramework)\ConnectToElPanel.dll" "$(AppData)\Autodesk\REVIT\Addins\$(RvtVersion)"
    md $(InstallAddinPath)
    copy "$(MSBuildProjectDirectory)\ConnectToElPanel.addin" "$(InstallAddinPath)\"
    copy "$(MSBuildProjectDirectory)\$(OutputPath)\$(TargetFramework)\ConnectToElPanel.dll" "$(InstallAddinPath)")
  </PostBuildEvent>
</PropertyGroup>


При таком подходе файл проекта становится намного компактнее и проще в поддержке

С полным текстом примера можно ознакомиться тут.

Рекомендую ознакомиться с примерами в репозитории

https://github.com/Nice3point/RevitTemplates

 

Успехов!