0
Under review

Встроенные функции ММ в написании скриптов

raspick92 8 years ago in Micromine / Scripting updated by shabaganov 2 years ago 13

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

Есть громадное количество вопросов по написанию скриптов. Данных из справки катастрофически не хватает. Хотелось бы оформить эту тему как набор вопросов, для освоения базовых приемов написания скриптов.

Python изучаю исключительно в рамках и для решения задач внутри ММ. Никакого опыта в программировании до этого не имел.

Для примера, следующая проблема.

Исходя из файла справки, делаю вывод, что прежде чем какие-либо манипуляции с файлом БМ проводить, его необходимо открыть.

Перепробовав разные варианты и анализируя справку-ошибку (к сожалению на C++), вижу что аргументы к функции open это (1.Объект БМ, 2.Путь к БМ, 3.Имя поля X, Y, Z)

Пишу следующий код

Image 957


Не знаю как передать аргумент класса БМ функции open. Не могли бы вы подсказать где ошибка? И подсказать как верно читать справку-ошибку, хотя бы в общих чертах?

+1
Under review

Здравствуйте. Да, к сожалению, справка не содержит ответов на все вопросы, однако касаемо функции для открытия блочной модели пример имеется (я его незначительно изменил):


Там же написано, что функция open принимает четыре входных параметра: путь к файлу блочной модели и поля X, Y, Z.

Комментарии по нему построчно следующие.

  1. Для начала, чтобы открыть блочную модель (или другой майкромайновский файл), необходимо создать объект либо блочной модели, либо файла соответственно. В данном случае в первой строке инициализируется переменная myBM в качестве объекта блочной модели.
  2. Инициализируется переменная myBkickModelFilename, в которой будет храниться путь к блочной модели.
  3. Инициализируются три переменных Xfield, Yfield и Zfield, в которых будут храниться имена полей координат блочной модели
  4. В четвертой строке написан оператор условия, который в случае значения Истина (True) выполняет блок, следующий сразу за условием, или в случае значения Ложь (False), выполняет блок, следующий после ключевого слова else. Функция open возвращается одно из этих значений: если файл открыт успешно, то True, в противном случае False
  5. Данная строка завершает выполнение скрипта c указанным в скобках сообщением для пользователя. В данном случае в роли этого сообщения выступает строка "Error: Problem opening Block Model"
  6. Ключевое слово else, указывающий на начало блока кода, который должен выполниться, если файл блочной модели был успешно открыт.
  7. Встроенная в Python функция print выводит любую информацию в окно вывода скрипта. В данном случае выводится количество строк в файле.
  8. Закрываем файл блочной модели.

Когда в окне вывода скрипта появляется ошибка на С++, то она означает лишь одно - неверные входные параметры у функции (либо их неверное количество, либо неверный тип). В остальном ошибки будут только от Python.

Если у Вас возникнут какие-то дополнительные вопросы, обращайтесь - ответим.

Павел, огромное спасибо за ответ! Это очень полезно, уже начинаю понимать логику.

Меня смутило вот что. Вы пишите что в справке есть пример открытия БМ.

Во встроенной справке (вызываемой по F1), она же онлайн-справка, у себя в версии 15.0.6. я такого примера не нашел. Не могли бы вы подсказать, где такой пример есть, скорее всего, это позволит лучше разобраться и задавать меньше вопросов?

+1

Да, конечно, могу. У скриптов есть своя отдельная справка, расположенная на панели инструментов редактора скриптов


или справа


Много вопросов - это хорошо.

+1

Спасибо еще раз огромное! Многое становится понятнее. Но не все, увы.

Подскажите по новому вопросу. Как итерироваться по строкам БМ одного поля?

Пишу следующее:

До 10 строки это из справки, образец. Далее пытаюсь прикрутить свой код. Не выходит.

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

Ставил на место переменной a переменную n, по точкам 3d тоже не итерируется.


+3

"Итерироваться" по строкам сразу не получится, так как ММ не имеет методов, возвращающих для этих целей итерируемых объектов. То, что делаете Вы, это попытка найти минимум из числа, что невозможно, в следствие чего появилась эта ошибка. Таким образом, чтобы найти минимальную координату поля X, необходимо создать для начала список всех значений. Это сделать можно несколькими способами, вот два из них (первый ближе к тому, что Вы делаете, но является менее удобным для данной задачи):


После этого к массиву данных x_coord уже можно применять функцию min.


В Вашем цикле переменная n является объектом MMpy.Point3D (либо координаты блока, либо его размеры), который также не является итерируемым.

Павел, здравствуйте! Хочу поблагодарить за ваши предыдущие ответы. Они мне очень помогли, пишу теперь что-то работающее.

Начал некоторые задачи решать, получается, но столкнулся с неприятностью.

Очень медленно проходят расчеты.

Есть ли какие-то способы ускорить расчет? Расчет на реальной модели МПИ идет 2 дня, на условной очень простой - 2 часа. Для прототипирования - довольно долго выходит.

Могу код приложить целиком, если это удобно и вас не затруднит.

Вопрос скорее так звучит: расчет долгий потому что Питон в принципе медленно считает, или искать как оптимизировать код?

Во время расчета происходит итерация по каждому блоку БМ, к блоку i применяется условие n, в котором учитываются многие (порядка 10% от всей БМ) блоки окружающие блок i, если множество блоков Qi удовлетворяет условию n, блок i записывается в список. Условие n включает в себя поиск суммы объемов блоков множества Qi. Если условие n выполняется, то в спец. поле БМ записывается показатель.

Может ли такая последовательность действий, при корректном коде, на модели 1млн. блоков рассчитываться 2 дня?


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


Здравствуйте. Не видя код, я, конечно, не смогу сказать, возможно его оптимизировать или нет. Если хотите, чтобы я посмотрел, то можете выслать скрипт и, желательно, приложить файлы, которые он использует (блочка и т.д.). Выслать все это можно мне на почту pyakovlev@micromine.com. Общий комментарий: Питон является интерпретируемым языком, поэтому скрипт выполняется значительно дольше, чем аналогичный скомпилированный код. В зависимости от того, что Вы делаете, можно использовать различные сторонние библиотеки, которые находятся в интернете в свободном доступе (например, numpy, pandas, scipy и т.д.). Эти библиотеки уже содержат в себе оптимизированный донельзя код, что значительно ускорит работу скрипта.

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

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

Прошу помочь, перестроить скрипт.

Удаление строк.py

Коорд.dat

Согласен с GIPRO. Возможен его вариант, либо цикл типа do while (проверка что не последняя запись в файле) >>loop (если такие есть в питоне). Хотя с точки зрения практичности вариант GIPRO лучше.

Добрый день !

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

Спасибо за наводку, реализовал вашу идею, создав список строк под удаление, удаляя строки с конца файла.

"количество строк в массиве определяется в начале цикла" для этого я применяю второй счетчик учитывающий удаленные строки. В VBA и ALISP конструкция с двумя счетчиками мною применяется без каких либо сбоев, но в ММ на питоне конструкция не пошла.

Питон на прикладном уровне осваиваю только сейчас, до сих пор не было особой нужды, и без отладчика мне сложно разобраться, в чем причина. Может быть есть возможность как-то подключить модули из ММ в редакторы с отладчиком?

+1

Добрый день!

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

Тогда вы может в рамках этого цикла сразу удалять строки.

Спасибо! Ранее, не представлял, что существует такой прием.