Форум НПФ  

Вернуться   Форум НПФ "ТОПОМАТИК" > Программные продукты "Топоматик Robur" на платформе "Robur AP3" > Средства разработки Топоматик Robur > Вопросы и ответы
Ник
Пароль
Регистрация FAQ Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09-19-2012, 14:02
maruza maruza вне форума
Новичок
 
Регистрация: Sep 2012
Сообщения: 1
По умолчанию Как пикетаж получить

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

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

Последний раз редактировалось maruza, 09-19-2012 в 14:04.
Ответить с цитированием
  #2  
Старый 09-21-2012, 17:32
Тимофей Ананичев Тимофей Ананичев вне форума
Разработчик Robur
 
Регистрация: Sep 2012
Сообщения: 18
По умолчанию

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

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 - если интересно - напишу подробно.

Тимофей.
Ответить с цитированием
  #3  
Старый 02-21-2019, 11:34
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

Подскажите, можно ли из var pr = ApplicationHost.Current.ActiveProject as ICoreProject напрямую получить Topomatic.Dtm.Core.TerrainModels?
Ответить с цитированием
  #4  
Старый 02-21-2019, 14:03
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 128
По умолчанию

Добрый день!

Для этого Вы можете вызвать у него метод 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; } } }
Ответить с цитированием
  #5  
Старый 02-22-2019, 11:26
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

Чем отличаются models.Collections и models.ItemList и почему в первой нет геологии?
Изображения
Тип файла: jpg 1.JPG (28.5 Кбайт, 1300 просмотров)
Тип файла: jpg 2.JPG (21.6 Кбайт, 1347 просмотров)
Ответить с цитированием
  #6  
Старый 02-22-2019, 13:16
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 128
По умолчанию

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

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


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

Обычно работа напрямую с коллекциями Вам не требуется, исключением является поиск или создание элемента.
Ответить с цитированием
  #7  
Старый 02-25-2019, 10:40
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

У меня есть одна или несколько Topomatic.Sfc.StructureLine, как ее выделить в CadView и отобразить в окне "Свойства".
Можно ли CadView смаштабировать по размерам BoundingBox2D структурной линии? На плане
Ответить с цитированием
  #8  
Старый 02-25-2019, 15:00
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 128
По умолчанию

Для выделения одной или нескольких структурных линий вы можете воспользоваться методом SelectStructureLine у класса SurfaceLayer туда необходимо передать индекс структурной линии и флаг, выделена она или нет.
Да масштабировать возможно, нужно воспользоваться методом ZoomBound у нужного экземпляра класса CadView . Туда необходимо передать границы, а флаг animate говорит о том, будет ли переход мгновенным или плавным.
Ответить с цитированием
  #9  
Старый 02-27-2019, 10:15
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

У меня есть Topomatic.Sfc.Surface - как сделать ЦММ, ее содержащую "Текущей" и включить для нее видимость(лампочку) на плане?
Ответить с цитированием
  #10  
Старый 02-27-2019, 11:08
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 128
По умолчанию

Вам необходимо получить ЦММ содержащую Вашу поверхность, сделать это можно например таким способом:
Код:
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(); }
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



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

Навигация по основному сайту
Главная Каталог продуктов и услуг Где купить Сопровождение
Вакансии О компании Обзоры Канал на YouTube

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