GH CPython と OpenSeesPy を用いた Grasshopper 上におけるオープンソースな構造形態創生環境の構築
Construction of open source computational morphogenesis environmenton Grasshopper using GH CPython and OpenSeesPy
藤田慎之輔 ∗1

Shinnosuke Fujita∗1∗1 北九州市立大学大学院 国際環境工学研究科 講師 工博
Lecturer, Graduate School of Environmental Engineering, The University of Kitakyushu, Dr. Eng.
キーワード
キーワード：GH CPython OpenSeesPy Grasshopper

Keywords：GH CPython OpenSeesPy Grasshopper

1. はじめにと機能不足の感が否めない.

構造形態創生と呼ばれる手法は，21 世紀に入って隆一方で，フリーのプログラミング言語である Python

盛を迎え，最適化技術を基盤としてアカデミックの世は，強力な最適化ライブラリ群を有するほか，機械学習界で様々な手法が提案され，実務にも応用されてきた．などの AI（人工知能）分野で最も使われている言語のひしかしながら，2000 年代初頭から構造デザインの世界

とつであり，非常に分かりやすい言語ルールと高い汎用で用いられてきた形態創生プログラムは，そのほとん性を持つため，初学者でも容易に扱うことができる利点

どが Fortran や C++ といったいわゆる重量言語で開発さがある. 近年では，カリフォルニア大学バークレー校がれている．科学技術計算の知識に乏しい初学者にとっオープンソースとして公開している有限要素解析フレーてそれらの重量言語は習得に時間を要するため，利用ムワークである OpenSees の Python インタプリタである

するにあたって敷居が高く，カスタマイズが難しいた

OpenSeesPy5) が登場し，まだ開発段階ではあるものの，めに，実務で広く普及したとは言い難かった. しかし有限要素解析も自作プログラムを組むことなく手軽に利

近年，Rhinoceros のプラグインとして，建築の設計時用可能な環境が構築されつつある．に考慮するパラメータをリアルタイムでコントロール

OpenSeesPy と Python の情報技術ライブラリ群を組みし，効率的に形態創生を行うことのできるツールとして合わせれば極めて高度なコンピュテーショナルデザイン

Grasshopper1) が登場し，先行して欧米で盛んに用いられが可能であるが，インターフェースが未整備であるためるようになった。Grasshopper は初学者でも扱いやすい実務に殆ど普及していない．

ヴィジュアルプログラミングツールであるため，ここ 10

しかし，まだ OpenSeesPy と同様に開発段階ではある

年ほどで日本にも急速に普及した. 意匠・構造の垣根をものの，2017 年に GH CPython6) が登場し，grasshopper越えてそれらのツールによってパラメトリックに形態決上で Python の情報技術ライブラリ群を直接動かすこと定を行う設計手法は総じてコンピュテーショナルデザイが可能となった.

ンなどと呼ばれ，設計の一手法としての地位を確立しつつある．

Grasshopper 上で構造形態創生を行う場合，galapagos2)
や octopus

本報告では，GH CPython を用いて grasshopper 上で直接 Python プログラムをコーディングし，有限要素解析3)などの発見的最適化ツールを最適化計算に4)用いて，構造解析には Karamba3D を用いるのが一般的を OpenSeesPy により行い，Python の最適化ライブラリ群を利用して構造形態創生を行う一連の手順の紹介と，実際の適用事例について概説する.

である. 知識の浅いものでも見様見真似で利用することができる大変便利なツールである一方で，galapagos や

2. Python の情報技術ライブラリ群の紹介

octopus は中身がブラックボックスでありカスタマイズ

Python には，科学技術計算に関する膨大なライブラが難しいことや，Karamba3D では扱える有限要素の種リが存在し，現在も世界中の技術者により開発が続けら類が少なかったり，一般の構造解析専用ソフトと比べるれ，その数は増え続けている．その中でも，建築構造物

日本建築学会情報システム技術委員会
第 42 回情報･システム･利用･技術シンポジウム論文集， 110-113 ， 2019 年 12 月，東京
Proceedings of the 42nd Symposium on Computer Technology of Information ，Systems and Applications ， AIJ ， 110-113 ， Dec. ， 2019 ， Tokyo－ 110 －

の形態創生を行うに際し有用となるであろう最適化手法

Python 3.7 version があらかじめインストールされているならびに機械学習に関するライブラリとしては，以下のものとする．

ものが挙げられる.

3.1. GH CPython

表1

情報技術に関わる代表的な Python ライブラリ
手法の分類

主なライブラリ

滑降シンプレックス法
Powell 法
共役勾配法
準ニュートン法
Newton-CG 法
記憶制限準ニュートン法
COBYLA 法
逐次最小二乗法
逐次二次計画法
拡張ラグランジュ関数法
CONMIN 法
KS 汎関数法
数理計画法
フィルタ信頼領域法
ペナルティ法
改良型 Dhor’s r-algorithm
線形計画問題一般
二次計画問題一般
二次制約二次計画問題一般
二次錐計画問題一般
半正定値計画問題一般
幾何計画問題一般
混合整数計画問題一般
混合整数二次錐計画問題一般

SciPy7)
SciPy
SciPy
SciPy
SciPy
SciPySciPy,pyOpt8)
SciPy,pyOpt
pyOpt
pyOpt
pyOpt
pyOpt
pyOpt
pyOpt
pyOpt
PuLP9) ,PICOS10)
PICOS
PICOS
PICOS
PICOS
PICOS
PICOS
PICOS

発見的最適化手法

機械学習

粒子群最適化法
ハーモニーサーチ
遺伝的アルゴリズム
蟻/蜂コロニー最適化
力まかせ探索ベイズンホッピング
差分進化
擬似焼きなまし法
モンテカルロ法
共分散行列適応進化戦略

pyOpt,PyGMO
pyOpt,PyGMO
pyOpt,PyGMO11) ,DEAP12)
pyOpt,PyGMO
SciPy
SciPy,PyGMO
SciPy,PyGMO
SciPy,PyGMO
PyGMO
PyGMO

scikit-learn13) ,TensorFlow14) ,Chainer15) ,Theano16)

GitHub もしくは Food4Rhino より GH CPython.zip が
ダ ウ ン ロ ー ド で き る の で ，展 開 し て GH CPython.ghaと FastColoredTextBox.dll を コ ン ポ ー ネ ン ト フ ォ ル ダ
へ 保 存 す る. こ の と き ，通 常 で あ れ ば C ド ラ イ ブ にGH CPython というフォルダが生成される．同フォルダ
内に Grasshopper.py というモジュールがあり，python のリストを Rhinoceros 上における点，線，面データに吐き出すことができるが，既知のエラーが存在することや，リストのみしか扱うことができず numpy の array 配列を扱えないなど使いにくい面がある．点や線の情報をRhino 上に出力するだけであれば，同フォルダに以下の簡単なソースコードを適当な名前を付けて保存すれば，Python 側で作成した座標ベクトル群を Rhinoceros の点データや線データに変換する関数として呼び出すことができる．
def addPoint(r):x,y,z=str(r[0]),str(r[1]),str(r[2])return ’gCPy.Point(’+x+’,’+y+’,’+z+’)’def addLine(r1,r2):
x1,y1,z1=str(r1[0]),str(r1[1]),str(r1[2])x2,y2,z2=str(r2[0]),str(r2[1]),str(r2[2])return ’gCPy.Line(’+x1+’,’+y1+’,’+z1+’,’+x2+’,’+y2+’,’+z2+’)’

例えば，上記のスクリプトを gh.py として保存し，以下のコードを GH CPython コンポーネントとして作成す
れば，スパンやライズ，メッシュの分割数をパラメトリッ
クにコントロール可能な裁断球殻ラチスドームを描画することができる (図 1)．引数は c(下端の中心の座標), divx(X方向分割数), divy(Y 方向分割数), spanx(X 方向スパン),spany(Y 方向スパン), h(ライズ) となっている．
import numpy as np
import gh

上記ライブラリはすべてオープンソースで公開されている．ここに紹介したライブラリ以外にも数多くのライブラリが存在し，情報技術に関わる様々なアルゴリズムが網羅されている．
また，Python には wxPython や PyQt，Tkinter といった強力な GUI ライブラリが存在するため，独自のグラフィックユーザーインターフェースを手軽に作成することができる.

3. 構造形態創生環境構築の流れ
本 節 で は ，GH CPython と OpenSeesPy を 用 い た 構

pitchx,pitchy=spanx/divx,spany/divy
R=spanx**2/8./h+spany**2/8./h+h/2.
r,ij=[],[]
for i in range(divx+1):
for j in range(divy+1):x,y=pitchx*i-spanx/2.,pitchy*j-spany/2.
z=np.sqrt(R**2-x**2-y**2)-(R-h)
r.append([x+c[0],y+c[1],z+c[2]])n,r=len(r),np.array(r)for i in range(divx+1):
for j in range(divy):
ij.append([i*(divy+1)+j,i*(divy+1)+j+1])
for i in range(divy+1):
for j in range(divx):
ij.append([i+j*(divy+1),i+(j+1)*(divy+1)])m,ij=len(ij),np.array(ij,dtype=np.int64)
plot_beam=[]for e in range(m):i,j=ij[e,0],ij[e,1]plot_beam.append(gh.addLine(r[i],r[j]))造 形 態 創 生 環 境 構 築 の 流 れ を 説 明 す る. 以 下 で は ，GH CPython ではカラーコンタを描画するなどの高度

Windows10OS の PC に Rhinoceros6.0 および Anaconda

なグラフィック操作を行うプラットフォームはまだ実装

報告 H41－ 111 －図1

GH CPython を利用したモデリングされていない．Python ⇔ Grasshopper 間ではデータのやりとりさえできれば十分であるので，より高度な可視化表
現が必要な場合にはデータの可視化は GH CPython 側で行わずに Grasshopper の内部コンポーネントや，Rhino のグラフィックコントロールに強い C#や VisualBasic などで行うと良い．

3.2. OpenSeesPy
OpenSeesPy は pip を使って簡単にインストールできる．コマンドラインで pip install openseespy とすればよい．GitHub 上に Documentation がまとめられているが，OpenSeesPy もまだ開発途上の新しいライブラリ

t=[0.15]#板厚
fix=[[1,1,1,1,1,1,1],[2,1,1,1,1,1,1],[3,1,1,1,1,1,1],[4,1,1,1,1,1,1]]#境界条件
p=[[5,10.,0.,0.,0.,0.,0.],[8,10.,0.,0.,0.,0.,0.]]#外力
for e in range(m1):#部材座標軸と梁要素の材料断面入力
i,j,m=ij[e][0],ij[e][1],matNo[e]-1
ops.geomTransf(’Linear’,e+1,v[e][0],v[e][1],v[e][2])ops.element(’elasticBeamColumn’,e+1,i,j,A[m],E[m],G[m],J[m],Iy[m],Iz[m],e+1)
for i in range(m2):#板要素の材料断面入力
ops.section(’ElasticMembranePlateSection’,i+1,E[i],poi[i],t[i],0.)
for e2 in range(m2):#板要素[n1,n2,n3,n4],m=ijkl[e2][:],matNo2[e2]ops.element(’shellMITC4’,m1+e2+1,n1,n2,n3,n4,m)for f in fix:#境界条件入力
ops.fix(f[0],f[1],f[2],f[3],f[4],f[5],f[6])ops.timeSeries(’Constant’,1)
ops.pattern(’Plain’, 1, 1, ’-fact’, 1.0)
for f in p:#外力入力
ops.load(f[0],f[1],f[2],f[3],f[4],f[5],f[6])ops.system(’BandSPD’),ops.numberer(’RCM’)ops.constraints(’Plain’),ops.algorithm(’Linear’)ops.integrator(’LoadControl’, 1.0)
ops.analysis(’Static’)ops.analyze(1)disp,reaction=[],[]
for i in range(n):disp.append(ops.nodeDisp(i+1))

図 2 および表 2 の解析モデルを入力した上記のソース
コードを実行すれば，弾性変位を得ることができる．ソー
スコードには含めていないが，断面力や応力，反力も必要に応じて得ることができる．

10kNであるため，解説が不十分でサンプルコード数も少なく初8(0,1,1)

学者にはやや扱いづらい．日本の建築の構造設計を行う⑦

上では，梁要素とせいぜい板要素さえ使えれば十分であり，他の有限要素を利用する機会は殆どない．そこでここ

10kN7(1,1,1)④

では梁要素と板要素で構成される図のような構造物の弾性解析を行うソースコードを紹介する．通常 Python では⑨⑧5(0,0,1)

index は 0 から数えるが，OpenSeesPy では，節点や要素，断面，材料番号の index が 1 から始まる点に注意する．また，単位は全て kN,m で揃えている．OpenSees では梁要⑤⑥4(0,1,0)①5m6(1,0,1)

素におけるコードアングルを角度で入力するのではなく，部材座標軸の方向ベクトルで入力する点が一般的な FEM
ソフトウェアと異なる．なお，同ベクトルは単位ベクトル

要素節点関係

matNo=[1,1,1,1,2,2,2,2]#梁要素の断面材料番号
A=[1.207e-2,8.337e-3]#断面積
E=[2.05e+8,2.05e+8]#ヤング係数
G=[7.885e+7,7.885e+7]#せん断弾性係数
J=[3.569e-4,3.59e-7]#ねじり定数
Iy=[2.32e-4,2.35e-4]#強軸断面二次モーメント
Iz=[2.32e-4,1.74e-5]#弱軸断面二次モーメントv=[[0.,1.,0.],[0.,1.,0.],[0.,1.,0.],[0.,1.,0.],[0.,0.,1.],[0.,0.,1.],[0.,0.,1.],[0.,0.,1.]]#部材座標軸
ijkl=[[5,6,7,8]]#板要素節点関係
matNo2=[1]#板要素の断面材料番号
E2=[2.1e+7]#ヤング係数
poi=[0.2]#ポアソン比

報告 H413(1,1,0)z y1(0,0,0)②xである必要はない．
import openseespy.opensees as ops
ops.wipe()
ops.model(’BasicBuilder’, ’-ndm’, 3)n,m1,m2=8,8,1#節点数, 梁要素数, 板要素数
r=[[0.,0.,0.],[5.,0.,0.],[5.,5.,0.],[0.,5.,0.],[0.,0.,5.],[5.,0.,5.],[5.,5.,5.],[0.,5.,5.]]#節点座標
for i in range(n):ops.node(i+1,r[i][0],r[i][1],r[i][2])#節点入力
ij=[[1,5],[2,6],[3,7],[4,8],[5,6],[6,7],[7,8],[8,5]]#梁③ 5m5m2(1,0,0)
図2

OpenSees で解析する例題骨組

表2

例題骨組の部材断面情報

要素番号

要素種別

断面・板厚

ヤング率

ポアソン比

①

梁要素

□-350x9205GPa0.3②

梁要素□-350x9205GPa0.3③梁要素□-350x9205GPa0.3④梁要素□-350x9205GPa

0.3⑤梁要素H-400x200x8x13

205GPa0.3⑥梁要素H-400x200x8x13

205GPa0.3⑦梁要素H-400x200x8x13

205GPa0.3⑧

梁要素

H-400x200x8x13

205GPa0.3⑨板要素

t=150mm21GPa

0.2－ 112 －3.3. Python ライブラリを用いた GH 上での形態創生
GH CPython 通して OpenSeesPy を用いれば grasshopper 上で様々な構造解析を行うことができる．あとは，Python の豊富な情報技術ライブラリを用いれば，grasshopper 上で構造形態創生を手軽に行うことができる．1 例として，図 2 で作成したラチスドームについて，部材断面をすべて H-400x200x8x13(図 1 の例において⑤〜⑧に指定した断面)，4 隅を固定支持として，各節点に鉛直下向きに 5kN の節点外力を受けた状態で，支持点を除く節点の鉛直方向座標を設計変数，体積の上限値を 2.63m2 とし(a) 最適化前てひずみエネルギーを最小化するスクリプトを組み，実行した結果を図 3 に示す．最適化ライブラリには表 1 における pyOpt を用い，逐次二次計画法により最適化計算を行った．支持点間のライズがカテナリー状に上昇する構造最適化の世界ではおなじみの形状を grasshopper 上で得ることができた．

4. まとめGH CPython と OpenSeesPy を 用 い て ，Galapagos
や Karamba に頼らない構造形態創生事例を紹介した．

図3(b) 最適化後
Python ライブラリを用いた GH 上での形態創生例

OpenSeesPy も含めて，Python のライブラリはそのほとんどがオープンソースで公開されているので，コンパイル済で中身がブラックボックス化してしまう既存のコンポーネントを使用するよりもプログラムの中身を熟知した構造形態創生環境の構築が可能である．ただし，

GH CPython はまだ発展途上のコンポーネントであり，形態創生の様子をリアルタイム描画したり，高度なヴィジュアライゼーションには対応していないなど，機能面で不十分な点も存在する．その他には，gh-python-remote17) を用いれば表 1 のライブラリ群が GH CPython と同様にダイレクトに利用可能となるが，Python2 系でしか使用できない欠点があるため，現状最も有効な選択肢となりうるのはやはり GH CPython であろう．gh-python-remote が近い将来 Python3 に対応するか，あるいは GH CPythonの機能がより充実するかすれば，より手軽に Python の情報技術ライブラリ群を grasshopper 上で利用できるようになると思われる．
[参考文献]
1） D. Rutten. Grasshopper -computing architectural concepts-. the conference Advances in Architectural Geometry, Vienna, Austria, pp.
18–21, 2010.9.
2） D. Rutten. Galapagos: On the logic and limitations of genericsolvers. Architectural Design, Vol. 83, No. 2, pp. 132–135, 2013.3.
3） R. Vierlinger. Multi objective design interface. Master Thesis ofTechnical University Vienna, 2013.3.
4） C. Preisinger and M. Heimrath. Karamba -A toolkit for parametric structural design. Structural Engineering International, Vol. 24,No. 2, pp. 217–221, 2013.11.
5） M. Zhu, F. McKenna, and M. Scott. Openseespy: Python library forthe opensees ﬁnite element framework. SoftwareX, Vol. 7, pp. 6–11,2018.1.
6） Mahmoud AbdelRahman. Mahmoudabdelrahman/gh cpython: Al-報告 H41

pha release of gh cpython plugin, https://doi.org/10.
5281/zenodo.888148. 2017.9.
7） T. E. Oliphant. Guide to NumPy. Createspace Independent Publishing Platform, 2015.
8） R. E. Perez, P. W. Jansen, and J. R. R. A. Martins. pyopt: a pythonbased object-oriented framework for nonlinear constrained optimization. Structural and Multidisciplinary Optimization, Vol. 45, No. 1,
pp. 101–118, 2012.1.
9） S. Mitchell, S. M. Consulting, and I. Dunning. Pulp: A linear programming toolkit for python. The University of Auckland, Auckland,New Zealand, 2011.9.
10） G. Sagnol. Picos documentation. a python interface to conic optimization solvers. release 0.1.1. Zuse Institute Berlin (ZIB), 2012.1.
11） D. Izzo. Pygmo and pykep: Open source tools for massively parallel
optimization in astrodynamics (the case of interplanetary trajectoryoptimization). Proceedings of the International Conference on Astrodynamics Tools and Techniques - ICATT, 2012.1.
12） F. A. Fortin et al. Deap: Evolutionary algorithms made easy. Journalof Machine Learning Research, Vol. 13, pp. 2171–2175, 2012.7.
13） F. Pedregosa et al. Scikit-learn: Machine learning in python. Journalof Machine Learning Research, Vol. 12, pp. 2825–2830, 2011.10.
14） M. D. Golub and D. Sussillo. Fixedpointﬁnder: A tensorﬂow toolbox for identifying and characterizing ﬁxed points in recurrent neural networks. The Journal of Open Source Software, Vol. 3, No. 31,
2018.11. https://doi.org/10.21105/joss.01003.
15） S. Tokui, K. Oono, S. Hido, and J. Clayton. Chainer: a nextgeneration open source framework for deep learning. Proceedings ofworkshop on machine learning systems (LearningSys) in the twentyninth annual conference on neural information processing systems(NIPS), Vol. 5, , 2015.12.
16） J. Bergstra et al. Theano: Deep learning on gpus with python. Journal of Machine Learning Research, Vol. 1, pp. 1–48, 2011.10.
17） GH Python Remote: https://www.food4rhino.com/app/
gh-python-remote. Accessed 2019.8.

－ 113 －