Python で学ぶ建築デザイン
数値を規則に通して形にする——設計におけるプログラミングの役割を確認し、Python の基本文法と、GHPython による最初のジオメトリ生成までを一気に体験します。
1なぜ建築で Python か
設計とは、制約・ルール・データから形を立ち上げる営みです。 Python は、その「立ち上げ方」を計算で考え、試し、再現するための通用語にあたります。
手で描くスタディでは、案を 1 つ描くたびに時間がかかります。 規則を Python で書いておけば、数値を変えるだけで案が何十通りも出てきます。 「どの案がよいか」を考える時間を増やすことが、プログラミングを使う目的です。
2実行環境 — Colab とこのページ
授業では Google Colab を使います。ブラウザだけで Python が動き、 ノートブック形式で「手順・式・結果」をまとめて保存できるためです。
- Google Drive → 新規 → その他 → Google Colaboratory
- セルにコードを入力し、Shift + Enter で実行
- ノート名を
lecture1.ipynbに変更
このページの演習環境も同じ Python(CPython)がブラウザの中で動いています。 Colab との違いは、Grasshopper のジオメトリまでその場で描けることです。 まずは動作確認をしてみましょう。
print("Hello, Architecture!")3Python の基礎
width = 5.2int, 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")
7 / 2 は 3.5、7 // 2 は 3。タイル枚数や柱本数のように「個数」を求めるときは // や math.ceil() を使い分けます。演習
空欄(________)を埋めて完成させてください。
「演習環境で開く」を押すと右のエディタに読み込まれます。
幅・奥行・高さが 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")ヒント
面積 = 幅 × 奥行
容積 = 幅 × 奥行 × 高さ
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))ヒント
コスト = 坪数 × 単価
幅・奥行から外周長を求め、柱ピッチ 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)ヒント
柱本数 ≒ 外周長 // ピッチ + 1
// は「割ってから小数を切り捨てる」演算子。次の情報をもとに [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"...{変数}..."。小数第 2 位まで表示するには
{area:.2f}。床(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 で数学アート
x, y など)、右に出力(a など)を設定する右のパネルは、その GHPython コンポーネントを模したものです。 左のスライダが入力、まん中のエディタが Python コード、 右の出力が Rhino のビューポートにプレビューされます。 スライダを動かすと自動で再計算されるところも Grasshopper と同じです。
Point3d / 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 本のスライダで形の性格が変わる、パラメトリック設計の典型例です。
スーパー楕円の点を生成するコードを完成させなさい。符号付きで x, y 座標を計算します。スライダ a・b は半径、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() です。
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 項目以上追加)
GHPython:n をアニメーションで動かし、形状変化の 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の助けを借りて構いません。右の演習環境で開いて制作し、完成したら 提出 を押してください。
第10回の学び(変数・演算・単位・ポリライン)を踏まえ、数式で決まる曲線や点群を一から書いてください。スーパー楕円や螺旋など、数学アートでも建築モチーフでも構いません。生成AIに「方針だけ」聞いて、コードは自分で整えるのを推奨します。
import Rhino.Geometry as rg import math # 一から書いてみましょう。生成AIに相談しながらで構いません。 # スライダ x, y, z, n が使えます。完成したら「提出」を押してください。 a = None