Solibriから出力したBCF2.1ファイルをTrimbleConnectに正常に受渡す方法
検証環境:
Solibri Office 9.12.10.20
Trimble Connect for Browser 5.8.1
問題
Solibriで作った案件をTCに取り込むとIFCのリンクが外れてしまう問題があります。
Solibriで作った案件
BCFv2.1で出力
プロジェクト詳細でBCFトピックを有効化
トピックインポート
インポート時に上記設定にチェックを入れないと、ステータスの「オープン」がTC上にデフォルトで設定されていないため、エラーが出てしまうので注意。(「Open」はあるが)
一見正しくインポートされたように見えるが、IFCデータとの紐づけがなされていないので(もちろんあらかじめ対象のIFCはTCにアップロードしている)3D表示はできず、文字情報とスクショだけが取り込まれている状態です。
3Dビューアで表示してもこのようなエラーが出る
検証
解決法だけわかりゃいいんじゃい!という方はここを飛ばしてもOKです。
Solibriから出力したBCF(v2.1)ファイルを解凍すると(拡張子は.bcfだが実態はzipなので解凍可能。7zipなら拡張子を変えることなく解凍も可)このようなフォルダとファイルが見えます。
ひとつひとつファイルをエディタで開いて見てみると、IFCファイルを指定しているのはmarkup.bcf
ファイルのようです。
このファイルも拡張子は.bcfですが中身はXMLです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Markup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="markup.xsd">
<Header>
<File IfcProject="344O7vICcwH8qAEnwJDjSU">
<Filename>C:\Data\***\TEST1.ifc</Filename>
<Date>2023-06-17T00:10:13+09:00</Date>
</File>
<File IfcProject="344O7vICcwH8qAEnwJDjSU">
<Filename>C:\Data\***\TEST2.ifc</Filename>
<Date>2023-06-17T00:10:36+09:00</Date>
</File>
</Header>
<Topic Guid="12ab8efe-6a64-4428-9b92-f11303dcc65f" TopicType="Error" TopicStatus="オープン">
<Title>BBBB</Title>
<Index>1</Index>
<CreationDate>2023-06-17T17:25:12+09:00</CreationDate>
<CreationAuthor>***@****.com</CreationAuthor>
<ModifiedDate>2023-06-17T17:37:47+09:00</ModifiedDate>
<ModifiedAuthor>***@****.com</ModifiedAuthor>
<AssignedTo></AssignedTo>
<Description>B説明</Description>
</Topic>
<Viewpoints Guid="c8336d4f-4e34-4db6-b0ee-b85304e102cc">
<Viewpoint>viewpoint.bcfv</Viewpoint>
<Snapshot>snapshot.png</Snapshot>
<Index>0</Index>
</Viewpoints>
</Markup>
どうやらファイル内の<Filename>C:\Data\***\TEST1.ifc</Filename>
<Filename>C:\Data\***\TEST1.ifc</Filename>
がローカルパスを指定しているせいでTC側が対象を見失って迷子になっているらしいです。
TC側で作ったトピックをBCF出力するとこの部分は
<Filename>TEST1.ifc</Filename>
となっています。
つまりこの部分を書き換えればTC側で正常に読み込まれるはず!
解決方法
以下のようなスクリプトをPythonで作りました。
import shutil
import xml.etree.ElementTree as ET
import os
import glob
OriginFileName = 'SolibriBCFTest.bcf' # 変換対象のBCFファイル名
ConvertFileName = "conv.zip"
ConverDirName = "dir_out"
ReConvertFileName = "reconv"
# 変換後(TrimbleConnect対応)のBCFファイル名
ReConvertbcf = os.path.splitext(os.path.basename(OriginFileName))[0] + "_TCconv.bcf"
# BCF -> ZIPに拡張子変換
shutil.copy(OriginFileName, ConvertFileName)
# ZIPを解凍
shutil.unpack_archive(ConvertFileName,ConverDirName)
# 変換対象の"markup.bcf"のパスを抽出
files = glob.glob(ConverDirName + "/**/markup.bcf")
for file in files:
# markup.bcfをXMLとしてパース
tree = ET.parse(file)
root = tree.getroot()
print(file)
# <Filename>タグのテキストのローカルパスをファイル名+拡張子のみに書き換える
for name in root.iter('Filename'):
basename = os.path.basename(name.text)
print("CONVERT:"+name.text+" -> "+basename)
name.text = basename
# markup.bcfの書き換え
tree.write(file, encoding='UTF-8')
# フォルダをZIP圧縮
shutil.make_archive(ReConvertFileName, format='zip', root_dir=ConverDirName)
# ZIP-> BCFに拡張子変更
shutil.copy(ReConvertFileName + ".zip", ReConvertbcf)
# 不要なフォルダ・ZIPを削除
shutil.rmtree(ConverDirName)
os.remove(ConvertFileName)
os.remove(ReConvertFileName + ".zip")
これをBCFファイルと同じディレクトリで実行することで書き換わった「SolibriBCFTest_TCconv.bcf」というファイルが生成されます。
やっていることは至って単純で、
- BCFファイルをZIP解凍
- 全てのmarkup.bcfをパス表記からファイル名のみに書き換え
- 再度ZIP圧縮(拡張子BCF)
をしているだけです。
結果
上記Pythonスクリプトで書き換えたbcfをTCに取り込むと、エラーが解消され必要なIFCファイルを表示してくれている。
カメラ位置が若干怪しいのと選択状態が保存されなかったり(上の画像は壁を選択してたはずだが選択されていない)
選択状態も持ってこられたかと思いきや色が変わっているだけだったり(モデルのリセットで色は戻る)
怪しい部分が無いでは無いですが、一応BCFインポート自体はできました。
おわりに
色んなCDEを試したけどめちゃくちゃ安い(メンバー5人まで x プロジェクト5つまで無料 / ビジネス版でも$9.99/月(2023/06/17現在))し、干渉チェックができたり2D図面を3D上に重畳表示できたり意外に高機能なので、TrimbleConnect最近の個人的ヒットです。
あまり日本で採用している話を聞かないので使ってる人いたら情報交換したいです。
Discussion