Cum plugins developing applications CAD (
Cum unum tantum plugin habes vel in hac re initium sui edoctus es, simpliciter exemplar propositi facere potes, loca necessaria in eo muta et novam versionem plugin congrega. Ideoque sequentes mutationes in codice multiplicem impensarum laboris incrementum sequent.
Cum experientiam et scientiam nancisceris, multipliciter invenies hunc processum automate. Hanc viam ambulavi et volo tibi dicere quid finivi et quam commodum sit.
Prius inspiciamus rationem manifestam et qua diu usus sum.
Links ut proiciamus files
Et ut omnia simplicia, visiva et intelligibilia faciamus, omnia utentes exemplo plugin evolutionis abstracto describam.
Aperiamus Studio Visual (Communitatem MMXIX versionem habeo. Et sic - in Russian) et novam solutionem crea. Vocemus eum MySuperPluginForRevit
Plugin Faciemus pro Revit pro versions 2015-2020. Ergo novum propositum in solutione (Net Framework Class Library) faciamus et appellant MySuperPluginForRevit_2015
Nexus ad Revit API addere opus est. Certe nexus localium imaginum addere possumus (necesse erit nos omnes SDKs vel omnes Revit versiones necessarias instituere), sed recta semita statim sequemur et sarcina NuGet coniungemus. Paucis fasciculis potes invenire, sed meo utar.
Post connectens in sarcina, item in dextra click "References"Et eligere item"Movere packages.config ad PackageReference ...»
Si subito in hoc loco expavescere incipis, quia in fenestra proprietatum sarcinarum nullae magni momenti erunt "Effingo localiter", quam certum est ad valorem proficisci falsum,, noli expavescere - vade ad folder cum incepto, aperi tabella cum .csproj extensione in editore convenienti tibi (uti Nota +) et ingressum in sarcina nostra ibi invenies. Spectat hoc modo:
<PackageReference Include="ModPlus.Revit.API.2015">
<Version>1.0.0</Version>
</PackageReference>
Addere proprietatem runtime. Eveniet sic:
<PackageReference Include="ModPlus.Revit.API.2015">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
Nunc, cum struis consilium, fasciculi e sarcina non transcribendum ad output folder.
Amplius eamus - statim cogitemus nostrum plugin ex Revit API aliquo usu fore, quod tempore mutatum est cum novae versiones dimissae sunt. Bene, vel solum necesse est aliquid mutare in codice secundum versionem Revit pro qua plugin facimus. Ad huiusmodi differentias in codice componendas, symbolis compilationalibus condicionalibus utemur. Aperi proprietates project, vade ad "tabconventus" et in agro "Conditionalis compilatio notatio"Scribe" R2015.
Nota symbolum addendum esse tam debug quam de configurationibus dimittendis.
Bene, dum in fenestra proprietatum sumus, statim ad tabapplication" et in agro "Default spatio nominali»Quin removere _2015ita ut nomen nostrum universale et extra conventum nominis sit;
In casu finali, pluginae omnium versionum in unum folder ponuntur, ideo nomina conventus mei manent cum suffixo formae. _20хх. Sed suffixum e nomine conventus removere potes, si tabellae in diversis folder ponendae existimantur.
Eamus in tabella codice Class1.cs et simulant ibi aliquem codicem, inspecta uaria Revit;
namespace MySuperPluginForRevit
{
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
[Regeneration(RegenerationOption.Manual)]
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
#if R2015
TaskDialog.Show("ModPlus", "Hello Revit 2015");
#elif R2016
TaskDialog.Show("ModPlus", "Hello Revit 2016");
#elif R2017
TaskDialog.Show("ModPlus", "Hello Revit 2017");
#elif R2018
TaskDialog.Show("ModPlus", "Hello Revit 2018");
#elif R2019
TaskDialog.Show("ModPlus", "Hello Revit 2019");
#elif R2020
TaskDialog.Show("ModPlus", "Hello Revit 2020");
#endif
return Result.Succeeded;
}
}
}
Statim in omnibus versionibus Revit supra versionis 2015 (quae tempore scriptionis praesto erant) consideravi et statim inspexi coram symbolis conditionalibus compilation, quae creantur utendo eodem exemplo.
Let's move on to the main highlight. Novum propositum in solutione nostra creamus, solum ad versionem plugin pro Revit 2016. Repeamus omnes gradus supra descriptos, respective, numerum MMXV numero 2015. Sed tabella reponens. Class1.cs delere de novo project.
File cum codice requiritur - Class1.cs - iam eam habemus et mox opus est ut vinculum cum illo in novo incepto inseramus. Dupliciter inserendi nexus:
- Long - right-click in project et eligere "addere» ->«Existens elementum", in fenestra aperiens, tabellam quaesitam inveniat et pro optione"addere" eligere optionem "Addere ut nexum»
- brevis - directe in solutione exploratoris, tabellam desideratam (vel etiam fasciculos, vel etiam folders integras) elige et in novum project trahe dum Altam clavem tenens. Ut trahis, videbis quod cum Alt key premes, murem cursorem a plus signo ad sagittam mutabit.
UPD: Parum posui confusionem in hac paragrapho - varias transferre fasciculos, quos tenere debes Alt Amoveo +!
Post modum procedendi, tabellam habebimus in secundo proposito Class1.cs cum icone correspondente (sagitta caerulea);
Cum codicem in fenestra editoris emendo, etiam eligere potes utra contextus contextus ad codicem exhibendum in quo codicem editum videre sinet sub diversis symbolis sub compilatione condicionis;
Omnia alia incepta (2017-2020) hac ratione utentes creamus. Vita hack - si limas in Solutio Explorer trahis non ex basi incepti, sed ex incepto ubi iam inserta sunt ut nexum, tunc non tenes Alt key tenere!
Optio descripta satis bona est donec momentum novam versionem plugin addit vel usque ad momentum novos tabulas ad iniciendum addit - haec omnia nimis taedium evadunt. Et nuper subito subito intellexi omnia uno incepto exsistere et ad secundum modum moveri
Magica figurarum
Finita lectione hic dicas, "Quare primum modum describit, si articulus est statim de secundo?" Atque omnia descripsi ut clarius patefaceremus cur symbolorum conditionalium compilatione indigeamus et quibus in locis consilia nostra differant. Et nunc plane nobis clarius fit quantas differentias in inceptis ad efficiendum opus sit, uno tantum consilio relicto.
Et ut omnia manifestiora faciamus, novum consilium non creabimus, sed mutationes ad propositum nostrum primo modo creatum reddemus.
Primum igitur omnia incepta a solutione removemus praeter unum principale (linea directe continens). Illae. incepta pro versionibus 2016-2020. Aperi folder cum solutione et folders harum inceptorum ibi dele.
Unum consilium habemus in consilio nostro relicto - MySuperPluginForRevit_2015. Aperi proprietates ejus &;
- In tab "application"Quis removere ab ecclesia nomen _2015 (Quare postea patebit)
- In tab "conventus»Conscriptionis symbolum removere R2015 ex correspondentes agri
Nota: postrema versio Visual Studiorum cimex - conditionalis symbola compilation in fenestra proprietatum delineatarum non ostentantur, tametsi in promptu sunt. Si hoc glitch experiris, necesse est ut manually e fasciculo .csproj removeres. Sed adhuc habemus elaboraret ea, tantas legimus in per.
Rename Solutio in Solutio in fenestra Explorer subtrahendo suffixo _2015 et tunc ex solutione removere project. Hoc opus est ordinem et affectus perfectionistarum servare! Folder solutionis nostrae aperimus, renominant consilium folder eodem modo et projectum in solutionem oneramus.
Aperi configurationem procurator. US configuratione Release in principio, non erit opus, sic delemus. Novas figurationes cum nominibus creamus quae iam nobis nota sunt R2015, R2016, ... , R2020. Nota te non opus esse uncinis ex aliis conformationibus imitari et non opus esse ad figurationes projectas creandas;
Vade ad folder cum incepto et aperi tabella cum .csproj extensione in editore convenienti tibi. Obiter eam in Studio Visuali aperire potes - opus exonerare inceptum ac deinde desideratum item in contextu menu erit:
Recensere in Visual Studio etiam potior est, cum editor adsimilat et suggerat.
In tabella elementa videbimus
Vade ad elementum commune PropertyGroup et videte rem ConventusName - hoc nomen conventus et illud sine suffixo habere debet _2015. Si suffixum est, removendum est.
Inveniens elementum cum conditione
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
Non opus est - delemus.
Element cum conditione
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
opus erit ad operandum in scaena codicis evolutionis et debugging. Mutare potes proprietates suas ad aptas necessitates tuas - pone vias varias output, symbola muta scribendarum conditionalium, etc.
Nunc faciamus nova elementa PropertyGroup pro nostris conformationibus. In his elementis tantum opus est quattuor proprietates ponere;
- OutputPath - output folder. Et posuit default valorem binR20xx
- DefineConstants — symbola conditionalis compilatio. De valore debet esse certa VESTIGIUM: R20хх
- TargetFrameworkVersion — versio suggestus. Variae Revit API versiones diversae tabulae ut specificatae requirunt.
- ConventusName - nomen conventus (i.e. lima nomen). Scribere potes nomen synthesis, sed pro mobilitate suadeo scribendo valorem $(AsseblyName)_20хх. Ad hoc faciendum, nos antea suffixos e nomine conventus removimus
Potissimum omnium horum elementorum notum est quod in alia incepta simpliciter transcribi non possunt nisi omnino mutato. Postea in articulo omnia contenta fasciculi .csproj apponam.
Bene, proprietates rei figurasti - difficile non est. Sed quid agat de obturaculis in bibliothecis (NuGet fasciculis). Si ulterius inspiciamus, bibliothecas inclusas denominari in elementis videbimus
Elementum ad nostrum auxilium venit
Uti elementum Eligevarias fasciculos NuGet pro diversis conformationibus constituimus;
Omnia contenta csproj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{5AD738D6-4122-4E76-B865-BE7CE0F6B3EB}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MySuperPluginForRevit</RootNamespace>
<AssemblyName>MySuperPluginForRevit</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>binDebug</OutputPath>
<DefineConstants>DEBUG;R2015</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2015|AnyCPU' ">
<OutputPath>binR2015</OutputPath>
<DefineConstants>TRACE;R2015</DefineConstants>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2015</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2016|AnyCPU' ">
<OutputPath>binR2016</OutputPath>
<DefineConstants>TRACE;R2016</DefineConstants>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2016</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2017|AnyCPU' ">
<OutputPath>binR2017</OutputPath>
<DefineConstants>TRACE;R2017</DefineConstants>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2017</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2018|AnyCPU' ">
<OutputPath>binR2018</OutputPath>
<DefineConstants>TRACE;R2018</DefineConstants>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2018</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2019|AnyCPU' ">
<OutputPath>binR2019</OutputPath>
<DefineConstants>TRACE;R2019</DefineConstants>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2019</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2020|AnyCPU' ">
<OutputPath>binR2020</OutputPath>
<DefineConstants>TRACE;R2020</DefineConstants>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<AssemblyName>$(AssemblyName)_2020</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="PropertiesAssemblyInfo.cs" />
</ItemGroup>
<Choose>
<When Condition=" '$(Configuration)'=='R2015' ">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2015">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='R2016' ">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2016">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='R2017' ">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2017">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='R2018' ">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2018">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='R2019' ">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2019">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='R2020' or '$(Configuration)'=='Debug'">
<ItemGroup>
<PackageReference Include="ModPlus.Revit.API.2020">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
</ItemGroup>
</When>
</Choose>
<Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" />
</Project>
Quaeso note quod in una condicionum duarum figurarum per me specificatarum OR'. Hoc modo sarcina requiritur in configuratione coniungetur Notice.
Et hic fere omnia perfecta habemus. Retro consilium oneratis, da configurationem quam indigemus, item vocamus "in menu contextu solutionis (non documentum)Restitue omnia NuGet packages"et videmus quomodo fasciculi nostri mutentur.
Hac in scaena ad finem mortuum veni - ut omnes schemata simul colligeremus, coetum batch uti potuimus.conventus» ->«Batch constructum"), sed cum configurationes mutandi, fasciculi automatice non restituuntur. Convenientibusque documentis hoc quoque non contingit, sed ratione habita. Solutio huius quaestionis per vexillum significat non inveni. Et hoc maxime probabile est etiam Visual Studio bug.
Ideo, ad batch conventus, placuit speciali automated systematis conventus uti
Ergo, vade ad folder solutionis nostrae (non propositum), clavem tene shift and right-click in vacuo spatio in folder - in contextu menu item lego "Patefacio PowerShell fenestra hic".
Si non installed nullaErgo prius scribe imperium
dotnet tool install Nuke.GlobalTool –global
Nunc scribe imperium nulla et promptus ad configurare nulla ad hodiernam delineationem. Nescio quomodo haec rectius in Russian - Anglice scribetur ".nuke limam invenire non potuit". Vis aedificare aedificare? [y/n]
Preme Y key et tunc erunt directa occasus items. Non opus est simplicissima optio utens MSBuildsic respondemus sicut in screenshot:
Eamus ad Studios Visual, quae nos suggeret ut solutionem reload, quia novum inceptum ei adiectum est. Nos solutionem reload et videamus nos habere consilium ædificem in quo intersunt tantum unum fasciculum - Build.cs
Aperi hanc fasciculum et scribe litteras ad omne schematum aedificandum. Bene, vel scripto utere meo, quod emendare potes ad usus tuos necessarios;
using System.IO;
using Nuke.Common;
using Nuke.Common.Execution;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.MSBuild;
using static Nuke.Common.Tools.MSBuild.MSBuildTasks;
[CheckBuildProjectConfigurations]
[UnsetVisualStudioEnvironmentVariables]
class Build : NukeBuild
{
public static int Main () => Execute<Build>(x => x.Compile);
[Solution] readonly Solution Solution;
// If the solution name and the project (plugin) name are different, then indicate the project (plugin) name here
string PluginName => Solution.Name;
Target Compile => _ => _
.Executes(() =>
{
var project = Solution.GetProject(PluginName);
if (project == null)
throw new FileNotFoundException("Not found!");
var build = new List<string>();
foreach (var (_, c) in project.Configurations)
{
var configuration = c.Split("|")[0];
if (configuration == "Debug" || build.Contains(configuration))
continue;
Logger.Normal($"Configuration: {configuration}");
build.Add(configuration);
MSBuild(_ => _
.SetProjectFile(project.Path)
.SetConfiguration(configuration)
.SetTargets("Restore"));
MSBuild(_ => _
.SetProjectFile(project.Path)
.SetConfiguration(configuration)
.SetTargets("Rebuild"));
}
});
}
Redimus ad fenestram PowerShell et iterum scribimus imperium nulla (Potes scribere imperium nulla significans requiratur Target. Sed unum Targetqui per defaltam currit). Post pressionem Intra clavem, hackers reales sentiemus, quia, sicut in pellicula, consilium nostrum pro diversis conformationibus sponte congregabitur.
Obiter uti potes PowerShell directe ex Visual Studio (menu "View» ->«Aliae fenestrae» ->«Package Manager Console") sed omnia in albo et nigro erunt, quod minus convenit.
Hoc concluditur meum articulum. Certus sum te posse significare optionem pro AutoCAD te ipso. Spero materiam hic propositam inveniet suos "clientes".
Спасибо за внимание!
Source: www.habr.com