我一直在使用下面的一个 Revit 模型测试 APS IoT 扩展代码。我已使用 VScode 和此网站 (https://oss-manager.autodesk.io) 上的 APS 插件来上传和翻译我的模型。使用相同的 Revit 文件,我得到了下面 2 种具有不同 URN 的不同模型,并且做到了。
奇怪的是,我设法让热图和传感器在第二个模型(第二张图片)中工作,但在第一个模型(第一张图片)中不起作用。 最近,我不小心从我的存储桶中删除了第二个模型(工作模型)。现在,每当我使用上述存储桶工具上传模型时,我总是会得到第一个不显示任何热图的模型。
我想知道是否有任何方法可以翻译我的模型,以便它给我返回第二个模型。或者我怎样才能让第一个模型与热图一起使用?我猜这可能与模型导数或模型翻译部分有关。
谢谢你。
https://github.com/autodesk-platform-services/aps-iot-extensions-demo
感谢您的测试模型。我这边一切看起来都很好。请检查我的电子邮件以获取快照。
这是我在
services/iot.mocked.js
中生成传感器数据的代码:
async function findRoomRootNode(name, model) {
return new Promise(function (resolve, reject) {
model.getObjectTree(function (tree) {
let dbId = null;
tree.enumNodeChildren(tree.getRootId(), function (dbid) {
let n = tree.getNodeName(dbid, true);
if (n && n.indexOf(name) >= 0) {
dbId = dbid;
}
});
resolve(dbId);
}, reject);
});
}
async function findLeafNodes(rootId, model) {
return new Promise(function (resolve, reject) {
model.getObjectTree(function (tree) {
let leaves = [];
tree.enumNodeChildren(rootId, function (dbid) {
if (tree.getChildCount(dbid) === 0) {
leaves.push(dbid);
}
}, true /* recursively enumerate children's children as well */);
resolve(leaves);
}, reject);
});
}
function getBoundingBox(dbId, model) {
const it = model.getInstanceTree();
const fragList = model.getFragmentList();
let bounds = new THREE.Box3();
it.enumNodeFragments(dbId, (fragId) => {
let box = new THREE.Box3();
fragList.getWorldBounds(fragId, box);
bounds.union(box);
}, true);
return bounds;
}
async function getRoomsInfo(roomIds, model) {
return new Promise((resolve, reject) => {
model.getBulkProperties2(
roomIds,
{ propFilter: ['name', 'Name', 'Level', 'level' ], ignoreHidden: true },
(result) => {
let sensors = {};
for (let i = 0; i < result.length; i++) {
const data = result[i];
const dbId = data.dbId;
const levelProp = data.properties.find(p => p.attributeName.toLowerCase() === 'level');
const bounds = getBoundingBox(dbId, model);
const position = bounds.center();
sensors[`sensor-${i+1}`] = {
name: data.name,
description: '',
groupName: levelProp.displayValue,
location: {
x: position.x,
y: position.y,
z: position.z
},
objectId: dbId
}
}
resolve(sensors);
},
(error) => reject(error)
);
});
}
var roomRootId = await findRoomRootNode('Rooms', viewer)
var roomIds = await findLeafNodes(roomRootId, viewer.model);
await getRoomsInfo(roomIds, viewer.model);
之后,您必须调整
getSamples
中的services/iot.mocked.js
功能中的传感器数据,使数字与传感器数量一致,如下
async function getSamples(timerange, resolution = 32) {
return {
count: resolution,
timestamps: generateTimestamps(timerange.start, timerange.end, resolution),
data: {
'sensor-1': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-2': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-3': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-4': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-5': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-6': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-7': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-8': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-9': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-10': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-11': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-12': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-13': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-14': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-15': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-16': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-17': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-18': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-19': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-20': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-21': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-22': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-23': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-24': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-25': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-26': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-27': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-28': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-29': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-30': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-31': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-32': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-33': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-34': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-35': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-36': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-37': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-38': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-39': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-40': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-41': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-42': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-43': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-44': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-45': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-46': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-47': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-48': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-49': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-50': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-51': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-52': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-53': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-54': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-55': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-56': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-57': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-58': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-59': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-60': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-61': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-62': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-63': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-64': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-65': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-66': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-67': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-68': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-69': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-70': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-71': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-72': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-73': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-74': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-75': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-76': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-77': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-78': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-79': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
},
'sensor-80': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(600.0, 640.0, resolution, 5.0)
},
'sensor-81': {
'temp': generateRandomValues(18.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-82': {
'temp': generateRandomValues(20.0, 24.0, resolution, 1.0),
'co2': generateRandomValues(540.0, 600.0, resolution, 5.0)
},
'sensor-83': {
'temp': generateRandomValues(24.0, 28.0, resolution, 1.0),
'co2': generateRandomValues(500.0, 620.0, resolution, 5.0)
}
}
};
}
关于第二个模型,如果您使用与第一个模型相同的
APS_MODEL_VIEW
,那么您的观点将是不正确的。主视图是在模型衍生翻译过程中生成的,因此它们的 guid 或可查看 id 将不同。您不能重复使用相同的值并将其设置为 APS_MODEL_VIEW
中的 public/config.js
。重新翻译模型后,您必须再次在模型清单中找到主视图的正确 guid。
为了防止这个问题,我们可以给
APS_MODEL_VIEW
一个空值,然后修改public/viewer.js
// public/config.js
export const APS_MODEL_URN = 'dXJ....Z0';
export const APS_MODEL_VIEW = '';
export const APS_MODEL_DEFAULT_FLOOR_INDEX = 1;
export const DEFAULT_TIMERANGE_START = new Date('2023-12-30');
export const DEFAULT_TIMERANGE_END = new Date('2024-01-15');
// Replace the function `loadModel` in public/viewer.js with the below one
export function loadModel(viewer, urn, guid) {
return new Promise(function (resolve, reject) {
function onDocumentLoadSuccess(doc) {
const viewable = guid ? doc.getRoot().findByGuid(guid) : doc.getRoot().getDefaultGeometry(true);
resolve(viewer.loadDocumentNode(doc, viewable));
}
function onDocumentLoadFailure(code, message, errors) {
reject({ code, message, errors });
}
Autodesk.Viewing.Document.load('urn:' + urn, onDocumentLoadSuccess, onDocumentLoadFailure);
});
}