Rhino8のGrasshopperでopenseespyを使いたい
概要
Rhino 8 ではgrasshopper のpythonが3系になり、script editorで外部のライブラリが使用可能になったので、openseespyを使ってみようとしてつまづいた部分の自分用メモ。
実施したRhinocerosのバージョン:
Rhino 8 for Windows
8.9.24194.18121 | 2024年7月12日
Grasshopper Script EditorでPython 3系を使用する
Rhino 8 から使用可能になったScript Editor
Python のバージョンは3.9.10。
最初にやって、うまくいかなかったこと
最初は、以下のサイトなどに記載の記法(# r: numpy や# venv: site-packagesなどを直接記入)を試していたが、原因不明のエラーが多かったのでやめた。これに限らず、パッケージインストール時などに、(パッケージ名のスペルミスなどで)とにかく頻繁にエラーが出る。出たらRhino再起動が必要な場合が多い。それでも解決しなければ、Rhino 8の再インストールが必要っぽい。
再インストール時には、以下のフォルダなども削除した。(関係あるかはよくわからない)
C:\Users\owner\.rhinocode
C:\Users\owner\AppData\Local\McNeel\Rhinoceros\8.0
C:\Users\owner\AppData\Roaming\McNeel\Rhinoceros\8.0
行った試行錯誤
ライブラリのパッケージインストールには、Script Editor上のメニュー中の段ボールのアイコンをクリックし、パッケージ名を入力してインストールすればよい(本来の正攻法)。
numpy,scipy,pandas,matplotlibなどは問題なくできた。
しかしopenseespyは失敗。pythonのバージョンが3.9.10なのが問題っぽい(2024年7月現在の最新openseespyはpython3.11に適合)。
しかし以下のポストによると、Rhino 8 のpythonのバージョンアップはまだ先。
python 3.9.10で利用可能なopenseespyのバージョンがわからない。chatGPTに聞いてみると、下記の回答。
ためしにopenseespy 3.2.2.1を指定すると、ひとまずインストールできた。
しかし実行すると、以下の表示のエラーが出た。openseespy 3.2.2は古すぎた?3.2.2.1が3.2.2になっているし。
以下のリンク先などによると、openseespy 3.5.1.3からはpython 3.10が、openseespy 3.5.1.8からはpython 3.11.が必要ということは確認できたものの、python 3.9.10に合うのは openseespy 3.3.0から3.5.1.3までのどれかっぽいというところまでで、これ以上はよくわからない。
Script Editorでopenseespy<=3.5.1.2を指定しDLても、以下のエラーが出る。3.5.1.2と指定しているのに以下のエラー中では3.5.1の指定と認識されてしまうのもよくわからない。
Info 07/25/2024 19:08:06 [RhinoCode] Installing "openseespy<=3.5.1"
Info 07/25/2024 19:08:06 [RhinoCode] Running process: C:\Users\owner\.rhinocode\py39-rh8\python.exe -s -m pip --disable-pip-version-check install --target "C:\Users\owner\.rhinocode\py39-rh8\site-envs\default-qIXuajZd" --progress-bar off --upgrade --no-warn-script-location --retries 0 --timeout 1 "openseespy<=3.5.1"
Error 07/25/2024 19:08:08 [RhinoCode] Process exited with code 2
Error 07/25/2024 19:08:08 [RhinoCode] pip install error | Collecting openseespy<=3.5.1
Using cached openseespy-3.4.0.8-py3-none-any.whl.metadata (1.6 kB)
Collecting openseespywin>=3.4.0.8 (from openseespy<=3.5.1)
Downloading openseespywin-3.4.0.8-py3-none-any.whl.metadata (1.0 kB)
Downloading openseespy-3.4.0.8-py3-none-any.whl (4.2 kB)
Downloading openseespywin-3.4.0.8-py3-none-any.whl (5.8 MB)
ERROR: Exception:
Traceback (most recent call last):
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 438, in _error_catcher
yield
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 561, in read
data = self._fp_read(amt) if not fp_closed else b""
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 527, in _fp_read
return self._fp.read(amt) if amt is not None else self._fp.read()
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\cachecontrol\filewrapper.py", line 98, in read
data: bytes = self.__fp.read(amt)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\http\client.py", line 463, in read
n = self.readinto(b)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\http\client.py", line 507, in readinto
n = self.fp.readinto(b)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\socket.py", line 704, in readinto
return self._sock.recv_into(b)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\ssl.py", line 1241, in recv_into
return self.read(nbytes, buffer)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\ssl.py", line 1099, in read
return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\cli\base_command.py", line 179, in exc_logging_wrapper
status = run_func(*args)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\cli\req_command.py", line 67, in wrapper
return func(self, options, args)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\commands\install.py", line 377, in run
requirement_set = resolver.resolve(
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 179, in resolve
self.factory.preparer.prepare_linked_requirements_more(reqs)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\operations\prepare.py", line 554, in prepare_linked_requirements_more
self._complete_partial_requirements(
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\operations\prepare.py", line 469, in _complete_partial_requirements
for link, (filepath, _) in batch_download:
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\network\download.py", line 184, in __call__
for chunk in chunks:
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_internal\network\utils.py", line 63, in response_chunks
for chunk in response.raw.stream(
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 622, in stream
data = self.read(amt=amt, decode_content=decode_content)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 587, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\contextlib.py", line 137, in __exit__
self.gen.throw(typ, value, traceback)
File "C:\Users\owner\.rhinocode\py39-rh8\lib\site-packages\pip\_vendor\urllib3\response.py", line 443, in _error_catcher
raise ReadTimeoutError(self._pool, None, "Read timed out.")
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
Error 07/25/2024 19:08:08 [RhinoCode] Error installing package | Rhino.Runtime.Code.Environments.EnvironException: Exception:
at Rhino.Runtime.Code.Languages.PythonNet.CPythonEnviron.AddPackages(IEnumerable`1 pkgSpecs, IProgress`1 progress)
at Rhino.Runtime.Code.Environments.Environ`1.Rhino.Runtime.Code.Environments.IPackageEnviron.AddPackages(IEnumerable`1 pkgSpecs, IProgress`1 progress)
at RhinoCodeEditor.Editor.Dialogs.InstallPackageDialog.<>c__DisplayClass16_0.<InstallPackages>b__0()
バージョン番号について、Script editorで上から3桁までの数値しか反映されないのは仕様かもしれない(以下のセマンティックバージョニングのメジャーバージョン・マイナーバージョン・パッチバージョン)
結局、openseespy<=3.4.0 を指定してDLすると、とりあえず動いた。openseespy-3.3.0.1.1とopenseespywin-3.4.0.8 が入ったっぽい。
Info 07/25/2024 19:14:51 [RhinoCode] Installing "openseespy<=3.4.0"
Info 07/25/2024 19:14:51 [RhinoCode] Running process: C:\Users\owner\.rhinocode\py39-rh8\python.exe -s -m pip --disable-pip-version-check install --target "C:\Users\owner\.rhinocode\py39-rh8\site-envs\default-xPtdn4Hi" --progress-bar off --upgrade --no-warn-script-location --retries 0 --timeout 1 "openseespy<=3.4.0"
Info 07/25/2024 19:14:51 [RhinoCode] Running process: C:\Users\owner\.rhinocode\py39-rh8\python.exe -s -m pip --disable-pip-version-check list --path "C:\Users\owner\.rhinocode\py39-rh8\site-envs\default-xPtdn4Hi" --format freeze
Info 07/25/2024 19:14:52 [RhinoCode] Collecting openseespy<=3.4.0
Using cached openseespy-3.3.0.1.1-py3-none-any.whl.metadata (1.6 kB)
Collecting openseespywin>=3.3.0.1 (from openseespy<=3.4.0)
Using cached openseespywin-3.4.0.8-py3-none-any.whl.metadata (1.0 kB)
Using cached openseespy-3.3.0.1.1-py3-none-any.whl (128 kB)
Downloading openseespywin-3.4.0.8-py3-none-any.whl (5.8 MB)
Installing collected packages: openseespywin, openseespy
Successfully installed openseespy-3.3.0.1.1 openseespywin-3.4.0.8
Script editorに以下のopenseespy例題コードを入力し、解析できたことを確認した。
https://openseespydoc.readthedocs.io/en/latest/src/truss.html
"""Grasshopper Script"""
# requirements: numpy
# requirements: scipy
# requirements: matplotlib
# requirements: openseespy<=3.4.0
from openseespy.opensees import *
import numpy as np
import matplotlib.pyplot as plt
# ------------------------------
# Start of model generation
# -----------------------------
# remove existing model
wipe()
# set modelbuilder
model('basic', '-ndm', 2, '-ndf', 2)
# create nodes
node(1, 0.0, 0.0)
node(2, 144.0, 0.0)
node(3, 168.0, 0.0)
node(4, 72.0, 96.0)
# set boundary condition
fix(1, 1, 1)
fix(2, 1, 1)
fix(3, 1, 1)
# define materials
uniaxialMaterial("Elastic", 1, 3000.0)
# define elements
element("Truss",1,1,4,10.0,1)
element("Truss",2,2,4,5.0,1)
element("Truss",3,3,4,5.0,1)
# create TimeSeries
timeSeries("Linear", 1)
# create a plain load pattern
pattern("Plain", 1, 1)
# Create the nodal load - command: load nodeID xForce yForce
load(4, 100.0, -50.0)
# ------------------------------
# Start of analysis generation
# ------------------------------
# create SOE
system("BandSPD")
# create DOF number
numberer("RCM")
# create constraint handler
constraints("Plain")
# create integrator
integrator("LoadControl", 1.0)
# create algorithm
algorithm("Linear")
# create analysis object
analysis("Static")
# perform the analysis
analyze(1)
ux = nodeDisp(4,1)
uy = nodeDisp(4,2)
if abs(ux-0.53009277713228375450)<1e-12 and abs(uy+0.17789363846931768864)<1e-12:
print("Passed!")
print("ux,uy=",ux,uy)
else:
print("Failed!")
ただし、ここで使用されたopenseespy 3.3.0.1.1は、比較的最近追加されたメソッド(openseespy.opensees.meshなど)が利用できない。現時点ではgrasshopper script editor側で利用可能なpythonが古いため、どうしようもなさそう。
今後のRhino 8の(マイナー?)バージョンアップを待ち、openseespyを合わせてバージョンアップする必要がある。
まとめ
・2024年7月現在のRhino 8 (8.9.24194.1812)のScript editorで使用可能なpythonのバージョンは3.9.10。よって、これに合うopenseespyのバージョン(例えばopenseespy-3.3.0.1.1)を指定してインストールする必要がある。ただし、3.3.0.1.1を指定しようとしてもなぜか上から3つまでの数値しか認識してくれない(一般的なバージョニングの慣例に基づく仕様?)のため、ここではopenseespy<=3.4.0としてDLした。
・試される場合は自己責任でお願いします。
追伸
こちらの方法の方が良い?いちいち読み込む必要なさそう。
コマンドプロンプト上でpipを利用してインストールしておくみたい。通常のpipを使ったインストールなのでオプションでバージョン指定もでき、こちらの方がよさげ。
C:\Users\owner\.rhinocode\py39-rh8\Scripts>pip3.9.exe install <package_name>
試していないのでわからない。公式の方法ではなさそうなので、下手したらまた再インストールが必要になるかも。
この記事が気に入ったらサポートをしてみませんか?