CAD ์ ํ๋ฆฌ์ผ์ด์
์ฉ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ ๋(
ํ๋ฌ๊ทธ์ธ์ด ํ๋๋ง ์๊ฑฐ๋ ์ด ๋ฌธ์ ์ ๋ํด ์์ง ๋ ํํ ์ด๋ณด์์ธ ๊ฒฝ์ฐ ํ๋ก์ ํธ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ํ์ํ ์์น๋ฅผ ๋ณ๊ฒฝํ ํ ์ ๋ฒ์ ์ ํ๋ฌ๊ทธ์ธ์ ์กฐ๋ฆฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ดํ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ธ๊ฑด๋น๊ฐ ์ฌ๋ฌ ๋ฒ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
๊ฒฝํ๊ณผ ์ง์์ ์ป์ผ๋ฉด ์ด ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ ๊ฐ ์ด ๊ธธ์ ๊ฑธ์ด์๋๋ฐ, ๊ฒฐ๊ตญ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์๊ณ , ์ผ๋ง๋ ํธ๋ฆฌํ์ง ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๋จผ์ , ์ ๊ฐ ์ค๋ซ๋์ ์ฌ์ฉํด ์จ ๋ช ๋ฐฑํ๊ณ ํ์คํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ ํ์ผ์ ๋ํ ๋งํฌ
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ ๊ฐ๋จํ๊ณ ์๊ฐ์ ์ด๋ฉฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฐ์ ์ถ์์ ์ธ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Visual Studio๋ฅผ ์ด๊ณ (์ ๋ Community 2019 ๋ฒ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์, ๋ฌ์์์ด๋ก ๋์ด ์์ต๋๋ค) ์ ์๋ฃจ์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ์๊ฒ ์ ํํ์ MySuperPluginForRevit
์ฐ๋ฆฌ๋ 2015-2020 ๋ฒ์ ์ฉ Revit์ฉ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ์์ ์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฃจ์ (Net Framework Class Library)์์ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ํธ์ถํด ๋ณด๊ฒ ์ต๋๋ค. MySuperPluginForRevit_2015
Revit API์ ๋งํฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ฌผ๋ก ๋ก์ปฌ ํ์ผ์ ๋งํฌ๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง(ํ์ํ ๋ชจ๋ SDK ๋๋ ๋ชจ๋ ๋ฒ์ ์ Revit์ ์ค์นํด์ผ ํจ) ์ฆ์ ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ NuGet ํจํค์ง๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ๊ฝค ๋ง์ ํจํค์ง๋ฅผ ์ฐพ์ ์ ์์ง๋ง ๋๋ ๋ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
ํจํค์ง๋ฅผ ์ฐ๊ฒฐํ ํ 'ํญ๋ชฉ์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ์ธ์.์ฐธ์กฐ" ํญ๋ชฉ์ ์ ํํฉ๋๋ค "packages.config๋ฅผ PackageReference๋ก ์ด๋...ยป
์ด ์์ ์์ ๊ฐ์๊ธฐ ๋นํฉํ๊ธฐ ์์ํ๋ฉด ํจํค์ง ์์ฑ ์ฐฝ์ ์ค์ํ ํญ๋ชฉ์ด ์๊ธฐ ๋๋ฌธ์ "๋ก์ปฌ๋ก ๋ณต์ฌ"๋ผ๋ ๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆ๋๊ทธ๋ฐ ๋ค์ ๋นํฉํ์ง ๋ง์ญ์์ค. ํ๋ก์ ํธ๊ฐ ์๋ ํด๋๋ก ์ด๋ํ์ฌ ํธ๋ฆฌํ ํธ์ง๊ธฐ์์ .csproj ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ ์ด๊ณ (์ ๋ Notepad++๋ฅผ ์ฌ์ฉํฉ๋๋ค) ๊ฑฐ๊ธฐ์์ ํจํค์ง์ ๋ํ ํญ๋ชฉ์ ์ฐพ์ต๋๋ค. ๊ทธ๋ ๋ ์ง๊ธ ์ด๋ ๊ฒ ๋ณด์ ๋๋ค:
<PackageReference Include="ModPlus.Revit.API.2015">
<Version>1.0.0</Version>
</PackageReference>
์์ฑ์ ์ถ๊ฐํ์ธ์. ์คํ ์๊ฐ. ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
<PackageReference Include="ModPlus.Revit.API.2015">
<Version>1.0.0</Version>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
์ด์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๋ ํจํค์ง์ ํ์ผ์ด ์ถ๋ ฅ ํด๋์ ๋ณต์ฌ๋์ง ์์ต๋๋ค.
๋ ๋์๊ฐ์ ์ฐ๋ฆฌ ํ๋ฌ๊ทธ์ธ์ด ์ ๋ฒ์ ์ด ์ถ์๋๋ฉด์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ Revit API์ ์ผ๋ถ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์ฆ์ ์์ํด ๋ด
์๋ค. ๊ธ์, ์๋๋ฉด ์ฐ๋ฆฌ๊ฐ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค๊ณ ์๋ Revit ๋ฒ์ ์ ๋ฐ๋ผ ์ฝ๋์์ ๋ญ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฌํ ์ฝ๋ ์ฐจ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋ก์ ํธ ์์ฑ์ ์ด๊ณ "ํญ์ผ๋ก ์ด๋ํ์ญ์์ค.์กฐ๋ฆฝ"๊ทธ๋ฆฌ๊ณ ํ์ฅ์์"์กฐ๊ฑด๋ถ ์ปดํ์ผ ํ๊ธฐ๋ฒ"๊ธ์ ์ฐ์ R2015.
๋๋ฒ๊ทธ ๋ฐ ๋ฆด๋ฆฌ์ค ๊ตฌ์ฑ ๋ชจ๋์ ๊ธฐํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ธ์, ์ฐ๋ฆฌ๊ฐ ์์ฑ ์ฐฝ์ ์๋ ๋์ ์ฐ๋ฆฌ๋ ์ฆ์ " ํญ์ผ๋ก ์ด๋ํฉ๋๋ค.์ ์ฒญ"๊ทธ๋ฆฌ๊ณ ํ์ฅ์์"๊ธฐ๋ณธ ๋ค์์คํ์ด์คยป ์ ๋ฏธ์ฌ๋ฅผ ์ ๊ฑฐํ์ธ์ _2015๋ค์์คํ์ด์ค๋ ๋ณดํธ์ ์ด๊ณ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ๊ณผ ๋ ๋ฆฝ์ ์ ๋๋ค.
๋์ ๊ฒฝ์ฐ ์ต์ข ์ ํ์์๋ ๋ชจ๋ ๋ฒ์ ์ ํ๋ฌ๊ทธ์ธ์ด ํ๋์ ํด๋์ ๋ค์ด๊ฐ๋ฏ๋ก ๋ด ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ์๋ ๋ค์ ํ์์ ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ต๋๋ค. _20ั ั . ๊ทธ๋ฌ๋ ํ์ผ์ด ๋ค๋ฅธ ํด๋์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ์์ ์ ๋ฏธ์ฌ๋ฅผ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.
ํ์ผ์ฝ๋๋ก ๊ฐ๋ณด์ Class1.cs ๋ค์ํ ๋ฒ์ ์ 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;
}
}
}
์ ๋ 2015 ๋ฒ์ ์ด์์ ๋ชจ๋ Revit ๋ฒ์ (์์ฑ ๋น์ ์ฌ์ฉ ๊ฐ๋ฅ)์ ์ฆ์ ๊ณ ๋ คํ์ผ๋ฉฐ ๋์ผํ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ์ ์กด์ฌ๋ ์ฆ์ ๊ณ ๋ คํ์ต๋๋ค.
์ฃผ์ ํ์ด๋ผ์ดํธ๋ก ๋์ด ๊ฐ์๋ค. ์ฐ๋ฆฌ๋ Revit 2016์ฉ ํ๋ฌ๊ทธ์ธ ๋ฒ์ ์ ๋ํด์๋ง ์๋ฃจ์ ์ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ์์์ ์ค๋ช ํ ๋ชจ๋ ๋จ๊ณ๋ฅผ ๊ฐ๊ฐ ๋ฐ๋ณตํ์ฌ ์ซ์ 2015๋ฅผ ์ซ์ 2016์ผ๋ก ๋ฐ๊ฟ๋๋ค. Class1.cs ์ ํ๋ก์ ํธ์์ ์ญ์ ํ์ธ์.
ํ์ ์ฝ๋๊ฐ ํฌํจ๋ ํ์ผ - Class1.cs โ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ ํ๋ก์ ํธ์ ๋งํฌ๋ฅผ ์ฝ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๊ธด โ ํ๋ก์ ํธ๋ฅผ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ๊ณ "๋ฅผ ์ ํํ์ญ์์ค.์ถ๊ฐ"->"๊ธฐ์กด ์์", ์ด๋ฆฌ๋ ์ฐฝ์์ ํ์ํ ํ์ผ์ ์ฐพ๊ณ ์ต์ ๋์ "์ถ๊ฐ"์ต์ ์ ์ ํํ์ธ์"์ฐ๊ฒฐ๋ก ์ถ๊ฐยป
- ์งง์ โ ์๋ฃจ์
ํ์๊ธฐ์์ ์ง์ ์ํ๋ ํ์ผ(๋๋ ํ์ผ ๋๋ ์ ์ฒด ํด๋)์ ์ ํํ๊ณ Alt ํค๋ฅผ ๋๋ฅธ ์ํ์์ ์ ํ๋ก์ ํธ๋ก ๋์ด๋ค ๋์ต๋๋ค. ๋๋๊ทธํ๋ฉด์ Alt ํค๋ฅผ ๋๋ฅด๋ฉด ๋ง์ฐ์ค ์ปค์๊ฐ ๋ํ๊ธฐ ๊ธฐํธ์์ ํ์ดํ๋ก ๋ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
UPD : ์ด ๋จ๋ฝ์์ ์ฝ๊ฐ์ ํผ๋์ ๊ฒช์์ต๋๋ค. ์ฌ๋ฌ ํ์ผ์ ์ ์กํ๋ ค๋ฉด ๋๋ฅด๊ณ ์์ด์ผ ํฉ๋๋ค. Shift + Alt!
์ ์ฐจ๋ฅผ ์ํํ ํ ๋ ๋ฒ์งธ ํ๋ก์ ํธ์ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. Class1.cs ํด๋น ์์ด์ฝ(ํ๋์ ํ์ดํ):
ํธ์ง๊ธฐ ์ฐฝ์์ ์ฝ๋๋ฅผ ํธ์งํ ๋ ์ฝ๋๋ฅผ ํ์ํ ํ๋ก์ ํธ ์ปจํ ์คํธ๋ฅผ ์ ํํ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ ์๋์์ ํธ์ง ์ค์ธ ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด ๊ตฌ์ฑํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ ํธ(2017-2020)๋ฅผ ๋ง๋ญ๋๋ค. ์ํ ํดํน - ๊ธฐ๋ณธ ํ๋ก์ ํธ๊ฐ ์๋๋ผ ์ด๋ฏธ ๋งํฌ๋ก ์ฝ์ ๋ ํ๋ก์ ํธ์์ ์๋ฃจ์ ํ์๊ธฐ์ ํ์ผ์ ๋๋๊ทธํ๋ ๊ฒฝ์ฐ Alt ํค๋ฅผ ๋๋ฅผ ํ์๊ฐ ์์ต๋๋ค!
์ค๋ช ๋ ์ต์ ์ ์ ๋ฒ์ ์ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๋ ์๊ฐ์ด๋ ํ๋ก์ ํธ์ ์ ํ์ผ์ ์ถ๊ฐํ๋ ์๊ฐ๊น์ง ๊ฝค ์ข์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ์ง๋ฃจํด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์ ๊ฐ์๊ธฐ ํ๋์ ํ๋ก์ ํธ๋ก ๋ชจ๋ ๊ฒ์ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊นจ๋ฌ์๊ณ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ๋์ด๊ฐ๊ณ ์์ต๋๋ค.
๊ตฌ์ฑ์ ๋ง๋ฒ
์ฌ๊ธฐ๊น์ง ์ฝ๊ณ ๋๋ฉด "๊ธฐ์ฌ๊ฐ ๊ณง๋ฐ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ์ธ๋ฐ ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ต๋๊น?!"๋ผ๊ณ ์ธ์น ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ๊ฐ ํ์ํ ์ด์ ์ ํ๋ก์ ํธ์ ์ฐจ์ด์ ์ ๋ ๋ช ํํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ์ค๋ช ํ์ต๋๋ค. ์ด์ ํ๋ก์ ํธ๋ฅผ ํ๋๋ง ๋จ๊ฒจ๋๊ณ ๊ตฌํํด์ผ ํ๋ ํ๋ก์ ํธ์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์ ํํ ๋ ๋ช ํํด์ก์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ง ์๊ณ ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ์์ฑ๋ ํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
๋ฐ๋ผ์ ๋จผ์ ๊ธฐ๋ณธ ํ๋ก์ ํธ(ํ์ผ์ด ์ง์ ํฌํจ๋ ํ๋ก์ ํธ)๋ฅผ ์ ์ธํ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ์๋ฃจ์ ์์ ์ ๊ฑฐํฉ๋๋ค. ์ ๊ฒ๋ค. 2016-2020 ๋ฒ์ ์ฉ ํ๋ก์ ํธ. ์๋ฃจ์ ์ด ์๋ ํด๋๋ฅผ ์ด๊ณ ๊ฑฐ๊ธฐ์์ ํด๋น ํ๋ก์ ํธ์ ํด๋๋ฅผ ์ญ์ ํ์ธ์.
์ฐ๋ฆฌ์ ๊ฒฐ์ ์๋ ํ๋์ ํ๋ก์ ํธ๊ฐ ๋จ์ ์์ต๋๋ค. MySuperPluginForRevit_2015. ํด๋น ์์ฑ์ ์ด๊ณ ๋ค์์ ์ํํฉ๋๋ค.
- ํญ์์ "์ ์ฒญ"์ด์ ๋ธ๋ฆฌ ์ด๋ฆ์์ ์ ๋ฏธ์ฌ๋ฅผ ์ ๊ฑฐํ์ธ์. _2015 (์ด์ ๋ ๋์ค์ ๋ฐํ์ง๊ฒ ์ฃ )
- ํญ์์ "์กฐ๋ฆฝยป ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. R2015 ํด๋น ๋ถ์ผ์์
์ฐธ๊ณ : ์ต์ ๋ฒ์ ์ Visual Studio์๋ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ๋ ์ฌ์ฉํ ์ ์์ง๋ง ํ๋ก์ ํธ ์์ฑ ์ฐฝ์ ํ์๋์ง ์์ต๋๋ค. ์ด ๊ฒฐํจ์ด ๋ฐ์ํ๋ฉด .csproj ํ์ผ์์ ์๋์ผ๋ก ์ ๊ฑฐํด์ผ ํฉ๋๋ค. ํ์ง๋ง ์์ง ์์ ํด์ผ ํ๋ฏ๋ก ๊ณ์ ์ฝ์ด๋ณด์ธ์.
์ ๋ฏธ์ฌ๋ฅผ ์ ๊ฑฐํ์ฌ ์๋ฃจ์ ํ์๊ธฐ ์ฐฝ์์ ํ๋ก์ ํธ ์ด๋ฆ์ ๋ฐ๊ฟ๋๋ค. _2015 ๊ทธ๋ฐ ๋ค์ ์๋ฃจ์ ์์ ํ๋ก์ ํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์๋ฒฝ์ฃผ์์์ ์ง์์ ๊ฐ์ ์ ์ ์งํ๊ธฐ ์ํด ๊ผญ ํ์ํ ์ผ์ด์ฃ ! ์๋ฃจ์ ํด๋๋ฅผ ์ด๊ณ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ๋ก์ ํธ ํด๋์ ์ด๋ฆ์ ๋ฐ๊พผ ๋ค์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์๋ฃจ์ ์ ๋ก๋ํฉ๋๋ค.
๊ตฌ์ฑ ๊ด๋ฆฌ์๋ฅผ ์ฝ๋๋ค. ๋ฏธ๊ตญ ๊ตฌ์ฑ ํด์ ์์น์ ์ผ๋ก ํ์ํ์ง ์์ผ๋ฏ๋ก ์ญ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฐ๋ฆฌ์๊ฒ ์ต์ํ ์ด๋ฆ์ผ๋ก ์๋ก์ด ๊ตฌ์ฑ์ ๋ง๋ญ๋๋ค. R2015, R2016,โฆ, R2020. ๋ค๋ฅธ ๊ตฌ์ฑ์์ ์ค์ ์ ๋ณต์ฌํ ํ์๊ฐ ์์ผ๋ฉฐ ํ๋ก์ ํธ ๊ตฌ์ฑ์ ์์ฑํ ํ์๋ ์์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ์๋ ํด๋๋ก ์ด๋ํ์ฌ ํธ๋ฆฌํ ํธ์ง๊ธฐ์์ ํ์ฅ๋ช ์ด .csproj์ธ ํ์ผ์ ์ฝ๋๋ค. ๊ทธ๋ฐ๋ฐ Visual Studio์์ ์ด ์๋ ์์ต๋๋ค. ํ๋ก์ ํธ๋ฅผ ์ธ๋ก๋ํด์ผ ์ํ๋ ํญ๋ชฉ์ด ์ํฉ์ ๋ง๋ ๋ฉ๋ด์ ํ์๋ฉ๋๋ค.
ํธ์ง๊ธฐ๋ ์ ๋ ฌ๊ณผ ํ๋กฌํํธ๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฏ๋ก Visual Studio์์ ํธ์งํ๋ ๊ฒ์ด ๋์ฑ ๋ฐ๋์งํฉ๋๋ค.
ํ์ผ์์ ์ฐ๋ฆฌ๋ ์์๋ฅผ ๋ณผ ์ ์์ต๋๋ค
๊ณตํต(์ฒซ ๋ฒ์งธ) ์์๋ก ์ด๋ ์์ฑ ๊ทธ๋ฃน ๊ทธ๋ฆฌ๊ณ ๋ถ๋์ฐ์ ์ดํด๋ณด์ธ์ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ โ ์ด๊ฒ์ ์ด์ ๋ธ๋ฆฌ์ ์ด๋ฆ์ด๋ฉฐ ์ ๋ฏธ์ฌ ์์ด ์ฌ์ฉํด์ผ ํฉ๋๋ค. _2015. ์ ๋ฏธ์ฌ๊ฐ ์์ผ๋ฉด ์ ๊ฑฐํ์ญ์์ค.
์กฐ๊ฑด์ด ์๋ ์์ ์ฐพ๊ธฐ
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
ํ์ํ์ง ์์ต๋๋ค. ์ญ์ ํฉ๋๋ค.
์กฐ๊ฑด์ด ์๋ ์์
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
์ฝ๋ ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น ๋จ๊ณ์์ ์์ ํ๋ ค๋ฉด ํ์ํฉ๋๋ค. ํ์์ ๋ง๊ฒ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ค์ํ ์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ณ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ์ ์์ ์ ํ ์ ์์ต๋๋ค.
์ด์ ์๋ก์ด ์์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์์ฑ ๊ทธ๋ฃน ์ฐ๋ฆฌ ๊ตฌ์ฑ์ ์ํด. ์ด๋ฌํ ์์์์๋ ๋ค์ ๋ค ๊ฐ์ง ์์ฑ๋ง ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
- ์ถ๋ ฅ ๊ฒฝ๋ก โ ์ถ๋ ฅ ํด๋. ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ์ด์ binR20xx
- ์ ์์์ โ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐํธ. ๊ฐ์ ์ง์ ํด์ผ ํฉ๋๋ค. TRACE;R20ั ั
- ๋์ํ๋ ์์ํฌ๋ฒ์ โ ํ๋ซํผ ๋ฒ์ . Revit API ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ซํผ์ ์ง์ ํด์ผ ํฉ๋๋ค.
- ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ โ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ(์: ํ์ผ ์ด๋ฆ). ์ด์ ๋ธ๋ฆฌ์ ์ ํํ ์ด๋ฆ์ ์ธ ์ ์์ง๋ง ๋ค์์ฑ์ ์ํด ๊ฐ์ ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. $(์ด์ ๋ธ๋ฆฌ ์ด๋ฆ)_20ั ั . ์ด๋ฅผ ์ํด ์ด์ ์๋ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ์์ ์ ๋ฏธ์ฌ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
์ด ๋ชจ๋ ์์์ ๊ฐ์ฅ ์ค์ํ ํน์ง์ ์ ํ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ฐ๋จํ ๋ณต์ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ธฐ์ฌ ๋ท๋ถ๋ถ์์ .csproj ํ์ผ์ ๋ชจ๋ ๋ด์ฉ์ ์ฒจ๋ถํ๊ฒ ์ต๋๋ค.
์ข์์, ์ฐ๋ฆฌ๋ ํ๋ก์ ํธ์ ์์ฑ์ ์์๋์ต๋๋ค. ์ด๋ ต์ง ์์ต๋๋ค. ํ์ง๋ง ํ๋ฌ๊ทธ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(NuGet ํจํค์ง)๋ก ๋ฌด์์ ํด์ผ ํ ๊น์? ๋ ์์ธํ ์ดํด๋ณด๋ฉด ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์์ ์ง์ ๋์ด ์์์ ์ ์ ์์ต๋๋ค.
์์๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์์ค๋๋ค
์์ ์ฌ์ฉ ์ผ์ชฝ ๋ฉ๋ด์์, ๋ค์ํ ๊ตฌ์ฑ์ ๋ํด ๋ค์ํ NuGet ํจํค์ง๋ฅผ ์ค์ ํฉ๋๋ค.
๋ชจ๋ ๋ด์ฉ 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>
์กฐ๊ฑด ์ค ํ๋์์ ๋ค์์ ํตํด ๋ ๊ฐ์ง ๊ตฌ์ฑ์ ์ง์ ํ์ต๋๋ค. ๋๋. ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ์ฑ ์ค์ ํ์ํ ํจํค์ง๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋๋ฒ๊ทธ.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์๋ฒฝํฉ๋๋ค. ํ๋ก์ ํธ๋ฅผ ๋ค์ ๋ก๋ํ๊ณ , ํ์ํ ๊ตฌ์ฑ์ ํ์ฑํํ๊ณ , (ํ๋ก์ ํธ๊ฐ ์๋) ์๋ฃจ์ ์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด์์ " ํญ๋ชฉ์ ํธ์ถํฉ๋๋ค.๋ชจ๋ NuGet ํจํค์ง ๋ณต์"๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ํจํค์ง๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ๋ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋จ๊ณ์์ ์ ๋ ๋ง๋ค๋ฅธ ๊ณจ๋ชฉ์ ์ด๋ฅด๋ ์ต๋๋ค. ๋ชจ๋ ๊ตฌ์ฑ์ ํ ๋ฒ์ ์์งํ๊ธฐ ์ํด ์ผ๊ด ์กฐ๋ฆฝ(๋ฉ๋ด "์กฐ๋ฆฝ"->"์ผ๊ด ๋น๋"), ๊ทธ๋ฌ๋ ๊ตฌ์ฑ์ ์ ํํ๋ฉด ํจํค์ง๊ฐ ์๋์ผ๋ก ๋ณต์๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ๋ฅผ ์กฐ๋ฆฝํ ๋ ์ด๋ก ์ ์ผ๋ก๋ ๊ทธ๋์ผ ํ์ง๋ง ์ด๋ฐ ์ผ๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋๋ ํ์ค ์๋จ์ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ด๊ฒ์ ๋ํ Visual Studio ๋ฒ๊ทธ์ผ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ผ๊ด ์กฐ๋ฆฝ์ ์ํด์๋ ํน์ ์๋ํ ์กฐ๋ฆฝ ์์คํ
์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ๋์์ต๋๋ค.
๋ฐ๋ผ์ ํ๋ก์ ํธ๊ฐ ์๋ ์๋ฃจ์ ํด๋๋ก ์ด๋ํ์ฌ ํค๋ฅผ ๊ธธ๊ฒ ๋๋ฅด์ธ์. ๋ณํ ํด๋์ ๋น ๊ณต๊ฐ์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ์ญ์์ค. ์ํฉ์ ๋ง๋ ๋ฉ๋ด์์ " ํญ๋ชฉ์ ์ ํํ์ญ์์ค.์ฌ๊ธฐ์์ PowerShell ์ฐฝ์ ์ฝ๋๋ค.".
์ค์น๋์ด ์์ง ์์ ๊ฒฝ์ฐ ํต๋ฌด๊ธฐ๊ทธ๋ฐ ๋ค์ ๋จผ์ ๋ช ๋ น์ ์์ฑํ์ญ์์ค.
dotnet tool install Nuke.GlobalTool โglobal
์ด์ ๋ช ๋ น์ ์์ฑํด ๋ณด์ธ์. ํต๋ฌด๊ธฐ ๊ตฌ์ฑํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ํต๋ฌด๊ธฐ ํ์ฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ. ์ด๊ฒ์ ๋ฌ์์์ด๋ก ๋ ์ ํํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ด๋ก ์์ฑ๋ฉ๋๋ค. .nuke ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค. ๋น๋๋ฅผ ์ค์ ํ์๊ฒ ์ต๋๊น? [์/์๋์]
Y ํค๋ฅผ ๋๋ฅด๋ฉด ์ง์ ์ค์ ํญ๋ชฉ์ด ๋ํ๋ฉ๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๋จํ ์ต์ ์ด ํ์ํฉ๋๋ค. MS๋น๋, ์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ด ๋๋ตํฉ๋๋ค.
Visual Studio๋ก ์ด๋ํ๋ฉด ์ ํ๋ก์ ํธ๊ฐ ์ถ๊ฐ๋์์ผ๋ฏ๋ก ์๋ฃจ์ ์ ๋ค์ ๋ก๋ํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์๋ฃจ์ ์ ๋ค์ ๋ก๋ํ๊ณ ํ๋ก์ ํธ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ๋น๋ ์ฐ๋ฆฌ๋ ๋จ ํ๋์ ํ์ผ์๋ง ๊ด์ฌ์ด ์์ต๋๋ค. Build.cs
์ด ํ์ผ์ ์ด๊ณ ๋ชจ๋ ๊ตฌ์ฑ์ ๋ํ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ญ์์ค. ์๋๋ฉด ํ์์ ๋ง๊ฒ ํธ์งํ ์ ์๋ ๋ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ธ์.
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"));
}
});
}
PowerShell ์ฐฝ์ผ๋ก ๋์๊ฐ์ ๋ช ๋ น์ ๋ค์ ์์ฑํฉ๋๋ค. ํต๋ฌด๊ธฐ (๋ช ๋ น์ ์ธ ์ ์์ต๋๋ค ํต๋ฌด๊ธฐ ํ์๋ฅผ ๋ํ๋ด๋ ๋ชฉํ. ํ์ง๋ง ์ฐ๋ฆฌ์๊ฒ ํ๋๊ฐ ์์ด์ ๋ชฉํ, ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋จ). Enter ํค๋ฅผ ๋๋ฅด๋ฉด ์ค์ ํด์ปค๊ฐ ๋ ๋ฏํ ๋๋์ด ๋ค ๊ฒ์ ๋๋ค. ์ํ์ฒ๋ผ ํ๋ก์ ํธ๊ฐ ์๋์ผ๋ก ๋ค์ํ ๊ตฌ์ฑ์ ๋ง๊ฒ ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ Visual Studio์์ ์ง์ PowerShell์ ์ฌ์ฉํ ์ ์์ต๋๋ค(๋ฉ๋ด "์ ๋ง"->"๋ค๋ฅธ ์ฐฝ"->"ํจํค์ง ๊ด๋ฆฌ์ ์ฝ์"), ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ์ด ํ๋ฐฑ์ผ๋ก ํ์๋๋ฏ๋ก ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ๋ด ๊ธฐ์ฌ๋ฅผ ๋ง์นฉ๋๋ค. AutoCAD ์ต์ ์ ์ง์ ์์๋ผ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ์๋ ์๋ฃ๊ฐ "๊ณ ๊ฐ"์ ์ฐพ์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
์ถ์ฒ : habr.com