RhinoInsideを用いてCPythonから属性ユーザテキストに書き込む(iPad手書き入力編)

最終更新日

BIMの重要な要素に属性情報があります。仕様や数量などの情報をモデルデータに埋め込み、生産設計や施工管理等に活用することができます。

前回は、RhinoInsideを介してCPythonから QRコード を読み込み、Rhinoモデルに属性情報を入力する方法を掲載しました。 QRコードを用いると迅速に入力できるのですが、IDの認識や”OK”の入力といった単純なことしかできないため、用途が限られてしまいます。

そこで本記事では、iPadのスクリブル機能を用いて手書き文字をWordに書き込み、それをCPythonで読み込むことで、Rhinocerousオブジェクトの属性ユーザテキストに任意の値を書き込む方法を示します。

まず、CPythonはあらかじめインストールされていることを想定します。パッケージ管理システムのPIPで以下のモジュールをインストールします

RhinoInside ※Rhinoバージョン7、64bit CPython(2.7, 3.5, 3.6, 3.7)

python-docx

Wordでシートを作成してiPadで書き込む

では、iPadで書き込むためのWordのテーブルを作成します。 枠内に手書きしてもらえるように枠を大きくして作成します。以下の画像がWordファイルのテーブルになります。

次に、このWordファイルをiPadアプリ「Pages」で読み込んで属性情報を書き込みます。「スクリブル」という2020年のiPadOS14から追加された機能によってWordファイルのテーブルに手書き入力していきます。下の左側の画像が書き込んでいる様子で、右がPagesで出力されたwordファイルです。

Wordファイルのテーブルを読み込んで、Rhinocerosオブジェクトに書き込む

それでは、手書きデータを書き込んだWordファイルをCPythonのモジュール「python-word」で読み込んで、Rhinocerosオブジェクトに属性情報を書き込みます。以下のプログラムを実行させます。

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

# -*- coding: utf-8 -*-
import os, sys
import docx #python-word

#RhinoInsideを使う
import rhinoinside
rhinoinside.load()
import System
import Rhino

#ファイルのパスを取得
dir_home = os.path.dirname(__file__)

path_3dm  = os.path.join(dir_home, "panelize.3dm")
path_docx = os.path.join(dir_home, "check_sheet.docx")

def read_docx(path_docx):

    #wordファイルのテーブルを取得
    doc = docx.Document(path_docx)
    table = doc.tables[0]

    #各行を格納するリスト
    list_dict_atrb = []

    #テーブルを巡回
    for y, row in enumerate(table.rows): #各行

        #項目名とサンプル行なのでスルー
        if y in [0,1]:
            continue

        dict_atrb = {}
        for x, cell in enumerate(row.cells):#左から読み込む

            val = cell.text
            if val == "":
                continue

            if x == 0:
                dict_atrb["002_PANEL_NAME"] = "panel_" + val.zfill(4)
            elif x == 1:
                dict_atrb["014_設置前検査合否"] = val
            elif x == 2:
                dict_atrb["015_設置日"] = val

        #空白があった行は属性情報を入力しない
        if len(dict_atrb.keys()) == 3:
            list_dict_atrb.append(dict_atrb)

    #テスト出力
    for dict_atrb in list_dict_atrb:
        for key in dict_atrb.keys():
            print("    {} : {}".format(key, dict_atrb[key]))
        print("")

    return list_dict_atrb

def write_3dm(path_3dm, list_dict_atrb):

    #.3dmを読み込む
    f3dm = Rhino.FileIO.File3dm.Read(path_3dm)

    for dict_atrb in list_dict_atrb:

        name_obj = dict_atrb["002_PANEL_NAME"]

        for obj in f3dm.Objects:

            atrb = obj.Attributes
            if atrb is None:
                continue

            if atrb.Name != name_obj:
                continue

            atrb.SetUserString("014_設置前検査合否", dict_atrb["014_設置前検査合否"])
            atrb.SetUserString("015_設置日", dict_atrb["015_設置日"])

        print("write : {}".format(name_obj))

    f3dm.Write(path_3dm, version=6)
    f3dm.Dispose()

def main():

    #wordファイル読み込み
    list_dict_atrb = read_docx(path_docx)

    #3dmオブジェクトの属性情報に書き込み
    write_3dm(path_3dm, list_dict_atrb)

if __name__ == '__main__':
    main()

このプログラムを実行すると、これまでと同じように.3dmファイルのオブジェクトに属性情報が入力されます。

以上になります。iPadのスクリブル機能によって手書き文字のデータをWordファイルに書き込み、RhinoInsideを介してオブジェクトの属性ユーザテキストに任意の値を書き込む方法を掲載しました。

建設現場で使うことができるかというと議論の余地があると思われまが、実際に活用するとなると、書き込む練習や、書式の設定、データの入力が適切に行われているかをチェックするプログラムを作成することが予想されます。一方で、応用範囲が広い技術なので属性情報の入力だけでなく、様々な用途に活用していきたいです。

それでは、最後までお読みいただき、ありがとうございました。

jyun-ichi

シンテグレートのプログラミング担当。入社2年目。業務はPythonやUnity(C#)の開発。運動と車と読書の田舎暮らし。

シェアする