Форум НПФ

Форум НПФ "ТОПОМАТИК" (http://www.topomatic.ru/forum/index.php)
-   Вопросы и ответы (http://www.topomatic.ru/forum/forumdisplay.php?f=68)
-   -   Как пикетаж получить (http://www.topomatic.ru/forum/showthread.php?t=4525)

maruza 09-19-2012 14:02

Как пикетаж получить
 
Я хочу ведомость отметок как мне надо выгрузить. Не поняла, где пикетаж взять по главному пути.

а еще есть какие-то ункции, чтобы габарит считать или междупутья?

Тимофей Ананичев 09-21-2012 17:32

Прошу прощения за ожидание!

1. Пикетаж можно получить у подобъекта (Класс Alignment из сборки Topomatic.Alg.dll) свойство alignment.Stationing. Как пользоваться пикетажом описано в 6 примере в руководстве разработчика Topomatic AP3.

Также Вы можете просмотреть свойства и иерархию классов, открыв эту сборку, например, в Visual Studio. В ближайшее время будет будет выпущена подробная документация с описанием классов и их методов и свойств основных библиотек нашей платформы - API (сейчас она в "зародышевом" состоянии topomatic_ap3_api.pdf)

2. Так как в данный момент на новой платформе выпущены только "Robur Изыскания" без станционного и ж/д функционала, то в Вашем модуле необходимо явно задавать имя подобъекта главного пути, тогда по этому имени можно получить сам Alignment.

Если Вы пишете на Visual Studio (С#), то:

a) Надо получить объект открытого проекта (и проверить на null):

var pr = ApplicationHost.Current.ActiveProject as ICoreProject;

б) Получить его список моделей:

var models = pr.FindItem(new Guid("30061C68-0D76-4a29-BF5C-B5ECADBCA3FE")) as ICoreCollection;

в) А затем, навигацию до узла проекта нужного подобъекта осуществлять с помощью классов CoreDirectoryInfo / CoreFileInfo

г) Получить подобъект по найденному элементу проекта (типа ICoreCollectionItem) надо так: var alignment = ((IAlignmentContainer)сoreCollectionItem.WrappedOb ject).Alignment as Alignment;

На словах несколько мудрёно, но мы, наверное, сделаем такую сниппет-функцию для разработчиков, чтобы они использовали ее.

CoreFileInfo и другие классы работы с деревом проекта описаны в сборках Topomatc.Core.dll и Topomatc.Core.ServiceClasses.dll - если что, спрашивайте!

3. Габарит до пути (расстояние по касательной до оси трассы) можно посчитать с помощью функции подобъекта alignment.Plan.CompoundLine.PosToStaOffset, только нужно не забыть, если нужно, учесть, ширину коли и по какому рельсу снят подобъект в кривых и т.п.

4. Междупутья рассчитываются сложнее, чем габарит, так как нужно найти минимальное расстояние от одного подобъекта до другого на определенном пикете - т.е., например, вычислять его половинным делением или другим способом, используя фнункции StaOffsetToPos и PosToStaOffset также можно использовать и математику Robur - если интересно - напишу подробно.

Тимофей.

bambr 02-21-2019 11:34

Подскажите, можно ли из var pr = ApplicationHost.Current.ActiveProject as ICoreProject напрямую получить Topomatic.Dtm.Core.TerrainModels?

Василий Гончаров 02-21-2019 14:03

Добрый день!

Для этого Вы можете вызвать у него метод FindItem() и передать туда Guid этой коллекции.

var terrains = pr.FindItem(new Guid("2986169F-A8D6-40d9-9329-1975F215E5B8")) as TerrainModels.

Отмечу, что использование ссылок на Topomatic.Dtm.Core это не очень хорошая практика. Лучше не допускать перекрестных ссылок между модулям и не ссылаться на такие модули как как Topomatic.*.Core и Topomatic.*.Controller. Исключение составляют модули Topomatic.Core и Topomatic.Alg.Core.

Если Вам необходимо создать новую поверхность или получить список всех поверхностей, лучше воспользоваться методами представленными в классе Topomatic.Alg.Runtime и использовать следующий код для создания новой поверхности:
Код:
//получаем общую коллекцию моделей var models = AlignmentWatcher.GetModelsCollection(); //получаем коллекцию поверхностей var terrains = AlignmentWatcher.GetCollection(AlignmentWatcher.Te rrainModelsCollectionId); if (terrains != null) { //находим относительный путь в проекте к коллекции поверхностей var terrains_path = CoreUtils.GetCoreObjectPath(models, terrains); //создаем новый объект, внутри коллекции поверхностей и получаем его относительный путь var terrain_id = AlignLibrary.CreateObjectId(models, terrains, Path.Combine(path, "Имя Вашей поверхности")); if (terrain_id != null) { //получаем этот объект, используя относительный путь var result = terrain_id.GetCoreObject(models) as ICoreCollectionItem; if (result != null) { //получаем поверхность этого объекта var container = result.WrappedObject as ISurfaceContainer; if (container != null) { //блокируем объект для редактирования (актуально в режиме коллективной работы) result.Lock(); try { var sfc = container.Surface; //начинаем операцию изменения sfc.BeginUpdate(); try { try { //Ваши операции по изменению поверхности } finally { //обновляем и перестраиваем индекс поверхности sfc.Invalidate(); } } finally { //заканчиваем операцию изменения sfc.EndUpdate(); } //обновляем дерево структуры проекта, для секции ЦММ ApplicationHost.Current.AddIns.Invoke(CoreConsts.I D_REFRESH_PROJECT_EXPLORER, new ExecuteEventArgs(new object[] { result })); } finally { //разблокируем объект для редактирования (актуально в режиме коллективной работы) result.Unlock(); } } } } }

Или такой, для возврата списка всех поверхностей:
Код:
//получаем общую коллекцию моделей //если Вас интересуют исключительно поверхности ЦММ, то нужно выполнить поиск по //AlignmentWatcher.GetCollection(AlignmentWatcher.Te rrainModelsCollectionId) var models = AlignmentWatcher.GetModelsCollection(); if (models != null) { //получаем все элементы, которые соответствуют определенному предикату foreach (var item in models.GetItems(delegate(ICoreCollectionItem obj) { //проверяем, что это нужный нам элемент, т.е. элемент содержащий поверхность return obj.WrappedObject is ISurfaceContainer; })) { //возвращаем поверхность из найденного контейнера var container = item.WrappedObject as ISurfaceContainer; if (container != null) { yield return container.Surface; } } }

bambr 02-22-2019 11:26

Вложений: 2
Чем отличаются models.Collections и models.ItemList и почему в первой нет геологии?

Василий Гончаров 02-22-2019 13:16

ItemList - свойство класса FolderItem - это список всех элементов, включенных в эту папку в проекте.
Collections - свойство класса FileItemCollectionGroup, который наследуется от FolderItem - это список коллекций, включенных в папку в проекте.

Фактически Collections это
Код:
ItemList.Where(item => item is FileItemCollection).OfType<FileItemCollection>()


В структуре ядра 15 версии существуют как отдельные элементы, так и элементы-коллекции. Последние поддерживают возможность создания внутри себя элементов определенного типа, например коллекция поверхностей - позволяет создавать поверхности. Поскольку геология не является коллекцией, т.е. не может создавать внутри себя элементы, она не отображается в свойстве Collections.

Обычно работа напрямую с коллекциями Вам не требуется, исключением является поиск или создание элемента.

bambr 02-25-2019 10:40

У меня есть одна или несколько Topomatic.Sfc.StructureLine, как ее выделить в CadView и отобразить в окне "Свойства".
Можно ли CadView смаштабировать по размерам BoundingBox2D структурной линии? На плане

Василий Гончаров 02-25-2019 15:00

Для выделения одной или нескольких структурных линий вы можете воспользоваться методом SelectStructureLine у класса SurfaceLayer туда необходимо передать индекс структурной линии и флаг, выделена она или нет.
Да масштабировать возможно, нужно воспользоваться методом ZoomBound у нужного экземпляра класса CadView . Туда необходимо передать границы, а флаг animate говорит о том, будет ли переход мгновенным или плавным.

bambr 02-27-2019 10:15

У меня есть Topomatic.Sfc.Surface - как сделать ЦММ, ее содержащую "Текущей" и включить для нее видимость(лампочку) на плане?

Василий Гончаров 02-27-2019 11:08

Вам необходимо получить ЦММ содержащую Вашу поверхность, сделать это можно например таким способом:
Код:
Surface surface = ... //владелец Surface это класс TerrainModel из Topomatic.Dtm var owned = (IOwned)surface.Owner; //владелец TerrainModel это ICoreCollectionItem; var collectionItem = (ICoreCollectionItem)owned.Owner; //если элемент не был активен if (!collectionItem.Active) { //активируем его collectionItem.Active = true; if (CadView != null) { //обновляем видовой экран CadView.Unlock(); CadView.Invalidate(); } }


Для управления видимостью код выглядит аналогично, просто мы приводим последнего владельца не к ICoreCollectionItem а к ILayer

Код:
Surface surface = ... //владелец Surface это класс TerrainModel из Topomatic.Dtm var owned = (IOwned)surface.Owner; //владелец TerrainModel это ILayer; var layerItem = (ILayer)owned.Owner; //управление блокировкой модели layerItem.Enable = true; //управление видимостью модели layerItem.Visible = true; if (CadView != null) { //обновляем видовой экран CadView.Unlock(); CadView.Invalidate(); }


Часовой пояс GMT +3, время: 4:32.

vBulletin v3.0.7 , Copyright ©2000-2023, Jelsoft Enterprises Ltd.
Copyright © 2003-2023, НПФ "ТОПОМАТИК".