Найти в Дзене

Часть 2. Начинаю программировать в Робуре. Добавляю геологические колонки в модель Робура

1.Разбираюсь с API Робура. В первой части я описал функцию создающую из геологических колонок блоки и вставляющую их в план по координатам взятым с карты фактического материала. Я пошел дальше и смог заполнить данными из колонок таблицу выработок в Робуре. Конечно было невозможно просто создать единую функцию которая бы просто брала бы в нанокаде объекты и заполняла таблицы в робуре. Почему? Ну во первых потому, что для робура требуется делать проект на Framework версии 3.5, а для нанокада нужен Framework версии начиная с 4.х. Во вторых я не представляю как из под нанокада подключиться к робуру и что-то в нем делать. В третьих метод выполнения функций у робура похож на нанокадовский. Т.е. команды запускаются изнутри программы. Проект собирается в библиотеку (dll) и вместе с файлом plugin (в котором описывается настройка дополнительных пунктов меню и команд (но не только)) копируется в папку с робуром. С учетом того, что по умолчанию робур ставится в C:\Program Files, просто взять и з
Оглавление

1.Разбираюсь с API Робура.

В первой части я описал функцию создающую из геологических колонок блоки и вставляющую их в план по координатам взятым с карты фактического материала.

Я пошел дальше и смог заполнить данными из колонок таблицу выработок в Робуре. Конечно было невозможно просто создать единую функцию которая бы просто брала бы в нанокаде объекты и заполняла таблицы в робуре. Почему?

Ну во первых потому, что для робура требуется делать проект на Framework версии 3.5, а для нанокада нужен Framework версии начиная с 4.х.

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

В третьих метод выполнения функций у робура похож на нанокадовский. Т.е. команды запускаются изнутри программы. Проект собирается в библиотеку (dll) и вместе с файлом plugin (в котором описывается настройка дополнительных пунктов меню и команд (но не только)) копируется в папку с робуром.

С учетом того, что по умолчанию робур ставится в C:\Program Files, просто взять и закинуть в эту папку dll на работе не получалось (нужен пароль админа). Благодаря помощи участников телеграм канала Топоматика узнал, что можно просто скопировать целиком папку с робуром в другое место и от туда запускать. Скопировал в папку D:\Program Files\Topomatic Robur Road 16.0

После этого смог настроить проект в соответствии с инструкцией от Топоматика и прописать пути, чтобы dll компилировалась прямо в папку с робуром.

Настройка проекта [Справка]

Но просто начать с нуля и сразу что-то писать не получится. Сначала пришлось скачать примеры и изучить их работу.

Исходный код примеров [Справка]

Затем пришлось поизучать структуру файла .plugin

Файл .plugin [Справка]

Меню в робуре больше чем меню. Это и переменные окружения, и возможность передать в команду какие-то значения. Без этого понимания сложно что-то писать. Скормив французскому ИИ Mistral help по .plugin вменяемого результата получить не удалось. И сам я тоже не очень то понял эту справку. Особенно вот эти пункты (внутри используются какие-то функции или переменные без объяснений):

-2

Самое полезное для начала работы нашлось в примере 3, где описывалось создание своей модели. Свою модель я создавать не собирался, но редактирование модели оказалось ключом в исследование.

В отличие от нанокада, робур запускается прямо из visual studio.

Нужно настроить VS для запуска робура.
Нужно настроить VS для запуска робура.

В программе ставим точку останова. Благодаря .plugin в меню появляются команды. Вызываю на выполнение команду из ленты и можно посмотреть имена моделей. В примере 3 имя модели передавалось через контекстное меню т.к. выбиралась конкретная модель. Я запускал команду через ленту и имя модели мне пришлось получать искусственно. Например для модели геологии с именем Geo1 идентификатор модели представлял такую строку:

":Модели/ЦММ/Geo1.glgx"

Первоначально я ограничился тем, что использовал эту строку в программе.

Потом нашел методы приведенные ниже и из них собрал нужную мне строку:

var project = ApplicationHost.Current.ActiveProject as ModelProject;
var p1 = PlanModelEditor.FindActiveModel(project, out dd);
var p3 = p1.Project.TargetProjectUri.LastPathComponent;
var p2 = project.TargetProjectUri;
var p4 = p2.ToString().Replace(p3, "");
var pr = p1.Uri.ToString().Replace(p4, ":");
var project_model = PluginCoreOps.FindModel(pr);

Возможно это все и не сильно нужно именно для геологии. Скорей для получения разных моделей и исследования значение полей модели.

Текущую модель геологии можно получить таким способом:

GeologyModel gm= new Topomatic.Glg.Model.GeologyModel();

Из нее можно получить таблицу выработок:

gm.BoreholeTable

а так же таблицу грунтов:

gm.GroundTable

В таблице грунтов добавляем свои грунты

Ground ground = new Ground(gm);
ground.Cipher = block.AttributeText;
gm.GroundTable.Add(ground);

Затем создаем новую скважину и ее таблицу грунтов:

Borehole borehole = new Borehole(gm);
BoreholeGround bground = new BoreholeGround(borehole);

Добавляем грунт к таблице грунтов выработки:

bground.Ground = ground;

borehole.Add(bground);

Затем, когда скважина заполнена добавляем ее к таблице выработок:

gm.BoreholeTable.Add(borehole);

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

2. Подготавливаю исходные данные для заполнения таблицы выработок.

Продолжил с deep seek писать парсинг колонок скважин. Выделив через Selection Set глубины и номера ИГЭ и отсортировав их по Y, я сохранил все данные в JSON формате.

Колонка. Красным показал участки выделяемых объектов.
Колонка. Красным показал участки выделяемых объектов.

{"Skvag": "117",

"PositionPlan": {

"X": 2328894.351,

"Y": 360387.14,

"Z": 0},

"SkvagElev": 118.3,

"Texts": [

{"Text": "0.2",

"Position": {

"X": -9481.19721319274,

"Y": -1184.9736624239613,

"Z": 0}},

{"Text": "1.5",

"Position": {

"X": -9481.19721319274,

"Y": -1197.9736624239613,

"Z": 0}},

{"Text": "3.2",

"Position": {

"X": -9481.19721319274,

"Y": -1214.9736624239613,

"Z": 0}},

{"Text": "4.0",

"Position": {

"X": -9481.19721319274,

"Y": -1222.9736624239613,

"Z": 0}},

{"Text": "9.7",

"Position": {

"X": -9481.19721319274,

"Y": -1279.9736624239613,

"Z": 0}},

{"Text": "10.0",

"Position": {

"X": -9481.19721319274,

"Y": -1282.9736624239613,

"Z": 0}}],

"Blocks": [

{"AttributeText": "Сл3",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1186.7236624239613,

"Z": 0}},

{"AttributeText": "1.1",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1194.2236624239613,

"Z": 0}},

{"AttributeText": "5.2",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1209.2236624239613,

"Z": 0}},

{"AttributeText": "4.3б",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1221.7236624239613,

"Z": 0}},

{"AttributeText": "4.3б",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1254.2236624239613,

"Z": 0}},

{"AttributeText": "3.7т",

"InsertionPoint": {

"X": -9452.19721319274,

"Y": -1284.2236624239613,

"Z": 0}}]}

3. Снова возвращаюсь к проекту в робуре.

Считываю сохраненные данные из файла. Заполняю таблицу выработок и грунтов. Описание грунтов я не сохранял т.к. они на колонках были со сдвижкой. Во всех полях с описанием и названием заполнил именем ИГЭ.

Потом начал менять в таблице грунтов описания и обнаружил, что в выработках описания не меняются. Т.е. они не связаны. Стал просить помощи у техподдержки топоматика. Техподдержка у топоматика работает очень хорошо. Мне нашли место в программе и указали в чем ошибка. Оказалось не достаточно, чтобы таблица грунтов была заполнена. Думаю до конца я так и не понял, как нужно было определять текущую модель. Вероятно так, как я это показал в начале статьи. Как я понимаю проблему - я двумя способами определил текущую GeologyModel создавал новую переменную типа Ground для GroundTable в одной модели, а скважины в другой.

Так или иначе все заработало. Вручную я переименовал описания грунтов и определил штриховки для слоев.

Результат заполненной програмно таблицы выработок
Результат заполненной програмно таблицы выработок
Почти весь объект находится на болоте. Построив поверхности по слоям получил искомую поверхность по низу торфа.
Почти весь объект находится на болоте. Построив поверхности по слоям получил искомую поверхность по низу торфа.
Таблица грунтов (описания грунтов были заполнены вручную и в таблице выработок имена грунтов поменялись).
Таблица грунтов (описания грунтов были заполнены вручную и в таблице выработок имена грунтов поменялись).