文字列と入出力・条件分岐/GHPython で家具デザイン
数値だけでなく文字列を扱えるようになると、設計条件を外から与えられるようになります。さらに条件分岐を覚えると、同じコードのまま形の種類そのものを切り替えられます。
1前回の復習
前回は「数値を規則に通して形にする」という考え方と、Python の基本文法を確認しました。 次の語句を思い出してください。
width = 5.2int, float)、文字列(str)など+ - * / // % **。単位変換やスケール調整に直結する# でメモ幅と奥行が与えられているとき、床面積(m²)を求めるコードを完成させなさい。
width_mm = 7700
depth_mm = 3900
w = ________ / 1000.0
d = ________ / 1000.0
area_m2 = ________ * ________
________("床面積:", round(area_m2, 2), "m^2")ヒント
[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)といい、
"(ダブルクォーテーション)で囲んで書きます。
文字列どうしを + でつなぐと連結されますが、
文字列と数値を足すとエラーになります。数値と文字列はまったく別のデータだからです。
123 + 456 # 数値どうし → たし算
"abc" + "def" # 文字列どうし → 連結
print(123 + 456)
print("abc" + "def")型を変換する
文字列は int() で整数に、float() で実数に変換できます。
逆に数値は str() で文字列に変換できます。
text = "1000"
print(int(text) + 1) # 文字列 → 整数
number = 123
print(str(number) + " 円") # 数値 → 文字列
height = 172
print("私の身長は" + str(height) + " cm です")print 関数と input 関数
name = input("お名前を入力してください: ")
print("こんにちは,", name)
h = input("椅子の高さ (mm): ")
print("高さ:", h, "mm")split 関数
split は、数字や記号が入り混じった文字列を区切り文字で切り分け、
リストにする関数です。仕様書きや CSV を読むときの基本操作になります。
spec = "W:450,D:450,H:800"
parts = spec.split(",")
print(parts) # ['W:450', 'D:450', 'H:800']
print(parts[0].split(":")) # ['W', '450']ユーザーが入力した仕様文字列(例: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 < b | a は b より小さい |
a <= b | a は b と等しいか小さい |
a > b | a は b より大きい |
a >= b | a は b と等しいか大きい |
a == b | a と b は等しい |
a != b | a と b は等しくない |
= は「代入」、== は「等しいか比べる」。ここを取り違えるのが最初の関門です。if 文
条件に応じた処理の分岐は if 文で行います。
条件式の行末には :(コロン)を書き、実行する処理は半角スペース 4 つだけ
字下げ(インデント)します。
a = 2025
if a == 2025:
print("令和七年")a = 60
if a == 60:
print("単位認定")
else:
print("不合格")最初の条件が満たされなかった場合に、さらに条件を追加したいときは
elif(else if の略)を使います。
seat_h = 430
if seat_h >= 470:
print("やや高め")
elif seat_h < 350: # 470mm 未満で,かつ 350mm 未満の場合
print("低め")
else:
print("標準的")想定荷重に応じて「大きい/小さい/標準的」を表示するコードを完成させなさい。
load = float(_____("想定荷重 (kgf): "))
__ load >= 120:
_____("大きい")
____ load < 30:
_____("小さい")
____:
print("標準的")ヒント
if / elif / else。標準入力の値を 150 や 20 に書き換えて、3 通りとも通ることを確かめましょう。4GHPython で家具デザイン
ここからは条件分岐を形に使います。方針は単純で、
条件に応じて形状タイプや寸法を切り替えること。
入力スライダは座面高さ H、荷重 Load、天板サイズ W, D です。
荷重に応じて椅子の座面を切り替えるプログラムを完成させなさい。荷重が大きければ四角い座面(強度重視)、小さければ円形座面(軽快)にします。
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 つの断面カーブを与えて、その間を滑らかにつなぐ操作をロフトといいます。 根元と先端で太さの違う断面を与えれば、テーパーのついた棒になります。
素材と断面形状の違いで箸のデザインを変えるプログラムを完成させなさい。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):
print・input・splitを用いて、 名前・身長・体重を表示するプログラムを作成しなさい。 - 課題 2(Colab):
if文を用いて、室内温度を判定するプログラムを作成しなさい。
提出形式:lecture2.ipynb
参考リンク
6自由制作
本日の学びを踏まえ、穴あきではなく一からコードを書いて提出する課題です。生成AIの助けを借りて構いません。右の演習環境で開いて制作し、完成したら 提出 を押してください。
第11回の学び(文字列・条件分岐・寸法の入出力)を踏まえ、パラメータに応じて形やメッセージが変わる小さなデザインを作ってください。例:脚の本数や高さで切り替わる椅子の骨格、窓割のバリエーション。
import Rhino.Geometry as rg import math # 一から書いてみましょう。生成AIに相談しながらで構いません。 # スライダ x, y, z, n が使えます。完成したら「提出」を押してください。 a = None