Skip to content

Commit

Permalink
Fix some phrasing
Browse files Browse the repository at this point in the history
  • Loading branch information
hrntsm committed Jan 6, 2022
1 parent 7bcb080 commit 4cf787c
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 41 deletions.
68 changes: 43 additions & 25 deletions website/docs/Coding/GetModelData.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ id: GetModelData
title: Get model data & draw
---

ここでは節点と部材の接続情報を取得して、Rhino 上にラインを書き出す方法について紹介します
ここでは節点と部材の情報を取得して、Rhino 上にラインとその情報を書き出す方法について紹介します

## ST-Bridge のデータの構造について

初めに、どこに情報があるか探しやすくするために、ST-Bridge のデータ構造について簡単に説明します。
基本的なイメージとしては一貫構造計算ソフトに近いものと考えていただくのが早いと思います
はじめに、どこに情報があるか探しやすくするため、ST-Bridge のデータ構造について簡単に説明します。
基本的なイメージとしては一貫構造計算ソフトのように、「節点があって、その間に梁があって、その梁には断面などの情報がある」ような形式だと考えていただくのが早いと思います

モデルの位置、断面情報は、`StbModel` に含まれ、以下のような構成になっています。
例えばモデルの位置、断面情報は、`StbModel` に含まれ、以下のような構成になっています。
部材の情報を取得したければ `StbMember`、断面の情報を取得したければ `StbSections` を使用する形になります。

```
Expand All @@ -26,22 +26,24 @@ ST_BRIDGE

各データ間の参照は id によって行っています。
例えば`柱 A``節点 1-2` 間を繋ぎ、`断面番号 5` の断面を持つといった形で StbMember はデータを保持しています。
ですので、柱 A の節点座標を知りたければ、 StbNodes の id が 1 と 2 のものを探すことになります。
ですので、柱 A の節点座標を知りたければ、 StbNodes の中から id が 1 と 2 のものを探し、断面を知りたければ StbSections の中から id が 5 のものを探すことになります。

少しわかりづらいのが部材がどこの階、軸に属するかについてです。
ST-Bridge データでは部材は軸や階の情報を持っていません。
全て節点がどこかに属しているので、部材に属する節点からその値を取得して部材の階や軸情報を取得することになります。

## 節点情報の取得

部材を構成する最も基本的な要素である節点の一覧を取得します。
節点情報は以下で取得できます
部材を構成する最も基本的な要素である節点の一覧を取得します。
節点情報は `StbNodes` から配列で返ってくる [StbNode](https://hiron.dev/STBDotNet/docs/STBDotNet.v202.StbNode.html) より取得できます

```cs
// model は v202.ST_BRIDGE 型のインスタンス
StbNode[] nodes = model.StbModel.StbNodes;
```

配列で [StbNode](https://hiron.dev/STBDotNet/docs/STBDotNet.v202.StbNode.html) が取得できます。

StbNode は節点の id や座標情報を持つクラスになっています。
仕様上は配列のインデックスと StbNode がもつ id は一致することを強制していないので、部材の節点を参照する際は必ず id を使って参照してください。
仕様上、配列のインデックスと StbNode がもつ id は一致することを強制されていないので、部材の節点を参照する際は必ず id を使って参照してください。
id が "1" の節点情報を取得する際は、例えば Linq を使うと以下のように書くことができます。

```cs {1,4}
Expand All @@ -51,11 +53,16 @@ StbNode[] nodes = model.StbModel.StbNodes;
StbNode node1 = nodes.FirstOrDefault(n => n.id == "1");
```

FirstOrDefault は配列から条件が true になる最初の値、発見されてなかった場合は Default(指定しない場合は null) の値を返すメソッドです。

:::important
id は数字で与えられている場合が多いですが、データの形式は文字列になっていますので注意してください。
:::

### Point3d での図化

Rhino の Point3d として可視化したい場合は以下のように取得した節点情報から Point3d の配列を作成することで可能です。
コンソールアプリで作成する場合は RhinoCommon ではなく Rhino3dm を参照した状態で行ってください。

```cs {4}
// using System.Linq をあらかじめしてください。
Expand All @@ -68,7 +75,7 @@ Point3d[] pts = nodes.Select(n => new Point3d(n.x, n.y, n.z)).ToArray();

## 部材情報の取得

ここでは例として柱の情報を取得する方法について紹介します
ここでは例として部材の中でも柱の情報を取得する方法について紹介します
柱の情報は `StbColumn` にあるので、その値を取得します。

```cs
Expand Down Expand Up @@ -109,12 +116,15 @@ foreach ((StbColumn column, int i) in columns.Select((column, index) => (column,
}
```

なおより正確に部材を描画したい場合は、例えば StbColumn には offset のプロパティが含まれますので、それを端部の節点座標に反映することで柱のオフセットを考慮することができます。
:::note
なおより正確に部材を描画したい場合は、例えば StbColumn には offset や rotate のプロパティが含まれますので、それを端部の節点座標に反映することで柱のオフセットや回転を考慮することができます。
:::

### 部材断面情報の取得

部材の符号は `name` のプロパティから取得できます。
name は書き出すソフトによりますが、2C1 のような 階 + 符号 で表される名前になります。
name は書き出すソフトによりますが、例えば 2C1 のような 階 + 符号 で表される名前になります。
断面ではなく部材の名前になります。

断面形状の情報は `id_section` のプロパティから取得できます。
節点の場合と同様に、実際の断面情報を持つ `StbSections` の中での id を表す文字列になります。
Expand Down Expand Up @@ -162,7 +172,7 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))
{
var hasName = false;

// RC 断面に該当す id があるか確認
// RC 断面に該当する id があるか確認
if (sections.StbSecColumn_RC != null)
{
foreach (StbSecColumn_RC columnRc in sections.StbSecColumn_RC)
Expand All @@ -174,7 +184,7 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))
}
}

// S 断面に該当す id があるか確認
// S 断面に該当する id があるか確認
if (sections.StbSecColumn_S != null && !hasName)
{
foreach (StbSecColumn_S columnS in sections.StbSecColumn_S)
Expand All @@ -190,13 +200,18 @@ foreach ((string id, int i) in idSection.Select((id, index) => (id, index)))

id がどこに該当するかは調べるまでわからないので、上記のように 1 つ 1 つ確認していく必要があります。

今回は使用していませんが、構造種別は `StbColumn` の中の `kind_structure` で取得することができますので、StbSecColum_XX の XX の部分の構造種別がどれかは判別して調べることができます。
今回は使用していませんが、構造種別は `StbColumn` の中の `kind_structure` で取得することができますので、StbSecColum_XX の XX の部分の構造種別がどれかは事前に判別して調べることができます。

:::note
`StbSecXXX_RC` などの RC 部材は中に断面の外形や配筋などの情報を含みますが、`StbSecXXX_S` などの鉄骨部材の断面情報は、断面の形状名(例えば H-300x150x10x15)が取得できるのみで具体的な形状情報は取得できません。
鉄骨の具体的な断面情報は `StbSecSteel` の中に含まれています。これまでの節点などの id と同様の考え方で、取得した断面の形状名と一致する形状名を持つ StbSecSteel の子要素を探す必要があり、鉄骨は RC に比べひと手間必要です。
:::

## C# Script コンポーネント化

これまでのことを踏まえて Grasshopper で動作するラインにタグ付けできるコンポーネントを作成します。

タグ付け自体は TextTag コンポーネントを使うとして、タグとなる文字列とそれを付ける Line を出力する C# Script コンポーネントを書いていきます。
タグ付け自体は TextTag コンポーネントを使うとし、タグとなる文字列とそれを付ける Line を出力する C# Script コンポーネントを書いていきます。

コンポーネントの中身は以下のようにしてください。これまで書いてきた内容をベースに作成しています。

Expand All @@ -220,6 +235,7 @@ public class Script_Instance: GH_ScriptInstance
var idSection = new string[columns.Length];
var sectionNames = new string[columns.Length];

// foreach ではなく for 文で書いています。
for (var i = 0; i < columns.Length; i++)
{
StbNode nodeStart = nodes.FirstOrDefault(n => n.id == columns[i].id_node_bottom);
Expand All @@ -234,6 +250,7 @@ public class Script_Instance: GH_ScriptInstance

StbSections sections = model.StbModel.StbSections;

// foreach ではなく for 文で書いています。
for (var i = 0; i < idSection.Length; i++)
{
var hasName = false;
Expand All @@ -242,20 +259,20 @@ public class Script_Instance: GH_ScriptInstance
{
foreach (StbSecColumn_RC columnRc in sections.StbSecColumn_RC)
{
if (columnRc.id != idSection[i]) continue;
sectionNames[i] = columnRc.name;
hasName = true;
break;
if (columnRc.id != idSection[i]) continue;
sectionNames[i] = columnRc.name;
hasName = true;
break;
}
}

if (sections.StbSecColumn_S != null && !hasName)
{
foreach (StbSecColumn_S columnS in sections.StbSecColumn_S)
{
if (columnS.id != idSection[i]) continue;
sectionNames[i] = columnS.name;
break;
if (columnS.id != idSection[i]) continue;
sectionNames[i] = columnS.name;
break;
}
}
}
Expand All @@ -269,6 +286,7 @@ public class Script_Instance: GH_ScriptInstance

作成した結果を以下に示します。図化しているのは HoaryFox の Sample フォルダ内にあるデータを使用しています。

タグ付けする位置は CurveMiddle コンポーネントを使って各Lineの中点を取得しその点に対して TextTag でタグを割り当てています。
タグ付けする位置は CurveMiddle コンポーネントを使って各 Line の中点を取得しその点に対して TextTag でタグを割り当てています。
Grasshopper と Karamba3D で断面最適化をした部材の結果のモデルなため、断面がたくさんありますが、それを図化しています。

![](../../images/Coding/GetModelData/column&tag.png)
34 changes: 18 additions & 16 deletions website/docs/Coding/GettingStart.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ title: Getting Start
ここでは、コードを書くことで ST-Bridge データを扱う方法について紹介します。
基本的には HoaryFox の内部実装を基にしてどのように処理していくかを紹介していく形になっています。

実際のHoaryFoxの実装については様々なケースにエラーなく対応するため複雑になっていますが、ベースとなる動作を理解し必要な場合に自分でカスタマイズための参考にしてください
実際の HoaryFox の実装については様々なケースにエラーなく対応するため複雑になっていますが、ベースとなる動作を理解し必要な場合に自分でカスタマイズするための参考にしてください

なお、HoaryFox の実装は以下で見ることができます。

- [hrntsm/HoaryFox](https://github.com/hrntsm/HoaryFox/tree/main/HoaryFox/RH7/Component)

## 環境構築
Expand All @@ -27,14 +28,14 @@ STBDotNet は OSS で開発しているライブラリになります。

### IDE 向け

パッケージマネージャーを使って nuget から参照してください。
以下では VisualStudio を使った場合の例をあげます。
ここでは VisualStudio のような統合開発環境(IDE)を使ってコードを書く場合の方法について紹介します。

VisualStudio ではパッケージマネージャーを使って nuget から参照してください。
VisualStudio を起動して ツール から NuGet パッケージマネージャー の ソリューションの NuGet パッケージの管理を選択してください。

![](../../images/Coding/GettingStart/nuget.png)

参照のタブを選び STBDotNet を検索し、対象のプロジェクトにインストールしてください。
参照のタブを選び STBDotNet を検索し、対象のプロジェクトにインストールしてください。使用するバージョンは最新のものを推奨します。

![](../../images/Coding/GettingStart/install_stbdotnet.png)

Expand All @@ -56,7 +57,8 @@ C# Script コンポーネントを配置して、右クリックし Manage Assem
#### HoaryFox がない場合

Nuget のサイトから必要なバージョンをダウンロードしてください。
STBDotNet の ページは以下でページ右側の Download package からダウンロードができます。
STBDotNet の ページは以下になります。
ページ右側の Download package からダウンロードができます。

- [Nuget/STBDotNet](https://www.nuget.org/packages/STBDotNet/)

Expand All @@ -70,13 +72,12 @@ nuget は C# などが動作している .NET 向けのライブラリがあげ

## ST-Bridge ファイルの読み込み

例として VisualStudio を使用した例をあげますが、Grasshopper の C# コンポーネントを使用する際もコードの内容は同様です。
例として VisualStudio を使用した例を最初にあげますが、Grasshopper の C# Script コンポーネントを使用する際もコードの内容は同様です。

### コンソールアプリの作成

VisualStudio を起動したらコンソールアプリを作成してください。
プロジェクトの名前を ConsoleApp1 とした場合の例をあげます。

program.cs を以下のように書き換えてください。

```cs title=program.cs
Expand Down Expand Up @@ -115,15 +116,14 @@ var model = Serializer.Deserialize(stbPath, Version.Stb202) as STBDotNet.v202.ST

### データのバージョン取得方法

もし ST-Bridge のバージョンがわからない場合はバージョンを取得するメソッドがあります。
以下のメソッドでバージョンを取得することができます。
もし ST-Bridge のバージョンがわからない場合は、以下のメソッドでバージョンを取得することができます。

```cs
Version stbVersion = STBDotNet.Utils.Util.GetStbVersion(stbPath);
```

ですが、ST-Bridge データは xml 形式のテキストデータなので、任意のテキストエディタで確認したほうが早いです。
テキストエディタで開くと冒頭で以下のようになっており、そこでバージョンを確認することができます。
テキストエディタで開くとデータの冒頭は以下のようになっており、そこでバージョンを確認することができます。
例えば HoaryFox で書き出した ST-Bridge データの冒頭は以下のようになっており、バージョンが 2.0.2 であることが確認できます。

```xml
Expand Down Expand Up @@ -152,16 +152,16 @@ v202 の `ST_BRIDGE` 型は以下のようなデータを持っています。

このデータの構成は、ST-Bridge_XML 仕様説明書 に準拠した形になっているので、STBDotNet のドキュメントを見なくても仕様説明書を見るとデータの構成を概ね把握することができます。

仕様書は BuildingSmartJapan[構造設計小委員会](https://www.building-smart.or.jp/meeting/buildall/structural-design/) のページよりダウンロードしてください。
仕様書は BuildingSmart Japan[構造設計小委員会](https://www.building-smart.or.jp/meeting/buildall/structural-design/) のページよりダウンロードしてください。

以下はバージョン 2.0.2 の仕様書の ST_BRIDGE の箇所の抜粋になります。
属性、子要素がそのまま ST_BRIDGE 型が持つプロパティとなっています。
属性、子要素がそのまま上で示した STBDotNet の ST_BRIDGE 型が持つプロパティとなっています。
これは、この ST_BRIDGE 型に限らず、全てのクラスで共通の形式になります。

![](../../images/Coding/GettingStart/siyoh.png)
> ![](../../images/Coding/GettingStart/siyoh.png)
例えば、書き出したアプリの名前を取得すること考えます
仕様書を確認すると、アプリ名は StbCommon の app_name にあることがわかります。
データの構造を理解するための例として、書き出したアプリの名前を取得する方法を紹介します
仕様書を確認すると、アプリ名は `StbCommon``app_name` にあることがわかります。
C# で値を取得するしてコンソールに表示する方法は以下になります。

```cs title=Program.cs {12,13,14}
Expand Down Expand Up @@ -189,7 +189,7 @@ model を取得する際に対象のバージョンの型にキャストし、

### Grasshopper の場合

STBDotNet を参照している状態で以下のようにすることでアプリの名前を返すことができます。
環境構築の箇所であげたように STBDotNet を参照している状態で以下のようにすることでアプリの名前を返すことができます。
path の TypeHint は string にしてください。

![](../../images/Coding/GettingStart/gh.png)
Expand All @@ -207,3 +207,5 @@ public class Script_Instance : GH_ScriptInstance
}
}
```

ここでは HoaryFox の Karamba3D 連携機能で書き出した ST-Bridge データを読み込んでいるため、 アプリ名の HoaryFox が出力されています。

0 comments on commit 4cf787c

Please sign in to comment.