こんにちは、ISDです。
以前、階層毎の属性情報を反映させたレイヤ名称を作成するということをやりました。
https://cim-cad.com/dynamo-02-create_layer_includes_attribute_information/
今回は、Dynamo を用いてこのレイヤ名称をもとにオブジェクトに属性情報を付与していきたいと思います。
属性情報の構成
今回は、例として橋梁モデルの各オブジェクトに属性情報を付与していきます。

属性情報は、以下のような構成とします。 ※階層4は省略
| 階層1 | 階層2 | 階層3 |
| 橋梁 | 上部構造 | 主桁 |
| 床版 | ||
| 舗装 | ||
| 壁高欄 | ||
| 下部工 | フーチング | |
| 柱 | ||
| 基礎構造 |
各オブジェクトをレイヤに配置
今回のDynamoでは、各オブジェクトが配置されているレイヤ名称を基に属性情報を付与していきます。
こちらの要領で、これらの階層毎の属性情報を反映させた名称でレイヤ作成します。
https://cim-cad.com/dynamo-02-create_layer_includes_attribute_information/

モデルの各オブジェクトを、然るべきレイヤに配置します。

プロパティセットの設定
今回の Dynamoでは、属性情報を付与したい各オブジェクトに
・階層1
・階層2
・階層3
という名称のプロパティを持った「属性情報」という名称のプロパティセットが、既に定義されていることを前提に処理が進みます。
先ずは、Dynamoを実行する前に、
属性情報を付与したい各オブジェクトに、属性情報を格納するプロパティセットを設定していきます。
プロパティセットを定義
リボンの [管理] タブの [プロパティセットを定義] ボタンを押して、[スタイルマネージャ]を表示します。

[スタイルマネージャ]の左のカラム内で、目的のファイルの「プロパティセットの定義」を右クリックし、プロパティセットを新規作成します。

作成したプロパティセットの名称を変更します。
今回のDynamoでは、「属性情報」という名称のプロパティセットが、既に定義されていることを前提に処理が進みますので、プロパティセットの名称は「属性情報」として下さい。

[適用先]のタブを開き、「属性情報」の適用先を [ソリッド(3D)] に設定します。

[定義] のタブを開き、[手動プロパティー定義を追加] から「階層1」を定義します。

同様に「階層2」「階層3」を定義します。

「OK」ボタンを押しスタイルマネージャーを閉じます。

各オブジェクトに「属性情報」プロパティセットを適用する
各オブジェクトを選択し、[プロパティパレット] を表示します。

ちなみに、[プロパティパレット] は [Ctrl]+[1]を押す ことで簡単に表示または非表示にできます。

[拡張データ]タブに切り替え、[プロパティセットを追加] ボタンを押し「属性情報」プロパティセットを追加します。


オブジェクトに「属性情報」プロパティセットが追加されます。

これで、Dynamoを用いてオブジェクトに属性情報を付与するための下準備は出来ました。
Dynamoを用いてオブジェクトに属性情報を付与する
では、Dynamoを用いて各オブジェクトに属性情報を付与していきましょう。
今回は、Civil3DToolkit のノードも使用していますので、Civil3DToolkit のパッケージをインストールしておいて下さい。
Civil3DToolkit のインストールについてはこちらをご参照ください。
https://cim-cad.com/dynamo-00-civil3dtoolkit/
使用するノード
Select Objects
Civil3Dのモデル空間からオブジェクトを選択します。(Civil3DToolkit)
標準で搭載されている Select Object のノードと違って、複数のオブジェクトを選択することが出来ます。
Object.PropertySetByName
定義の名前によって、オブジェクトに設定されているプロパティセットを取得します。
Object.Layer
オブジェクトが配置されているレイヤ名を取得します。
String.Split
セパレータによって指定された文字により、1つの文字列を文字列のリストに分割します。
List.Transpose
リストの行と列を入れ替えます。
List.GetItemAtIndex
リストの、指定されたインデックスの要素を取得します。
PropertySet.PropertyByName
プロパティセットから、名前によってプロパティを取得します。
Property.SetValue
プロパティの値を設定します。

ノードを上図のように配置します。
今回の Dynamoでは、属性情報を付与したい各オブジェクトに
・階層1
・階層2
・階層3
という名称のプロパティを持った「属性情報」という名称のプロパティセットが、既に定義されていることを前提に処理が進みます。
処理の流れとしては、
①オブジェクトを選択
②オブジェクトのレイヤ名から属性情報のリストを作成
③オブジェクトから「属性情報」という名前のプロパティセットを取得。
④「属性情報」プロパティセットから「階層1」プロパティを取得。
⑤属性情報のリストから対応する要素を取得し、プロパティに値をセット。
⑥「階層2」「階層3」のプロパティも同様に処理をおこなう。
こんな感じです。
実行すると、オブジェクトの「属性情報」プロパティセットにレイヤ名に則した情報が入力されます。

まとめ
今回の例では、各オブジェクトについてレイヤ名称に含まれた「階層1」~「階層3」についての属性情報をもとに、「属性情報」プロパティセットの各項目に属性情報を入力してみました。
今回の例では、「属性情報」「階層1」「階層2」「階層3」などの名称やプロパティセットの構成はあらかじめ決め打ちしている状態ですが、他の属性情報の構成に変更したい場合は、お好みでDynamoをカスタマイズしてください。
オブジェクト分類名だけでなく判別情報も入力したい場合も、同様の考え方でDynamoを拡張してい行くとよいでしょう。
ただ、付与する情報を増やしていくと、必要なレイヤの数が組み合わせ爆発によって大変なことになってしまうかもしれません…
手作業で属性情報をつけてもさほど手間がかからないようであれば、あえて手作業で処理するのもありですかね。
この辺りは、トータルで見てどのように処理するのが一番効率がいいのかを気にかけながら作業するのがよろしいかと思います…
今回の Dynamo のファイルは、こちらからダウンロードできますのでよろしければどうぞ。


コメント