皆さんこんにちは。AMDlabの森山です。
今日はVisualStudioCode(以下VSC)を用いて.ghaファイルをビルドする方法を紹介しようと思います。
準備するもの
- VSC
- Rhinoceros
やり方
環境準備
.NETCoreとC#の拡張機能をVSCに導入します。
といってもVisualStudioなどで普通に開発している方は.NetCoreに関してはおそらくすでに準備されているかと思います。
C# for Visual Studio CodeはVSCを開いて左のメニュー(Ctrl+Shift+X)からExtencionを開いて、Installします。
その後再起動して、teminalに
dotnet --version
を打ち込んで表示されれば準備完了です。
開発準備
まずはcsprojファイルを追加します。
dotnet new console --target-framework-override TFM -lang c# -o DirectoryName
私の場合はTFMにnet472を選択し、DirectoryNameは現在のディレクトリなので
dotnet new console –target-framework-override net472 -lang c# -o .
という形で入力しています。
treeコマンドで確認すると以下のような構造が確認できます。
├─bin
│ └─Debug
│ └─net472
└─obj
└─Debug
└─net472
また、現在のcsprojを見てみるとこんな感じになっています。
1 2 3 4 5 6 7 8 |
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net472</TargetFramework> </PropertyGroup> </Project> |
簡単に言ってしまえばこのcsprojを無理やり編集して.NetFrameworkのビルドができるようにすればいいわけです
このファイルを編集していきます。まずはOutputTypeをLibraryに変更します
<OutputType>Library</OutputType>
これでビルドした後のファイルがクラスライブラリに変更されます。
Rhinocommon他、.netFrameworkが使えるようにしましょう。
Itemgroupタグを追加して、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Data" /> <Reference Include="System.Runtime.Serialization" /> <Reference Include="System.ServiceModel.Web" /> <Reference Include="System.Web" /> <Reference Include="System.Xml" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Drawing" /> <Reference Include="System.Windows.Forms" /> <Reference Include="RhinoCommon"> <SpecificVersion>False</SpecificVersion> <HintPath>C:\Program Files\Rhino 6\System\rhinocommon.dll</HintPath> <Private>False</Private> </Reference> <Reference Include="Grasshopper"> <SpecificVersion>False</SpecificVersion> <HintPath>C:\Program Files\Rhino 6\Plug-ins\Grasshopper\Grasshopper.dll</HintPath> <Private>False</Private> </Reference> <Reference Include="GH_IO"> <SpecificVersion>False</SpecificVersion> <HintPath>C:\Program Files\Rhino 6\Plug-ins\Grasshopper\GH_IO.dll</HintPath> <Private>False</Private> </Reference> </ItemGroup> |
Rhino系の参照の場合はReferenceとHintPathを付けてあげると親切です。
この状態でセーブして、コンポーネントを作っていきます。
簡単なコンポーネントを作る
単純に足し算するコンポーネントを作りましょう。
New-Item CmpVSC.cs, CmpVSCinfo.cs
まずはinfo.csを書いていきましょう。usingでライブラリを追加するとこのように候補が出てくると思います。出てこない場合はVSCを再起動して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; using System.Drawing; using Grasshopper.Kernel; namespace GHCmpByVSC{ public class GHCmpByVSC : GH_AssemblyInfo{ public override string Name => "GHCmpByVSC"; public override Bitmap Icon => null; public override string Description => ""; public override Guid Id => new Guid("faaa95d6-c7bf-4d76-9db7-4ace9544b3fa"); public override string AuthorName => ""; public override string AuthorContact => ""; } } |
GUIDの生成には悩むところですが、私は拡張機能であるInsertGUIDを使用しています。
ではコンポーネントを実装していきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; using System.Drawing; using Grasshopper.Kernel; namespace GHCmpByVSC{ public class CmpVSC : GH_Component{ public CmpVSC() : base("VSCAdditon","VSCAdd","VScodeから生成されたコンポーネントです","VSC","calculation") {} protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddNumberParameter("Val1", "v1", "first number", GH_ParamAccess.item); pManager.AddNumberParameter("Val2", "v2", "second number", GH_ParamAccess.item); } protected override void RegisterOutputParams(GH_OutputParamManager pManager) { pManager.AddNumberParameter("Result", "r", "result v1 + v2", GH_ParamAccess.item); } protected override void SolveInstance(IGH_DataAccess DA) { double v1 = 0.0; double v2 = 0.0; DA.GetData("Val1", ref v1); DA.GetData("Val2", ref v2); double result = v1 + v1; DA.SetData("Result", result) } protected override Bitmap Icon => null; public override Guid ComponentGuid => new Guid("c1da5bcb-0726-4e2d-ac3f-ecd4c77784f7"); } } |
何のひねりもないコンポーネントで申し訳ないですがとりあえずこんな感じです。
デバッグしてみる
デバッグしてみます。
ここで色々なツールが出てきますが、.NETCoreを選択してください。
するとエラーが発生して、lauch.jsonが生成されます。
この状態で再度デバッグするとtask.jsonの生成を要求されます
これも.NETCoreで生成しましょう。
さて、lauch.jsonを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": ".NET Core Launch (console)", "type": "coreclr", "request": "launch", "preLaunchTask": "build", "program": "${workspaceFolder}/bin/Debug/net472/amdblog.dll", "args": [], "cwd": "${workspaceFolder}", "console": "internalConsole", "stopAtEntry": false // ブレークポイントで止めたい場合はに変更true }, { "name": ".NET Core Attach", "type": "coreclr", "request": "attach", "processId": "${command:pickProcess}" } ] } |
この状態でビルドしてもghaファイルが生成されないので、csprojにビルドイベントを付け加えましょう。
ついでにいちいちコピーするのがめんどくさいのでGHのLibraryフォルダにコピーされるようにも設定します。
1 2 3 4 5 6 |
<PropertyGroup> <PostBuildEvent> Copy "C:\Users\%USERNAME%\Documents\amdblog\bin\Debug\net472\amdblog.dll" "C:\Users\Kenju\Documents\amdblog\bin\Debug\net472\amdblog.gha" Copy "C:\Users\%USERNAME%\Documents\amdblog\bin\Debug\net472\amdblog.dll" "%APPDATA%\Grasshopper\Libraries\amdblog.gha" </PostBuildEvent> </PropertyGroup> |
ここの書き方についてなんですが、本当はrootディレクトリを環境変数を設定するようにしてあげたほうが親切です。今回は簡略して書いています。
Rhinoを起動して、確認してみましょう。
これでghaファイルのデバッグが可能になりました。
以上の手順を踏めば、Grasshopperだけでなく、RevitやAutocadなどほかのソフトウェアでも可能です。
.exeまでの起動パスを入れれば普段の開発のようにRhinoを起動しながらデバッグすることも可能になります。VisualStudioはちょっとした開発には少し仰々しいので、ライトに開発したいときはVSCを使うといいでしょう。
今回は一番簡単な方法を紹介しましたが、そもそもslnファイルを作って管理する方がいいような気もします。そのあたりの話はまたいずれできればと思います。
是非試してみてください。
COMMENTS