0

Изменение значений столбцов в файле макроса

Yuri 3 years ago in Micromine / Scripting updated by Stepan (Moderator (RUS)) 2 years ago 36

Здравствуйте,

Выполняю операцию Файл/Поля/Соединить с файлом макроса.

Все работает прекрасно. (Левая сторона изображения)

Записываю скрипт на выполнение этой операции, запускаю ее - она не работает

Причина:  поле результата %3 скрипт не видит. (Права сторона изображения)

Можно решить эту проблему? И как?

Image 2315

По моему скрипт не использует переменные из обычного макроса. Нужно значение присваивать отдельно или прописать вручную имя поля ("FLD", "Название столбца").

Здравствуй Дмитрий!

 В операции Файл/Поля/Соединить %3 у меня не переменная, а название столбца в файле макроса

Здравствуйте. %3 это переменная, значение которой подхватывается из поля при работе обычного макроса. При запуске скрипта питона, значение переменной не подхватывается.

Это все я понимаю...

Но все таки есть надежда, что в скрипте можно что то дописать или изменить ее так, чтобы значение %3 обрабатывалась не как переменная, а как название столбца 

+2

Юрий, добрый день!


Да, в скриптах при работе с полями, которые имеют имена вида "%d", будут возникать такие проблемы. Связано это с тем, что при запуске скрипта записанные вами операции будут выполняться на самом деле с помощью макросов. А в макросах поля вида "%d" имеют служебное значение. Поэтому и происходит такая ситуация.

Для того, чтобы всё-таки осуществить то, что вы хотите, можно использовать более низкоуровневый инструмент под названием MMpy.File. Прикладываю скрипт join_script.py, в котором с помощью модуля MMpy открывается нужный файл (macro.MCR в папке проекта), а затем в поле "%3" записывается результат объединения полей "xxx" и "yyy". В комментариях к коду я описал, что делает каждая строчка, но если вопросы останутся, буду рад на них ответить!

Напишите, пожалуйста, устроит ли вас такое решение? 


Вообще использование дополнительных полей, таких как "xxx" и "yyy", в файле макроса это не самая очевидная вещь :) Если дадите больше деталей по исходной задаче, то, возможно, найдем более оптимальный путь решения.

Благодарю Максим!

Скрипт работает., все отлично)

Задача такая:

Есть набор каркасов допустим из 300 каркасов

И надо с ними провести операцию в макросе: 

WFHEAL

WFBOOLEAN

…..

запуском одного макроса (нажатием одной кнопки)

Порядок операций в макросе такая:

1. WFPROPERTIES  Делаем отчет по набору каркаса. Главное, чтобы в отчете было название каркасов Каркас Имя.

2. MODIFY  Добавляем в созданный отчет  новое поле: нумерация . И записываем нумерацию с 1 с приращением 1: 1,2,3,...…

3. MMMERGE  Имея файл макроса со столбцом нумерация  закидываем названия каркасов (в поле название каркасов в моем случае было XXX) с файла отчета используя ключевое поле нумерация . 

4. Теперь, чтобы перенести название каркасов в столбец переменной % (в моем случае %3), используем ваш скрипт.

5. Дальше  созданный макрос выполняет необходимую операцию со множествами каркасов.

То же самое можно использовать при подсчете блочных моделей. Есть 1000 блоков ГКЗ по которым  надо прогнать БМ, но при этом важно условие = пробы внутри одного блока не должны влиять на оценку соседнего блока. Для этого нужен фильтр по блокам: по данным опробования, по оцениваемым блокам. 

Названия блоков (для фильтра) по вышеуказанной схеме записывается в переменную % и процесс пошел....


У вас какие идеи по моим схемам?

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

+1

Это на самом деле достаточно распространенная практика (хотя и не всегда оптимальная). Макросы имеют более низкий порог входа по сравнению со скриптами. Ну и самое главное, что для решения большинства задач автоматизации быстрее будет создать макрос, а не скрипт.

Но не все действия можно сделать с помощью макросов. Особенно это относится к тем случаям, когда нужно сделать какие-либо манипуляции с файлами (как в этой теме). Поэтому пользователи часто комбинируют два этих подхода, и получаются такие комбайны.

+2

Полностью согласен.

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

+4

Я как-то проще делаю. Создаешь модель в наборе (все они - раздельные каркасы? Если нет, сперва делаем Separate). Затем последовательно добавляем, например, 1000 м к одной из координат в модели и в композитах. Таким образом, все 300 тел будут разнесены друг от друга на 1 км. Интерполируем одним заходом, пробы смешиваться не будут. Делать пересечение каркасов смысла нет - это делается при последовательном создании блочной модели.

Благодарю Дмитрий, отличный неординарный метод.

+2

Юрий,

Если я правильно понял, то основная сложность, которая возникает у вас при решении задачи, это получение списка каркасов. Четыре действия из пяти в вашем порядке операций относятся именно к получению этого списка и записи его в параметры макроса.

Поскольку я занимаюсь скриптами, у меня связанная с этим профдеформация. Поэтому вашу задачу я полностью решал бы (сюрприз!) с помощью скрипта :) Если вы напишите, как именно у вас формируется набор каркасов, то я подскажу, как можно получить список каркасов с помощью скрипта.

Как пример, прикладываю скрипт (script.py с описанием about.rtf), который был написан для решения задачи автоматизации 3D оценки множества каркасов. Здесь все каркасы располагались в одном .tridb файле. В общем случае это, конечно, будет не так. Каждый каркас из полученного списка каркасов использовался для фильтра при интерполяции БМ. Для справки также прикладываю использованные формы в mmsetx формате (3d_оценка.mmsetxэллипсы.mmsetx). Если по этому скрипту возникнут вопросы, то буду рад помочь!

А что за проблема такая великая - получить список каркасов??? Это же элементарно:

1. Присвоили каркасы чему угодно (пробам, модели) и прописали названия каркасов в новое поле.

2. запустили процесс "Файл/Поля/Извлечь Уникальный" по этому полю и получили список каркасов.

+1

Это отличное решение, демонстрирующее мощь макросов и существующих функций Micromine.

Проблема может возникнуть, когда, например, каркасы будут лежать в разных файлах и в разных вложенных папках, а их количество перевалит за 100. Ручное создание набора в этом случае может занять определенное время.

Если у вас 1000 каркасов, и каждое тело оценивается индивидуально, и для каждого тела процесс интерполяции надо запусить 10 раз, и для 5 элементов, с ураганами и без, то это: 1000 * 10 * 5 * 2 = 100 000 строк в макросе. И 100 000 возможностей ошибиться с фильтром. Кроме того, если модель большая, даже с фильтром, то процесс будет ооочень долго работать. Но. Если тела разнести, о чем я писал выше, то фильтры не нужны, а количество строк сократится в тысячу раз до 100. Золотой ключит будет в кармане гораздо быстрее.

Максим,

благодарю за сотрудничество, для решения моей задачи вашего первого скрипта мне хватило)


Скрипт для решения задачи автоматизации 3D оценки множества каркасов попробую на практике. Будут вопросы отпишусь.

Отлично! Обращайтесь, буду рад помочь!

Максим здравствуйте! 

Нужна ваша помощь.

Можете мне написать скрипт чтобы в файле макроса значения в столбце макроса приняли назначенное значение.

Например необходимо записать во все строки столбца 

%5-вспомогательные каркасы.tridb , 

%6 - объединенный каркас  и..т.д.

+1

Юрий, здравствуйте!

Прикладываю скрипт fill_fields.py, в котором поля заполняются определенными значениями. Всё как обычно, в коде есть комментарии :) Но если что-то непонятно, буду рад помочь.

Максим благодарю!!! Все просто, и работает)))

+2

А зачем для этого скрипт? Создай файл с необходимыми значениями, а затем объедини эти значения в файл макроса в нужное поле или поля - процесс Файл/Поля/Объединить ММ. С ключом или без.

Коллеги, спрошу здесь чтобы не плодить темы

Как через макрос переименовать название поля? При интерполяции процесс тащит название поля с файла опробования (Au), а нужно переименовать поле по методу интерполяции (Au_IDW2), и сделать это в режиме макроса аналог функции "изменить файл". 

Добрый день, Владимир!
Вы можете в Макросе использовать функцию Файл - Создать или изменить файл

В форме указать переменные, а для переименования выберите функцию Переименовать, укажите Имя поля, а в столбце Начало укажите новое имя данного поля.


Примерный вид макроса:


Отлично, спасибо!

Подскажите - как через макрос удалить файл?

Вы можете воспользоваться следующим процессом:

Спасибо за оперативный ответ

Всегда пожалуйста!

Обращайтесь, если возникнут вопросы :)

Степан, подскажите - а если вписать в название временного файла префикс "Tmp" (temporal, временный), то можно ли потом "подцепить" все файлы такого рода и удалить их одной операцией?

У меня при интерполяции 50 временных файлов, пока просто беру и вручную прописываю удаление каждого.

Хочется элегантного метода)))

А зачем столько временных файлов ? Достаточно двух буферных временных файла, нужно в макросе их менять местами, если речь идет о интерполяции блочных моделей.

В целом то можно. Но тут как раз решил посмотреть по прогонам как интерполяция сработала.



Добрый день, попробуйте использовать 

Спасибо. Я скорее про то чтобы выбрать "временность" файла самостоятельно, к примеру префиксом в названии. То что Вы указали - это, наверное ближе к оптимизации размера проекта? Нет?

А какие у ММ критерии для временных и других типов файлов ?

Да, Вы правы это к оптимизации интерполяции с помощью макроса, просто я раньше так же писал все в отдельные временные файлы, но было такое что из-за большого кол-ва временных файлов макрос либо зависал, либо на выходе получалось, что окончательная модель интерполировалась неверно из-за нехватки памяти. Я поступаю так: делаю несколько прогонов вручную чтобы убедиться что интерполяция проходит верно и все заполняется, а затем все шаги прописываю в макрос и вперед.

Вот пример макроса интерполяции:переменная %3 - входная блочная модель, переменная %5 - выходная блочная модель.

Добрый день! 

Подскажите пожалуйста, возможно ли запускать макрос по времени? 

Здравствуйте, Vagiz.
Для решения Вашей задачи можно воспользоваться следующим способом:
1) Запустите макрос из командной строки, укажите название проекта (Examples) и имя макроса (mymacro.mcr) в качестве параметров в командной строки.
Пример:
mmwin.exe -project "Examples" -macro mymacro.mcr

2) Воспользоваться планировщиком заданий Windows, с помощью которого запланировать запуск на определённое время.