皆様こんにちは
AMDlabの秋山です。
前回に引き続きZeroTouch Nodeの第5弾です。
今回は、ZeroTouch Nodeを使用して、Revitのパラメータを取得、設定の方法をお話していきます。
今回作成するノードは
1.壁のインスタンスパラメータを変更
2.窓のタイプパラメータを変更
3.プロジェクト情報のパラメータ一覧を取得
の3つになります。
1.壁のインスタンスパラメータを変更
Revitの壁要素に対して「上部レベルオフセット」のインスタンスパラメータを変更します。以下が今回作成するコードになります。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using Autodesk.Revit.DB; using RevitServices.Persistence; using RevitServices.Transactions; using Revit.Elements; using Autodesk.DesignScript.Runtime; using System.Collections.Generic; namespace RevitModification { public static class WallUtils { [IsVisibleInDynamoLibrary(true)] public static void SetTopLevelOffset( List<Revit.Elements.Element> walls, double offsetInMillimeters) { // Revitドキュメントを取得 Document doc = DocumentManager.Instance.CurrentDBDocument; // オフセットをミリメートルからフィートに変換 double offsetInFeet = UnitUtils.ConvertToInternalUnits(offsetInMillimeters, UnitTypeId.Millimeters); // トランザクションの開始 TransactionManager.Instance.EnsureInTransaction(doc); foreach (var wallElement in walls) { // Revitの壁要素を取得 var revitWall = wallElement.InternalElement as Autodesk.Revit.DB.Wall; if (revitWall != null) { // 上部レベルオフセットパラメータの取得 Autodesk.Revit.DB.Parameter topOffsetParam = revitWall.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET); if (topOffsetParam != null && !topOffsetParam.IsReadOnly) { // パラメータに新しいオフセット値を設定 topOffsetParam.Set(offsetInFeet); } } } // トランザクションの終了 TransactionManager.Instance.TransactionTaskDone(); } } } |
上記のコードを簡単に解説していきます。
まず初めに名前空間をインポートします。ライブラリやフレームワークの特定部分を参照するために記述します。
1 2 3 4 5 6 |
using Autodesk.Revit.DB; using RevitServices.Persistence; using RevitServices.Transactions; using Revit.Elements; using Autodesk.DesignScript.Runtime; using System.Collections.Generic; |
クラスを定義します。
1 2 3 4 5 |
namespace RevitModification { public static class WallUtils { [IsVisibleInDynamoLibrary(true)] |
メソッドの定義をします。
このメソッドは、壁の「上部レベルオフセット」を設定するためのメソッドです。
1 2 3 |
public static void SetTopLevelOffset( List<Revit.Elements.Element> walls, double offsetInMillimeters) |
次に、トランザクションを開始するコードです。
Revit APIでは要素の変更時にトランザクションが必要です。
1 |
TransactionManager.Instance.EnsureInTransaction(doc); |
次に壁要素の取得と上部レベルオフセットの設定をします。
Dynamoの壁要素をRevit APIの壁要素に変更する必要があるので、Revit.Elements.ElementをAutodesk.Revit.DB.Element型に変換して直接アクセスできるようにします。詳しくは前々回の記事で確認ください。次に壁の「上部レベルオフセット」パラメータを取得します。ここでは、上部レベルオフセットを特定するための定数 BuiltInParameter.WALL_TOP_OFFSET を使用します。取得した上部レベルオフセットパラメータに、新しいオフセット値をフィート単位で設定します。IsReadOnlyでないかを確認し、読み取り専用でない場合にのみ設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
foreach (var wallElement in walls) { // Revitの壁要素を取得 var revitWall = wallElement.InternalElement as Autodesk.Revit.DB.Wall; if (revitWall != null) { // 上部レベルオフセットパラメータの取得 Autodesk.Revit.DB.Parameter topOffsetParam = revitWall.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET); if (topOffsetParam != null && !topOffsetParam.IsReadOnly) { // パラメータに新しいオフセット値を設定 topOffsetParam.Set(offsetInFeet); } } } |
最後にトランザクションの終了をします。
1 |
TransactionManager.Instance.TransactionTaskDone(); |
コーディングが完了したら、Visual Studioでプロジェクトをビルドします。ビルドが成功すると、指定したプロジェクトフォルダ内の「bin\Debug」または「bin\Release」ディレクトリにDLLファイルが生成されます。
Dynamoを開き、[ファイル] タブから「ライブラリを読み込む」を選択し、生成したDLLファイルを選択してインポートします。
インポート後、新しいノード(カスタムノード)として「WallUtils.SetTopLevelOffset」が利用可能になりましたので、配置してみます。
壁のインスタンスパラメータを変更することができました。
2.窓のタイプパラメータを変更
Revitの窓ファミリタイプのタイプパラメータ「幅」を設定するものです。以下が今回作成するコードになります。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using System; using Autodesk.Revit.DB; using RevitServices.Persistence; using RevitServices.Transactions; using Autodesk.DesignScript.Runtime; using System.Collections.Generic; using DB = Autodesk.Revit.DB; using RVT = Revit.Elements; namespace RevitModification { public static class WindowUtils { [IsVisibleInDynamoLibrary(true)] public static void SetWindowWidth( RVT.FamilyType windowTypeElement, double widthInMillimeters) { // Revitドキュメントを取得 Document doc = DocumentManager.Instance.CurrentDBDocument; // 幅をミリメートルからフィートに変換 double widthInFeet = UnitUtils.ConvertToInternalUnits(widthInMillimeters, UnitTypeId.Millimeters); // FamilySymbol(窓のタイプ)を取得 var revitWindowType = windowTypeElement.InternalElement as DB.FamilySymbol; if (revitWindowType == null) { throw new ArgumentException("Invalid WindowType provided."); } // トランザクションの開始 TransactionManager.Instance.EnsureInTransaction(doc); // 幅パラメータの取得と設定 DB.Parameter widthParam = revitWindowType.LookupParameter("幅"); if (widthParam != null && !widthParam.IsReadOnly) { widthParam.Set(widthInFeet); } // トランザクションの終了 TransactionManager.Instance.TransactionTaskDone(); } } } |
上記のコードを今回も簡単に解説していきます。1の項目と内容が同じ箇所は省略します。
まず初めにクラスとメソッドの定義をします。
このメソッドは、窓のファミリタイプと窓のタイプパラメータである幅の値を受け取り変更します。引数はDynamoのインプットになります。
1 2 3 4 5 6 7 8 |
namespace RevitModification { public static class WindowUtils { [IsVisibleInDynamoLibrary(true)] public static void SetWindowWidth( RVT.FamilyType windowTypeElement, double widthInMillimeters) |
次にファミリタイプの「幅」パラメータを取得します。英語環境であれば「Width」、日本語環境であれば「幅」など言語に応じた正確なパラメータ名を使用します。今回は日本語環境なので幅と入力しています。
1 2 3 4 5 |
DB.Parameter widthParam = revitWindowType.LookupParameter("幅"); if (widthParam != null && !widthParam.IsReadOnly) { widthParam.Set(widthInFeet); } |
コーディングが完了したら、先ほど同様ビルドをし「WindowUtils.SetWindowWidth」を配置してみます。
窓のタイプパラメータを変更することができました。
3.プロジェクト情報のパラメータ一覧を取得
以下が今回作成するコードになります。
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 34 35 36 37 38 39 40 41 42 |
using System; using System.Collections.Generic; using Autodesk.Revit.DB; using RevitServices.Persistence; using Autodesk.DesignScript.Runtime; namespace RevitProjectParameters { public static class ProjectParameterUtils { [IsVisibleInDynamoLibrary(true)] public static Dictionary<string, string> GetAllProjectParameters() { // 現在のRevitドキュメントを取得 Document doc = DocumentManager.Instance.CurrentDBDocument; // プロジェクト情報要素を取得 ProjectInfo projectInfo = doc.ProjectInformation; if (projectInfo == null) { throw new InvalidOperationException("プロジェクト情報が取得できませんでした。"); } // プロジェクトパラメータを格納するディクショナリを作成 Dictionary<string, string> projectParameters = new Dictionary<string, string>(); // プロジェクト情報のすべてのパラメータを取得 foreach (Parameter param in projectInfo.Parameters) { // パラメータ名とその値をディクショナリに追加 if (param.HasValue) { string paramName = param.Definition.Name; string paramValue = param.AsValueString() ?? param.AsString(); projectParameters[paramName] = paramValue ?? "値がありません"; } } return projectParameters; } } } |
クラスとメソッドの定義をします。
このメソッドは、プロジェクト情報のすべてのパラメータを取得します。戻り値として、パラメータの名前と値のペアを辞書型で返します。
1 2 3 4 5 6 |
namespace RevitProjectParameters { public static class ProjectParameterUtils { [IsVisibleInDynamoLibrary(true)] public static Dictionary<string, string> GetAllProjectParameters() |
次にProjectInformationを使用して、プロジェクトに関連する情報を取得します。プロジェクト情報が取得できない場合にInvalidOperationExceptionをスローし、エラーを通知します。
1 2 3 4 5 |
ProjectInfo projectInfo = doc.ProjectInformation; if (projectInfo == null) { throw new InvalidOperationException("プロジェクト情報が取得できませんでした。"); } |
すべてのパラメータ名とその値を格納するためのディクショナリを作成します。キーにはパラメータ名、値にはパラメータ値が入ります。
1 |
Dictionary<string, string> projectParameters = new Dictionary<string, string>(); |
最後にプロジェクト情報パラメータの取得と追加をします。
param.HasValueでパラメータに値が存在するかを確認し、ある場合はパラメータの値を文字列として取得します。値が存在しない場合には”値がありません”と取得します。
1 2 3 4 5 6 7 8 9 |
foreach (Parameter param in projectInfo.Parameters) { if (param.HasValue) { string paramName = param.Definition.Name; string paramValue = param.AsValueString() ?? param.AsString(); projectParameters[paramName] = paramValue ?? "値がありません"; } } |
コーディングが完了したら、先ほど同様ビルドをし「ProjectParameterUtils.GetAllProjectParameters」を配置してみます。
プロジェクト情報が取得されました。
今回は、ZeroTouch Nodeを使用して、Revitのパラメータを取得、設定する方法を説明しました。
次回は、第6弾で、ZeroTouch Nodeを使用してDynamoのノードを少しリッチなUIにしていく話をしていきます。
AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career
カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry
COMMENTS