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

文字列と入出力・条件分岐/GHPython で家具デザイン

広島工業大学2025/12/8演習 6 問

数値だけでなく文字列を扱えるようになると、設計条件を外から与えられるようになります。さらに条件分岐を覚えると、同じコードのまま形の種類そのものを切り替えられます。

1前回の復習

前回は「数値を規則に通して形にする」という考え方と、Python の基本文法を確認しました。 次の語句を思い出してください。

変数値に名前をつけて保存する。例:width = 5.2
数値(int, float)、文字列(str)など
演算子+ - * / // % **。単位変換やスケール調整に直結する
関数入力(引数)を受け取り、決まった手順で計算し、結果(戻り値)を返すルール
コメント# でメモ
確認2前回の復習:床面積を求める

幅と奥行が与えられているとき、床面積(m²)を求めるコードを完成させなさい。

width_mm = 7700
depth_mm = 3900

w = ________ / 1000.0
d = ________ / 1000.0

area_m2 = ________ * ________

________("床面積:", round(area_m2, 2), "m^2")
ヒント
最後の空欄は画面に表示する関数です。
確認3前回の復習:設計メモ

[Design Studio] site=Tokyo, use=House, area=96.90 m^2 の形式でメモを出力するコードを完成させなさい。

project = "Design Studio"
site = "Tokyo"
use  = "House"
area = 96.90

note = f"[{______}] site={______}, use={______}, area={______:.2f} m^2"
______(note)

2文字列と入出力

Python では、数値だけでなく人名や地名などの文字もデータとして扱えます。 文字からなるデータを文字列(string)といい、 "(ダブルクォーテーション)で囲んで書きます。

文字列どうしを + でつなぐと連結されますが、 文字列と数値を足すとエラーになります。数値と文字列はまったく別のデータだからです。

数値(int / float) 123 + 456 ↓ たし算になる 579 文字列(str) "abc" + "def" ↓ 連結になる "abcdef" 123 + "ABC" は型が違うのでエラー。int() や str() で揃えてから計算する。
同じ「+」でも、型によって意味が変わる。
型による + の違い
123 + 456        # 数値どうし → たし算
"abc" + "def"    # 文字列どうし → 連結

print(123 + 456)
print("abc" + "def")

型を変換する

文字列は int() で整数に、float() で実数に変換できます。 逆に数値は str() で文字列に変換できます。

int() / float() / str()
text = "1000"
print(int(text) + 1)      # 文字列 → 整数

number = 123
print(str(number) + " 円")  # 数値 → 文字列

height = 172
print("私の身長は" + str(height) + " cm です")

print 関数と input 関数

print()引数に指定した値を画面に出力する関数
input()キーボードから入力された文字列を受け取る関数。返ってくるのは必ず文字列
対話的に受け取る
name = input("お名前を入力してください: ")
print("こんにちは,", name)

h = input("椅子の高さ (mm): ")
print("高さ:", h, "mm")
このページでの input()ブラウザ上では入力ダイアログを出さず、右パネルの黄色い「Panel — 標準入力」に書いた値を上から 1 行ずつ読み込みます。Grasshopper でパネルから文字列を送り込むのと同じ感覚です。値を書き換えて再実行すれば、いろいろな入力を試せます。

split 関数

split は、数字や記号が入り混じった文字列を区切り文字で切り分け、 リストにする関数です。仕様書きや CSV を読むときの基本操作になります。

split で切り分ける
spec = "W:450,D:450,H:800"
parts = spec.split(",")
print(parts)              # ['W:450', 'D:450', 'H:800']
print(parts[0].split(":")) # ['W', '450']
P1家具の寸法仕様を切り分ける

ユーザーが入力した仕様文字列(例:W:450,D:450,H:800)を split で分解し、幅・奥行・高さを表示するコードを完成させなさい。

入力する値は、右パネルの黄色い「Panel — 標準入力」に 1 行ずつ書いておきます(Colab では実行のたびにキーボードから入力します)。

# 仕様文字列をユーザーから受け取る
spec = _____("寸法仕様を入力してください(例:W:450,D:450,H:800): ")

# まずカンマで分割 → ['W:450', 'D:450', 'H:800']
parts = ____._____(",")

# さらにコロンで分割して数値部分だけを取り出す
w = parts[0]._____(":")[1]
d = parts[1]._____(":")[1]
h = parts[2]._____(":")[1]

# 結果を整形して表示
_____("幅:", w, "mm")
_____("奥行:", d, "mm")
_____("高さ:", h, "mm")
ヒント
[1] はリストの 2 番目(0 から数える)。"W:450".split(":")['W', '450'] になります。

3条件式と分岐

プログラムの処理には 3 つの型があります。

順次処理処理を上から順番に一つずつ実行する
分岐処理条件に応じて処理を選択する
反復処理条件が満たされている間、処理を繰り返す

比較演算子とブール型

比較演算子は二つの値の大小を比べる演算子で、条件を満たせば True(真)、 満たさなければ False(偽)を返します。この 2 値をとる型をブール型といいます。

演算子意味
a < ba は b より小さい
a <= ba は b と等しいか小さい
a > ba は b より大きい
a >= ba は b と等しいか大きい
a == ba と b は等しい
a != ba と b は等しくない
<code>=</code> と <code>==</code>= は「代入」、== は「等しいか比べる」。ここを取り違えるのが最初の関門です。

if 文

条件に応じた処理の分岐は if 文で行います。 条件式の行末には :(コロン)を書き、実行する処理は半角スペース 4 つだけ 字下げ(インデント)します。

if だけ
a = 2025

if a == 2025:
    print("令和七年")
if — else
a = 60

if a == 60:
    print("単位認定")
else:
    print("不合格")

最初の条件が満たされなかった場合に、さらに条件を追加したいときは elif(else if の略)を使います。

seat_h を受け取る seat_h >= 470 ? print("やや高め") はい seat_h < 350 ? いいえ(elif) print("低め") print("標準的") else
if → elif → else は「上から順に条件を試し、最初に当たったものだけ実行する」。
if — elif — else
seat_h = 430

if seat_h >= 470:
    print("やや高め")
elif seat_h < 350:      # 470mm 未満で,かつ 350mm 未満の場合
    print("低め")
else:
    print("標準的")
P2条件で部材寸法を切り替える

想定荷重に応じて「大きい/小さい/標準的」を表示するコードを完成させなさい。

load = float(_____("想定荷重 (kgf): "))

__ load >= 120:
    _____("大きい")
____ load < 30:
    _____("小さい")
____:
    print("標準的")
ヒント
上から順に if / elif / else。標準入力の値を 15020 に書き換えて、3 通りとも通ることを確かめましょう。

4GHPython で家具デザイン

ここからは条件分岐を形に使います。方針は単純で、 条件に応じて形状タイプや寸法を切り替えること。 入力スライダは座面高さ H、荷重 Load、天板サイズ W, D です。

if Load > 120: → 四角座面 / else: → 円形座面 Rectangle3d(強度重視) Load = 150 kgf Circle(軽快) Load = 50 kgf
同じコードのまま、Load の値だけで座面の形が入れ替わる。
G3椅子座面の切替

荷重に応じて椅子の座面を切り替えるプログラムを完成させなさい。荷重が大きければ四角い座面(強度重視)、小さければ円形座面(軽快)にします。

import Rhino.Geometry as rg

# Inputs: W, D, H, Load
__ Load > 120:
    seat = rg.Rectangle3d(rg.Plane.WorldXY, W, D)   # 四角座面(強度重視)
____:
    seat = rg.Circle(rg.Point3d(0,0,0), min(W,D)/2.0)  # 円形座面(軽快)

# 押し出し高さ H を Z 方向へ
__ isinstance(seat, rg.Circle):
    brep = rg.Extrusion.Create(seat.ToNurbsCurve(), H, True).ToBrep()
____:
    crv = seat.ToNurbsCurve()
    brep = rg.Extrusion.Create(crv, H, True).ToBrep()

a = ____
ヒント
最後の a = ____ には、直前に作った変数名を入れます。
isinstance(x, 型) は「x はその型か?」を True / False で返す関数。
完成したら Load スライダを 120 の前後で動かしてみましょう。

断面をロフトする

2 つの断面カーブを与えて、その間を滑らかにつなぐ操作をロフトといいます。 根元と先端で太さの違う断面を与えれば、テーパーのついた棒になります。

c0(根元 R_base) c1(先端 R_tip) CreateFromLoft Gap だけ離して 2 本
根元と先端の 2 断面をロフトし、Gap だけ離して複製すれば箸になる。
G4箸のデザインの変更

素材と断面形状の違いで箸のデザインを変えるプログラムを完成させなさい。Material で先端の細さを、Section で断面形状(丸・角・三角)を切り替え、2 つの断面をロフトして 1 本の箸をつくり、Gap だけ離して 2 本並べます。

import Rhino.Geometry as rg
import math

# Inputs: L, R_base, R_tip, Gap, Section, Material

# 1) 素材によって「先端の細さ」を調整(if / elif / else)
______ Material == 0:      # Bamboo
    tip_scale = 0.85
______ Material == 1:      # Metal
    tip_scale = 1.15
______:                    # Resin (default)
    tip_scale = 1.00

R_tip2 = R_tip * tip_scale

# 2) 断面形状によって「始点/終点の断面カーブ」を作る(if / elif / else)
pl0 = rg.Plane.WorldXY
pl1 = rg.Plane.WorldXY
pl1.Origin = rg.Point3d(0, 0, L)

______ Section == 0:       # Round
    c0 = rg.Circle(pl0, R_base).ToNurbsCurve()
    c1 = rg.Circle(pl1, R_tip2).ToNurbsCurve()
______ Section == 1:       # Square
    r0 = rg.Rectangle3d(pl0, rg.Interval(-R_base, R_base), rg.Interval(-R_base, R_base))
    r1 = rg.Rectangle3d(pl1, rg.Interval(-R_tip2, R_tip2), rg.Interval(-R_tip2, R_tip2))
    c0 = r0.ToNurbsCurve()
    c1 = r1.ToNurbsCurve()
______:                    # Triangle
    a0 = 0.0
    a1 = 2.0*math.pi/3.0
    a2 = 4.0*math.pi/3.0

    p0 = rg.Point3d(R_base*math.cos(a0), R_base*math.sin(a0), 0)
    p1 = rg.Point3d(R_base*math.cos(a1), R_base*math.sin(a1), 0)
    p2 = rg.Point3d(R_base*math.cos(a2), R_base*math.sin(a2), 0)

    q0 = rg.Point3d(R_tip2*math.cos(a0), R_tip2*math.sin(a0), L)
    q1 = rg.Point3d(R_tip2*math.cos(a1), R_tip2*math.sin(a1), L)
    q2 = rg.Point3d(R_tip2*math.cos(a2), R_tip2*math.sin(a2), L)

    c0 = rg.Polyline([p0, p1, p2, p0]).ToNurbsCurve()
    c1 = rg.Polyline([q0, q1, q2, q0]).ToNurbsCurve()

# 3) 2 つの断面をロフトして「1 本の箸」を作る
lofts = rg.Brep.CreateFromLoft([c0, c1], rg.Point3d.Unset, rg.Point3d.Unset,
                               rg.LoftType.Normal, False)
stick = lofts[0] if lofts and len(lofts) > 0 else None

# 4) 2 本目を Y 方向に複製して配置
xform = rg.Transform.Translation(0, Gap, 0)
stick2 = stick.DuplicateBrep() if stick else None
if stick2:
    stick2.Transform(xform)

# Outputs
A = stick
B = stick2
C = stick is None
ヒント
空欄はすべて if / elif / else のどれかです。elif は 2 回目以降の条件、else は「それ以外」。
完成したら Section を 0 → 1 → 2 と切り替えて、断面が変わることを確かめましょう。

5まとめと課題

本日のまとめ

  • 文字列と入出力によって、仕様を外部から与えられるようになった。
  • 条件分岐で形状タイプや部材寸法を自動的に切り替えられるようになった。
  • 家具の基本形(座面・箸)を GHPython で生成した。

次回までのミニ課題(提出:次回冒頭)

  • 課題 1(Colab)printinputsplit を用いて、 名前・身長・体重を表示するプログラムを作成しなさい。
  • 課題 2(Colab)if 文を用いて、室内温度を判定するプログラムを作成しなさい。

提出形式:lecture2.ipynb

参考リンク

6自由制作

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

進め方テーマを決める → 生成AIに方針を相談 → 自分で書いて動かす → 提出(何度提出しても最新が残ります)。スライダは + スライダ で追加、各スライダの で削除できます。サンドボックスは 自由制作 ページにもあります。
第11回条件と入出力のある家具/部品

第11回の学び(文字列・条件分岐・寸法の入出力)を踏まえ、パラメータに応じて形やメッセージが変わる小さなデザインを作ってください。例:脚の本数や高さで切り替わる椅子の骨格、窓割のバリエーション。

import Rhino.Geometry as rg
import math

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

a = None