ADN Club > Forge: Data Management API

BIM360 Issue pushpin - в каких координатах?

(1/3) > >>

Александр Пекшев aka Modis:
Если из BIM360 Docs получать Issues, "привязанные" к файлам (в основном это файлы Navisworks), то у Issue будут данные по булавке (pushpin):


Булавку, в свою очередь, можно "прикрепить" только к элементу модели. Например, используя плагин Coordination Issues for Autodesk® Navisworks®

Возникла задача - найти элемент в модели Navisworks по координатам pushpin. Но никакой справочной информации я не смог найти. Главный вопрос - что это за координаты location и как перевести их в координаты модели?

Александр Игнатович:
На вскидку, нужно учесть globalOffset, как вот здесь:
https://adn-cis.org/map-forge-viewer-camera-back-to-navisworks.html

Александр Игнатович:
Я бы ещё посмотрел вот в эту сторону на всякий случай

--- Код - Javascript [Выбрать] ---NOP_VIEWER.model.getModelToViewerTransform()

Александр Пекшев aka Modis:
Спасибо за ссылки, но вопрос-то в другом.
Из плагина я "вынул" кусок, который восстанавливает точку обзора:

--- Код - C# [Выбрать] ---public static void RestorePushPinViewpoint(Autodesk.Navisworks.Api.View view, PushPinData data){    if (view == null)        return;     var viewpoint = view.CreateViewpointCopy();    if (data.Target != null)    {        viewpoint.Position = LinearUtils.ArrayToPoint3D(data.Eye);        viewpoint.AspectRatio = data.AspectRatio;        viewpoint.WorldUpVector = new UnitVector3D(Autodesk.Navisworks.Api.Application.ActiveDocument.UpVector);        viewpoint.PointAt(LinearUtils.ArrayToPoint3D(data.Target));        viewpoint.AlignUp(LinearUtils.ArrayToVector3D(data.Up));        viewpoint.Projection = data.IsOrthographic ? ViewpointProjection.Orthographic : ViewpointProjection.Perspective;        if (data.IsOrthographic)        {            if (!data.OrthographicHeight.HasValue)            {                throw new ArgumentException(                    @"Invalid viewpoint. Is orthographic but no orthographicHeight specified.",                    nameof(data.OrthographicHeight));            }                        viewpoint.HeightField = data.OrthographicHeight.Value;        }        else        {            if (!data.FieldOfView.HasValue)            {                throw new ArgumentException(                    @"Invalid viewpoint. Is perspective but no fieldOfView specified.",                    nameof(data.FieldOfView));            }                        viewpoint.HeightField = LinearUtils.DegreesToRadians(data.FieldOfView.Value);        }    }    else    {        viewpoint.ZoomBox(Autodesk.Navisworks.Api.Application.MainDocument.GetBoundingBox(true));    }        view.CopyViewpointFrom(viewpoint, ViewChange.JumpCut);    view.RequestDelayedRedraw(ViewRedrawRequests.OverlayRender);}
И перед этим еще производится трансформ:

--- Код - C# [Выбрать] ---public static bool TryTransformPushPinData(Pushpin data, Model model, out PushPinData transformedData){    if (model != null)    {        transformedData = new PushPinData(data);                if (!Path.GetExtension(new Uri(model.FileName).LocalPath)            .Equals(".nwd", StringComparison.OrdinalIgnoreCase))        {            Transform3D modelToWorldTransform = GetModelToWorldTransform(model);            transformedData.Location = TransformPoint(data.Location, modelToWorldTransform);            transformedData.Eye = TransformPoint(data.Eye, modelToWorldTransform);            transformedData.Target = TransformPoint(data.Target, modelToWorldTransform);        }         if (transformedData.IsOrthographic && transformedData.OrthographicHeight.HasValue)        {            double num = Autodesk.Navisworks.Api.Interop.LcOaUnit.ScaleFactor(model.Units,                Autodesk.Navisworks.Api.Application.MainDocument.Models.First.Units);            transformedData.OrthographicHeight *= num;        }                return true;    }     transformedData = null;    return false;} private static Transform3D GetModelToWorldTransform(Model model){    double value = Autodesk.Navisworks.Api.Interop.LcOaUnit.ScaleFactor(        model.Units,        Autodesk.Navisworks.Api.Application.MainDocument.Models.First.Units);    Transform3DComponents transform3DComponents = model.Transform.Factor();    transform3DComponents.Scale = transform3DComponents.Scale.Multiply(value);    return transform3DComponents.Combine();} private static double[] TransformPoint(double[] pnt, Transform3D transform){    return LinearUtils.Vector3DToArray(new Vector3D(pnt[0], pnt[1], pnt[2]).Multiply(transform.Linear).Add(transform.Translation));} 

Там есть некоторые неясные моменты, но в тестовом файле все работает - точка обзора восстанавливается как надо.
При создании булавок используется метод View.PickItemFromPoint. Как я понял - эта точка - PickItemResult.Point - это и есть точка location. Но скорее всего я ошибаюсь

А вопрос в том - как имея location найти элемент в модели? Какие обратные процедуры произвести?

Александр Игнатович:

--- Цитата: Александр Игнатович от 27-09-2021, 13:09:16 ---А вопрос в том - как имея location найти элемент в модели? Какие обратные процедуры произвести?
--- Конец цитаты ---

Где ты ищешь элемент? В Navisworks или Forge Viewer?

Если в Navisworks, тогда нужно преобразовать координаты, pushpin имеет координаты в системе координат Viewer-а (логично, вроде), есть матрица перехода model-to-viewer, можно получить обратную viewer-to-model. Ну или ещё проще, вряд ли при трансформации модели будет назначен какой-то поворот или масштабирование, взять global offset как в статье предложено. С API Navisworks-а мало имел и совсем давно, возможно, там есть что-то для пространственного поиска.

Если речь про поиск в Forge Viewer, то преобразовывать координаты не нужно. Сам поиск можно реализовывать по разному в зависимости от задачи. Если одноразово, то можно простым перебором, если многоразово, то, наверное, стоит по boundingbox-ам построить R-Tree, искать уже в нём

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии