Я делаю интеграцию кузницы для Navisworks и не могу понять, как перенести плоскости сечения из Navisworks в Forge. Я следовал инструкциям в этот пост в блоге, чтобы установить секущие плоскости, но я не вижу, чтобы они отображались в средстве просмотра. Чтобы установить плоскости, я извлекаю SectionData из Navisworks ActiveView и извлекаю вектор нормали и расстояние из возвращенного объекта json, а затем передаю данные через параметры URL-адреса моему средству просмотра forge. Код ниже:
//set cut planes
if (planes.length > 0)
{
var three_planes = [];
var i;
for (i = 0; i < planes.length; i += 4)
{
var a = String(planes[i]);
var b = String(planes[i+1]);
var c = String(planes[i+2]);
var distance = String(planes[i+3]);
if (a.includes("E") || a.includes("e"))
{
a = "0.00";
}
if (b.includes("E") || b.includes("e"))
{
b = "0.00";
}
if (c.includes("E") || c.includes("e"))
{
c = "0.00";
}
if (distance.includes("E") || distance.includes("e"))
{
distance = "0.00";
}
var afloat = parseFloat(a);
var bfloat = parseFloat(b);
var cfloat = parseFloat(c);
var distancefloat = parseFloat(distance);
// create a THREE.Vector4
var vector4 = new THREE.Vector4(
afloat, bfloat,
cfloat, distancefloat);
three_planes.push(vector4);
}
viewer.setCutPlanes(three_planes);
}
Состояние просмотра показывает, что самолеты есть, но не может их видеть. Требуются ли какие-либо специальные преобразования координат, чтобы это работало?
Обновлено: я попробовал решение, приведенное ниже, но я все еще не вижу плоскости разреза в Forge. Я убедился, что переменные плоскости разреза из Navis (afloat, bfloat, cfloat, Distancefloat) вводятся правильно. Мой измененный код ниже. Любая идея, что я могу делать неправильно?
//set cut planes
if (planes.length > 0)
{
var three_planes = [];
var i;
for (i = 0; i < planes.length; i += 4)
{
var a = String(planes[i]);
var b = String(planes[i+1]);
var c = String(planes[i+2]);
var distance = String(planes[i+3]);
if (a.includes("E") || a.includes("e"))
{
a = "0.00";
}
if (b.includes("E") || b.includes("e"))
{
b = "0.00";
}
if (c.includes("E") || c.includes("e"))
{
c = "0.00";
}
if (distance.includes("E") || distance.includes("e"))
{
distance = "0.00";
}
var afloat = parseFloat(a);
var bfloat = parseFloat(b);
var cfloat = parseFloat(c);
var distancefloat = parseFloat(distance);
var forge_model_offset = NOP_VIEWER.model.getData().globalOffset;
//calculate exact distance in Forge Viewer
var dis_in_forge = (forge_model_offset.x * afloat + forge_model_offset.y * bfloat + forge_model_offset.z * cfloat) -
distancefloat;
//build the plane for Forge Viewer sectioning.
var vector4 = new THREE.Vector4(-afloat, -bfloat, -cfloat, -dis_in_forge);
three_planes.push(vector4);
}
NOP_VIEWER.setCutPlanes(three_planes);
}
Обновлено еще раз: Получил работу. Размещение здесь, если кто-то столкнется с этой проблемой. setCutPlanes необходимо вызывать в конце процесса загрузки. Мой код изначально вызывал его из onModelLoadSuccess, что не сработало. Но когда я переместил его в событие TEXTURES_LOADED, все заработало нормально.
Я послал по электронной почте. Если бы я мог получить видимые плоскости сечения, это было бы хорошо. Я делал разрез прямо через здание, чтобы проверить. Спасибо.
Я провел некоторые исследования и нашел некоторые хитрости в отображении секущей плоскости между Navisworks и Forge Viewer. Это блог на тему: https://forge.autodesk.com/blog/map-sectioning-plane-navisworks-forge-viewer-2
основной код
//get offset of the model
let forge_model_offset = NOP_VIEWER.model.getData().globalOffset
// assume the param of Navisworks clip plane is available
//I copied from the XML file
let navis_clip_plane =
{x:0.1368226246,y:0.4334009763,z:0.8907542664,d:886.2418151801}
//calculate exact distance in Forge Viewer
dis_in_forge =( forge_model_offset.x * navis_clip_plane.x +
forge_model_offset.y * navis_clip_plane.y +
forge_model_offset.z * navis_clip_plane.z) -
navis_clip_plane.d
//build the plane for Forge Viewer sectioning.
cutplanes = [
new THREE.Vector4( -navis_clip_plane.x,
-navis_clip_plane.y,
- navis_clip_plane.z, -dis_in_forge)
];
//apply the plane to sectioning
NOP_VIEWER.setCutPlanes(cutplanes)
Сомневаюсь, что это проблема конкретной модели. Не могли бы вы поделиться демонстрационной моделью Navisworks? если он содержит конфиденциальную информацию, отправьте его по адресу [email protected] (ограничение размера файла 1 МБ, поэтому установите облачный драйвер и поделитесь с нами ссылкой для скачивания). Кроме того, будет полезен снимок Navisworks, на котором показано, какое сечение (и точку обзора) вы хотите увидеть.