前面提到的模型瀏覽器所瀏覽的文件,都是基於自己對Revit文件的進行解析,所導出的蹭文件是JSON結構的。有朋友 提到可否瀏覽IFC文件呢?
小作嘗試確認是可以的。但是IFC存在非常大的問題:
第一,沒有模型結構樹。
第二,沒有構件屬性信息,只有幾何信息。
我把IFC上傳到廣聯達的平臺上也是一樣的,沒屬性沒模型目錄,除了看個外觀,沒其他鳥用。
技術路線分享一下吧。:
第1步,從Revit導出IFC。它自帶有導出IFC的菜單,如果要通過代碼實現,也很簡單。
IFCExportOptions ifcOptions = new IFCExportOptions();
ifcOptions .FileVersion = IFCVersion.IFC2x3;
ICollection<ElementId> views = new List<ElementId>();
views.Add(view.Id);
document.Export(Path.GetDirectoryName(document.PathName), Path.GetFileNameWithoutExtension(document.PathName),
dwgOptions);
第二步,把IFC轉成OBJ+MTL文件。這技術不是我的,我不公開發布。
第三步,參考官方示例,加載OBJ+MTL文件。好吧,這顏色跟我們自定義的JSON並無差別,而且IFC文件或者OBJ文件,遠比自定義的JSON要大許多。就像前面文章說到的,自定義可以隨便導出自己想到的屬性和數據,按自己的業務表組織結構。
核心代碼:
// var model = mtl的文件名
var onProgress = function ( xhr ) {
if ( xhr.lengthComputable ) {
var percentComplete = xhr.loaded / xhr.total * 100;
progressLoad.value = percentComplete;
console.log( Math.round( percentComplete, 2 ) + '% downloaded' );
}
};
var onError = function () { };
THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
new THREE.MTLLoader()
//.setPath( '' )
.load( model+'.mtl', function ( materials ) {
materials.preload();
new THREE.OBJLoader()
.setMaterials( materials )
//.setPath( 'models/obj/male02/' )
.load( model+'.obj', function ( object ) {
object.position.y = - 95;
_this.scene.add( object );
resolve('1');
}, onProgress, onError );
} );