IU Tips

Archicad Python APIの基本を解説します

2024.01.12

はじめに

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

前回Pythonの環境構築をして実行してみるところまで行いましたが、新しいスクリプトの前に一旦Archicad Python APIの基礎知識として前回のコードを解説していきたいと思います。

コードは前回のものを使います。
コード全体は前回の記事を参照してください

定型文の解説

最初にArchicad python APIを使う上で毎回書く定型文的な部分について説明します。

まずは、Archicadのライブラリをインポートします

from archicad import ACConnection

次に、Archicadに接続するためのコードを書きます

conn = ACConnection.connect()
assert conn

次に下記のようなコードを書きます。

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

Archicad Python APIでは大きく分けてcommands, types, utilitiesの3種類を使用してスクリプトを作成します。

ざっくり言うと
・commands: Archicadからデータを取得するなどの関数
・types: Archicad APIで使用するデータの定義、作成
・utilities: 便利な機能
となります。

これを使うための短縮コマンドのようなものが上記のものになります。
毎回書いていたら面倒ですからね。 

そして、ここまでの部分はあまり深く考えずコピペでも大丈夫です。
次からがやりたいことを実現していく部分になります。

ゾーン名を変更するスクリプトの解説

では、ゾーン名を変更するスクリプトに関しての説明をしていきます。
まず変更したいプロパティのGUIDを取得します。

property_id = acu.GetBuiltInPropertyId("Zone_ZoneName")

GUIDはざっくり言うとこの世に1つしかない文字列で、データの識別や特定に使用します。
Archicadを使う時はプロパティの名前しか意識していないですが、裏ではGUIDによって管理しています。

utilitiesの中に便利機能として、GetBuiltInPropertyIdという関数があります。これはビルトインプロパティ(ゾーンの名前などArchicadにあらかじめ用意してあるプロパティ)のIDを取得するための関数です。

これを使わない場合、下記のように書く必要があります。

property_user_id = act.PropertyUserId(type="BuiltIn", nonLocalizedName="Zone_ZoneName")
property_id = acc.GetPropertyIds([property_user_id])

長くて面倒ですね。
GetPropertyIdsは引数、返り値ともにリストになりますし。
これを1行で書くための便利機能というわけです。

ちなみに、ビルトインプロパティの名前は次のようにGetAllPropertyNames関数で確認できます。

import pprint
property_names = acc.GetAllPropertyNames()
pprint.pprint(property_names)

pythonのpprintモジュールを使えば改行されて見やすくなります。

プロパティを取得できたら、変更するプロパティの値を設定します。

new_zone_name = act.NormalStringPropertyValue("Hello World!")

Pythonは動的型付け言語のためあまりデータ型を意識しなくても書けますが、Archicadにはデータ型があります。ユーザー定義プロパティを作る時にも設定すると思います。

画像の赤枠の部分です。

プロパティを設定するときにはプロパティに合った正しいデータ型で値を入力する必要がありますので、この場合は文字列のためNormalStringPropertyValueを使います。

次に、名前を変更する対象であるゾーンのデータを取得します。

zones = acc.GetElementsByType("Zone")

GetElemensByTypeはArchicadの指定したタイプの要素をすべて取得します。
今回はゾーンを指定します。

そして、新しいプロパティ値とゾーンを紐づけます

property_values = []

for zone in zones:
    property_value = act.ElementPropertyValue(
        zone.elementId, property_id, new_zone_name
    )
    property_values.append(property_value)

ElementPropertyValueはモデル要素のGUID、プロパティのGUID、プロパティの値を入力することでモデル要素のプロパティ値を定義します。

property_valuesは作成結果を入れるリストで、zonesをfor分でループしてそれぞれのゾーンに対してプロパティと新しいゾーン名を割り当ててたものをリストに追加していっています。

elementIdは取得したゾーンに含まれるゾーンのGUIDです。

今回はプロパティと新しいプロパティ値は全て同じものなので変化なしになっています。

最後に作成したプロパティ値のリストをArchicad側にセットして終了です。

acc.SetPropertyValuesOfElements(property_values)

このような流れでArchicad上のゾーン名を変更するスクリプトができあがります。

Archicad Python APIの使い方について、なんとなく分かってきましたでしょうか?
以上で前回のコードの解説を終わりたいと思います。
より詳しい情報は公式のドキュメントを確認してみてください。

https://archicadapi.graphisoft.com/archicadPythonPackage/modules.html

次回から、別のスクリプトを作っていきたいと思います。