Преобразование плоскостей сечения navisworks в кузницу - PullRequest
0 голосов
/ 08 апреля 2019

Я делаю интеграцию кузницы для 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, оно заработало нормально.

1 Ответ

0 голосов
/ 10 апреля 2019

Я провел некоторые исследования и обнаружил некоторые хитрости в отображении плоскости сечения между 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)
...