ARCHICADBIMGrasshopperPython開発
Archicad JSON Interfaceを使ってみよう
2025.08.25
2025.07.14
こんにちは。
IU BIM STUDIO原田です。
今回はGrasshopperでArchicadの階情報を取得する方法について説明します。
Archicad – Grasshopper Live Connectionを使えばモデル要素に対して階の指定はできますが、階高などの情報は取得できません。
今回はArchicadのPython APIを使って階情報を取得する方法を試してみたいと思います。
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で使うことができます。
取得した階情報でモデルを作成してみましょう。
試しに、柱を一括で作成するスクリプトを作成してみます。
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)
ARCHICADBIMGrasshopperPython開発
2025.08.25
BIMGrasshopper
2025.07.23
ARCHICADBIMGrasshopperPython開発
2025.07.14
BIM
2025.06.25
ARCHICADBIM
2025.06.19
ARCHICAD
2025.06.17