IU Tips

GrasshopperでArchicadの階情報を取得する 【Python】

2025.07.14

こんにちは。
IU BIM STUDIO原田です。

今回はGrasshopperでArchicadの階情報を取得する方法について説明します。
Archicad – Grasshopper Live Connectionを使えばモデル要素に対して階の指定はできますが、階高などの情報は取得できません。
今回はArchicadのPython APIを使って階情報を取得する方法を試してみたいと思います。

Pythonスクリプトの作成

Rhinoceros 8ではPython3系が使えるようになっています。Python3コンポーネントであれば、外部ライブラリも使用できますのでarchicadライブラリを使用します。

まずは archiadライブラリ使用時の定型文を入力します。

from archicad import ACConnection

conn = ACConnection.connect()
assert conn

acc = conn.commands
acu = conn.utilities
act = conn.types


次にプロジェクトマップのツリーを取得します。

nav_tree = acc.GetNavigatorItemTree(act.NavigatorTreeId("ProjectMap"))

これは断面図などの項目も含まれているため、平面の情報のみを取り出します。
これには便利な関数が用意されています。

stories = acu.FindInNavigatorItemTree(nav_tree.rootItem, lambda x: x.type == "StoryItem")

FindNavigatorItemTreeは第二引数として渡した関数でTrueになるものだけをフィルターしてくれるようです。
今回は階情報が欲しいので”StoryItem”だけを取り出すようなラムダ式を使用します。

フィルターした内容にはレベル情報が入っていないので、階の情報を取得します。その前に階情報取得関数の引数に合うように、階のIDのみを取り出したリストに変形します。

story_ids = [i.navigatorItemId for i in stories]

引数が準備で来たら階情報を取得します

story_infos = acc.GetStoryNavigatorItems(story_ids)
story_infos.sort(key=lambda x:x.storyNavigatorItem.floorLevel)

階情報は基本的に上の階からになっているようです。
おそらくバラバラになることはないと思うのですが、下の階から並べたい場合などはリストをレベルでソートしておきましょう

これで階情報が取得できました。
これから情報を整理していきます。

情報の出力

出力用のリストを作成し、情報を整理していきます。
プリフィックスには.(ドット)が含まれるので、削除しておきます。
階高に関する情報は入っていないので、レベルから計算します。

names = []
prefixes = []
levels = []
for story_info in story_infos:
    names.append(story_info.storyNavigatorItem.name)
    prefixes.append(story_info.storyNavigatorItem.prefix[:-1])
    levels.append(story_info.storyNavigatorItem.floorLevel)

heights = []
for i in range(1,len(levels)):
    height = levels[i] - levels[i-1]
    heights.append(height)

heights.append(0)

これで階情報が取得できました。
Archicadの階情報をGrasshopperで使うことができます。

Grasshopperでモデルを作成

取得した階情報でモデルを作成してみましょう。
試しに、柱を一括で作成するスクリプトを作成してみます。

SeriesでX軸Y軸の通心間隔と個数を作成し、高さはArchicadのレベルを使用します。
それらをCross Referenceで組み合わせ、柱の基準位置を作成します。

頂点のリストをRelative Itemでパスを1つずらしたものを作成します。
これで、1つ上の階へシフトした点のリストを取得できます。
出力したリストをArchicadの柱に入力することで、柱を作成できます。

画像のようなモデルが作成されます。

Grasshopperの全体はこんな感じです。

まとめ

今回はPythonスクリプトを使ってArchicadの階情報を使う方法を紹介しました。
Pythonを活用するとGrasshopperでできることも増えますね。

最後までお読みいただきありがとうございました。
以下にPythonスクリプト全文を載せておきます。

from archicad import ACConnection

conn  = ACConnection.connect()
assert conn

acc = conn.commands
acu = conn.utilities
act = conn.types

nav_tree = acc.GetNavigatorItemTree(act.NavigatorTreeId("ProjectMap"))
stories = acu.FindInNavigatorItemTree(nav_tree.rootItem, lambda x: x.type == "StoryItem")
story_ids = [i.navigatorItemId for i in stories]

story_infos = acc.GetStoryNavigatorItems(story_ids)
story_infos.sort(key=lambda x:x.storyNavigatorItem.floorLevel)

names = []
prefixes = []
levels = []
for story_info in story_infos:
    names.append(story_info.storyNavigatorItem.name)
    prefixes.append(story_info.storyNavigatorItem.prefix[:-1])
    levels.append(story_info.storyNavigatorItem.floorLevel)

heights = []
for i in range(1,len(levels)):
    height = levels[i] - levels[i-1]
    heights.append(height)

heights.append(0)