(191211)
(200515)

1.概要

 百人町施設の記録図面からAutoDesk系のソフトで入力したIFC形式のデータは、ArchiCADでは読み出せない
 一方、景観シミュレータの外部関数IFC.exe では、ArchiCADのサンプルが読み出せない
 その原因を調べると、頂点→面→立体→部材→建物の構築のパスが異なることが判明した。
 そこで、以下の取り組みを行った。
1.IFC.exe のバージョンアップにより、ArchiCADのサンプルを処理可能とする
2.メタファイル IFC.cmm を異なる構造のIFCファイルに関して作成する
3.新たに、WebGL上を用いてブラウザのcanvasタグにIFC形式を読み込むスクリプトを試作する

2.IFC.exeの改良

使用したサンプルデータ

(141219時点、AutoCAD系)
 サンプル壁のみ.ifc
 サンプル1.ifc
 サンプル2スパンRC.ifc
→これらはBOOL演算及び回転を含む座標変換を使用
(150219時点、AutoCAD系)
 01本館棟.ifc~16実大排煙実験室.ifc
→これらはシンプルな三角形分割モデル
(181206時点、ArchiCAD系
 sample_RC_AC21.ifc
→BOOLを入れ子で使用
 回転を含む座標変換を使用

百人町データのIFCファイルにおける階層構造(シンプルなサーフェスモデル)

 IFCCARTESIANPOINT
→IFCPOLYLOOP(閉じた頂点列)
→IFCFACEOUTERBOUND (外周), IFCBOUND(穴)
→IFCFACE(面)
→IFCCONNECTEDFACESET(面群)
→IFCFACEBASEDSURFACEMODEL(多面体)
→IFCSHAPEREPRESENTATION(形状の種類と形状データ)
(以下同)
→IFCPRODUCTREPRESENTATION(部材の表現)
→IFCBUILDINGELEMENTPROXY(部材のID、和文名称、配置、部材の表現)

ArchiCADサンプルRC建物における階層構造(シンプルなサーフェスモデル)

 IFCCARTESIANPOINT
→IFCPOLYLOOP(閉じた頂点列)
→IFCFACEOUTERBOUND(外周)
→IFCFACE(面)
→IFCOPENSHELL(開いた殻、異なる経路)
→IFCSHELLBASEDSURFACEMODEL(異なる経路)
→IFCSHAPEREPRESENTATION
(以下同)
(このサンプルにおいては、立体を表現するために、他のいくつかの手段が使われている(後述)が、
IFCFACEBASEDSURFACEMODELは使用されていない。

190918時点での成果

・入れ子になったBOOL演算に対応
・穴あき図形に対応(景観シミュレータの平面穴あけ機能を移植導入
→最新版は190918で、デバッガを用いてsample_RC_21.ifcを変換
・生成したgeoファイルを景観シミュレータにロードする時点でBOOL演算を実施
・ロードが終了後に、表示段階で面積微小のエラーを表示
・141219時点のサンプル3題に関しては解決
 ただし、ksim/binにはこの時点でまだ反映していない。

残された課題

 GetTransform関数で、「回転要素あり」としてエラー処理に入る場合への対応(15ヶ所)
 (70060, 78436, 106858, 107128, 854871,
  1238856, 1239202, 1240108, 1240378, 1253117,
   1334290, 1334802, 1335715, 1335985, 1342881)
 仮想線と交差する内輪処理において交差数が1しかない
→854871 I=1, i=4, j=24
→1138599 I=1, i=4, j=0
(これらについては、2005時点で解決)
 BOOL演算の中間ファイルを削除する機能が必要(現状は、ifc.exeと同じディレクトリ)

カラー、マテリアルなど

02_土圧試験室.ifc について見ると、
 IFCCOLOURRGBで根本定義されたカラーが、4階層を経て、
 IFCSTYLEDITEM(モデル、スタイル)コマンドにより関連付けられる
 このモデルは、屋根、建具、床、壁の4レイヤーをもつ。
 屋根、床、壁はすべて(0.7,0.7,0.7)であるが、
 建具だけは、(0, 1, 1)のカラーを有する。
 IFCCOLOURRGB→IFCSURFACESTYLERENDERING→IFCSURFACESTYLE
 →IFCREPRESENTATIONSTYLEASSIGNMENT→IFCSTYLEDITEM
 サンプル集合住宅におけるマテリアルは、材質がわかるのみでカラー情報を持たない場合もある
→一般的な材料の表面光学特性をデフォルト・マテリアル(IFC.mtl)  個別IFCファイルの中で特にカラー指定されている場合について、
 百人町施設のマテリアル(百人.mtl)
 集合住宅サンプルのマテリアル(sample_RC_AC21.mtl) として整理。景観シミュレータの外部関数としてのIFC.exeで変換する場合、 これらのファイルをkdb/material配下にコピーしておき、変換入力を行うと、 部材にマテリアルが定義され、表示段階でマテリアルファイルが参照される。
マテリアル・ファイルの作り方

 新たなIFCファイルを変換したときに、既存のIFC.mtl等に定義されていないマテリアルが参照された場合、 表示段階でエラーメッセージが表示され、「確認のために光らせる」という選択肢が提示される。 IFC.exe の場合、変換出力するLSSGファイルの末尾にマテリアル定義をCOMMENT(ON); ~COMMENT(OFF); で囲って出力しているので、この部分をコピーして既存のマテリアルファイル(例えばIFC.mtl)に追記するか、 または新しいマテリアルファイルを作成すれば、正常に表示されるようになる。
この作業を行うためには、コマンドプロンプトからIFCを次のように起動する。
>IFC.exe 変換元ファイル.IFC 変換先ファイル.GEO 1 最後のフラグ1は、メッセージ等を豊富に出力する場合に立てる。
景観シミュレータから外部関数として起動する場合には、通常0である。

200520時点での成果

BOOL演算における仮のファイル作成場所の明確化
 従来の改良においては、IFC.exeを単独で起動し、引数として変換元ファイルと変換先ファイルを指定していた。 この場合、BOOL演算用のファイルを作成する場所はカレントであり、直前に行われた処理に影響されていた。
 一方、sim.exeの外部関数として実行された場合には、sim.exeによって以下のように制御される。
 パラメータ設定ダイアログが終了した時点:/ksim/temp/IFC.geo が作成される。この中で、
 Gxx=FILE(IFC,変換元ファイル.ifc, 変換結果格納ファイル.geo,1);  という1行が、IFC.exeに与えるパラメータを定義している。
 このファイルは、次のIFCダイアログが上書きするまで残っている。
 このファイルを実行すると、ksim/temp/IFC.g という長いファイルが作成される。
 IFC.exeが実行終了すると、次にsim.exeがこのファイルのロードを開始する。 このロードの過程で、BOOL演算に先立ってOUTPUT関数が、tempディレクトリに形状ファイルを出力し、 子プロセスとしてBOOL.exeを起動する。BOOL関数は、形状ファイルを二つ読み込んで、結果を第三のファイルに出力する。 この結果をsim.exe(IPライブラリ)が読み込んで、IFC.gファイルの読み込み処理を続行する。
 形状ファイルの拡張子を「.geo」としても、「.g」としても正常に処理は完了する。後者の場合、 すべての変換処理が終了した時点で形状ファイルは削除される。また、拡張子を「.geo」とした場合、 形状ファイルはtempディレクトリに残る(デバッグに用いることができる)。この場合、 IFC.exeが生成した「IFC.geo.del.bat」を用いて、これらの形状ファイルを一括削除することができる。
 BOOL.exeが処理に失敗した場合、二つの形状ファイルを構成する面群の内、失敗したペアを格納した 「u2FailCaseN.geo」というファイルがksim/tempディレクトリに作成される。 (大きなファイルの処理に際しては、数百に及ぶ多くのファイルが作成される場合がある)
CONCAVE(ON), CONCAVE(OFF)の切り換え(200422)
 正常なLSS-Gファイルにおいては、凹多面体を出力する前に「CONCAVE(ON);」を実行し、
次の図形が凸であればその後に「CONCAVE(OFF);」を実行する。
 しかしながら、テスト、デバッグに使用したサンプルデータ(IFC)には、 8の字状態に巻いた病的な図形が含まれていた。これをこのままCONCAVE(ON)として処理すると、 負の面積を有する残余図形が生じてエラーメッセージを発する。その数が非常に多い場合、 オペレータの負担が大きい。そこで、このような図形を検出した場合には、CONCAVE(OFF)として 出力するように、便宜的に対応した。自動修正を行う処理は、「園路生成」に作成例があるが、少し長い。
単位の処理(200424)
 sim.exeにおいては、長さの単位がmであろうが、mmであろうが、結果を同じ縮尺で解釈すれば問題ない。
しかし、一つ例外があり、座標値の一致不一致の判定等を行う場合にEPSの意味が異なってくる。
 そこで、IFCファイルの先頭部に、単位の定義があれば、以後の処理をその尺度で行うこととした。
[例]
#42= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
・・・ #78= IFCUNITASSIGNMENT((#42,#44,・・・));
(ここに列挙されるのは、長さ、面積、体積など異なる単位である。「mm」と「m」の両方が指定された場合エラー
BOOL演算における不適切な図形への対応(200417)
 BOOL演算にかけられる図形が冗長に記述された図形である場合に、エラーを惹起する場合がある。 例えば、隣接する2頂点が同一座標値を有していたり、連続する3頂点が一直線上にある場合には、 一つの頂点を削除することが有効である。しかし、このような縮減処理を行った結果、片方の図形が 三角形未満となってしまったような場合、前捌きを行い、演算関数を呼び出さないこととした。 またこのような場合であっても、面を持たない空の立体を出力することにより、次の演算処理につなげる。 (そうしなければ、「結果ファイルがない」エラーとなる)
曲線断面から構成される掃引体図形の処理(200517)
 サンプルデータでは、ハンガーレール(径30mm)の断面を定義するために、4の円弧を使用している。
「IFCEXTRUDEDAREASOLID(断面, 座標系, 掃引方向, 掃引長さ);」
 という表現で掃引体を記述するのであるが、断面の記述方法の一として、
 IFCARBITRARYPROFILEDEFINITIONWITHVOIDS('area', 断面名称, 曲線群, (曲線群, 曲線群));
で、最初の曲線群が外側図形の曲線群、配列を成す曲線群は中島図形の曲線群である。
 一つの曲線群は、
 IFCCOMPOSITECURVE((曲線1, 曲線2,・・・),.F.);
の形式で表現される。
 一つの曲線は、
 IFCCOMPOSITECURVESEGMENT(.CONTINUOUS.,.T.,円弧);
の形式で例えば円弧を参照する。
 一つの円弧は、  IFCTRIMMEDCURVE(円、(開始点の座標, IFCPARAMETERVALUE(開始角)), (開始点の座標, IFCPARAMETERVALUE(開始角)), .T., .CARTESIAN.);
の形で円とその周上の開始点と終了点を記述する。
 実装に当たっては、角度で分割して多角形近似を行った。

ダウンロード

 コンバータ本体IFC.exe
 ファイル選択ダイアログIFC_D_exe
 マニフェストファイルIFC_D.exe.manifest
 リソースファイルIFC_D.rc
 リソースヘッダIFC_D.rc.h
以上は、ksim/bin 配下に配置します。
 日本語リソースIFC.ja.xml
*ksim/Language/ja に配置します。
 インドネシア語リソースIFC.id.xml
*ksim/Language/id に配置します。
関連する実行形式のアップデート
 図形演算(連続する演算に対応)BOOL.exe
 景観シミュレータ(大量の変換エラーの中間表示省略)Sim.exe
 URLアクセス(https転送)geoload.exe
  (ID,パスワード付きURLアクセス)URL.exe
*ksim/bin に配置します。(念のため、オリジナルをバックアップした上で更新)
(同、ヘルプ日本語)(URL.ja.txt
*ksim/Language/jaに配置します
(同、インドネシア語)(URL.id.txt
*ksim/Language/idに配置します
テスト用データ
 百人町庁舎記録データの例.ifc02.ifc
百前壁
 集合住宅サンプルsample_RC_AC21.ifc"
スピーカの穴
 IFC形式のデフォルト・マテリアルIFC.mtl
 百人町施設のマテリアル百人.mtl
 集合住宅サンプルのマテリアルsample_RC_AC21.mtl
Geoload テスト用
 集合住宅1スパン分(WEB)LSS-Sデータ(web)
 集合住宅1スパン分(LAN)LSS-Sデータ(lan)

3.メタファイル IFC.cmm の増補

 メタファイルを用いてIFC形式のデータを解読するためには、以下の手段がある。
 (1)景観シミュレータの外部関数(VC-1C.exe)で変換する。
 (2)景観シミュレータのプラグインDLL(VC-2V)で変換する。
 (3)Android アプリ(VC-3M)で変換する。
 (4)サーバ上で運用される三次元データ保管庫で変換する。
 1.詳細未詳のIFC形式データに関しては、内部で使用されているコマンドの一覧と出現頻度を見るのが便利
  変換処理を行わず、データ構造の解析だけを行うツールIFCdebug.cmm
 2.百人町庁舎の記録データを解読するためのメタファイルIFC.cmm
 3.集合住宅サンプルデータを解読するためのメタファイル作成中

4.WebGLによるIFC形式の解読

HTMLにおいては、WEBブラウザ上で、JavaScriptからOpenGL表示を行うことができる(WebGL)。
 JavaScriptで記述したページにおいて、クライアント側のIFCファイルを選択・ロードし、クライアント側の 計算資源だけを用いて表示を行う機能を試作した。データがホスト側に送付されることはない。  Windows上のIE,Vivaldiと、Android上のChrome,Vivaldi等で表示確認を行った。

 試作ページテストページ