PyPython で学ぶ建築デザインブラウザだけで動く GHPython 演習環境
数理・データサイエンス・AI 入門 第 10 回

Python で学ぶ建築デザイン

広島工業大学2025/12/1演習 7 問

数値を規則に通して形にする——設計におけるプログラミングの役割を確認し、Python の基本文法と、GHPython による最初のジオメトリ生成までを一気に体験します。

1なぜ建築で Python か

設計とは、制約・ルール・データから形を立ち上げる営みです。 Python は、その「立ち上げ方」を計算で考え、試し、再現するための通用語にあたります。

数値 スパン・階数・単価 規則 Python で書いた手順 ジオメトリ・図面・数量 結果を見て数値を変える = 設計のスタディ
数値を規則に通して形にする。結果を見て数値を変える——この往復が設計のスタディそのもの。

手で描くスタディでは、案を 1 つ描くたびに時間がかかります。 規則を Python で書いておけば、数値を変えるだけで案が何十通りも出てきます。 「どの案がよいか」を考える時間を増やすことが、プログラミングを使う目的です。

解析日射・風・熱・構造の評価を設計にフィードバックする
自動化図面・BIM・数量表など、繰り返しの作業を機械にやらせる
生成形態のバリエーションを大量につくり、比較して選ぶ
この教材の使い方右側のパネルが演習環境です。演習カードの「演習環境で開く」を押すとコードが読み込まれ、▶ 実行(または Ctrl + Enter)で結果が出ます。書いたコードはブラウザに自動保存されるので、閉じても消えません。

2実行環境 — Colab とこのページ

授業では Google Colab を使います。ブラウザだけで Python が動き、 ノートブック形式で「手順・式・結果」をまとめて保存できるためです。

  1. Google Drive → 新規 → その他 → Google Colaboratory
  2. セルにコードを入力し、Shift + Enter で実行
  3. ノート名を lecture1.ipynb に変更
Colab の推奨設定ツール → 設定 → エディタ で、インデント幅を 4 に、「行番号の表示」と「インデントガイドの表示」をオンにしておくと読みやすくなります。

このページの演習環境も同じ Python(CPython)がブラウザの中で動いています。 Colab との違いは、Grasshopper のジオメトリまでその場で描けることです。 まずは動作確認をしてみましょう。

Colab 演習 0
print("Hello, Architecture!")

3Python の基礎

変数値に名前をつけて保存する。例:width = 5.2
数値(int, float)、文字列(str)など
演算子+ - * / // % **。単位変換やスケール調整に直結する
関数入力(引数)を受け取り、決まった手順で計算し、結果(戻り値)を返すルール
コメント# から行末まではメモ。コードを「読める図面」にする
演算子をためす
width = 5.2          # 数値(float)
name  = "Studio-A"   # 文字列(str)
rooms = 3            # 数値(int)

print(width * 2)     # 掛け算
print(rooms // 2)    # 商(切り捨て)
print(rooms % 2)     # あまり
print(2 ** 10)       # べき乗
print(name, "の幅は", width, "m")
<code>/</code> と <code>//</code> の違い7 / 23.57 // 23。タイル枚数や柱本数のように「個数」を求めるときは //math.ceil() を使い分けます。

演習

空欄(________)を埋めて完成させてください。 「演習環境で開く」を押すと右のエディタに読み込まれます。

P1面積・体積と単位変換

幅・奥行・高さが mm で与えられています。mm から m に変換し、床面積(m²)と容積(m³)を求めなさい。

width_mm = 5200
depth_mm = 3100
height_mm = 2800

w = ________ / 1000.0
d = ________ / 1000.0
h = ________ / 1000.0

area_m2 = ________ * ________
volume_m3 = ________ * ________ * ________

print("面積:", round(area_m2, 2), "m^2")
print("容積:", round(volume_m3, 2), "m^3")
ヒント
mm を m にするには 1000 で割る
面積 = 幅 × 奥行
容積 = 幅 × 奥行 × 高さ
P2坪変換と概算コスト

1 坪 = 3.305785 m² とし、床面積 42.8 m² の住宅の坪数と、概算コスト(坪単価 35 万円)を求めなさい。

area_m2 = 42.8
tsubo = ________ / 3.305785
unit_yen = 350000
cost = ________ * ________

print("坪数:", round(tsubo, 2))
print("概算コスト:", int(cost))
ヒント
坪数 = 面積 ÷ 3.305785
コスト = 坪数 × 単価
P3外周長と柱本数

幅・奥行から外周長を求め、柱ピッチ 1.8 m で柱本数を概算しなさい。端部は両方とも柱が立つものとします。

width_m = 8.4
depth_m = 6.3
pitch_m = 1.8

perimeter = 2 * (________ + ________)
posts = int(perimeter // ________) + 1

print("外周長:", perimeter)
print("柱本数:", posts)
ヒント
外周長 = 2 × (幅 + 奥行)
柱本数 ≒ 外周長 // ピッチ + 1
// は「割ってから小数を切り捨てる」演算子。
P4設計メモの自動生成

次の情報をもとに [Studio-A] site=Hiroshima, use=House, area=42.80 m^2 の形式でメモを出力するコードを完成させなさい。

project = "Studio-A"
site = "Hiroshima"
use = "House"
area = 42.8

note = f"[{______}] site={______}, use={______}, area={______:.2f} m^2"
print(note)
ヒント
f 文字列は f"...{変数}..."
小数第 2 位まで表示するには {area:.2f}
P5タイル枚数の算定

床(5.2 m × 3.1 m)を 0.3 m 角のタイルで敷くとき、必要枚数(端数切り上げ)を求めなさい。

import math

floor_w = 5.2
floor_d = 3.1
tile_w = 0.3
tile_d = 0.3

nx = math.ceil(________ / ________)
ny = math.ceil(________ / ________)

print("必要枚数:", nx * ny)
ヒント
math.ceil(x) は x を切り上げる。
幅方向と奥行方向で別々に必要枚数を計算し、最後に掛ける。

4GHPython で数学アート

GrasshopperRhino 上のビジュアルプログラミング環境。部品(コンポーネント)を線でつないで形をつくる
GHPythonその部品のひとつ。Python で直接ジオメトリを生成・操作できる
入出力コンポーネントの左に入力(x, y など)、右に出力(a など)を設定する

右のパネルは、その GHPython コンポーネントを模したものです。 左のスライダが入力、まん中のエディタが Python コード、 右の出力が Rhino のビューポートにプレビューされます。 スライダを動かすと自動で再計算されるところも Grasshopper と同じです。

このページで使える Rhino.GeometryPoint3d / Vector3d / Plane / Interval / Polyline / NurbsCurve / Line / Circle / Rectangle3d / Extrusion / Brep / Transform ほか。実物の Rhino より機能はずっと少ないですが、この授業で書くコードはそのまま動きます。一覧は自由制作ページにあります。

スーパー楕円

円と長方形の中間にある形を、ひとつの式で連続的に表せる曲線です。

|x / a|n + |y / b|n = 1

指数 n を動かすと、菱形(n = 1)→ 楕円(n = 2)→ 角の丸い四角(n が大きい) へと連続的に変化します。1 本のスライダで形の性格が変わる、パラメトリック設計の典型例です。

n = 1n = 2n = 4n = 8
同じ式で n だけを変えたスーパー楕円。演習 G1 の出力そのもの。
G1スーパー楕円の点生成

スーパー楕円の点を生成するコードを完成させなさい。符号付きで x, y 座標を計算します。スライダ ab は半径、n は「角の丸さ」を決める指数です。

import Rhino.Geometry as rg
import math

pts = []
for deg in range(0, 360, 5):
    t = math.radians(deg)
    c = math.cos(t)
    s = math.sin(t)
    x = a * (abs(c) ** (2.0 / n)) * (__________)
    y = b * (abs(s) ** (2.0 / n)) * (__________)
    pts.append(rg.Point3d(x, y, 0))

a = rg.Polyline(pts)
ヒント
abs() で絶対値をとってから累乗しているので、符号が消えています。元の符号を掛け戻すには (1 if 値 >= 0 else -1)
x は c、y は s の符号を見ます。

断面を立体にする

閉じた曲線を高さ方向に押し出すと、柱状体(Brep)になります。 Grasshopper の Extrude コンポーネントに相当するのが Extrusion.Create() です。

断面(閉じた曲線) rg.Polyline → ToNurbsCurve H 柱状体(Brep) Extrusion.Create
閉じた断面を H だけ押し出して柱状体をつくる。
G2押し出しで立体化

G1 で作成したスーパー楕円断面を高さ H だけ押し出し、柱状体を作りなさい。断面をつくる部分はすでに完成しています。

import Rhino.Geometry as rg
import math

# ---- G1 でつくった断面(完成済み)----
pts = []
for deg in range(0, 360, 5):
    t = math.radians(deg)
    c = math.cos(t)
    s = math.sin(t)
    x = a * (abs(c) ** (2.0 / n)) * (1 if c >= 0 else -1)
    y = b * (abs(s) ** (2.0 / n)) * (1 if s >= 0 else -1)
    pts.append(rg.Point3d(x, y, 0))

# ---- ここから G2 ----
poly = rg.Polyline(pts).ToNurbsCurve()
poly.MakeClosed(1e-6)

ext = rg.Extrusion.Create(__________, ________, True)
a = ext.ToBrep()
ヒント
Extrusion.Create(曲線, 高さ, True)。第 1 引数には閉じた曲線 poly、第 2 引数にはスライダ H を渡します。最後の True は「上下に蓋をする」という意味です。

5まとめと課題

本日のまとめ

  • 数値から形への変換を理解し、Colab と GHPython の初歩を体験した。
  • スーパー楕円を題材に、パラメトリックな外形の生成方法を確認した。

次回までの課題

Colab(lecture1.ipynb

  • 面積・体積の別ケースを 3 パターン以上
  • 設計メモの拡張(敷地条件などを 2 項目以上追加)

GHPythonn をアニメーションで動かし、形状変化の GIF を作成

ヒント単位変換は関数にまとめられます。
def mm_to_m(x):    return x / 1000.0
数値の丸めは round(x, 2)f"{x:.2f}"。GHPython では n の範囲を 1.5 〜 6.0、Animate は fps 8 〜 12 程度に。閉曲線が不安定なときはサンプル刻みを細かくし、MakeClosed を残しておくこと。

参考リンク

6自由制作

本日の学びを踏まえ、穴あきではなく一からコードを書いて提出する課題です。生成AIの助けを借りて構いません。右の演習環境で開いて制作し、完成したら 提出 を押してください。

進め方テーマを決める → 生成AIに方針を相談 → 自分で書いて動かす → 提出(何度提出しても最新が残ります)。スライダは + スライダ で追加、各スライダの で削除できます。サンドボックスは 自由制作 ページにもあります。
第10回変数と計算で形をつくる

第10回の学び(変数・演算・単位・ポリライン)を踏まえ、数式で決まる曲線や点群を一から書いてください。スーパー楕円や螺旋など、数学アートでも建築モチーフでも構いません。生成AIに「方針だけ」聞いて、コードは自分で整えるのを推奨します。

import Rhino.Geometry as rg
import math

# 一から書いてみましょう。生成AIに相談しながらで構いません。
# スライダ x, y, z, n が使えます。完成したら「提出」を押してください。

a = None