ThatOpenのIFCローダーをMacで動かす

ThatOpenとは
ThatOpenは、BIM(Building Information Modeling)アプリケーションを構築するためのオープンソースライブラリの集合体です。
プロジェクトの概要
主要な特徴
Three.jsやその他のライブラリをベースとした、ブラウザベースの3D BIMアプリケーションを簡単に構築できる事前作成済み機能を提供します。主な機能には以下があります:
- IFCファイルの処理: IFCの読み込み、表示、ナビゲーション、編集、エクスポート
- 3Dビューア: ポストプロダクション、寸法表示、フロアプランナビゲーション、DXFエクスポートなど
- 多様な3Dフォーマット: その他の3D形式の読み込み、表示、ナビゲーション
主要なライブラリ構成
1. @thatopen/components
BIMアプリケーション作成のためのコア機能のコレクション。Three.jsベースの3D機能を提供します。
2. @thatopen/ui
ユーザーインターフェース要素の究極セット。ボタン、パネル、ツールバー、テーブル、入力フィールドなどのコアUIコンポーネントを提供。
3. @thatopen/ui-obc
@thatopen/componentsの多くの機能に対応する事前作成済みの機能コンポーネント。IFCファイル読み込みボタンから、アプリツール設定テーブル、モデル分類表示パネルまでを含みます。
技術的特徴
Web Components技術
ブラウザAPIのWeb Componentsを使用して、独自のHTMLタグ(DOM要素)を定義可能。React、Angular、Vue、SvelteなどどこでもHTML要素として使用できる
多様なプラットフォーム対応
Web(HTML、CSS、オプションでReact、Angular、Vueなど)、Node.js(バックエンドアプリ)、React Native(モバイルアプリ)、Electron(デスクトップアプリ)
プロジェクトの目標
すべての人がBIMソフトウェアを作成できるようにし、すべてのソフトウェアが同じ言語で話せる分散型エコシステムを作ることで、お互いの問題解決のために共有、売買できるようにすることを目指しています。
つまり、ThatOpenは建築・建設業界向けのモダンで使いやすいBIMソフトウェア開発プラットフォームということですね!

サンプルの中のIFCロードを自分のMacで動かすと色々エラーが出たので対処方法のメモ
リポジトリをcloneする
yarn
yarnが必要なのでインストールしておく。自分はvolta環境なので、
volta install yarn
した
パッケージをプレビルドする
yarn build-libraries
実行
yarn dev

Darwin用のプラグインがないエラー
依存パッケージにDarwin非対応のバージョンが含まれている
- yarn.lock、package-lock.jsonを削除する
- node_modulesを削除する
- yarn installする

indexに何も表示されない
examplesという文字だけでリンクがない。
vite.config.ts内でサンプルにリンクするindexを作成している部分がある。
ここのディレクトリの区切りがWindows用になっているので変更する。
directory.match(/packages\\([^\\]+)/);
↓
directory.match(/packages[\/\\]([^\/\\]+)/);
const writeIndexHTML = () => {
let links: string = "";
const examplePaths = globSync("packages/**/src/**/example.html");
for (const examplePath of examplePaths) {
const directory = path.dirname(examplePath);
const packageNameMatch = directory.match(/packages[\/\\]([^\/\\]+)/);
解説 by Claude
正規表現での \\
と \/\\
の違いを説明します:
\\
について
- エスケープされたバックスラッシュ
- JavaScriptの文字列内では
\\
= 実際の\
文字1つ - 正規表現では Windows のパス区切り文字
\
にマッチ
\/\\
について
- エスケープされたスラッシュ +
エスケープされたバックスラッシュ - JavaScriptの文字列内では
\/\\
= 実際の/\
文字2つ - 正規表現では Unix/Linux の
/
OR Windows の\
にマッチ
この行の意味:
directory.match(/packages[\/\\]([^\/\\]+)/);
- packages の後に
/
または\
が続く -
([^\/\\]+)
=/
でも\
でもない文字が1文字以上 - つまり packages/core や packages\core 両方にマッチ
なぜこうするのか:
- クロスプラットフォーム対応
- macOS/Linux: packages/core
- Windows: packages\core
- 両方のパス形式に対応できる

謎のエラー
IFCをロードするとエラー
Unhandled Promise Rejection: TypeError: Missing field: "tolerancePlaneIntersection"
AIに聞いても検索してもわからない
対応策
いろいろ試行錯誤した結果、Mac(もしくはSafari?)では、web-ifcのwasmをネットワーク経由でダウンロードして動かすとエラーになるらしい。ローカルから読み込むようにしたら動作した。
resources以下にwasmディレクトリを作成して、下記コマンドでwasmをコピーする
% cp node_modules/web-ifc/web-ifc.wasm resources/wasm
% cp node_modules/web-ifc/web-ifc-mt.wasm resources/wasm
/packages/core/src/fragments/IfcLoader/example.ts の、wasmのロード部分を変更する
await ifcLoader.setup({
autoSetWasm: false,
wasm: {
path: "/resources/wasm/",
absolute: false,
// path: "https://unpkg.com/web-ifc@0.0.70/",
// absolute: true,
},
});
Hi there torikasyu-san!
I only created an account to express that I am very grateful for this post!!!!
Thank you, greetings from Hungary.
Tamas Balogh

うごいた