ADN Club > Forge: Data Management API
BIM360 Issue pushpin - в каких координатах?
Александр Пекшев 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, искать уже в нём
Навигация
Перейти к полной версии