12+
Макросы Datamine

Объем: 328 бумажных стр.

Формат: epub, fb2, pdfRead, mobi

Подробнее

Введение

Книга написана в помощь специалистам, работающим с Datamine (любой версии) и желающим сделать свой труд более эффективным. Макросы — очень неплохое подспорье в работе, позволяющее ее ускорить и/или упростить. По сути, написание макросов — это программирование. Несмотря на то, что у большинства геологов когда-то там в ВУЗе был курс информатики с элементами программирования, почти никто из студентов геологических специальностей не уделяли этому предмету большого внимания. В результате, когда пришло время применять «полученные знания», оказалось, что «методом научного тыка» получается освоить не более чем линейные алгоритмы. Как итог — большинство макросов, написанных большинством специалистов, работающих с Datamine, представляют собой огромные «простыни», которые трудно читать, еще труднее править и/или отлаживать. Кроме того, макросы, имеющие относительно длительную историю, часто похожи на классическое письмо из Простоквашино, когда начинал писать макрос один специалист, потом при изменении условий (количества каркасов, поля зонального контроля или еще чего-нибудь) уже другой специалист, не разобравшись в исходном макросе (а как в нем разобраться, если это документ объема «Войны и мира» на языке то ли майя, то ли шумеров?), начал подставлять «костыли», потом пришел третий (четвертый, пятый и далее по списку), каждый со своими костылями, и так далее. О модификации таких фундаментальных макросов речи не идет, и все ими пользуются по принципу «работает — и слава богу». Это неправильно. Макросы должны быть короткими, настолько, насколько это возможно для решения конкретной задачи, понятными, легко анализируемыми и относительно легко модифицируемыми. А еще — должна существовать возможность использования макросов в относительно широком диапазоне входных данных, а не только в данных конкретных.

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

Для освоения материала не требуется никаких специальных познаний в области IT, программировании и т. д. (хотя вредными они не будут). Достаточно навыков работы с Datamine.

Книга рекомендована специалистам, работающим в Datamine, у которых часто «горят сроки». Книга также может быть полезна творческим личностям, которым лень выполнять механическую однообразную работу. В принципе нет никаких отличий в написании макросов для геологического моделирования и для задач, скажем, горняков или маркшейдеров. Но авторы книги — геологи, поэтому изложение материала дается применительно к задачам, возникающим перед геологами. Любой специалист, работающий в Datamine, может вынести из книги полезные знания и умения, но не-геологам сделать это в рамках данной книги будет немножко сложнее.

Книга разработана с использованием версии Datamine Studio RM 2.0.66.0. Однако можно с достаточно большой степенью уверенности утверждать, что навыки, полученные при его прохождении, могут быть с успехом применены и для более ранних версий и, видимо, для более поздних (с учетом процессов или параметров процессов, которые появляются с новыми версиями). Макросы, приведенные в книге, ориентированы именно на упомянутую версию Datamine, но, скорее всего, будут работать и в более ранних версиях, просто часть параметров (появившихся в свежих версиях) будет проигнорирована.

Книга создана на основе учебного курса, который можно найти на широко известном обучающем ресурсе Stepik. Если книга покажется интересной — милости просим и туда. Книга — штука неизменяемая, а в учебном курсе что-то может быть изложено по-другому — понятнее или глубже. Примеры файлов, используемые по ходу книги, расположены на GitHub.

Если в ходе изучения изложенного материала у вас возникнет недопонимание прочитанного и/или горячее желание что-то переспросить или возразить — добро пожаловать в telegram-канал «Ресурсные геологи». Мы, скорее всего, где-то там присутствуем.

А теперь кратко об авторах.

Кирьяков Георгий

Кандидат геолого-минералогических наук. Стаж работы в геологии 29 лет, из которых 23 года занимался построением моделей минерализации месторождений различной металлогенической специализации — от черных металлов (Fe, Cr…) до цветных и благородных, а также алмазов, бокситов, известняков. Сопровождал работы добывающих предприятий в Гвинее, Гайане, России (подсчет запасов, проектирование ГРР и т. д.). Выполнял все аспекты оценки минеральных ресурсов, включая анализ первичных данных, их обработку, геологическую интерпретацию и геологическое моделирование. Написал большое количество макросов и скриптов для ПО Datamine, которые в настоящий момент используются на множестве месторождений (проверка базы данных опробования, проверка контактов рудных каркасов, анализ длин подвесок, сближенные пакеты MSO, степень увязки проб в каркасы и др.). Разработал методики моделирования и написал макросы построения моделей минеральных ресурсов для следующих месторождений: Албазино, Капан, Викша, Маломыр и др. Проводит тренинги и обучение специалистов на добывающих и разведочных предприятиях в области геологического моделирования.

Вяльцев Андрей

Компетентная персона в области оценки минеральных ресурсов (IOM3 (QMR), AusIMM, AIG, MPONEN, ОЭРН). Стаж работы в геологии 12 лет, из которых 11 лет занимался ведением баз данных и построением моделей минерализации и моделей контроля содержаний. За время работы принимал участие в построении моделей МР нескольких десятков месторождений полезных ископаемых, которые располагаются в России, Казахстане, Армении, Африке. Выполнял все аспекты оценки минеральных ресурсов, включая анализ первичных данных, их обработку, геологическую интерпретацию и геологическое моделирование. За время работы посетил порядка 15 золотых, серебряных и медных рудников. Курировал процесс процедуры согласования. В настоящий момент по разработанным им методикам и написанным макросам строятся модели минеральных ресурсов следующих месторождений: Бакырчик, Варваринское, Комаровское, Майское, Лунное, Воронцовское и другие. Читал множество докладов на конференциях в Великобритании и России. Проводит тренинги и обучение специалистов на добывающих и разведочных предприятиях в области геологического моделирования.

Внимание! В тексте книги, в отличие от скриншотов, некоторые функции приводятся с пробелом перед открывающей скобкой. Это чисто техническая проблема: в выбранном нами редакторе присутствует неотключаемая опция автокоррекции, которая автоматически ставит пробел перед любой открывающей скобкой. Например, на странице 63 приводится функция возведения числа в степень, в которой присутствует лишний пробел между именем функции и открывающей скобкой с перечислением параметров. К сожалению, обнаружили мы эту неприятность в момент, который не предполагал смены редактора. Приносим свои извинения за эту неприятность и уведомляем, что при наличии разночтений между текстом и скриншотами правильный вариант написания функции — на скриншотах.

Макросы: что это, для чего нужны, что могут и что не могут

Для чего нужны макросы

Макросы являются прекрасным средством для того, чтобы:

— Быстро сделать много механической работы. Наверное, лучшее определение «быстро» звучит так: «быстро — это не торопясь, но без перерывов». Любое действие в Datamine будет выполняться с одинаковой скоростью вне зависимости от того, запущено оно руками или макросом (при прочих равных). Но если вам надо выполнить более одного действия, макрос будет работать быстрее вас просто потому, что он не делает перерывов между этими действиями. А человек — делает. Просто в силу своей природы: если вам надо выполнить связку TRIFIL+PROMOD на большом и сложном файле каркасов, вы вряд ли будете сидеть и любоваться тем, как выполняется TRIFIL. Скорее всего, вы отвлечетесь (поводов масса). А макрос — нет. Но даже если у вас железная сила воли и вы не отвлекаетесь от наблюдения за работой TRIFIL, на ввод параметров для PROMOD у вас уйдет времени больше, чем у макроса. Итог: макрос не делает перерывов, поэтому он быстрее ручной работы.

— Выполнить то, что сделать вручную технически сложно и долго — например, длительный циклический перебор тех или иных параметров с целью получения некоего оптимального результата. Один из макросов, разработанных авторами книги, занимается тем, что подбирает оптимальные параметры дробления при заполнении каркасов ячейками. То есть схема такая: выбрали размеры подъячеек, заполнили, проверили качество. То, что заполнено хорошо — отложили в сторону. То, что заполнено плохо, заполняется повторно с меньшими подъячейками. И так до достижения удовлетворительного результата. Для выполнения этой задачи надо многократно запускать несколько процессов (TRIFIL+PROMOD+TRIVAL+EXTRA). Да, физически вы можете запустить любой процесс несколько десятков раз (нажать на кнопку — процедура не так чтобы особо утомительная), но есть большие сомнения, что ваша психика выдержит эту монотонную «работу». У макроса психики нет. Ему сказали — он делает.

— Обеспечить прозрачность моделирования. Вместо длинных словесных описаний того, как выполнялось моделирование, можно приложить к отчетным материалам макрос — и 99% вопросов о методике моделирования будут сняты.

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

Ну и, наконец, это интересно и увлекательно (хотя на этот счет есть разные мнения).

Язык макросов — неплохо развитый внутренний для Datamine язык программирования, поэтому, по сути, написание макросов — это программирование. Но поскольку вы, вероятнее всего, все-таки не программист, лучше не заявлять лишний раз о том, что вы программируете, а на вопрос «что делаешь?» отвечать нейтральное «макрос пишу».

Что такое макрос

Макрос — текстовый файл, имеющий расширение *mac и кодировку Win-1251 (да, это не совсем так, если вы находитесь в стране, где актуальность кириллицы близка к 0, но данная книга ориентирована в первую очередь на «пользователей с кириллицей»). Макросы, написанные в кодировке семейства UTF, выполняться будут, но при работе со строками результат может не вполне соответствовать ожиданиям, плюс при выводе комментариев вы, скорее всего, увидите кракозябры вместо знакомых с детства символов кириллицы.

Макрос, содержащий строку на кириллице в кодировке UTF (слева), и вывод этой же строки в окно Command Datamine (справа)

Еще одна неприятность при работе с кодировками не-Win-1251 — это все те же кракозябры при редактировании файлов в кодировке «не той системы»: если вы настроили ваш любимый редактор на чтение именно кодировки Win-1251, то открытие файла в другой кодировке приведет к неожиданному эффекту, показанному на следующей странице.

В общем, давайте в рамках данной книги считать, что макросы пишутся в кодировке Win-1251 — и все тут.

Макрос содержит последовательность команд, которые необходимо выполнить для решения какой-либо задачи. Все команды в макросах начинаются с восклицательного знака. Макрос всегда начинается с команды START, после которой идет имя макроса. Макрос всегда заканчивается командой END. «Минимальный» макрос выглядит следующим образом (да, мы нарушим традиции и не будем писать программу «Hello, world!»):

!START NOACTION

!END

Макрос с кириллицей, созданный в кодировке Win-1251, открытый в кодировке UTF (сверху) и в кодировке Win-1251 (снизу)

Этот макрос содержит все атрибуты, необходимые для того, чтобы Datamine воспринимал файл с этим текстом как макрос: у него есть начало, имя (NOACTION) и конец. Макрос не делает ничего, но пока этого и не требуется. Пока что достаточно выглядеть как макрос. Дальше этого будет мало, но на текущем этапе можно и так.

Как запускать макрос

Существующий макрос можно запустить тремя способами (может, есть еще, но нам, кроме этих трех, ничего в голову не приходит):

— с помощью кнопки в ленте команд; кнопка расположена непосредственно на вкладке Home;

— прямо под кнопкой запуска макроса находится кнопка вызова меню работы с макросами, одним из пунктов которого также является запуск макроса; из остальных предложенных вариантов наиболее полезным является вариант Start Recording — его разберем чуть позже;

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

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

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

Что может и не может макрос

Макрос может:

— выполнять все операции, выполняемые процессами Datamine (теми, что запускаются из командной строки Datamine);

Командная строка Datamine, если кто забыл

— читать файлы формата dm без использования процессов Datamine, но, увы, не создавать и не изменять их (об этом чуть позже);

— управлять командами операционной системы (есть тут кто-нибудь, кто помнит, как жить без графического интерфейса, под чистой DOS?).

Например, вот такой макрос:

!START SYSMACRO

!OPSYS

echo Hello, world>> newfile. txt

!END

создаст в рабочем каталоге вашего проекта файл `newfile. txt` и запишет туда текст «Hello, world» (давайте-таки соблюдем традиции!).

Макрос не может сделать ничего, что бы выходило за рамки процессов Datamine. Например, макрос не может управлять объектами в окне 3D: он не может загрузить в окно 3D что-либо, не может в этом окне что-то сделать с загруженными данными и т. д., например, «штатными» инструментами макрос не может выполнить проверку каркасов на ошибки или соединение двух стрингов.

Когда-то давно, когда компьютеры были большими, а Datamine существовала без добавки Studio (и представляла собой набор программ), в пакете программ Datamine существовал еще один внутренний язык программирования, который как раз мог управлять окном 3D (точнее, на тот момент — программой Guide). Однако с появлением Datamine Studio этот язык тихо умер (кажется, это произошло сразу, как вышла Datamine Studio 1). В текущих версиях Datamine автоматизацию работы в окне 3D должен обеспечить JavaScript или любой язык программирования, способный подключиться к API Datamine. И, в принципе, обеспечивает. Беда в том, что делает это так себе — главным образом из-за отвратительной степени документированности этого самого API.

Да, сразу предупреждаем: скрипты, написанные на JavaScript, в этой книге не рассматриваются.

Необходимые навыки

Собственно, единственный обязательный навык для написания макросов — это умение работать с Datamine, которое должно включать знание процессов, понимание того, для чего они используются и как работают. Временами приветствуется знание школьного курса математики и любознательность. Никакого тайного таланта к программированию не требуется. Вообще, утверждение «я не способен программировать» — полнейший абсурд. Задумайтесь на минуту: что вы будете делать сегодня после работы? Ответ, вероятно, будет примерно следующим: «В 18:00 я отключу компьютер, надену уличную обувь, запру кабинет и пойду домой. По дороге я зайду в магазин N и куплю (далее следует список)». Ну, собственно, вот: вы только что написали программу. Программу вашей жизни сегодняшним вечером. Сложно? Талант потребовался? Ситуация с написанием макросов примерно такая же: если вы знаете, что надо сделать для получения нужного результата, вы можете написать макрос.

На самом деле, ситуация с макрописательством — такая же, как, например, с бегом на 100 м: вы можете пробежать 100 м за, предположим, 18 секунд, после некоторой тренировки вы можете довести это время до 14—15 сек. При упорных тренировках, наверное, вы сможете «выбежать» из 12—13 сек. Но для того, чтобы довести это время до 10 сек., нужен талант. Так и здесь: простые макросы может писать любой, но для чего-то более сложного нужны тренировки, а с некоторого момента — предрасположенность. Но даже простые макросы здорово улучшают жизнь. Данное руководство рассчитано на людей, начинающих что-то такое писать на языке макросов и не требует наличия «чего-то эдакого».

$ Задание 1.1

Чем завершится выполнение данного макроса?

!START MACRO

!END

A) Макрос запустится, не сделает ничего и выведет информацию о завершении работы в окно Command

B) Ошибкой и выводом информации об ошибке в окне Command

C) Макрос запустится, выведет информацию об имени макроса в окно Command и не сделает более никаких действий

D) Макрос даже не запустится

$ Задание 1.2

Чем завершится выполнение данного макроса?

START MACRO

!END

A) Ошибкой и выводом информации об ошибке в окне Command либо даже не удастся его запустить

B) Макрос запустится, выведет информацию об имени макроса в окно Command и не сделает более никаких действий

C) Макрос запустится, не сделает ничего и выведет информацию о завершении работы в окно Command

$ Задание 1.3

Чем завершится выполнение данного макроса?

!START MACRO

END

A) Макрос даже не запустится

B) Ошибкой и выводом информации об ошибке в окне Command

C) Макрос запустится, выведет информацию об имени макроса в окно Command, выведет информацию о завершении работы в окно Command, но исполнительный файл макроса останется заблокированным для редактирования до перезагрузки Datamine

D) Макрос запустится, не сделает ничего и выведет информацию о завершении работы в окно Command

$ Задание 1.4

Чем завершится выполнение данного макроса?

START MACRO

END

A) Ошибкой и выводом информации об ошибке в окне Command либо же даже не удастся его запустить

B) Макрос запустится, выведет информацию о начале работы в окно Command и не сделает более никаких действий

C) Макрос запустится, выведет информацию об имени макроса в окно Command и не сделает более никаких действий

D) Макрос запустится, не сделает ничего и выведет информацию о завершении работы в окно Command

$ Задание 1.5

Чем завершится выполнение данного макроса?

!START

!END

A) Ошибкой и выводом информации об ошибке в окне Command

B) Макрос запустится, выведет информацию об имени макроса в окно Command и не сделает более никаких действий

C) Макрос запустится, не сделает ничего и выведет информацию о завершении работы в окно Command

D) Макрос запустится, выведет информацию о начале работы в окно Command и не сделает более никаких действий

E) Ошибкой и выводом информации об ошибке в окне Command, при этом исполнительный файл макроса останется заблокированным для редактирования до перезагрузки Datamine

Инструменты разработки

На данный момент мы уже знаем, что макрос — это текстовый файл. Чем можно создавать и редактировать текстовый файл? Очевидно, текстовым редактором. Каким? Да хоть бы и штатным «Блокнотом». И в родном учебнике Datamine все скриншоты макросов приведены именно с использованием этого бессмертного редактора.

Учебник по макросам

Однако «можно» — не значит «нужно». Вообще, рекомендовать использовать «Блокнот» для написания макросов можно только злейшему врагу. Никому другому «Блокнот» для этих целей рекомендовать не стоит. Поскольку мы не питаем столь сильных чувств к читателям данной книги, то и рекомендовать использовать «Блокнот» не будем. А что будем? А будем любой из перечисленных ниже:

— Sublime Text;

— Visual Studio Code;

— Notepad++.

Выбор инструмента для работы — штука сугубо интимная, и никого ни к чему принуждать не собираемся. Далее кратко опишем упомянутые инструменты.

Sublime Text

Текстовый редактор для написания программного кода на различных языках программирования, а также верстки веб-документов. Распространяется по платной лицензии, но имеет абсолютно бесплатную ознакомительную версию, которая покрывает 146% потребностей специалиста, работающего с макросами Datamine.

Ключевые возможности редактора

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

Настраиваемый интерфейс. Внешний вид можно адаптировать под конкретные задачи. Например, для работы с несколькими файлами макросов одновременно можно настроить режим, при котором сразу будут показываться до 4 окон. Данную функцию мы будем использовать, когда захотим скопировать у кого-нибудь (да даже и у себя) кусок кода и вставить в свой макрос (естественно, с указанием авторства). Также можно просматривать разные фрагменты одного и того же файла макроса.

Работа с двумя файлами одновременно

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

Различные темы и цветовые стили

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

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

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

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

Подсветка синтаксиса

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

Автосохранение в памяти. При закрытии программы в ее памяти остается все, что там было на момент закрытия — вне зависимости от того, сохранили ли вы это явным образом или нет.

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

Преимущества

— Широкая функциональность. За счет достаточно разнообразного набора встроенных возможностей редактора, а также подключаемых расширений, редактор представляет собой, по сути, упрощенную среду разработки, а не просто инструмент для написания макроса. Помимо написания макросов, в нем можно писать скрипты, а также создавать интерфейс для запуска скриптов и макросов, т. к. редактор позволяет работать с HTML-разметкой.

— Быстродействие. Благодаря оптимизации собственного кода, а также выделения плагинов в отдельный процесс, редактор запускается и работает быстро даже с документами, состоящими из миллионов строк кода. Хотя на практике вряд ли вам встретятся такие объемные макросы. Авторы данной книги не встречали, да и сами не писали, макросы, в которых было бы больше 10000 строк.

— Простой и понятный интерфейс. Рабочая область в редакторе организована максимально удобно. Благодаря этому можно выполнить настройку под конкретные задачи, применять визуальное выделение, разграничивать на отдельные зоны для параллельной работы с несколькими файлами, часто используемые команды вывести на отдельную панель и т. д. Это не только облегчает работу уже опытному «макросописцу», но и снижает порог вхождения для новичков. Кроме того, минималистичный интерфейс редактора не перегружен ненужными функциями и легко воспринимается пользователем.

— Широкая поддержка. Редактор постоянно развивается основным разработчиком — компанией Sublime HQ. Для него выпущена подробная официальная документация, различные справочные и вспомогательные материалы. Также вокруг этого редактора сложилось достаточно широкое сообщество, представители которого пишут разнообразные плагины и помогают в решении возникающих проблем.

— Portable-версия. Если у вас нет прав администратора и вам запрещено устанавливать на компьютер программное обеспечение, то вы всегда можете скачать portable-версию с официального сайта и пользоваться ею.

Недостатки

— Нет готовых сниппетов.

Итог

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

Visual Studio Code

Редактор Visual Studio Code (давайте дальше его для краткости именовать VSCode) распространяется свободно, то есть даром, компанией Microsoft. Скачивается с официального сайта.

Ключевые возможности редактора

VSCode является «штатным» текстовым редактором для интегрированной среды программирования Visual Studio, распространяемой Microsoft. Извлеченный из этой IDE, он сохранил многие полезные особенности «старшей сестры» (из которых, правда, далеко не все будут полезны при макрописательстве):

— Многоязычный интерфейс (русский в комплекте). Если у вас русскоязычная Windows, редактор при установке, скорее всего, это поймет и включит русский интерфейс по умолчанию.

— Поддерживаются темы оформления. Темная есть в базовой поставке. Создать свою тоже большой сложности не представляет.

Различные темы и цветовые стили

— Присутствует подсветка синтаксиса многих языков программирования по умолчанию (как-никак в «прошлой жизни» это была IDE). Правда, для подсветки языка макросов Datamine необходимо скачать и установить плагин.

— Поддерживается автозавершение слов: редактор по первым буквам вводимого слова пытается угадать, что хочет ввести пользователь, и предлагает варианты. Предлагаемые варианты автозавершения зависят от того, на каком языке программирования вы сейчас работаете. Например, VSCode не будет предлагать варианты автозавершения из Python или JavaScript после того, как догадается, что вы пишете макрос под Datamine. Также в списке вариантов автозавершения присутствуют слова, которые в активном документе уже есть.

— Поддерживает сниппеты (в русскоязычном варианте интерфейса они названы «пользовательские фрагменты кода»). Штука крайне полезная, позволяющая «вместо тысячи слов» набрать одно, которое будет заменено заготовкой, например, для запуска процесса или организации того или иного фрагмента вашего алгоритма (цикла, подпрограммы и т. д.). Можно создать свой файл сниппетов, можно скачать с репозитория, а можно воспользоваться списком сниппетов, созданным одним из автором данной книги для себя.

— Если в один прекрасный день вам вдруг нестерпимо захочется написать код на каком-либо распространенном языке программирования — типа того же Python, VSCode позволит вам выполнять запуск и отладку вашего кода непосредственно в редакторе (правда, для этого тоже нужен отдельный плагин).

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

Плагин подсветки синтаксиса макросов Datamine

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

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

— Поддерживается уже известный нам множественный ввод.

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

Разбиение рабочего окна на части. Приведенный пример, конечно, непрактичен, но при наличии крайне широкого монитора или нескольких не крайне широких — почему бы и нет?

— Редактор официально поддерживает переносной режим. Как его использовать, подробно объясняется здесь (да, надо немного владеть языком Вильяма нашего Шекспира… ну или онлайн-переводчиком на худой конец). Очень полезное свойство, которое позволяет пользоваться удобствами VSCode, даже если вам на работе запретили самостоятельно ставить новое ПО. Ну или как вариант — если вам придется работать на чужом компьютере.

— У редактора есть официальная онлайн-версия со всеми удобствами, что позволяет вам ваять макросы хоть бы и на планшете под «андроидом» (пробовали, получается).

VSCode довольно популярен среди любителей что-нибудь напрограммировать, поэтому решение большинства проблем и задач несложно найти на просторах Всемирной сети.

Notepad ++

Свободный текстовый редактор с открытым исходным кодом. Распространяется по лицензии GNU 3.0+ (General Public License), скачать можно на официальном сайте. Данное лицензирование можно отнести как к плюсам — полностью бесплатное использование для любых нужд, так и к минусам — не использует платные инструменты и решения. Но для работы с макросами Datamine базовые функции Notepad++ сполна покрывают все необходимые потребности.

Ключевые возможности редактора

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

Так же редактор поддерживает множество видов кодировок, в том числе Windows-1251, и позволяет проводить преобразование кодировок для документа.

Настраиваемый интерфейс. Есть возможность настройки внешнего вида интерфейса программы, позволяет настроить и дополнить контекстное меню под конкретные задачи. Присутствует возможность работы в двух окнах для одновременного редактирования файлов (но, к сожалению, поддерживает только два окна), включение «карты» файла.

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

Работа с двумя файлами одновременно

Множественный ввод. Как и в редакторах, описанных ранее, Notepad++ поддерживает функцию множественного ввода.

Автоматическое заполнение. Также поддерживается автоматическое окончание записи.

Автосохранение в памяти. При закрытии программы в ее памяти остается все, что там было на момент закрытия — вне зависимости от того, сохранили ли вы это явным образом или нет. Также при редактировании файла визуально подсвечиваются строки, в которые были внесены изменения (в примере: оранжевая полоса напротив номера строки).

Подсветка синтаксиса. Редактор поддерживает и имеет готовые настройки подсветки синтаксиса для множества языков. Еще больше готовых вариантов можно скачать из сети. К сожалению, подсветки синтаксиса языка макросов Datamine нет, но редактор без проблем позволяет создать свой собственный набор для подсветки.

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

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

Portable-версия. Редактор официально поддерживает переносной режим. Скачать версию Portable можно с официального сайта, ссылка на который была приведена ранее.

$ Задание 2.1

Запустится ли данный макрос?

A) Да

B) Конечно нет. Datamine — уважаемое ПО и не запускает макросы, написанные в «Блокноте»

C) Нет. Datamine не понимает код без подсветки синтаксиса

Макросы

Структура макросов

Из чего состоят макросы

Итак, макрос — это текстовый файл. В этом текстовом файле содержится набор команд, которые необходимо выполнить Datamine для получения нужного вам результата. Команды макросов всегда начинаются с восклицательного знака. Команды макросов можно разделить на:

1. «Внутренние» команды макросов — команды для организации выполнения макроса. Давайте назовем их по-программистски «операторами». К этой разновидности команд можно отнести:

— Оператор присвоения LET. С помощью этого же оператора могут выполняться некоторые функции — как арифметические, так и строковые: получение целой части, абсолютного значения, максимума/минимума, степенные, показательные, логарифмические и тригонометрические функции; изменения регистра строки, определение длины строки, поиск подстроки в строке и т. д.

— Условный оператор IF.

— Оператор безусловного перехода GOTO.

— Операторы «общения» с пользователем ECHO и PROMPT.

— Операторы организации подпрограмм GOSUB и RETURN.

— Оператор запуска команд ОС OPSYS.

— Оператор запуска другого макроса XRUN.

— Операторы чтения файлов FILES и FIELD.

— Другие операторы, которые с ходу не вспомнить, но которые будут описаны по ходу настоящей книги.

— Другие операторы, которые с ходу не вспомнить и которые не будут описаны в книге, но которые вы наверняка найдете сами, если будете копаться в руководстве и справке.

2. Команды запуска процессов. Эти команды начинаются с имени соответствующего процесса, перед которым (ожидаемо) должен присутствовать восклицательный знак. Например, процесс EXTRA запускается командой `!EXTRA`.

Команды будут упомянуты и более подробно описаны по мере возникновения в них необходимости согласно логике изложения материала. Более «сухое» и официальное описание команд можно найти в справочных материалах.

Ограничения

Сразу пару слов об ограничениях (а вы думали, что все так просто?). До некоторой версии (мы сами не заметили до какой) длина одной строки в макросе не должна была превышать 80 символов. Причина такого ограничения, вероятно, уходила корнями в седую древность (если кто не знал, то код Datamine минимум до версий Datamine Studio 3.* был написан на практически «мертвом» Visual Fortran). Все, что выходило за пределы 80 символов, Datamine нагло игнорировал. С некоторых пор это ограничение снято, но мы бы рекомендовали его придерживаться с целью обратной совместимости — вдруг ваш макрос попадет в руки пользователю, который не в курсе, что вышли новые версии Datamine. Ну и плюс: если строка вашего макроса слишком длинная, читать его не очень удобно. Это не единственное ограничение, остальные будут описаны в подходящий момент.

Алгоритмы: что это и какие бывают

Алгоритм можно определить как набор правил для решения некоторой задачи. Или по-другому: алгоритм — это идея, тогда как конкретный макрос — его реализация.

Алгоритмы принято делить на:

— Линейные алгоритмы. Самый простой тип. Просто последовательность команд, выполняемых одна за другой. После первой команды всегда выполняется вторая, после второй всегда выполняется третья и т. д. Линейный алгоритм используется, когда все ясно и никаких вариантов развития событий не предполагается.

— Алгоритмы с ветвлением. Используется при возникновении вариантов развития событий.

если пойдет дождь — я поеду на автобусе,

если будет солнечно — прогуляюсь пешком,

если друзья предложат выпить пива — вообще никуда не пойду.

— Циклические алгоритмы. Описывают процессы, повторяющиеся много раз.

— «Каждый год 31 декабря мы с друзьями ходим в баню» — то есть один раз указывается действие, а затем сообщается, что это действие исполняется некоторое количество раз.

— Алгоритмы с подпрограммами. Перефразируя известного киноперсонажа, можно сказать: «Точно такие же, как и циклические, но другие». Об этом чуть позже.

При написании макросов вы будете писать обычные линейные алгоритмы, алгоритмы с ветвлением и, возможно, будете использовать циклы и подпрограммы. Обычно достаточно большой макрос содержит все разновидности алгоритмов. Далее будут описаны упомянутые варианты алгоритмов по принципу «от простого к сложному».

$ Задание 3.1

Какой тип алгоритма описан в этом увлекательном рассказе?

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

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

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

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

A) Мы такого не проходили

B) Циклический алгоритм

C) Алгоритм с ветвлением

D) Линейный алгоритм

$ Задание 3.2

Какой тип алгоритма описан в данном отрывке?

Размышляя таким образом, она пробралась в маленькую комнатку, сверкающую чистотой. У окна стоял стол, а на нем, как она и надеялась, лежал веер и несколько пар крошечных перчаток. Алиса взяла веер и пару перчаток и совсем уже собралась выйти из комнатки, как вдруг увидала у зеркала маленький пузырек. На нем не было написано: «ВЫПЕЙ МЕНЯ!», но Алиса открыла его и поднесла к губам.

A) Линейный

B) Циклический

C) Алгоритм с ветвлением

D) Мы такого не проходили

$ Задание 3.3

Какой тип алгоритма описан в этой пыхтелке?

Если б мишки были пчелами,

То они бы нипочем

Никогда и не подумали

Так высоко строить дом;

И тогда (конечно, если бы

Пчелы — это были мишки!)

Нам бы, мишкам, было незачем

Лазить на такие вышки!

A) Мы такого не проходили

B) Алгоритм с ветвлением

C) Линейный алгоритм

D) Циклический алгоритм

$ Задание 3.4

Какой тип алгоритма описан здесь?

Вот пистолеты уж блеснули,

Гремит о шомпол молоток.

В граненый ствол уходят пули,

И щелкнул в первый раз курок.

Вот порох струйкой сероватой

На полку сыплется. Зубчатый,

Надежно ввинченный кремень

Взведен еще. За ближний пень

Становится Гильо смущенный.

Плащи бросают два врага.

Зарецкий тридцать два шага

Отмерил с точностью отменной,

Друзей развел по крайний след,

И каждый взял свой пистолет.

A) Линейный алгоритм

B) Алгоритм с ветвлением

C) Мы такого не проходили

D) Циклический алгоритм

$ Задание 3.5

Какой тип алгоритма описан?

Раз он в море закинул невод, —

Пришел невод с одною тиной.

Он в другой раз закинул невод, —

Пришел невод с травой морскою.

В третий раз закинул он невод, —

Пришел невод с одною рыбкой,

С непростою рыбкой, — золотою.

A) Циклический алгоритм

B) Мы такого не проходили

C) Линейный алгоритм

D) Алгоритм с ветвлением

$ Задание 3.6

Какой тип алгоритма описан?

У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

«У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

«У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

…»

A) Циклический алгоритм

B) Алгоритм с ветвлением

C) Линейный алгоритм

D) Мы такого не проходили

Линейные алгоритмы

Линейные алгоритмы — это алгоритмы, когда «все ясно». То есть линейный алгоритм выглядит следующим образом: «Начало макроса — выполняем действие А, затем действие Б, действие В… конец макроса». Продолжая аналогию с реальной жизнью: «выключу компьютер, надену обувь, зайду в магазин…».

Однако, поскольку целью данной книги не является обучение тому, как правильно покидать рабочее место, перейдем непосредственно к написанию макроса.

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

— Выборка проб каркасами минерализации с зональным контролем по полю номера рудного тела.

— Композитирование выбранных проб.

— Урезка ураганных содержаний.

Давайте для простоты предположим, что нам известно следующее (файлы для тестирования):

— имя файла рудных каркасов — ore_tr/pt;

— имя файла скважин — holes;

— имя поля номера рудного тела — BODY;

— имя поля урезаемых содержаний — AU;

— средняя длина проб, к которой требуется привести рудную выборку — 1 м;

— оптимальная сеть декластеризации — данные расположены по регулярной сети;

— уровень ураганных содержаний одинаков для всех рудных тел — 100 г/т;

— имя файла обработанной рудной выборки holes_ore_cut.

На многих приводимых ниже картинках с фрагментами кода в начале строки можно видеть номер. Это просто номер строки, который не является частью макроса. Номера строк автоматически проставляются многими текстовыми редакторами. Это не часть текста, это просто номера строк, они «физически» — в виде символов текста — не существуют и нужны только для облегчения адресации пользователя, например: «в строке N выполняется такое-то действие».

Макрос, выполняющий все описанные выше действия, будет выглядеть следующим образом (macro1):

Смотрим, что тут написано.

Строка 1 — заголовок макроса и его имя (OREHOL).

Строка 3 — запуск процесса SELWF. Строки до появления следующего восклицательного знака (до строки 16 включительно) — это параметры запуска данного процесса:

— на строке 3, кроме имени запускаемого процесса Datamine, указано, что входным файлом для процесса SELWF является файл holes — &IN (holes);

— на строке 4 указано, что файлом треугольников каркасов минерализации является файл ore_tr — WERETR (ore_tr);

— на строке 5 указано, что файлом точек каркасов минерализации является файл ore_pt — &WERETR (ore_pt);

— на строке 6 указано, что выходным файлом для процесса SELWF является файл holes_ore_cut — &OUT (holes_ore_cut).

Строки 3–6 соответствуют вкладке Files процесса SELWF:

Вкладка Files процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 3–6 с вкладкой Files, можно заметить, что:

— поля входных и выходных файлов в макросе имеют то же имя, что и в интерфейсе процесса: поле в интерфейсе «IN» обозначается в макросе ∈

— используемые файлы в макросе помечаются знаком «&» — как «входящие», так и «результирующие»;

— имена файлов указываются в скобках;

— параметры друг от друга отделяются запятой; если описание процесса не помещается в одну строку (помним про ограничение в 80 символов), перенос осуществляется после запятой.

Строки 7–10 соответствуют вкладке Fields интерфейса.

Вкладка Fields процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 7–10 с вкладкой Fields, можно заметить, что:

— поля помечаются символом «*» перед именем параметра;

— пропущенные поля в интерфейсе процесса (оставленные незаполненными) в макросе не отображаются вовсе;

— имена полей указываются в скобках.

Строки 11–16 соответствуют вкладке Parameters интерфейса.

Вкладка Parameters процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 11–16 с вкладкой Parameters, можно заметить, что:

— параметры вкладки Parameters помечаются символом «@»;

— значения числовых параметров указываются с помощью знака равенства;

— параметры друг от друга отделяются запятой;

— никакого разделения на вкладки (как в интерфейсе процесса) нет.

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

— запуск процесса начинается с имени процесса и восклицательного знака перед ним;

— все параметры имеют то же имя, что и в графическом интерфейсе процесса;

— имена файлов предваряются символом амперсанда «&»;

— имена полей предваряются символом звездочки «*»;

— параметры предваряются помечаются символом «собаки» — «@»;

— имена файлов и полей заключаются в скобки;

— значения числовых параметров указываются с помощью знака равенства;

— параметры друг от друга отделяются запятыми.

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

Пожалуй, некоторыми особенностями обладает только процесс EXTRA. Описание параметров у него завершается на строке 42 параметром @APPROX=0.0. Причем, после этого параметра нет запятой (то есть описание параметров процесса завершено). Основной функционал содержится в строках с 44 до команды GO (строка 47). Процесс EXTRA всегда завершается командой GO (без запятой в конце и восклицательного знака в начале).

Крайний правый знак на строке 16 приведет к зависанию макроса. Сообщение об ошибке при этом не появится. Макрос просто будет «висеть», изображая работу
Отсутствие запятой в строке 14 приведет к игнорированию параметров CHECKROT и ALLPTS. Ошибка в данном случае также не проявится, поскольку параметры необязательные

Можно было заметить, что при разборе макроса ничего не было сказано о вкладке Retrieval, на которой указываются логические условия выполнения процессов. Эти условия в макросе указываются точно так же, как они указываются при «обычном» запуске процесса. От предыдущих параметров эти условия также отделяются запятыми. То есть вот такое условие:

!COPY $IN (holes),&OUT (hol_rich),AU> 10

заставит Datamine скопировать из файла holes в файл hol_rich пробы с содержаниями золота не ниже 10 г/т. Если требуется указать более одного условия, они перечисляются через запятую:

!COPY $IN (holes),&OUT (hol_rich),AU> 10,AG> 50

При этом, как и в «ручном» запуске процесса оба условия будут выполняться одновременно — то есть во втором случае в файл hol_rich будут скопированы пробы с содержанием золота не меньше 10 г/т и серебра не менее 50 г/т.

Ну и, завершая разбор первого макроса, следует упомянуть, что макрос завершается строкой 51, на которой сообщается, что макрос завершен: END.

Перед решением заданий

Задания дальше по книге можно решать двумя способами:

— Набрать соответствующий текст макроса и попытаться запустить.

— Внимательно прочитать текст макроса и попытаться понять, как он будет работать.

Мы бы очень хотели, чтобы вы выбрали второй путь. Собственно, для этого тексты макросов приведены в виде картинок. Умение бездумно набирать и запускать макросы — это немного не тот навык, который мы бы хотели вам передать. Огромная просьба: не пытаться мухлевать, а постараться реально решать задания. В конце концов, мы не в школе, родителей к директору никто вызывать не собирается, на второй год оставлять — тоже.

$ Задание 3.7

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем holes_extra

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

D) Процесс выполнится, но выходной файл не создастся

E) Ошибкой

$ Задание 3.8

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся. Параметр APPROX проигнорируется, в выходном файле также будет создано поле @APPROX, значение которого будет равно 0

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

F) Создастся точная копия входного файла с именем holes_extra

$ Задание 3.9

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) В файл holes_extra будут скопированы записи с содержанием золота 0

$ Задание 3.10

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Создастся точная копия входного файла с именем holes_extra

C) Процесс выполнится, но выходной файл не создастся

D) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.11

Чем завершится выполнение данного макроса?

A) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

B) Создастся точная копия входного файла с именем holes_extra

C) Ошибкой

D) Процесс выполнится, но выходной файл не создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.12

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем holes_extra

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) Процесс выполнится, но выходной файл не создастся

D) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

E) Ошибкой


$ Задание 3.13

Чем завершится выполнение данного макроса?

A) Ошибкой, так как параметра *RUDA в процессе SELWF нет

B) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

C) Зависанием Datamine до принудительного завершения пользователем работы макроса.

D) Процесс выполнится, но выходной файл не создастся

E) Создастся точная копия входного файла с именем hol_sel

F) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создадутся дополнительные поля BODY и ORE

$ Задание 3.14

Чем завершится выполнение данного макроса?

A) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

B) Создастся точная копия входного файла с именем hol_sel

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) Зависанием Datamine до принудительного завершения пользователем работы макроса


$ Задание 3.15

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

D) Создастся точная копия входного файла с именем hol_sel

E) Процесс выполнится, но выходной файл не создастся


$ Задание 3.16

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем hol_sel

B) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY. Абсолютно все параметры проигнорируются

C) Процесс выполнится, но выходной файл не создастся

D) Зависанием Datamine до принудительного завершения пользователем работы макроса

E) Ошибкой

F) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

G) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY. Все параметры после @SELECT=3.0 проигнорируются

$ Задание 3.17

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Выходной файл отсортируется по полю BHID

C) Выходной файл отсортируется по полям BHID и FROM

D) Зависанием Datamine до принудительного завершения пользователем работы макроса

E) Выходной файл отсортируется по полю FROM

F) Процесс выполнится, но выходной файл не создастся


$ Задание 3.18

Чем завершится выполнение данного макроса?

A) Процесс выполнится, но выходной файл не создастся

B) Выходной файл отсортируется по полям BHID и FROM

C) Выходной файл отсортируется по полю FROM

D) Выходной файл отсортируется по полю BHID

E) Ошибкой

F) Зависанием Datamine до принудительного завершения пользователем работы макроса


$ Задание 3.19

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Ошибкой

C) Выходной файл композитируется с зональным контролем по полю BODY

D) Процесс выполнится, но выходной файл не создастся


$ Задание 3.20

Чем завершится выполнение данного макроса?

A) Успешным выполнением

B) Ошибкой

C) Вылетом Datamine

D) Процессы выполнятся, но выходной файл после команды EXTRA не создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

Переменные

Итак, мы с вами написали первый простой макрос (пока «не вы, а мы», но лиха беда начало), автоматизирующий процесс создания рудной выборки. При этом мы условились, что:

— имя файла рудных каркасов — ore_tr/pt;

— имя файла скважин — holes;

— имя поля номера рудного тела — BODY;

— имя поля урезаемых содержаний — AU;

— средняя длина проб, к которой требуется привести рудную выборку — 1 м;

— оптимальная сеть декластеризации — данные расположены по регулярной сети;

— уровень ураганных содержаний одинаков для всех рудных тел — 100 г/т;

— имя файла обработанной рудной выборки holes_ore_cut.

Несложно догадаться, что это не всегда так. Каркасы могут называться по-другому, файл скважин — тоже. Поле содержания — не обязательно AU, а зонального контроля — не обязательно BODY. Ну и далее по списку. Что же делать? Вариантов минимум три:

— Каждый раз перед использованием макроса подгонять имена файлов и полей под то, что написано в макросе.

— Каждый раз перед использованием макроса править весь текст макроса в соответствии с вашими входными условиями.

— Модифицировать макрос так, чтобы правки были понятными, минимальными и простыми.

Первые два варианта — путь сложный и тупиковый. Мы хотели написать «как несложно догадаться…», но поняли, что пока догадаться сложно. Поэтому просто поверьте: первые два варианта — очень плохая идея. И мы, как говорится, пойдем другим путем — то есть третьим из перечисленных.

Для этого третьего пути нам понадобится некая сущность, которой мы можем оперировать либо как числом, либо как строкой — то есть либо выполнять арифметические действия, либо складывать ее с другими строками. Но при этом в то время, когда мы пишем макрос, мы не знаем, какое именно значение принимает эта сущность. То есть нам нужна некая виртуальная «коробка», в которой можно хранить все, что угодно, и при этом заставлять наш макрос производить с этой коробкой любые операции, как будто он имеет дело с тем содержимым, которое в этой коробке находится в момент выполнения макроса. И вот эту коробку в программировании принято называть «переменная». В принципе, переменная в программировании очень похожа на переменную в школьном курсе математики — то есть это некий «икс», который можно складывать, вычитать, умножать и так далее, как будто вы работаете с числом (но при этих операциях мы понятия не имеем, какое там число). Только в программировании в эту коробку можно складывать не только числа: например, применительно к языку макросов — имена файлов или полей (понятно, что в этом случае перечень операций, доступных для переменной, несколько другой).

Итого: переменную в макросе можно определить как контейнер («коробку»), содержимое которого неизвестно в момент написания макроса и определяется по ходу выполнения макроса. Переменная должна иметь имя, которое может состоять из одного или нескольких символов. Над переменными можно выполнять те же операции, что и над их содержимым.

Поскольку то, что вы читаете, не является официальным руководством и не обязано подчиняться строгим правилам изложения материала, здесь нет строгого и «правильного» определения переменной. Если интересно строгое определение — откройте любой поисковик и наберите запрос. То, что написано выше — это объяснение концепции переменной понятным языком (надеемся, что понятным).

Для создания переменной и для задания ее значения в языке макросов используется команда (оператор) LET. Если вы слегка знакомы с английским, можно увидеть поразительное сходство этого оператора с глаголом «to let» (позволять) или с модальным словом «let» (что в вольном переводе означает «пусть!», «а давайте!»). Суть также совпадает: строка

!LET $a# = 10

как бы говорит: «пусть в переменной $a# будет значение 10» или «а давайте засунем десятку в переменную $a#».

Переменная в макросе должна начинаться со знака доллара и заканчиваться знаком решетки.

Переменная может именоваться более, чем одной буквой. То есть переменная вполне может быть названа, например, $hello_its_me#. Причем, мало того, она не то что «может», более того, лучше, чтобы она называлась более чем одной буквой. Хороший стиль программирования (ой, пардон, написания макросов) включает в себя присвоение переменным таких имен, чтобы было примерно понятно, что эта переменная обозначает. Имя переменной $in_tr# для исходного файла треугольников намного лучше, чем, например, $a#. Хотя на работоспособность макроса это не влияет никак (а вот на «читабельность» написанного макроса — очень даже). Но здесь возникает следующее ограничение: длина имени переменной (включая знаки доллара и решетки) не должна превышать 16 символов. То есть называть переменные следует так, чтобы было «примерно понятно», что она содержит, но при этом не стоит увлекаться длиной названий.

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

!LET $third_var# = `hgjf`.

При этом записи

!LET $my_var# = hhh

и

!LET $my_var# = `hhh`

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

Если вам почему-либо хочется, чтобы строковая переменная содержала пробел — нужны кавычки:

!LET $str_var# = Hello everybody

запишет в переменную $str_var# значение Helloeverybody, а выражение

!LET $str_var# = `Hello everybody`

даст требуемое приветствие в переменной — Hello everybody.

Если строковая переменная должна содержать какие-либо операторы (а она это может, и это очень полезное свойство переменных в макросах) — например, для использования в EXTRA в качестве команды, вот так:

!LET $com_str# = `if (A> 10) `,

то без одинарных кавычек не обойтись.

Также необходимо упомянуть, что язык макросов — не типизированный. То есть переменная может быть в один момент строковой и содержать что-то типа `Very interesting number`, а в следующий момент превратиться в числовую и содержать 3.141592654. Также отсутствие типизации приводит к тому, что операции

!LET $a# = 10

и

!LET $a# = `10`

дают одинаковый результат.

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

!LET $a# = `10`

!LET $b# = $a# * 5

приведет к тому, что в переменной $b# будет содержаться значение 50 (точнее, 50.0). Но если переменной присвоить что-то, что ни при каких обстоятельствах не может быть расценено как число, например

!LET $my_sunday_plan# = `10 shots of vodka`,

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

Также стоит упомянуть о следующей особенности переменных: с любой переменной можно выполнять строковые операции (объединение, вырезание части и т. д.), но арифметические операции доступны только для переменных, которые «похожи» на число.

Разделитель целой и дробной части в языке макросов — точка, вне зависимости от настроек региональных стандартов ОС.

Кроме того, необходимо упомянуть еще то, что в языке макросов переменные могут содержать только строки и числа. Логические значения переменных (как во многих других языках) будут восприниматься как строковые. Поэтому вот такое присвоение

!LET $i_am_genius# = true

приведет к записи в переменную $i_am_genius# текста «true». Не логического значения «истина», а именно текста. Работать с этой переменной как с логической (например, использовать ее в условном операторе) вы не сможете (точнее, сможете, но результат будет некорректным). Если есть необходимость использовать в макросе какие-то логические «переключатели», следует использовать числа 0 и 1.

Итак, выше было показано, как присваивать значения переменным. Изменять значения переменных можно так же, как и присваивать: с помощью оператора LET (по сути, изменение и есть присвоение). Но, как говорится, «есть нюансы». Дело в том, что оператор LET в «обычном» исполнении выдерживает не более одной арифметической операции. То есть вот это:

!LET $radius# = 10

!LET $circle_len# = 6.282 * $radius#

будет выполнено. А вот это:

!LET $radius# = 10

!LET $circle_len# = 2 * 3.141 * $radius#

уже нет. Возникает закономерный вопрос «что делать?» (вопрос «кто виноват?» в данном случае не важен). Вариантов, очевидно, два:

— Разбивать длинные формулы на части по одной операции. Кажется, не самая удачная идея.

— Заключать длинные формулы в фигурные скобки:

!LET $radius# = 10

!LET $circle_len# = {2 * 3.141 * $radius#}.

И вот это уже работать будет. Почему так — не знаем. Наиболее вероятный ответ: «так исторически сложилось».

Что еще можно делать с переменными? Вариантов масса.

Для числовых переменных, кроме базовых арифметических операций, существуют функции, которые рассчитывают:

— целую часть — INT;

— модуль (абсолютная величина) — ABS;

— максимум/минимум — MAXMIN;

— квадратный корень — SQRT;

— степень числа — RAIS: RAIS (2,3) — это 2 в кубе, т. е. 8;

— экспоненту (то есть возведение числа «e» в некоторую степень) — EXP;

— логарифмы — LOG (десятичный логарифм), LOGN и LOGE (обе последние функции рассчитывают натуральный логарифм; зачем две — не спрашивайте, «так исторически сложилось»);

— тригонометрические функции — прямые: SIN, COS, TAN и обратные: ASIN, ACOS, ATAN; тригонометрические функции работают с углами в градусах.

Для переменных, содержащих строки, существуют функции, которые:

— вычисляют положение одной строки внутри другой: INDX (sdfgtr, f) — результат выполнения этого выражения — 3; если второй строки в первой нет, результат будет равен нулю;

— вычисляют длину строки — LENG;

— изменяют регистр строки на нижний (LWC) — то есть делают все символы строки «маленькими», или на верхний (UPC) — т.е. делают все символы строки «большими»;

— выделяют подстроку из строки — SUBS (dfjh, 2, 1) возвратит f.

Возникает закономерный вопрос: если выделение подстроки из строки сделать можно, то как сделать одну строку из кучи составляющих? Или, выражаясь «по-программистски», как сделать конкатенацию строк? Как говорится, нет ничего проще: достаточно написать складываемые строки друг за другом. Вот этот набор операторов:

!LET $count# = 10

!LET $space# = ` `

!LET $volume# = shots

!LET $type# = `of vodka`

!LET $what_i_want# = `$count#$space#$volume#$space#$type#`

Запишет в переменную $what_i_want# значение

Если посмотреть на нижнюю строку присвоения, то можно увидеть, что:

— сложение строк выдерживает более одной операции в отличие от сложения числовых переменных (в примере выше выполняется сложение 5 строк);

— для того чтобы в итоговой строковой переменной присутствовали пробелы, необходимо заключить весь набор объединяемых строк в одинарные кавычки.

Необходимо отметить еще один тонкий момент: «переменная не задана» и «переменной не присвоено значение» — это разные случаи. Разницу в этих случаях иллюстрирует этот макрос:

Результат его выполнения будет следующим:

Давайте обсудим, что у нас получилось. На строках макроса 3–5 выполняется попытка обратиться к переменной $var1#, которая к этому моменту еще не создана. Поскольку переменной еще не существует, Datamine интерпретирует имя переменной как строку и выводит ее — см. результат первого ECHO. Затем на строке 7 создается переменная, но ей не присваивается никакого значения. В строках 9–11 мы вновь пытаемся обратиться к этой переменной. Но теперь Datamine уже «знает», что такая переменная существует, просто в ней ничего нет. Соответственно, при попытке вывести «ничего» и происходит вывод «ничего» — см. результат второго ECHO. При работе с пустой переменной и несуществующей переменной ожидаемо тоже будут различия:

Результат:

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

Получается ошибка:

Причем ошибка совершенно закономерная — Datamine возмущается тем, что ее пытаются заставить выполнить арифметическую операцию со строкой.

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

Результат:

То есть отсутствующее значение при сложении воспринимается как 0.

В то же время умножение приводит к ошибке:

Результат:

Тригонометрические операции воспринимают отсутствующее значение как 0:

Результат:

Суммируем:

— «Нет переменной» и «нет значения» — разные случаи.

— При строковых операциях с несуществующей переменной она воспринимается как строка, содержащая имя несуществующей переменной (включая знаки доллара и решетки).

— При строковых операциях с переменной, которой не присвоено значение, она воспринимается как пустая строка.

— Результат математических операций с несуществующей переменной — ошибка макроса.

— Результат математических операций с переменной, которой не присвоено значение, зависит от типа операции.

Давайте суммируем все, что мы узнали про переменные к настоящему моменту (плюс несколько новых фактов):

— длина имени переменной (вместе со знаками $ и #) — не более 16 символов;

— имя переменной может состоять из букв, цифр, знаков препинания, подчеркивания, знаков арифметических операций, знаков доллара и решетки;

— имя переменной может (но крайне не рекомендуется) содержать буквы русского алфавита;

— Имена переменных — регистрозависимые: $Floors#, $floors#, $FLOORS# — три разные переменные, потому что их имена состоят из символов разного регистра: строчных и прописных;

— присвоение значения переменной выполняется с помощью команды (оператора) LET;

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

!LET $circle_len# = {2 * 3.141 * $radius#}

— присвоение переменной строкового значения может выполняться с использованием одинарных кавычек, а может и без него; одинарные кавычки обязательны, если необходимо, чтобы строка содержала пробелы;

— длина строки, записываемой в переменную, ограничена, а вот чем она ограничена — вопрос довольно загадочный. В официальной справке по макросам сказано, что длина строки ограничена 72 символами. Однако попытка записать в переменную длинную строку дала несколько другое значение этого ограничения — 80 знаков. Скорее всего, справка не обновлялась достаточно давно, а в интерпретаторе языка макросов что-то «подкручивали». В общем, лучше не делать строковые переменные длиннее 72 знаков;

— ограничение, которое вам вряд ли когда понадобится, но если понадобится — не говорите, что мы не предупреждали. Длина переменной, содержащей число, подчиняется тем же ограничениям, что и переменной со строкой — не более 80 символов. То есть, если попытаться в переменную записать число e с кучей знаков после запятой:

!LET $e# = 2.7182818284 (и так далее)

то в переменную будет записано только 78 знаков после запятой: один знак «уйдет» на целую часть, один — на десятичную точку и на дробную часть останется «всего» 78 знаков. Сложно представить ситуацию, когда это ограничение сработает, но мы предупредили;

— сложение строковых значений выполняется простым перечислением переменных, участвующих в сложении;

— переменная может быть использована как команда в макросе или EXTRA. Например, вот такая конструкция вполне рабочая (при условии существования файла tmp.dm, естественно):

— впрочем, как значение в EXTRA, переменная также может быть использована:

Или как имя поля. Вот так:

Ну или так:

Мало того. Даже вот так будет работать:

В общем, очень полезное свойство переменных;

— «нет переменной» и «нет значения» — разные случаи. Результат обработки зависит от типа операции и не всегда приводит к ошибке;

— максимальное количество переменных в макросе — 1000.

Применяем полученные знания

Вроде бы, в теории все понятно, теперь давайте применим сакральные знания о переменных на практике. При написании макроса мы считали, что нам известны имена файлов, название поля зонального контроля, название урезаемого поля, уровень ураганных содержаний и длина композитирования. А что если это не так? Тогда надо дать возможность задавать эти значения перед запуском макроса с помощью переменных.

В нашем подопытном макросе к этому моменту заданы переменные, которые отвечают за тот или иной параметр. Заданы-то они заданы, но пока никак не использованы. То есть пока что от них никакого толка. Предлагается исправить это упущение. Исправлять будем путем замены имен файлов и полей соответствующими переменными.

Заданные переменные в макросе

В приведенном ниже фрагменте с помощью переменных мы задали имена файла скважин, «основу» имени файлов треугольников и точек рудного каркаса, имя поля зонального контроля, длину композитирования, имя урезаемого поля, уровень урезки и имя файла рудной выборки. При этом имена переменных заданы таким образом, чтобы по ним можно было догадаться, для чего эти переменные, а для лучшей «читабельности» при задании переменных в начале макроса они отделены друг от друга пустыми строками. Но что если тот, кто будет пользоваться макросом, не догадается, для чего эти переменные? На этот случай есть такая полезная штука, как комментарии.

Было (слева) — стало (справа). Красными рамками справа обведены изменения, которые произошли в макросе при замене жестко заданных имен на переменные

$ Задание 3.21

Что произойдет в результате выполнения данного макроса:

A) Имя переменной некорректное

B) В переменную $variable# будет записано число 1

C) Переменной $variable# будет присвоено строковое значение «1,0»

D) Ошибка

$ Задание 3.22

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_2# будет присвоено строковое значение «2,0»

B) Переменной $variable_2# будет присвоено числовое значение 2.0

C) Ошибка

$ Задание 3.23

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_2# будет присвоено строковое значение «1,01,0»

B) Ошибка

C) Переменной $variable_2# будет присвоено строковое значение «2,0»

D) Переменной $variable_2# будет присвоено числовое значение 2.0

$ Задание 3.24

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_3# будет присвоено числовое значение 10.0

B) Переменной $variable_3# будет присвоено числовое значение 7.0

C) Ошибка

$ Задание 3.25

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_3# будет присвоено числовое значение 10.0

B) Ошибка

C) Переменной $variable_3# будет присвоено числовое значение 7.0

$ Задание 3.26

Что произойдет в результате выполнения данного макроса:

A) Ошибка

B) Переменной $variable_3# будет присвоено числовое значение 7.0

C) Переменной $variable_3# будет присвоено числовое значение 10.0

$ Задание 3.27

Что произойдет в результате выполнения данного макроса:

A) Ошибка

B) Переменной $variable_3# будет присвоено числовое значение 7.0

C) Переменной $variable_3# будет присвоено числовое значение 10.0

$ Задание 3.28

Что произойдет в результате выполнения данного макроса:

A) Переменной $my_super_mega_very_awesome_variable# будет присвоено строковое значение «1.0»

B) Переменной $my_super_mega_very_awesome_variable# будет присвоено числовое значение 1.0

C) Ошибка

$ Задание 3.29

Что произойдет в результате выполнения данного макроса:

A) Ошибка

B) Переменной $variable_4# будет присвоено строковое значение «I love Datamine»

C) Datamine засмущается и вывалится по ошибке от смущения

D) Переменной $variable_4# будет присвоено строковое значение «Datamine»

E) Переменной $variable_4# будет присвоено строковое значение «IloveDatamine»

$ Задание 3.30

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_4# будет присвоено строковое значение «I love Datamine»

B) Переменной $variable_4# будет присвоено строковое значение «Datamine»

C) Ошибка

D) Переменной $variable_4# будет присвоено строковое значение «IloveDatamine»

$ Задание 3.31

Что произойдет в результате выполнения данного макроса:

A) Переменной $variable_4# будет присвоено строковое значение «IloveDatamine»

B) Ошибка

C) Переменной $variable_4# будет присвоено строковое значение «I love Datamine»

D) Переменной $variable_4# будет присвоено строковое значение «Datamine»

$ Задание 3.32

Что произойдет, если в переменную мы попытаемся записать число π с точностью до 100 знаков после запятой?

Бесплатный фрагмент закончился.

Купите книгу, чтобы продолжить чтение.