@@ -3,14 +3,14 @@ id: GetModelData
3
3
title : Get model data & draw
4
4
---
5
5
6
- ここでは節点と部材の接続情報を取得して 、Rhino 上にラインを書き出す方法について紹介します 。
6
+ ここでは節点と部材の情報を取得して 、Rhino 上にラインとその情報を書き出す方法について紹介します 。
7
7
8
8
## ST-Bridge のデータの構造について
9
9
10
- 初めに、どこに情報があるか探しやすくするために 、ST-Bridge のデータ構造について簡単に説明します。
11
- 基本的なイメージとしては一貫構造計算ソフトに近いものと考えていただくのが早いと思います 。
10
+ はじめに、どこに情報があるか探しやすくするため 、ST-Bridge のデータ構造について簡単に説明します。
11
+ 基本的なイメージとしては一貫構造計算ソフトのように、「節点があって、その間に梁があって、その梁には断面などの情報がある」ような形式だと考えていただくのが早いと思います 。
12
12
13
- モデルの位置 、断面情報は、` StbModel ` に含まれ、以下のような構成になっています。
13
+ 例えばモデルの位置 、断面情報は、` StbModel ` に含まれ、以下のような構成になっています。
14
14
部材の情報を取得したければ ` StbMember ` 、断面の情報を取得したければ ` StbSections ` を使用する形になります。
15
15
16
16
```
@@ -26,22 +26,24 @@ ST_BRIDGE
26
26
27
27
各データ間の参照は id によって行っています。
28
28
例えば` 柱 A ` は` 節点 1-2 ` 間を繋ぎ、` 断面番号 5 ` の断面を持つといった形で StbMember はデータを保持しています。
29
- ですので、柱 A の節点座標を知りたければ、 StbNodes の id が 1 と 2 のものを探すことになります。
29
+ ですので、柱 A の節点座標を知りたければ、 StbNodes の中から id が 1 と 2 のものを探し、断面を知りたければ StbSections の中から id が 5 のものを探すことになります。
30
+
31
+ 少しわかりづらいのが部材がどこの階、軸に属するかについてです。
32
+ ST-Bridge データでは部材は軸や階の情報を持っていません。
33
+ 全て節点がどこかに属しているので、部材に属する節点からその値を取得して部材の階や軸情報を取得することになります。
30
34
31
35
## 節点情報の取得
32
36
33
- 部材を構成する最も基本的な要素である節点の一覧を取得します。
34
- 節点情報は以下で取得できます 。
37
+ 部材を構成する最も基本的な要素である節点の一覧を取得します。
38
+ 節点情報は ` StbNodes ` から配列で返ってくる [ StbNode ] ( https://hiron.dev/STBDotNet/docs/STBDotNet.v202.StbNode.html ) より取得できます 。
35
39
36
40
``` cs
37
41
// model は v202.ST_BRIDGE 型のインスタンス
38
42
StbNode [] nodes = model .StbModel .StbNodes ;
39
43
```
40
44
41
- 配列で [ StbNode] ( https://hiron.dev/STBDotNet/docs/STBDotNet.v202.StbNode.html ) が取得できます。
42
-
43
45
StbNode は節点の id や座標情報を持つクラスになっています。
44
- 仕様上は配列のインデックスと StbNode がもつ id は一致することを強制していないので 、部材の節点を参照する際は必ず id を使って参照してください。
46
+ 仕様上、配列のインデックスと StbNode がもつ id は一致することを強制されていないので 、部材の節点を参照する際は必ず id を使って参照してください。
45
47
id が "1" の節点情報を取得する際は、例えば Linq を使うと以下のように書くことができます。
46
48
47
49
``` cs {1,4}
@@ -51,11 +53,16 @@ StbNode[] nodes = model.StbModel.StbNodes;
51
53
StbNode node1 = nodes .FirstOrDefault (n => n .id == " 1" );
52
54
```
53
55
56
+ FirstOrDefault は配列から条件が true になる最初の値、発見されてなかった場合は Default(指定しない場合は null) の値を返すメソッドです。
57
+
58
+ ::: important
54
59
id は数字で与えられている場合が多いですが、データの形式は文字列になっていますので注意してください。
60
+ :::
55
61
56
62
### Point3d での図化
57
63
58
64
Rhino の Point3d として可視化したい場合は以下のように取得した節点情報から Point3d の配列を作成することで可能です。
65
+ コンソールアプリで作成する場合は RhinoCommon ではなく Rhino3dm を参照した状態で行ってください。
59
66
60
67
``` cs {4}
61
68
// using System.Linq をあらかじめしてください。
@@ -68,7 +75,7 @@ Point3d[] pts = nodes.Select(n => new Point3d(n.x, n.y, n.z)).ToArray();
68
75
69
76
## 部材情報の取得
70
77
71
- ここでは例として柱の情報を取得する方法について紹介します 。
78
+ ここでは例として部材の中でも柱の情報を取得する方法について紹介します 。
72
79
柱の情報は ` StbColumn ` にあるので、その値を取得します。
73
80
74
81
``` cs
@@ -109,12 +116,15 @@ foreach ((StbColumn column, int i) in columns.Select((column, index) => (column,
109
116
}
110
117
```
111
118
112
- なおより正確に部材を描画したい場合は、例えば StbColumn には offset のプロパティが含まれますので、それを端部の節点座標に反映することで柱のオフセットを考慮することができます。
119
+ ::: note
120
+ なおより正確に部材を描画したい場合は、例えば StbColumn には offset や rotate のプロパティが含まれますので、それを端部の節点座標に反映することで柱のオフセットや回転を考慮することができます。
121
+ :::
113
122
114
123
### 部材断面情報の取得
115
124
116
125
部材の符号は ` name ` のプロパティから取得できます。
117
- name は書き出すソフトによりますが、2C1 のような 階 + 符号 で表される名前になります。
126
+ name は書き出すソフトによりますが、例えば 2C1 のような 階 + 符号 で表される名前になります。
127
+ 断面ではなく部材の名前になります。
118
128
119
129
断面形状の情報は ` id_section ` のプロパティから取得できます。
120
130
節点の場合と同様に、実際の断面情報を持つ ` StbSections ` の中での id を表す文字列になります。
@@ -162,7 +172,7 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))
162
172
{
163
173
var hasName = false ;
164
174
165
- // RC 断面に該当す id があるか確認
175
+ // RC 断面に該当する id があるか確認
166
176
if (sections .StbSecColumn_RC != null )
167
177
{
168
178
foreach (StbSecColumn_RC columnRc in sections .StbSecColumn_RC )
@@ -174,7 +184,7 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))
174
184
}
175
185
}
176
186
177
- // S 断面に該当す id があるか確認
187
+ // S 断面に該当する id があるか確認
178
188
if (sections .StbSecColumn_S != null && ! hasName )
179
189
{
180
190
foreach (StbSecColumn_S columnS in sections .StbSecColumn_S )
@@ -190,13 +200,18 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))
190
200
191
201
id がどこに該当するかは調べるまでわからないので、上記のように 1 つ 1 つ確認していく必要があります。
192
202
193
- 今回は使用していませんが、構造種別は ` StbColumn ` の中の ` kind_structure ` で取得することができますので、StbSecColum_XX の XX の部分の構造種別がどれかは判別して調べることができます。
203
+ 今回は使用していませんが、構造種別は ` StbColumn ` の中の ` kind_structure ` で取得することができますので、StbSecColum_XX の XX の部分の構造種別がどれかは事前に判別して調べることができます。
204
+
205
+ ::: note
206
+ ` StbSecXXX_RC ` などの RC 部材は中に断面の外形や配筋などの情報を含みますが、` StbSecXXX_S ` などの鉄骨部材の断面情報は、断面の形状名(例えば H-300x150x10x15)が取得できるのみで具体的な形状情報は取得できません。
207
+ 鉄骨の具体的な断面情報は ` StbSecSteel ` の中に含まれています。これまでの節点などの id と同様の考え方で、取得した断面の形状名と一致する形状名を持つ StbSecSteel の子要素を探す必要があり、鉄骨は RC に比べひと手間必要です。
208
+ :::
194
209
195
210
## C# Script コンポーネント化
196
211
197
212
これまでのことを踏まえて Grasshopper で動作するラインにタグ付けできるコンポーネントを作成します。
198
213
199
- タグ付け自体は TextTag コンポーネントを使うとして 、タグとなる文字列とそれを付ける Line を出力する C# Script コンポーネントを書いていきます。
214
+ タグ付け自体は TextTag コンポーネントを使うとし 、タグとなる文字列とそれを付ける Line を出力する C# Script コンポーネントを書いていきます。
200
215
201
216
コンポーネントの中身は以下のようにしてください。これまで書いてきた内容をベースに作成しています。
202
217
@@ -220,6 +235,7 @@ public class Script_Instance: GH_ScriptInstance
220
235
var idSection = new string [columns .Length ];
221
236
var sectionNames = new string [columns .Length ];
222
237
238
+ // foreach ではなく for 文で書いています。
223
239
for (var i = 0 ; i < columns .Length ; i ++ )
224
240
{
225
241
StbNode nodeStart = nodes .FirstOrDefault (n => n .id == columns [i ].id_node_bottom );
@@ -234,6 +250,7 @@ public class Script_Instance: GH_ScriptInstance
234
250
235
251
StbSections sections = model .StbModel .StbSections ;
236
252
253
+ // foreach ではなく for 文で書いています。
237
254
for (var i = 0 ; i < idSection .Length ; i ++ )
238
255
{
239
256
var hasName = false ;
@@ -242,20 +259,20 @@ public class Script_Instance: GH_ScriptInstance
242
259
{
243
260
foreach (StbSecColumn_RC columnRc in sections .StbSecColumn_RC )
244
261
{
245
- if (columnRc .id != idSection [i ]) continue ;
246
- sectionNames [i ] = columnRc .name ;
247
- hasName = true ;
248
- break ;
262
+ if (columnRc .id != idSection [i ]) continue ;
263
+ sectionNames [i ] = columnRc .name ;
264
+ hasName = true ;
265
+ break ;
249
266
}
250
267
}
251
268
252
269
if (sections .StbSecColumn_S != null && ! hasName )
253
270
{
254
271
foreach (StbSecColumn_S columnS in sections .StbSecColumn_S )
255
272
{
256
- if (columnS .id != idSection [i ]) continue ;
257
- sectionNames [i ] = columnS .name ;
258
- break ;
273
+ if (columnS .id != idSection [i ]) continue ;
274
+ sectionNames [i ] = columnS .name ;
275
+ break ;
259
276
}
260
277
}
261
278
}
@@ -269,6 +286,7 @@ public class Script_Instance: GH_ScriptInstance
269
286
270
287
作成した結果を以下に示します。図化しているのは HoaryFox の Sample フォルダ内にあるデータを使用しています。
271
288
272
- タグ付けする位置は CurveMiddle コンポーネントを使って各Lineの中点を取得しその点に対して TextTag でタグを割り当てています。
289
+ タグ付けする位置は CurveMiddle コンポーネントを使って各 Line の中点を取得しその点に対して TextTag でタグを割り当てています。
290
+ Grasshopper と Karamba3D で断面最適化をした部材の結果のモデルなため、断面がたくさんありますが、それを図化しています。
273
291
274
292
![ ] ( ../../images/Coding/GetModelData/column&tag.png )
0 commit comments