大規模プロジェクトでのRhino運用#2- スクリプトによるバッチ処理
以前の投稿で一つのプロジェクトであっても、
複数のファイルに分割することで共同作業が可能になるWorksessionを紹介しました。
今回の投稿では、さらにパーツ単位にファイルを分けることで、
一部の作業をルーティン化する方法を紹介します。
この手法を使うことで、「ファイルが大きすぎて処理できない!」という状況を回避できます。
パネル状の外装材のモデルを想定します。
割付の検討をしてペライチのモデルで一枚ずつのパネルの外形ができているとしましょう。
EleFrontのExportコンポーネントなどを利用して一枚ずつのパネルに分けてファイルを作ります。
できましたね。
いわゆるバラ図(製作用の単品図)の単位でファイルを分けていると考えてください。
つぎに、すべてのパネルにたいして
「四隅に縁から100mmの位置で点を打つ」
という操作をしてみましょう(ファスナーの挿入基点を想定しています)。
一つのパネルに対してGrasshopperをかきます。
最後はAttribute User Textをつけながらでこんな感じでBakeします。
EleFrontのReference by LayerとBakeのコンポーネントを使うのがミソです。
RefLayの設定に要注意。
AutoUpdateをさせることでファイルが開かれるたびにBakeされるようになります。
さて、ここからがハイライトです。
なにかしらのスクリプトを使って、
作業対象のフォルダの中のすべての3dmファイルに対して
・開いて
・保存して
・閉じる
操作をします。
#日本語名称に対応できるようutf-8想定
# -*- coding: utf-8 -*-
#いつものおまじない
import os
import rhinoscriptsyntax as rs
import Rhino
import scriptcontext as sc
#今開いているRhinoファイルを操作対象にする
sc.doc = Rhino.RhinoDoc.ActiveDoc
#FolderLocation
mydir = rs.BrowseForFolder(None,"Sel Folder")
#フォルダ内のRhinoファイルのパスをリスト化
def getRhinoFile(dir):
pathList = []
for file in os.listdir(dir):
if file.endswith(".3dm"):
path = dir + "\\" + file
pathList.append(path)
print (path)
return (pathList)
#指定されたパスのファイルを開いて..保存
def open_close(dir):
for f in dir:
f = '"' + f + '"'
rs.Command("_-Open {}".format(f))
rs.Command("Save")
#ファイル取得
files = getRhinoFile(mydir)
#開いて保存するループ
open_close(files)
スクリプトだけを見ると意味不明かもしれませんが、
先ほどのgrasshopperと組み合わせると複数のファイルに対して同じghファイルを適用できます。
単純な操作や数量が少ないと効果がわからないかもしれませんが、
1000を超えるパーツ数になると、
この手法でないとRhinoがクラッシュすることがあります。
巨大なモデルを作る必要が出てきたとき試してみてください。