国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 Forge Viewer 在序列中聚合多模型

graf / 1788人閱讀

摘要:但模型載入程序并不是同步執行的載入文檔和幾何等動作在里都是異步的,我們沒辦法知道哪一個模型是第一個被完整載入,和下個一個完全載入的是誰而在一些應用場景里是有可能需要在一個序列聚合多個模型。

此篇博客原著為 Autodesk ADN 的梁曉冬,以下以我簡稱。

我的同事創作了一些關于如何在一個 Forge Viewer 實例里聚合多模型的博客,例如:

Aggregating multiple models in the Viewer

Preparing your viewing application for multi-model workflows

Preparing your viewing application for multi-model workflows - Part 2: Model Loader

這些示例多半是一次聚合一個模型到 viewer 里,照這里面的思路是很容易將其改寫成透過一個回圈(Loop)在 Viewer 載入任意個數模型的。但模型載入程序并不是同步執行的(載入文檔、viewable和幾何等動作在 Viewer
里都是異步的),我們沒辦法知道哪一個模型是第一個被完整載入,和下個一個完全載入的是誰;而在一些應用場景里是有可能需要在一個序列(Sequeuence)聚合多個模型。

所以我花了一些時間研究如何使用 JavaScript Promise 這個機制,基本上 Promise 提供了一個靈活的機制可以用來管理這些單元程序。為了建立一個 Promise 的序列,我找到了一篇有用的討論串和他的測試例子:

https://stackoverflow.com/que...

根據這個基礎,我寫了一個測試工程 https://jsfiddle.net/xiaodong...,這個工程主要是用來展示如何透過一個序列將各樓層的模型一個一個載入,這工程的部份代碼如下所示:

//replace with your own urns
this.urn_model1 = ;
this.urn_model2 = ;
this.urn_model3 = ;
this.urn_model4 = ;

//model info array
this.modelArray = [{
        modelName: "urn_model1",
        urn: urn_model1,
        modelObj: null
    },
    {
        modelName: "urn_model2",
        urn: urn_model2,
        modelObj: null
    },
    {
        modelName: "urn_model3",
        urn: urn_model3,
        modelObj: null
    },
    {
        modelName: "urn_model4",
        urn: urn_model4,
        modelObj: null
    }
];

//viewer object                        
this.viewer = null;

function start() {

    //replace with your own token
    var token = < your token > ;

    //option to initialize viewer.
    var options = {
        env: "AutodeskProduction",
        accessToken: token
    };

    //It looks the static function of Viewer does not support ES6
    //still use ES5

    Autodesk.Viewing.Initializer(options, function onInitialized() {

        //get the viewer div
        var viewerDiv = document.getElementById("myViewer");

        //initialize the viewer object
        viewer = new Autodesk.Viewing.Private.GuiViewer3D(viewerDiv, {});

        //load model one by one in sequence
        globalPromise(modelArray);
    });
}

//load model by promise 
globalPromise = (modelArray) => {

    var _this = this;

    //each promise function
    //input the index of model array

    function promiseEachModel(index) {
        return new Promise((resolve, reject) => {
            var modelName = modelArray[index].modelName;
            var _index = index;

            //when the document is loaded
            function _onDocumentLoadSuccess(doc) {
                console.log(modelName +
                    ": Document Load Succeeded!");
                _this.globalDocumentLoad(doc,
                    _onLoadModelSuccess,
                    _onLoadModelError);
            };

            //when the document failed to be loaded 
            function _onDocumentLoadFailure(viewerErrorCode) {
                console.error(modelName +
                    ": Document Load Failure, errorCode:" +
                    viewerErrorCode);
            }

            //when the model is loaded 
            function _onLoadModelSuccess(model) {
                console.log(modelName + ": Load Model Succeeded!");

                //delegate geometry loaded event
                _this.viewer.addEventListener(
                    Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
                    _onGeometryLoaded);

                //map this item with the corresponding model in case of use
                modelArray[index].modelObj = model
            };

            function _onLoadModelError(viewerErrorCode) {
                console.error(modelName +
                    ": Load Model Error, errorCode:" +
                    viewerErrorCode);
                //any error
                reject(modelName + " Loading Failed!" + viewerErrorCode);
            }

            function _onGeometryLoaded(evt) {
                //_this.globalGeometryLoaded(modelName,evt.model);
                _this.viewer.removeEventListener(
                    Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
                    _onGeometryLoaded);
                console.log(modelName + "  Geometry Loaded!");
                resolve(modelName + "  Geometry Loaded!");
            }


            //load the model 
            Autodesk.Viewing.Document.load(
                modelArray[index].urn,
                _onDocumentLoadSuccess,
                _onDocumentLoadFailure);

        }); //end of new promise

    } //end of each promise function 

    //build the index array
    var indexArr = [0, 1, 2, 3];

    //proces each promise
    //refer to http://jsfiddle.net/jfriend00/h3zaw8u8/
    function processArray(array, fn) {
        var results = [];
        return array.reduce(function(p, item) {
            return p.then(function() {
                return fn(item).then(function(data) {
                    results.push(data);
                    return results;
                });
            });
        }, Promise.resolve());
    }

    //start to process
    processArray(indexArr, promiseEachModel).then(function(result) {
        console.log(result);
    }, function(reason) {
        console.log(reason);
    });
} //end of function globalPromise


//when document is being loaded 
globalDocumentLoad = (doc, _onLoadModelSuccess, _onLoadModelError) => {
    //get available viewables
    var viewables = Autodesk.Viewing.Document.getSubItemsWithProperties(
        doc.getRootItem(), {
            "type": "geometry"
        }, true);
    if (viewables.length === 0) {
        console.error("Document contains no viewables.");
        return;
    }

    // Choose the first avialble viewables
    var initialViewable = viewables[0];
    var svfUrl = doc.getViewablePath(initialViewable);

    var mat = new THREE.Matrix4();
    //input the transformation
    var loadOptions = {
        placementTransform: mat,
        globalOffset: {
            x: 0,
            y: 0,
            z: 0
        }, // to align the models
        sharedPropertyDbPath: doc.getPropertyDbPath()
    };

    //if this is the first model
    if (doc.myPath == this.urn_model1) {

        //load the first model
        this.viewer.start(svfUrl,
            loadOptions,
            _onLoadModelSuccess,
            _onLoadModelError);

    } else {
        //other models
        this.viewer.loadModel(svfUrl,
            loadOptions,
            _onLoadModelSuccess,
            _onLoadModelError);
    }
}

start();

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91851.html

相關文章

  • Forge Viewer 里切換模型視圖(Viewables)

    摘要:有提供類似的功能,但這并不包含在里頭。條列清單或是切換視圖是非常容易的,你主要是要建立一個使用者介面讓使用者去選取他們想觀看的內容。我使用了來確保當前載入模型占用的內存可以都被釋出。 此篇文章原作是 Autodesk ADN Philippe Leefsma,以下以我簡稱。 這有一個簡易的博客用來說明一個我剛加入 https://forge-rcdb.autodesk.io 的一個新功...

    BlackHole1 評論0 收藏0
  • 「翻譯」Forge Viewer上實作簡易的模型版本比較

    摘要:現在讓我們修改這個示例讓他可以展示兩個同項目但不同版號的模型及。示例執行結果如下這邊是這個比較模型的括展代碼英文原文 showImg(https://segmentfault.com/img/bVOmjp?w=1542&h=925); 熟悉 BIM360 Team 的朋友可能知道他有一個很牛的模型文檔版本比較的功能,但如果模型是放在 Google 云盤或是百度云盤上有可能做到嗎? Au...

    JowayYoung 評論0 收藏0
  • Autodesk Forge Viewer 信息本地化技術分析

    摘要:默認情況下,是英文環境,調取的是的資源其實無需翻譯。但是,如前面提到的,語言包只是包含了部分常規字串的翻譯,如果遇到沒有包含的常規字串怎么辦呢例如,本例中的語言包并沒有對,進行翻譯,所以即使切換了語言,它們仍舊是英文。 注:本文是個人調試分析所得,非官方文檔,請酌情選用參考。文中分析的數據由https://extract.autodesk.io轉換下載而來。 談到信息本地化,個人覺得包...

    littleGrow 評論0 收藏0
  • Forge Viewer 里顯示 Revit 格子線 (grids)

    最近一些Forge客戶都在詢問我同一個的問題,他們希望將Revit的網格呈現在viewer中,藉此讓我有機會來完成這件事,并將它記錄在本文章里,就讓我們開始吧! 在開始之前,有件事你必須先知道: 由于在Revit里格子線只能在2D視圖(例如平面圖、立面圖、表單等等)中顯示,并不會在3D視圖中被看見。因此,我們也無法在ForgeViewer的3D視圖中看到這些格子線,網格會在模型轉文件時被忽略。據我...

    Yangyang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<