摘要:現在讓我們修改這個示例讓他可以展示兩個同項目但不同版號的模型及。示例執行結果如下這邊是這個比較模型的括展代碼英文原文
熟悉 BIM360 Team 的朋友可能知道他有一個很牛的模型文檔版本比較的功能,但如果模型是放在 Google 云盤或是百度云盤上有可能做到嗎?
Autodesk Forge 團隊先前寫了一個從 Google 云盤的轉檔示例,這個示例會從 Google 云盤里下載模型文檔到你的服務器上,在將它上傳到 Forge Data Management 服務上進行轉檔,同時在轉檔完成后在瀏覽器上展示結果。
現在讓我們修改這個示例讓他可以展示兩個同項目但不同版號的 Revit 模型(model A 及 model B)。在 Forge Viewer 里,每個 Revit 構件都會對應到一個 dbId,而這個 dbId 也會對應到一個 Reivt 唯一碼(Unique GUID),這個唯一碼也是 Forge Viewer 的外部編碼(Extenal Id),所以只要在 model A 及 model B 里比對兩者間有沒有不存在的 Extenal Id,以及比對同一個 External Id 的構件屬性里有沒有被新增、修改及刪除的參數,根據這個思路我們可以將沒有修改的構件隱藏起來,有異動的構件以綠色(新增的)、紅色(刪除的)及橘色(有修改的)來上色,就可以在 Forge Viewer 上做出簡單的模型比較功能,原代碼可以參考這里,示例可造訪這里。
示例執行結果如下:
這邊是這個比較模型的括展代碼:
function VersionChanges(viewer, options) { Autodesk.Viewing.Extension.call(this, viewer, options); } VersionChanges.prototype = Object.create(Autodesk.Viewing.Extension.prototype); VersionChanges.prototype.constructor = VersionChanges; VersionChanges.prototype.load = function () { var modelA = this.options.modelA; var modelB = this.options.modelB; var removed = {}; var added = {}; var modified = {}; var red = new THREE.Vector4(1, 0, 0, 1); var green = new THREE.Vector4(0, 0.5, 0, 1); var orange = new THREE.Vector4(1, 0.6, 0.2, 1); viewer.addEventListener(Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, function () { listElements(function (listA, listB) { // make all elements as ghost viewer.isolate(-1); viewer.clearThemingColors(modelA); viewer.clearThemingColors(modelB); for (var extIdA in listA) { if (listB[extIdA] != null) continue; var dbIdA = listA[extIdA].dbId; removed[extIdA] = dbIdA; console.log("Removed dbId: " + dbIdA); viewer.impl.visibilityManager.show(dbIdA, modelA); viewer.setThemingColor(dbIdA, red, modelA); } for (var extIdB in listB) { if (listA[extIdB] != null) continue; var dbIdB = listB[extIdB].dbId added[extIdB] = dbIdB; console.log("Added dbId: " + dbIdB); viewer.impl.visibilityManager.show(dbIdB, modelB); viewer.setThemingColor(dbIdB, green, modelB); } for (var extId in listA) { if (typeof listB[extId] === "undefined") continue; // removed dbId var dbId = listA[extId].dbId; // should be the same as listB[extId] var propsA = listA[extId].properties; var propsB = listB[extId].properties; for (var i = 0; i < propsA.length; i++) { if (propsB[i] == null) continue; if (propsA[i].displayCategory.indexOf("__")==0) continue; // internal properties if (propsA[i].displayValue != propsB[i].displayValue) { console.log("Property " + dbId + ": " + propsA[i].displayName + " changed from " + propsA[i].displayValue + " to " + propsB[i].displayValue); modified[extId] = dbId; } } if (typeof modified[extId] != "undefined") { console.log("Modified dbId: " + dbId); // color on both models //viewer.impl.visibilityManager.show(dbId, modelA); //viewer.impl.visibilityManager.show(dbId, modelB); viewer.setThemingColor(dbId, orange, modelA); viewer.setThemingColor(dbId, orange, modelB); } } }); }); function listElements(callback) { getAllLeafComponents(modelA, function (modelAdbIds) { getAllLeafComponents(modelB, function (modelBdbIds) { // this count will help wait until getProperties end all callbacks var count = modelAdbIds.length + modelBdbIds.length; var modelAExtIds = {}; modelAdbIds.forEach(function (modelAdbId) { modelA.getProperties(modelAdbId, function (modelAProperty) { modelAExtIds[modelAProperty.externalId] = {"dbId": modelAdbId, "properties": modelAProperty.properties}; count--; if (count == 0) callback(modelAExtIds, modelBExtIds); }); }); var modelBExtIds = {}; modelBdbIds.forEach(function (modelBdbId) { modelB.getProperties(modelBdbId, function (modelBProperty) { modelBExtIds[modelBProperty.externalId] = {"dbId": modelBdbId, "properties": modelBProperty.properties}; count--; if (count == 0) callback(modelAExtIds, modelBExtIds); }); }); }); }); } function getAllLeafComponents(model, callback) { var components = []; function getLeafComponentsRec(tree, parentId) { if (tree.getChildCount(parentId) > 0) { tree.enumNodeChildren(parentId, function (childId) { getLeafComponentsRec(tree, childId); }); } else components.push(parentId); return components; } var instanceTree = model.getInstanceTree(); var allLeafComponents = getLeafComponentsRec(instanceTree, instanceTree.nodeAccess.rootId); callback(allLeafComponents); } return true; }; VersionChanges.prototype.unload = function () { return true; }; Autodesk.Viewing.theExtensionManager.registerExtension("Autodesk.Forge.Samples.VersionChanges", VersionChanges);
英文原文:https://forge.autodesk.com/bl...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83209.html
摘要:默認情況下,是英文環境,調取的是的資源其實無需翻譯。但是,如前面提到的,語言包只是包含了部分常規字串的翻譯,如果遇到沒有包含的常規字串怎么辦呢例如,本例中的語言包并沒有對,進行翻譯,所以即使切換了語言,它們仍舊是英文。 注:本文是個人調試分析所得,非官方文檔,請酌情選用參考。文中分析的數據由https://extract.autodesk.io轉換下載而來。 談到信息本地化,個人覺得包...
摘要:有提供類似的功能,但這并不包含在里頭。條列清單或是切換視圖是非常容易的,你主要是要建立一個使用者介面讓使用者去選取他們想觀看的內容。我使用了來確保當前載入模型占用的內存可以都被釋出。 此篇文章原作是 Autodesk ADN Philippe Leefsma,以下以我簡稱。 這有一個簡易的博客用來說明一個我剛加入 https://forge-rcdb.autodesk.io 的一個新功...
摘要:搜索所需的時間會依據你的模型大小及你搜索字串的空白數量而定,搜索的效能差異是有可能從幾秒鐘有引號變成數分鐘沒有引號的。從上圖看來,就可以知道在搜索時加上引號是怎么對效能有顯著的影響。 Viewer3D.search 是一個非常有用的搜索函數,他可以讓你清楚的知道你模型里面有什么信息,但他的響應時間很容易因你搜索內容而拉長。請試著想象如果我們需要進行多次的搜索,但每次都需要一段很長的時間...
摘要:本文將介紹來自顧問團隊的國際同事原創的緩存范例,利用廣泛用于開發的典型接口實現。因而在緩存模型時,可以調用該接口緩存所有相關的,無需用到。代碼示例我們制作了讓用戶選擇模型作離線緩存的例子,查看代碼請訪問,在線演示請訪問。 演示視頻:http://www.bilibili.com/video... 由于Autodesk Forge是完全基于RESTful API框架的云平臺,且暫時沒有本...
閱讀 2423·2021-10-09 09:59
閱讀 2177·2021-09-23 11:30
閱讀 2591·2019-08-30 15:56
閱讀 1145·2019-08-30 14:00
閱讀 2939·2019-08-29 12:37
閱讀 1253·2019-08-28 18:16
閱讀 1656·2019-08-27 10:56
閱讀 1022·2019-08-26 17:23