1.Разбираюсь с API Робура.
В первой части я описал функцию создающую из геологических колонок блоки и вставляющую их в план по координатам взятым с карты фактического материала.
Я пошел дальше и смог заполнить данными из колонок таблицу выработок в Робуре. Конечно было невозможно просто создать единую функцию которая бы просто брала бы в нанокаде объекты и заполняла таблицы в робуре. Почему?
Ну во первых потому, что для робура требуется делать проект на Framework версии 3.5, а для нанокада нужен Framework версии начиная с 4.х.
Во вторых я не представляю как из под нанокада подключиться к робуру и что-то в нем делать.
В третьих метод выполнения функций у робура похож на нанокадовский. Т.е. команды запускаются изнутри программы. Проект собирается в библиотеку (dll) и вместе с файлом plugin (в котором описывается настройка дополнительных пунктов меню и команд (но не только)) копируется в папку с робуром.
С учетом того, что по умолчанию робур ставится в C:\Program Files, просто взять и закинуть в эту папку dll на работе не получалось (нужен пароль админа). Благодаря помощи участников телеграм канала Топоматика узнал, что можно просто скопировать целиком папку с робуром в другое место и от туда запускать. Скопировал в папку D:\Program Files\Topomatic Robur Road 16.0
После этого смог настроить проект в соответствии с инструкцией от Топоматика и прописать пути, чтобы dll компилировалась прямо в папку с робуром.
Но просто начать с нуля и сразу что-то писать не получится. Сначала пришлось скачать примеры и изучить их работу.
Затем пришлось поизучать структуру файла .plugin
Меню в робуре больше чем меню. Это и переменные окружения, и возможность передать в команду какие-то значения. Без этого понимания сложно что-то писать. Скормив французскому ИИ Mistral help по .plugin вменяемого результата получить не удалось. И сам я тоже не очень то понял эту справку. Особенно вот эти пункты (внутри используются какие-то функции или переменные без объяснений):
Самое полезное для начала работы нашлось в примере 3, где описывалось создание своей модели. Свою модель я создавать не собирался, но редактирование модели оказалось ключом в исследование.
В отличие от нанокада, робур запускается прямо из visual studio.
В программе ставим точку останова. Благодаря .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 в одной модели, а скважины в другой.
Так или иначе все заработало. Вручную я переименовал описания грунтов и определил штриховки для слоев.