Я тестировал код расширения APS IoT с одной моделью Revit, представленной ниже. Я использовал плагин APS для VScode и этот сайт (https://oss-manager.autodesk.io) для загрузки и перевода моей модели. С помощью одного и того же файла Revit я получил 2 разных типа моделей ниже с разными URN и так и сделал.
Странно то, что мне удалось заставить тепловые карты и датчики работать во второй модели (второе изображение), но не в первой модели (первое изображение). Недавно я случайно удалил из своих ведер вторую модель (рабочую). Теперь, всякий раз, когда я загружаю свою модель с помощью вышеуказанных инструментов корзины, я всегда получаю первую модель, которая не показывает никаких тепловых карт.
Я хотел бы знать, могу ли я каким-либо образом перевести свою модель, чтобы она вернула мне вторую модель. Или как мне заставить первую модель работать с тепловыми картами? Я предполагаю, что это может быть связано с производной модели или частью перевода модели.
Спасибо.
https://github.com/autodesk-platform-services/aps-iot-extensions-demo
Первая модель Вторая модель
Я установилgenerateMasterViews: true, но все равно сталкиваюсь с той же проблемой. У меня все еще есть та же самая первая модель, описанная выше. Я проверил идентификатор комнаты и присвоил его датчику, но тепловые карты все равно не появились.
Если так, то, боюсь, я не смогу многого сказать без дополнительных подробностей и тестовых моделей для исследований. Но могли бы вы попробовать это? gist.github.com/yiskang/3016e59cf1be499ae30e287a483571aa
А пока не могли бы вы предоставить тестовую модель Revit для исследования и отправить ее на aps (DOT) help (AT) autodesk (DOT) com
? Нет необходимости делиться моделями целиком, достаточно поделиться частичным содержанием, демонстрирующим эту проблему.
Я отправил свою модель на адрес электронной почты, указанный выше. Помогите, пожалуйста, посмотреть. Спасибо
Спасибо за тестовую модель. С моей стороны все выглядит нормально. Пожалуйста, проверьте мою электронную почту на наличие снимков.
Вот мой код для создания данных датчиков в 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 или отображаемые идентификаторы будут отличаться. Вы не можете повторно использовать одно и то же значение и установить его на APS_MODEL_VIEW
в public/config.js
. После повторного перевода модели необходимо снова найти правильное руководство для главного представления в манифесте модели.
Чтобы предотвратить эту проблему, мы могли бы указать 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);
});
}
Спасибо за решения, у меня наконец-то все заработало. Большое спасибо
Пожалуйста, проверьте, запросили ли вы основные представления, указав
generateMasterViews: true
в дополнительных параметрах при отправке задания на перевод, и загрузили ли вы основное представление в программу просмотра. aps.autodesk.com/blog/…