Я делаю интеграцию кузницы для Navisworks и застрял в том, как перенести плоскости сечения из Navisworks в Forge. Я следовал инструкциям в этом сообщении в блоге , чтобы установить плоскости среза, но я не вижу их в программе просмотра. Чтобы установить плоскости, я извлекаю SectionData из Navisworks ActiveView и извлекаю вектор нормали и расстояние от возвращенного объекта json, а затем передаю данные через параметры URL в мою программу просмотра кузницы. Код ниже:
//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);
}
Состояние просмотра показывает, что самолеты есть, но их не видно. Есть ли какие-либо специальные преобразования координат, необходимые для этой работы?
РЕДАКТИРОВАТЬ: Я попробовал решение, приведенное ниже, но я все еще не вижу плоскости разреза в Кузнице. Я подтвердил, что мои переменные плоскости разреза от Navis (на плаву, на плаву, на плаву, на расстояние) попали правильно. Мой модифицированный код ниже. Есть идеи, что я могу делать не так?
//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);
}
РЕДАКТИРОВАТЬ 2: Получил это работает. Размещение здесь на случай, если кто-то столкнется с этой проблемой. setCutPlanes должен вызываться поздно в процессе загрузки. Мой код первоначально вызывал его из onModelLoadSuccess, который не работал. Но когда я переместил его в событие TEXTURES_LOADED, оно заработало нормально.