大規模プロジェクトでのRhino運用#4- スクリプトを用いてモデルを統合する

最終更新日

以前の投稿に、パーツ毎それぞれファイルに分けて書き出し、繰り返しで行う処理をバッチ処理で行う方法が書かれていました。

現在進行中のとあるプロジェクトでもこの方法を使って部材のモデリングを行っていますが、この方法には、部材がバラバラのファイルになっているので全体のモデルとして形状を確認することが少々面倒という欠点があります。

さらには、他の会社様とデータのやり取りをしながら整合の取れた施工可能なモデルを作るので、他の会社様へデータを展開する際に全体のモデルに統合し直す必要があります。複雑な形状であれば、確認やそれに伴う形状修正が何度も繰り返されその都度、統合されたモデル(以下、統合モデルと呼ぶ)を作る必要があります。

ライノを用いて複数のファイルを統合する場合、ドラッグアンドドロップでまとめて import したら済むというように思えますが、大規模プロジェクトで部材の数多く、書き出されたファイルが複数のフォルダにまたがっている場合もあるため、時間も手数もかかり毎回毎回それらすべてのファイルを漏れなく統合するというのは非常にストレスです。

今回は、以下のようなプロジェクトファイルとフォルダの構成を想定して、スクリプトを用いて統合モデルを自動で作成する方法を書いていきます。統合モデルに含めるのは、base.3dm + working.3dm + parts_modeling 以下すべてのファイルです。

一般パネルと足元パネルを UserText などで管理し条件分岐で処理することも可能ですが、
今回はフォルダを分けていると想定します
プロジェクトフォルダ・ファイル構成

prj_name
- 0_base
	- base.3dm // 基準線など触らないファイル(普段はアタッチして使うが統合する際にモデルに含める)

- 1_working
	- working.3dm // 躯体や躯体に付く支持部材などを含む作業用ファイル

- 2_parts_modeling
	- parts  // 部材ごとにバラで書き出したファイル、一般パネル
		- 0000.3dm
		- 0001.3dm
		- 0002.3dm
		- ...

	- parts_bottom // 部材ごとに書き出したファイル、足元パネル(建物最下部のためにディテールが一部違う)
		- 9001.3dm
		- 9002.3dm
		- 9003.3dm
		- ...

統合モデルを自動で作成するためには

  1. プロジェクトフォルダを指定
  2. ライノのカンバスを新規作成する
  3. ファイルを読み込む
  4. 名前を付けて保存する

これらの処理が必要です。

スクリプトを書いてみます。動作環境は Windows10 / Rhino6 です。

### Copyright (c) 2021 Syntegrate
###
### This software is released under the MIT License.
### https://opensource.org/licenses/MIT

# -*- coding: utf-8 -*-

import datetime
import os
import rhinoscriptsyntax as rs


def get_current_time():
    return str(datetime.datetime.now().strftime("%y%m%d-%H%M%S"))

def get_rhino_file(dir_):
    pathList = []
    for file in os.listdir(dir_):
        if file.endswith(".3dm"):
            path = dir_ + "\\" + file
            pathList.append(path)
            # print (path)
    return (pathList)


### (1) Set Path
prj_path = rs.BrowseForFolder()
# print(prj_path)


### (2) Rhino Initialize
rs.Command("-New \"Large Objects - Millimeters.3dm\"")


### (3) Import
##### Base
base_path = "\"" + prj_path + "\\0_base\\base.3dm\""
rs.Command('_-Import {} _Enter'.format(base_path))

##### Working
working_path = "\"" + prj_path + "\\1_working\\working.3dm\""
rs.Command('_-Import {} _Enter'.format(working_path))

##### Parts
parts_dir = prj_path + "\\2_parts_modeling\\parts"
parts_path = get_rhino_file(parts_dir)
for p in parts_path:
    p = "\"" + p + "\""
    rs.Command('_-Import {} _Enter'.format(p))

##### Parts_Botttom
parts_dir = prj_path + "\\2_parts_modeling\\parts_bottom"
parts_path = get_rhino_file(parts_dir)
for p in parts_path:
    p = "\"" + p + "\""
    rs.Command('_-Import {} _Enter'.format(p))


### (4) Save
timestamp = get_current_time()
result_path = prj_path + "\\result_{}".format(timestamp) + ".3dm"
rs.Command("-Save \"{}\"".format(result_path))

print("SAVE : {}".format(result_path))

(連番の名前がついた大量のファイルをコードに含めるのはスマートではないので、指定したフォルダのファイル一覧を取得してループで処理しましょう。このスクリプトでは 2_parts_modeling 以下のフォルダ名をハードコーディングしているのでこれは美しくないです)

以上のスクリプトを実行すると、最初に選択したフォルダの直下に、作成時の時刻を名前とした統合モデルが作成されます。

作成時刻が23時になっていますが長時間労働を強いられているわけではないです
(念のため)

モデルの修正作業を終えてからスクリプトを実行して座って待っていれば、ただのまとめ作業に手間取られることもなく、ヒューマンエラーを避けつつ統合モデルを作成することができます。

今後の展開として、統合後にオブジェクトを分類して集計することや、エラー出ている箇所にメッセージを出すなど分析のような機能などを追加して、自動で統合しつつ分析結果まで吐き出すようなものができるかと思っているので、もう少し掘り下げていきたいです。
繰り返し発生する単純な作業はスクリプトを書いて自動化し、より楽をしていきたい本質的な業務に向き合う時間を増やしていきたいです。

naoki.yoshioka

主にファサードプロジェクトを担当。使用言語は日本語と Python。C++(と英語)を勉強中。

シェアする