[general]
name=Isoliner - грид и изолинии
qgisMinimumVersion=3.16
qgisMaximumVersion=4.99
description=2D kriging (GSLIB KB2D) and isoline / contour-polygon generation in QGIS. Кригинг 2D (GSLIB KB2D) и построение изолиний/контурных полигонов в QGIS.
about=A Processing toolset for point-data interpolation and isolines: 2D kriging (points to raster, GSLIB KB2D core), experimental variogram with model fitting, leave-one-out cross-validation, optional trend removal (regression kriging), isolines and contour polygons whose boundaries coincide with the lines, reusable processing profiles, and a sample-data generator. Suitable for roof elevations, thicknesses, geomechanical properties, chemistry and any numeric attribute. Bilingual (EN/RU) user manual (PDF) is bundled, opened by the language of the QGIS interface. Developed with the support of Inform++ LLC (www.informpp.ru).
    .
    Группа команд Processing для интерполяции точечных данных и построения изолиний: 2D Kriging (точки в растр, ядро GSLIB KB2D), экспериментальная вариограмма с подбором модели, кросс-валидация (leave-one-out), опциональное снятие тренда (регрессия-кригинг), изолинии и контурные полигоны с совпадающими границами, профили обработки и генератор учебных данных. Подходит для отметок пласта, мощностей, ФМС, химии и любых числовых атрибутов. Двуязычное руководство пользователя (PDF, EN/RU) в комплекте, открывается по языку интерфейса QGIS. Разработано при поддержке ООО «Информ++» (www.informpp.ru).
version=4.99.6
author=ООО «Информ++»
email=xbbster@gmail.com
homepage=https://github.com/Valery35/qgis-isoliner
tracker=https://github.com/Valery35/qgis-isoliner/issues
repository=https://github.com/Valery35/qgis-isoliner
tags=kriging,geostatistics,variogram,interpolation,minimum curvature,cross-validation,contour,contours,isolines,hydrogeology,geology,gslib,raster,dem,terrain,topography,hydrology,watershed,flow accumulation,river network,slope,aspect,anudem,topo2raster,copernicus,gedtm30,openstreetmap
category=Analysis
icon=icon.svg
experimental=False
deprecated=False
hasProcessingProvider=yes
changelog=4.99.6
    - Флажок «Заполнять запертые ячейки у разломов» убран из интерфейса,
      заполнение идёт всегда. Случая, когда дырка в гриде предпочтительнее
      сдвига на размер кармана, не нашлось, а лишняя ручка требует от
      человека решения там, где решать нечего.
    - О самом факте по-прежнему сказано в журнале: число запертых ячеек,
      число заполненных и ширина наибольшего кармана. Карманы шире двух
      ячеек отмечаются предупреждением - это признак того, что линия
      проведена слишком извилисто для выбранного размера ячейки.
    4.99.5
    - Запертые ячейки у разломов заполняются по соседям, а не остаются
      дырками. Ячейка, попавшая в складку мельче себя, не видит ни одного
      замера, и оценивать там не из чего. Дырка при этом обходится
      дороже: по ней рвутся изолинии, разваливаются пояса и искажаются
      объёмы. Значение соседей даёт ошибку геометрии не больше размера
      самого кармана, а карман по определению мельче складки.
    - Заполнение идёт волной от края кармана внутрь, за проход пустая
      ячейка берёт среднее по рассчитанным соседям из восьми. В журнал
      уходят число запертых ячеек, число заполненных и ширина
      наибольшего кармана. Карманы шире двух ячеек отмечаются отдельным
      предупреждением: значения там взяты издалека.
    - Поведение управляется флажком «Заполнять запертые ячейки у
      разломов», по умолчанию включён. Снятый флажок оставляет ячейки
      пустыми, если пустоты нужны как признак слишком извилистой линии.
    4.99.4
    - Проверка барьера на вогнутых и складчатых линиях по предложению
      Ивана Иванова. Оба случая разобраны численно и закреплены тестами.
    - U-образный разлом ведёт себя верно: снаружи стенка отсекает
      внутренность полностью, изнутри наружу видно только через устье, и
      конус видимости расширяется по мере приближения к нему.
    - Змейка с крупной складкой пустых ячеек не даёт. Складка мельче
      ячейки их даёт, и это законно: ячейка запирается в кармане, откуда
      не видно ни одного замера, и оценивать там не из чего.
    - 1.02 теперь предупреждает о таких ячейках в журнале, называя их
      число и причину. Раньше пользователь увидел бы дырки в гриде без
      объяснения.
    4.99.3
    - Описание полей в справках закончено. Немых настроечных параметров не
      осталось ни одного, сторож покрытия переведён в строгий режим и
      список известного долга пуст.
    - Повторяющиеся ручки описаны один раз и подключаются общим блоком.
      Заполнение понижений и epsilon уклона - у пяти инструментов группы
      Топография, зерно ГСЧ - у шести, способ выборки растра - у четырёх
      инструментов группы Разрез, размеры учебной сетки - у двух демо.
      Правка идёт в одном месте, и перевод тоже один.
    - Заполнение понижений описано с оговоркой, которая касается наших
      площадей прямо: карст, мульды оседания и бессточные котловины это
      настоящие понижения, и заполнение их сотрёт.
    - Разобраны прежде немые ручки: цель свипа и смещения сетки в 1.01,
      детализация вариограммной карты в 1.06, тренд и сохранение профиля
      в 1.07, модель и анизотропия в 1.09, размер ячейки и функция формы
      в 2.03, сдвиг выбора в 2.11, доля согласных проб в 2.20, профиль
      врезки в 2.16, полурадиус окна в 7.01 и ещё десяток.
    - Сторож покрытия переписан. Обвязка определяется теперь типом
      параметра, а не списком слов: слой, поле, охват и место сохранения
      описания не требуют по своей природе. Прежний список приходилось
      вести руками, он разрастался и всё равно промахивался. Заодно
      сторож научился разворачивать общие блоки справки.
    4.99.2
    - Первый проход по описанию полей в справках. Закрыто 22 пробела из 79,
      сторож покрытия ужат до 57 записей.
    - 1.02: разобраны логарифмирование значения с оговоркой про единицы ln
      и медианную оценку, снятие полиномиального тренда как
      регрессия-кригинг, дискретизация блока и сглаживание грида с прямым
      указанием, что это косметика карты, а не улучшение модели.
    - 1.05: разобраны устойчивая оценка Кресси-Хокинса, перцентиль обрезки
      ураганных проб и разница между удалением и срезкой к границе,
      минимум точек в группе с полом в тридцать точек.
    - 3.06: разобраны медиана P50 как отдельный выход по ансамблю, радиус
      поиска, максимум соседей на узел как главная ручка скорости и зерно
      ГСЧ для воспроизводимости.
    - 3.01: разобраны радиус поиска, границы числа точек, бикубическое
      сглаживание границ и скругление Chaikin с указанием, что первое
      меняет разрешение, а не принадлежность класса.
    - 2.01: разобран весь узел сглаживания FPDEMS - зачем оно работает по
      нормалям, что задают окно, порог различия и число проходов, - а
      также размер ячейки и предел числа плиток.
    4.99.1
    - Разломы описаны в справках. У 1.02 разобраны барьер влияния,
      поведение у затухающего конца, точная геометрия вместо сетки и
      названа цена приближения: веса соседей у самой линии считаются без
      учёта разрыва между ними самими. У 1.03 разобраны барьер на рёбрах,
      полоса мембраны у линии и узел, попавший ровно на линию. У 1.04
      разобраны разрез по линии, ширина коридора и порог наименьшей
      толщины полигона с предупреждением, что на крутой поверхности с
      частым сечением он выкашивает карту.
    - У 1.02 и 1.03 заодно описаны прежде немые ручки: обрезка по контуру
      скважин, коэффициент релаксации, анизотропия.
    - У 1.10 описана амплитуда разлома. Сказано прямо, что атрибут throw
      справочный и инструменты его не читают: барьер у них чисто
      геометрический и о величине смещения не знает.
    - Поставлен сторож покрытия справок. Настроечный параметр обязан быть
      упомянут в тексте справки своего инструмента. Обвязка (входы,
      выходы, поля, охват) описания не требует. Найдено 79 старых
      пробелов, они записаны отдельным списком: новые не пускаются, а
      закрытые обязаны из списка уходить, иначе тест об этом скажет.
    4.99.0
    - У 1.03 «Минимальная кривизна» появились разломы. Барьер живёт на
      рёбрах между соседними узлами: ребро, пересечённое линией, из
      шаблона выпадает, и поверхность вдоль разлома рвётся. В сетку
      разлом не переводится, ступенек по ячейкам не возникает, крыло у
      узла определяется само стороной, с которой он лежит.
    - В полосе шириной два узла вдоль линии решение переходит на мембрану
      по неперекрытым соседям. Тринадцатиточечный шаблон кривизны
      дотягивается на две ячейки и перешагнул бы разрыв, а выбрасывать из
      него отдельные точки нельзя - он перестанет приближать бигармонию.
      Дальше от линии работает обычная кривизна. Тот же приём стоит в
      Topo2Raster у обрывов.
    - Узел, лёгший точно на линию, приписывается к одной стороне по
      правилу знака. Строгое сравнение не годилось: разлом, проведённый
      точно через центры узлов, не перекрывал ни одного ребра, а на
      шахтной сетке линия по оси - обычное дело.
    - Барьер проверен на герметичность: единица, поставленная на одном
      крыле, на другое не протекает ни по одному пути.
    4.98.8
    - Часть изолиний оставалась без границы пояса под собой, а соседние
      пояса сливались. Причина у конца разлома. Полоса коридора доходила
      до самой концевой вершины и резала изолинии своим торцом, а
      обрезанный конец оказывался ЗА концом линии. Притянуть его нельзя,
      там разрыв уже сошёл на нет, и конец оставался висеть в стороне.
      Полигонизация выбрасывает висячее ребро вместе со всем куском
      изолинии до ближайшего узла, а узлов у изолиний почти нет, поэтому
      выбрасывался кусок целиком.
    - Коридор строится теперь по укороченной линии: ось короче разлома на
      ширину полосы с каждой стороны. Торец полосы стоит внутри разлома,
      всякий обрезанный конец лежит сбоку от линии, проекция попадает
      строго внутрь, и притяжка его берёт.
    - Притягиваются концы по-прежнему к настоящей линии, а не к
      укороченной оси: иначе они снова повисли бы за её концом.
    - Короткий разлом не исчезает, срез не больше трети длины с каждой
      стороны.
    4.98.7
    - Под частью изолиний не было границ поясов: соседние пояса сливались.
      Причина в отмене овершута у разлома. Конец, притянутый на линию,
      образует с ней T-стык, а такой стык GEOS часто не нодирует - ровно
      то, ради чего овершут и заведён. Грань не замыкалась.
    - У разлома хвостик вернулся, но короткий, десятая доля ячейки.
      Пересечь линию этого хватает, а дотянуться до изолинии на другом
      крыле нет: коридор уже вычистил полосу своей ширины по обе стороны,
      и ближайшая чужая изолиния не ближе неё.
    - Длина хвостика задаётся по концам отдельно. Ноль означает не
      продлевать, и только этот конец.
    - В журнале вместо оставленных концов пишется, сколько продлено
      коротко у разлома.
    4.98.6
    - Клин в поясах у конца разлома убран. Торец коридора был круглым, и
      полоса заходила за конец линии. Изолинии, обрезанные там, получали
      свободные концы посреди просвета, овершут продлевал их навстречу
      друг другу, и вдвоём они замыкали лишнюю грань.
    - Торец коридора снова плоский, полоса обрывается ровно на конце
      разлома. За концом разрыва уже нет, поверхность смыкается, и резать
      там нечего. Веер, из-за которого торец когда-то сделали круглым,
      формой торца не лечился вовсе и закрыт своей притяжкой.
    - Овершут держит концы во всей полосе коридора, а не только легшие
      точно на линию. У самого конца разлома изолиния бывает срезана
      краем полосы и до линии не дотягивается.
    - Порог наименьшей толщины полигона предупреждает, когда отсеивает
      больше половины поясов. Он задуман против обрывков у разрыва, но на
      крутой поверхности с частым сечением нормальный пояс сам по себе
      уже ячейки, и порог в ячейку выкашивает карту.
    4.98.5
    - Овершут брал не ту вершину на втором конце линии. Хвостики
      дописывались по очереди, и вставка в начало сдвигала индексы:
      второй хвостик считался от предпоследней вершины, а приписывался к
      последней. На карте это чужой отрезок поперёк изолиний, а в поясах
      незамкнутые грани и потеря части полигонов. На демо поясов выходило
      188 вместо примерно шестисот.
    - Обе вершины-хвостика считаются до того, как ломаная изменится, и
      только потом дописываются. Расчёт вынесен в чистую функцию с
      безголовыми тестами: проверяется, что хвост идёт по направлению
      последнего звена, а не первого.
    4.98.4
    - 1.04 срывался на полигонизации с TypeError. В цепочке изолиний
      перемешаны два вида звеньев: алгоритмы Processing возвращают
      строку-идентификатор, а свои шаги отдают готовый слой в памяти.
      Полигонизация умела разрешать только строку, а овершут в прошлой
      версии перестал быть шагом Processing и стал отдавать слой.
    - Разрешение слоя сведено в одну функцию, принимающую и строку, и
      путь, и сам слой. Каждое новое звено получает поддержку обоих видов
      даром, и правка в середине цепочки больше не роняет звено ниже.
    4.98.3
    - Убраны тёмные полосы поперёк разлома на границах поясов. Изолинии
      при этом лежали верно, и виноват был овершут. Открытые концы
      продлеваются на ячейку за контур области, чтобы стык чисто
      занодировался, и продлевались они все подряд, включая притянутые к
      разлому. Такой хвостик выносился на чужое крыло, доставал до
      соседней изолинии и замыкал с ней лишнюю грань пояса.
    - Конец, лежащий на линии разлома, больше не продлевается: у разлома
      овершут не нужен, там грань замыкает сама линия, которая и так
      входит в сеть полигонизации.
    - Овершут переведён на свой обход объектов. Заодно из цепочки ушли три
      шага Processing: разделение по замкнутости, продление и слияние.
      Замкнутые петли по-прежнему не трогаются.
    - В журнал пишется, сколько концов продлено и сколько оставлено на
      разломе.
    4.98.2
    - Веер сходящихся изолиний у конца разлома убран. Две предыдущие
      попытки правили форму коридора, и обе мимо: дело было не в нём, а в
      притяжке. Штатная тянула конец к ближайшей точке разлома без
      разбора, а за концом линии такая точка одна на все окрестные концы,
      сама концевая вершина. К ней они и сходились.
    - Притяжка теперь своя. Конец, ближайшая точка которого совпала с
      концевой вершиной разлома, не двигается вовсе. Внутренние изломы
      ломаной концами не считаются, там притяжка работает как прежде.
    - Торцы коридора снова круглые, кружки у концов не вырезаются. Полоса
      заходит за конец разлома на свою ширину и снимает частые изолинии и
      там, а просвет у затухающего конца верен по смыслу: разрыв там сошёл
      на нет, поверхность смыкается, и рвать её нечем.
    - Количество притянутых концов пишется в журнал.
    4.98.1
    - У концов разлома коридор снимается кружком той же ширины. Плоский
      торец буфера срезал изолинии, огибающие затухающий конец, и их
      концы оказывались за концевой вершиной линии. Ближайшая точка линии
      для них одна на всех, сама вершина, и притяжка сводила десяток
      концов в один узел веером.
    - Ценой служит короткий участок частых изолиний у самого конца
      разлома длиной в ширину коридора. По смыслу это правильно: у
      затухающего конца разрыва уже нет, поверхность там смыкается, и
      рвать её нечем.
    - Допуск притяжки уменьшен с полутора ширин до одной с четвертью.
      Концу надо пройти ровно полосу, а запас сверх этого тянет узлы вбок.
    4.98.0
    - У 1.04 появилась ширина коридора у разлома, умолчание одна ячейка.
      Грид сплошной, значения по разные стороны разлома отличаются на всю
      амплитуду, и скачок приходится на пару соседних ячеек. Контурер
      рисует в этом промежутке все промежуточные уровни разом: при
      амплитуде в двадцать метров и сечении в два метра это десяток
      изолиний в ширине одной ячейки. Геологического смысла у них нет,
      это интерполяция поперёк разрыва, которого пласт не знает.
    - Полоса режется точной геометрией и концы притягиваются к самой
      линии разлома, а не к краю вырезанной полосы: иначе граница поясов
      ушла бы в сторону на ширину коридора.
    - Торцы коридора плоские. У затухающего разлома полоса обрывается
      ровно на конце линии и не трогает изолинии, огибающие его.
    - Ноль отключает вырезание. Меньше ячейки брать незачем, скачок
      занимает ровно ячейку. Заметно больше - начнут пропадать изолинии,
      идущие вдоль разлома по делу.
    - Разлом режет изолинии и тогда, когда пояса не строятся. Раньше он
      доходил только до ветки с поясами, и со снятой галочкой «Контурные
      полигоны» изолинии возвращались сшитыми поперёк разрыва.
    4.97.2
    - 1.04 срывался на продлении открытых концов: «объект содержит
      некорректную геометрию». Виноват был не тот шаг, на котором вылезло.
      Разрез линией разлома оставляет обрывки нулевой длины там, где
      линия проходит точно через вершину изолинии, а Processing по такой
      геометрии прерывает расчёт целиком, а не пропускает объект.
    - Обрывки убираются сразу после разреза и ещё раз после разбора
      мультичастей. Чистка идёт обходом объектов и записью в память, мимо
      проверки Processing: алгоритм проверяет геометрию на входе и
      сорвался бы ровно на том, что призван вычистить.
    - Совпадающие соседние узлы снимаются, объекты нулевой длины
      выбрасываются, число выброшенных пишется в журнал.
    4.97.1
    - 1.04 срывался на записи результата, когда разлом реально разрезал
      изолинии: OGR отказывал по UNIQUE constraint failed на поле fid.
      Причина не в разломах. gdal:contour пишет во временный GeoPackage, а
      QGIS показывает служебный ключ fid обычным полем, и оно едет по всей
      цепочке атрибутом. Пока изолинию никто не разрезал, значения
      оставались уникальными. Разрез делает из одной изолинии несколько
      кусков с одним и тем же fid, и запись падает.
    - Поле снимается сразу после контуринга, один раз для всех
      потребителей. Чинить это у разреза по отдельности значило бы ждать
      следующего шага, который размножает объекты.
    - Поломка была скрытой и ждала своего случая: пока грид рвался по
      ячейкам, изолинии до линии разлома не доходили и резать было нечего.
    4.97.0
    - Найдена причина ступенчатой лесенки вдоль разлома, и она была в
      ядре, а не в изолиниях. Барьер работал растровой маской ячеек, а
      видимость считалась лучом от центра оцениваемой ячейки. Луч
      начинался внутри самой ячейки, и если та лежала на линии, первая же
      проверка попадала в маску: такая ячейка не видела ни одного замера
      со всей площади и уходила в nodata. Вдоль разлома в гриде
      оставалась ступенчатая щель, из которой в 1.04 и росла лесенка
      узких полос.
    - Отказ от явной записи nodata в 4.95.0 щель не убрал, потому что она
      возникала сама, как побочный эффект самоблокировки луча.
    - Разлом больше не переводится в сетку. Видимость проверяется точной
      геометрией: пересекает ли отрезок от ячейки до замера звено линии.
      Барьерных ячеек не существует, пустот вдоль разлома нет, а крыло у
      ячейки определяется само стороной, с которой лежит её центр.
      Отдельное разбиение площади на блоки не нужно.
    - Замер, стоящий точно на разломе, виден с обоих крыльев: скважина на
      линии принадлежит обеим сторонам, отбрасывать её незачем.
    - Накладной расход разломов стал почти незаметен. Проверка звеньев
      идёт по всем замерам разом, тогда как прежний луч шёл по ячейкам
      маски шагом в половину ячейки для каждого замера отдельно.
    4.96.0
    - Три сторожа в тестах не работали в общем прогоне. Файл с заглушками
      QGIS оставлял подставной osgeo в памяти после себя, и проверки,
      идущие следом, вместо настоящей библиотеки получали заглушку.
      Пропуск по её отсутствию не срабатывал, и падали как раз те тесты,
      что стерегут порядок осей целевой СК и инженерную СК чертежа
      разреза. По одному файлу они проходили, все вместе - нет.
    - Заглушки убираются после файла, который их поставил. Оба таких
      файла теперь возвращают память в исходное состояние.
    - Проверка переводов и проверка импорта модулей не собирались pytest:
      весь разбор лежал под запуском файла как скрипта, и в общем прогоне
      обе молчали. Обе вызываются как обычные тесты.
    - Стоп-слова публикуемых текстов проверяются по всему, что уходит
      пользователю, включая описание и changelog. Прежняя проверка
      смотрела только модули пакета, поэтому в записях changelog слова
      остались. Записи поправлены.
    - Заголовки глав руководства сверяются с именами инструментов в
      панели. Разошлась одна глава в русском тексте и пять в английском,
      включая стрелку в имени 1.02: в словаре она была знаком минус со
      скобкой, а в русском имени и в руководстве типографской.
    - В подписи вариограмм по группам пустое значение поля выводится
      словом, а не знаком.
    4.95.0
    - Разрыв перенесён из грида в векторную часть. Вырезать барьер из
      грида было ошибкой: ячейка не передаёт диагональ, и вдоль косого
      разлома шла лесенка ступенек. Теперь грид строится сплошным, а
      разлом подаётся в 1.04 и режет изолинии по своей линии.
    - Линия разлома входит в полигонизацию наравне с изолиниями и
      контуром области, поэтому граница поясов идёт точно по разлому.
    - В 1.02 барьер остался тем, чем был: отбором соседей при оценке,
      чтобы значения не перетекали через разлом.
    4.94.0
    - Ячейки на линии разлома записываются в грид как nodata: оценки в них
      нет, потому что такая ячейка не принадлежит ни одному крылу. Разрыв
      становится виден всему, что работает по гриду - изолинии доходят до
      края данных, контур области обходит линию, и контурные полигоны
      замыкаются по разлому сами. Лесенки узких полос вдоль линии больше
      не возникает.
    - У 1.04 появился запасной отсев по толщине полигона, умолчание ноль.
      Толщина считается как удвоенная площадь на периметр: у полосы с
      разрыва она около ячейки при любой длине, поэтому по площади такую
      полосу не отличить, а по толщине видно сразу. Нужен там, где грид
      рвётся не разломом - у карьеров, обрывов, краёв области.
    4.93.0
    - У 1.02 появились разломы: линии работают барьерами влияния, замер за
      разломом в выборку ячейки не идёт, и поверхность вдоль линии
      рвётся. Изолинии по такому гриду рвутся сами.
    - Линия не обязана рассекать площадь насквозь: у затухающего разлома
      влияние огибает его конец, и поверхность там смыкается. Это и
      отличает приём от раздельного счёта по блокам.
    - Приближение названо в справке прямо: по видимости отбираются только
      соседи, а ковариации между самими замерами остаются евклидовыми.
      Занулять их нельзя, система потеряет положительную определённость.
    - В демо скважин добавлен разлом: линия с затухающим концом и сдвиг
      значений по одну сторону. Амплитуда задаётся параметром, при нуле
      разлом выдаётся линией без сдвига.
    4.92.1
    - В быстрый старт добавлен сценарий для тех, у кого уже есть свои
      створы и ЦМР: что должно лежать в геометрии, какие поля стоит
      завести и почему без них расходы выходят завышенными в разы. Плюс
      три места, где обычно спотыкаются - одна отметка на всю долину,
      чертёжный слой уровней вместо карты и расход выше кривой.
    4.92.0
    - Имена инструментов приведены к единому виду: отглагольное
      существительное вместо глагола. «Собрать пачку от рельефа» стало
      «Сборкой пачки от рельефа», «Поправить пачку» - «Коррекцией пачки»,
      «Убрать ступени» - «Снятием ступеней».
    - У демонстрационных инструментов слово «Создать» убрано: пометка
      «(демо)» и так говорит, что данные порождаются. Имена стали короче,
      а для списка инструментов это важнее стройности фразы. У примера для
      разреза появилась пропущенная пометка «(демо)».
    - Внутренние имена алгоритмов не менялись: модели Processing и
      скрипты продолжают работать.
    4.91.0
    - 6.02 строит зону затопления на любой желаемый расход по уже
      посчитанной кривой. Подаются створы на карте, таблица кривой и
      расход: по каждому створу отметка находится обратным ходом, из них
      поднимается поверхность воды. Пересобирать 6.01 не нужно, потому что
      кривая от расхода не зависит - она характеристика створа.
    - Створ, у которого расход вне кривой, пропускается с предупреждением;
      если так на всех створах, инструмент отказывает с объяснением.
    4.90.0
    - 6.01 отдаёт уровни ещё и на плановой геометрии створов, отдельным
      выходом «Уровни по створам на карте». Чертёжные линии уровней для
      карты не годятся: у них по горизонтали расстояние вдоль створа, и
      на ЦМР они не ложатся.
    - 6.02 проверяет, что слой уровней пересекается с охватом поверхности,
      и при чертёжном слое отказывает с объяснением, какой выход брать.
      Раньше он падал на пустой сетке без внятной причины.
    4.89.0
    - Новый инструмент 5.06 «Складчатость поверхности». В каждом окне
      подгоняется плоскость и считается разброс остатков вокруг неё:
      наклон уходит, извилистость остаётся. Прямая дисперсия отметок для
      этого не годится, на общем наклоне она велика всюду.
    - Одно окно о складчатости не говорит: дисперсия зависит от масштаба,
      и мерой служит скорость её роста. Задаётся несколько окон, выходит
      карта наклона в двойном логарифме - около нуля на спокойной
      поверхности и заметно больше на смятой.
    - Остаток поверхности выдаётся отдельно и годится входом для 7.01: на
      детрендированной поверхности наклон вариограммы описывает
      извилистость, а не общее падение слоя.
    4.88.0
    - Новый инструмент 5.05 «Манифест модели»: роли слоёв записываются в
      пользовательские свойства проекта QGIS - опорная поверхность,
      контакт тела, зеркало, устья, интервалы, замеры оси, справочник,
      наземные наблюдения, створ, разрез.
    - Роли угадываются по именам слоёв и выдаются таблицей на проверку:
      имя ничего не гарантирует, и догадка остаётся подсказкой, а не
      решением за пользователя.
    - Чужие роли, записанные другими модулями, при слиянии сохраняются:
      манифест общий, и вычищать незнакомое значит ломать соседям работу.
    - Правило чтения записано в справке прямо: инструменты читают
      манифест, но не требуют его. Без ролей всё работает по явному
      выбору, как раньше.
    4.87.0
    - Новый инструмент 5.04 «Поправить пачку по статистике мощностей».
      По замерам считается статистика мощности каждого тела, берётся
      доверительный интервал, и мощности на гриде срезаются по его
      границам: всё, что вышло за них, заменяется самой границей. Число
      ячеек не меняется, в отличие от выбрасывания - место остаётся,
      обезврежена только величина.
    - Срезание отделяет артефакт интерполяции от геологии: мощность вне
      интервала на выдержанном теле почти наверняка разгон метода между
      скважинами. Там, где тело меняется закономерно, интервал широк, и
      правка не срабатывает.
    - Без поданных замеров интервал считается по самому гриду, и об этой
      слабости сказано предупреждением: грид уже содержит артефакт,
      который мы ищем.
    4.86.0
    - 5.01 различает срез и выклинивание, если подать уровень растворения.
      Арифметика их не различает: и там, и там мощность уходит в ноль.
      Разница в том, что при срезе кровля лежит на зеркале, а выше тела
      просто нет, и в растре зон появляется отдельный код. Без зеркала
      зона так и остаётся выклиниванием, о чём сказано в журнале.
    4.85.0
    - 5.03 умеет собирать не только от рельефа. Если подать прослеженный
      контакт и указать, чьей кровлей он служит, сборка идёт от него в обе
      стороны: вниз вычитанием мощностей, вверх прибавлением. Ошибка
      делится пополам вместо накопления вниз от рельефа, и это
      единственный разумный путь для глубоких пачек.
    - Проверяется совпадение сеток опорной поверхности и рельефа: на
      разных сетках вычитание молча даёт неверную мощность.
    4.84.0
    - Новый инструмент 5.03 «Собрать пачку от рельефа»: колонка строится
      сверху вниз, тело за телом по справочнику. Для каждого тела растр
      мощности по скважинам, подошва вычитанием из вышележащей
      поверхности, она же верх для следующего.
    - Мощность считается по стволу и приводится к вертикали по углу
      падения: у наклонной скважины вскрытая больше истинной, и без
      поправки пачка распухает. Отсутствие тела в скважине это ноль, а не
      пропуск, и тело выклинивается само.
    - Линии контакта дают достоверные нули: там, где тело выходит на
      поверхность, мощность всего вышележащего равна нулю по определению
      границы. Узлы прореживаются, чтобы густота оцифровки не
      превращалась в вес.
    - Перехлёстов у такой сборки быть не может: подошвы получены
      вычитанием неотрицательных мощностей, непротиворечивость выходит по
      построению, а не проверкой после.
    4.83.0
    - 5.02 выдаёт линии контакта отдельным слоем: с источником и весом.
      От точечных наблюдений они отличаются не достоверностью, а
      плотностью - оцифрованная граница несёт тысячи узлов и вперемешку с
      точками задавила бы всё количеством. Прореживание и вес поэтому
      назначаются линии, а не каждому узлу.
    4.82.0
    - В демо-пачке покровные тела сходят на нет у левого края площади, и
      подстилающее выходит на дневную поверхность. Без этого ни одно тело
      не выходило наружу, и следу выхода взяться было неоткуда.
    - 5.02 выдаёт наземные наблюдения точками контакта и след выхода
      линиями. Мощность вышележащего тела вдоль следа равна нулю, и этот
      ноль известен, а не оценен: в поле веса он выше скважинного. Это
      вход для 4.12 и для сборки от рельефа.
    4.81.0
    - 5.02 выдаёт скважины трёх видов: вертикальные, наклонные и
      восходящие из выработки. У устья появились поля azimuth, dip и kind,
      отдельным выходом идут замеры оси. Интервалы наклонных и восходящих
      считаются вдоль оси, а не под устьем, поэтому демо покрывает первый
      этап плана геомодели целиком.
    4.80.0
    - Ядро демо-пачки научилось произвольной оси ствола: точки оси по
      азимуту и углу падения, интервалы вдоль оси, а не под устьем.
      Восходящие стволы подземного бурения задаются отрицательным углом,
      и отметка вдоль оси у них растёт.
    - Три теста: ось с углом девяносто повторяет прежний вертикальный
      расчёт, у наклонного ствола забой уходит в сторону, у восходящего
      отметка растёт. Это опора для этапа 1 плана геомодели.
    4.79.0
    - 6.02 принимает уровни по створам линиями и поднимает из них
      поверхность воды: глубина считается от неё, а не от плоскости.
      Уровень вдоль реки не постоянен, вверх по течению он выше, и срез
      одной отметкой заливал долину там, где дно ниже этой отметки, хотя
      вода туда не доходит. Линии берутся прямо с выхода 6.01.
    - Отметка воды стала необязательной, если поданы уровни линиями.
    4.78.0
    - Урез-изолиния и «Заполнить понижения в итоге» работают навстречу
      друг другу: первое строит русло, второе его заравнивает, потому что
      для заполнения русло это обычная яма. Обе галочки стоят рядом и до
      сих пор ни о чём не предупреждали. Теперь при таком сочетании
      инструмент предупреждает дважды: при разборе озёр и перед самим
      заполнением.
    - Разница смыслов описана в справке: заполнение нужно рельефу суши,
      чтобы вода стекала, и вредно ЦМР с дном.
    4.77.1
    - Слово «контракт» убрано из всех текстов: соглашение об именах там,
      где о полях слоя, формат обмена там, где о данных между
      программами, требования к входу в остальных местах.
    4.77.0
    - У 2.03 урез работает в двух режимах. Плоскость заливает площадь
      внутри ровной отметкой - зеркало озера. Изолиния закрепляет только
      линию берега, а поверхность внутри остаётся за точками и
      структурными линиями: так строится русло с дном по промерам и
      тальвегу. Раньше урез всегда прибивал всю площадь, и ЦМР с дном
      построить было нельзя.
    - Переключается галочкой «Урез как плоскость», по умолчанию включена,
      прежнее поведение не меняется.
    4.76.1
    - «Наблюдённые уровни» переименованы в «наблюдаемые» во всех текстах.
    4.76.0
    - В подписях полей появились ожидаемые имена: «Поле уклона (обычно
      slope)», «Поле начала интервала (обычно from)» и так далее. Поля и
      так подхватываются по ожидаемым именам, но в форме списки остаются
      пустыми, и человек, открывший инструмент впервые, не знал, что
      заполнять их не нужно. Подписи это снимают, ничего не обещая сверх
      того, что делает подхват.
    - Правка прошла по всем местам, где есть соглашение об именах: створы
      и таблицы гидрологии, модель бурения в разрезах. Свободные поля
      не тронуты - подсказка там была бы выдумкой.
    4.75.1
    - Прежний термин заменён на «участки» во всех текстах: границы
      участков, разбивка на участки, расход по каждому участку.
    - Перечень полей с единицами: в руководствах таблицей по всем входам и
      выходам, в справке 6.01 и в README коротко по створам. Раньше
      единицы были названы только для шероховатости и уклона, а сами поля
      нигде не описаны.
    4.75.0
    - Уровни обрезаются по урезу: линия существует только там, где вода
      есть, и на борта створа больше не заходит. Отмель посреди русла или
      замкнутое понижение на пойме разрывают зеркало, и каждая часть
      выходит своим отрезком. Работает и в слое уровней, и на картинке
      отчёта, и для наблюдаемых уровней тоже.
    - Вертикальные звенья профиля обрабатываются наравне с наклонными: у
      стенки русла переход через урез происходит в той же координате, и
      пропуск такого звена терял весь участок целиком.
    4.74.2
    - В справку 6.01 и в руководства добавлены единицы: уклон безразмерен
      и задаётся метр на метр, в подвал он выводится в промилле отдельным
      полем; шероховатость задаётся коэффициентом Маннинга, формула
      метрическая, а рядом в подвале идёт обратная величина, как её и
      печатают на гидростворе.
    4.74.1
    - Картинки в отчёте не появлялись: рисование было написано, а вызовы в
      теле отчёта не легли. Исправлено, добавлен сторож - он смотрит, что
      блок картинок собирается, фрагменты доезжают до отчёта и распаковка
      их принимает. Проверено воспроизведением.
    4.74.0
    - Отчёт 6.01 стал с графикой. По каждому створу рисуются профиль с
      нанесёнными уровнями и границами участков и график Q(H) с линиями
      обеспеченности: от отметки к кривой и вниз к расходу, как на ручных
      построениях. Наблюдённые уровни отличаются цветом от расчётных.
    - Рисунки идут инлайновым SVG, без файлов рядом и без внешних
      библиотек: отчёт остаётся одной страницей, которую можно переслать.
    4.73.0
    - Исправлен нулевой расход на всех створах, кроме первого. В цикле по
      вершинам расстояние между точками называлось step - тем же именем,
      что шаг по отметке для кривой. После первого створа шаг становился
      равным тридцати метрам, и кривая строилась из одной отметки.
    - Сторож против такого: числовая настройка расчёта не переприсваивается
      внутри циклов. Проверено воспроизведением поломки.
    4.72.3
    - Диагностика 6.01 расширена: площадь живого сечения на верхней
      отметке и шероховатости по участкам. Профиль доходит верным, а
      расход выходит нулевым - эти два числа разделяют, потеряна площадь
      или множители.
    4.72.2
    - Диагностика профиля в журнале 6.01: по каждому створу диапазон
      отметок, ширина и число вершин, плюс предупреждение о плоском
      профиле. Плоский профиль даёт нулевую площадь на всех отметках и
      кривую из нулей, и без этих чисел причина неотличима от ошибки
      расчёта.
    - 6.04 печатает по каждому створу километраж, диапазон отметок и число
      вершин: видно, что записано в слой.
    4.72.1
    - Подвал чертежа падал на первом же запуске: расход по Маннингу
      возвращает одно число, а разбирали его в пару. Компиляция такое
      пропускает, тесты формы не касаются.
    - Сторож против такого: число целей присваивания сверяется с числом
      значений в return самой функции ядра. Проверено воспроизведением.
    4.72.0
    - 6.01 наносит наблюдаемые уровни: отметка и подпись подаются своей
      таблицей. Это замер, а не расчёт, на кривую он не опирается и
      ложится рядом с расчётными, вида УВ 472.90 X/2021. В слое уровней
      такие строки помечены kind=obs, расчётные kind=prob.
    - 6.04 отдаёт учебные наблюдаемые уровни с подписями дат.
    4.71.1
    - 6.04 отдаёт учебные расходы обеспеченности таблицей: без неё уровни
      и подвал чертежа не на чем показать, а пользователю пришлось бы
      выдумывать значения. Настоящие расходы выходят из статистики рядов
      наблюдений и плагином не считаются, эти взяты долями от наибольшего
      на кривой и заведомо лежат внутри неё.
    4.71.0
    - 6.01 отдаёт подвал чертежа гидроствора: строка на участок с шириной,
      средней глубиной, площадью, смоченным периметром, радиусом, уклоном
      в промилле, шероховатостью и обратной ей величиной, скоростью,
      расходом и долей от суммарного на заданной отметке. Без отметки
      берётся первая по обеспеченности - именно её и наносят на чертёж.
    - Рядом идут отметки земли и расстояния точками: нижние строки того же
      чертежа. Лист собирается компоновкой, инструмент отдаёт данные.
    4.70.0
    - 6.01 считает уровни обеспеченности. Расходы 1%%, 5%%, 10%% подаются
      таблицей пар обеспеченность-расход: считать их из рядов наблюдений
      не наше дело, это гидрологическая статистика. По кривой каждому
      расходу находится отметка, и уровни выходят линиями на чертёж, как
      их и наносят на гидростворе (УВВ1%%, УВВ2%%, УВВ10%% над профилем),
      плюс строками в отчёт HTML. Расход выше кривой даёт предупреждение,
      а не экстраполяцию.
    4.69.1
    - Исправлен порядок в 6.03: список переносимых свойств вычислялся
      ниже цикла, который его читал, и импорт падал на первом же запуске.
    - Сторож против такого: имя не должно читаться раньше самого раннего
      присваивания. Аргументы, вложенные функции и генераторы из проверки
      исключены. Проверено воспроизведением поломки - тест её ловит.
    4.69.0
    - 6.03 переносит из таблицы расчётные свойства, а не только профиль:
      границы участков div_l и div_r, шероховатости n_left, n_channel,
      n_right и уклон slope. Без них возвращалась геометрия, но не
      расчёт, и кривая по восстановленным створам расходилась с
      исходной. Существующие программы держат эти величины рядом с
      парами, значит и таблица их несёт.
    - Демо-таблица промеров дополнена теми же полями, круг замкнулся:
      створы, таблица, обратно створы, та же кривая.
    4.68.1
    - Восстановлен вход 6.03: слой линий створов не появился в форме,
      потому что правка легла наполовину. Обращение к слою в коде было, а
      самого параметра не было, и живой прогон упал бы на первом запуске.
    - Сторож против такого: имя, встреченное в теле расчёта, обязано
      встречаться и вне его. Проверено воспроизведением поломки - тест её
      ловит.
    4.68.0
    - 6.03 умеет раскладывать промеры по настоящим линиям створов:
      подайте слой линий, и расстояние по створу станет расстоянием вдоль
      линии. Схема остаётся запасным путём для тех, у кого створов на
      карте нет. Створ без линии строится схемой с предупреждением,
      промеры длиннее линии прижимаются к её концу тоже с
      предупреждением.
    - Так снимается вопрос плановой привязки: придумывать положение
      незачем, если створ уже оцифрован.
    4.67.1
    - 6.03 ставил створы от нуля километража, и цепочка уезжала на
      десятки километров от площади: километраж на реке идёт от устья и
      легко начинается с десятков. Теперь положение отсчитывается от
      первого створа, куда встанет цепочка - решает охват, а километраж
      задаёт только расстояния между створами. Принятое начало печатается
      в журнал.
    4.67.0
    - 6.04 отдаёт ещё два выхода, и группа замыкается сама на себя:
      таблицу промеров парами расстояние-отметка для 6.03 и поверхность
      долины растром для 6.02. Резать затоплению было нечего, пока долина
      существовала только линиями, а гонять демо по реальной ЦМР не
      годится.
    - Поверхность строится из тех же створов, что и кривые, поэтому
      полигон затопления и кривая расходов говорят об одной долине, а не
      о двух похожих. Продольно между створами линейная интерполяция,
      поперёк профиль створа.
    - Два теста: створы, собранные из таблицы промеров, дают ту же кривую
      с точностью до девятого знака, и поверхность совпадает со створами
      в их плоскостях.
    4.66.0
    - Группа гидрологии рек доделана до четырёх инструментов.
    - 6.02 «Полигон затопления»: срез поверхности отметкой воды с
      контуром и растром глубины. Отметку можно задать прямо, а можно
      расходом - тогда она берётся обратным ходом по кривой от 6.01, тем
      самым, что на ручных построениях рисуют красной стрелкой. Мелкие
      пятна отсекаются по площади. Связность с руслом не проверяется, и
      об этом сказано прямо: замкнутые понижения в стороне от реки
      остаются в контуре.
    - 6.03 «Импорт таблиц створов»: пары расстояние-отметка из
      существующих программ превращаются в линии с Z, готовые для 6.01.
      За годы таких таблиц накапливается много, и перебивать их руками
      ради перехода в ГИС незачем. Плановая привязка схематична и на
      расчёт кривой не влияет.
    - Группа «5. Геологическая модель» помечена бетой: диагностика и демо
      работают, сборка колонки от опорной поверхности ещё в постановке.
    4.65.0
    - 6.01 подхватывает поля створа по ожидаемым именам: sec, km, div_l,
      div_r, n_left, n_channel, n_right, slope. Заполнять руками пять
      выпадающих списков при известных именах - та самая работа, от
      которой ветка и должна избавлять. Подхваченные поля печатаются в
      журнал, явный выбор всегда старше найденного.
    - Тест metadata.txt строгим парсером с интерполяцией, тем же, каким
      её читает каталог плагинов. Одиночный процент в журнале изменений
      дважды отбивал архив на странице загрузки, теперь это ловится до
      сборки.
    4.64.1
    - Правая граница участка в демо-реке стояла не на бровке, а на пять
      метров глубже в пойме. Русло захватывало кусок поймы и выше бровок
      набирало наклонный периметр без площади: гидравлический радиус
      падал, и расход на первой пойменной отметке уменьшался при
      поднявшейся воде. Поймы при этом выходили несимметричными на
      симметричной долине. Расчёт был верен, ошибка была в параметрах
      демо, но выглядела как ошибка расчёта.
    - Два сторожевых теста: расход не убывает при подъёме воды ни на
      участке, ни суммарно, и поймы симметричной долины дают одинаковый
      расход.
    4.64.0
    - Новая группа «6. Гидрология рек», фрактальный анализ стал седьмым.
      Ветка самостоятельная: у неё свой предмет и свои пользователи, а
      внутри топографии она смешала бы рельеф с инженерной гидравликой.
    - 6.01 «Створы и кривые расходов»: зависимость расхода от отметки по
      створу. Профиль по вершинам, разбивка на левый берег, русло и
      правый берег одной линией с границами в полях либо тремя линиями с
      ролью. Расход по Маннингу отдельно на каждом участке, смоченный
      периметр по твёрдым границам. Шероховатость и уклон берутся из
      полей створа, а не из параметров: створов много, у каждого свои
      значения, и калибровка сводится к правке таблицы. Уклон умеет
      считаться по цепочке створов от километража и отметок дна.
    - 6.04 «Создать пример реки (демо)»: цепочка створов с известным
      ответом и эталонная кривая, посчитанная ядром напрямую. Расхождение
      с тем, что даст 6.01 на этих же створах, есть ошибка инструмента.
    - Ядро hydro_section.py на чистом NumPy, тринадцать headless-тестов.
    4.63.0
    - У 4.02 новый выход: якоря подписей интервалов. Точка посередине
      каждого интервала на чертеже со всеми его атрибутами. Причина не
      косметическая: движок подписей плохо размещает текст на тонких
      полосах интервалов, и составные подписи содержаний на густой сети
      слипаются - подтверждено на живых данных. Полосы остаются для
      заливки, подписи вешаются на точки обычным выражением по полям.
    4.62.0
    - Демо стало полным разрезом верхнекамского типа. Колонка взята из
      справочника пластов целиком, все тридцать шесть тел сверху вниз: от
      покровных отложений через пестроцветную, терригенно-карбонатную и
      соляно-мергельную толщи к соли, карналлитовой зоне с
      междупластьями, сильвинитовым пластам, подстилающей соли,
      маркирующей глине и нижней соли. Междупластья теперь такие же тела,
      как пласты, а не промежуток в паре.
    - Эрозия считается от уровня растворения - отметки, до которой дошла
      вода. Зеркало это кровля не назначенного тела, а того, которое
      уцелело: в стороне от купола переходная пачка, над сводом покровная
      соль. Что выходит под зеркало, показывает растр subcrop.
    - Соляно-мергельная толща легла на срезанную соль и заполняет всё до
      подошвы терригенно-карбонатной: своей мощности у неё нет, над
      куполом она тонкая, в стороне полная.
    - Водозащитная толща от кровли пласта В до зеркала выдаётся растром
      vzt и печатается в журнал размахом. Над сводом она тоньше.
    - Поверхности пишутся в папку по файлу на контакт и грузятся в группу
      в порядке колонки. Тридцать семь строк в диалоге открывать было бы
      нечем.
    - Стратиграфическая координата считается вектором. Шаг по стволу
      снижен до двадцати сантиметров, иначе маркирующая глина в
      шестьдесят проваливается между пробами. Поточечный марш на такой
      сетке считался бы минутами, вектором площадь строится за полсекунды.
    4.61.0
    - Демо-пачка доведена до дневной поверхности. Ниже зеркала добавлена
      покровная соль ПКС, выше легли СМТ, ТКТ и верхняя толща,
      заполняющая промежуток до рельефа. Разрез теперь читается как
      разрез, а не как одна соляная часть, повисшая в воздухе.
    - Зеркало больше не задаётся числом, оно выводится: соль растворена
      там, где поднялась выше уровня воды, поэтому зеркало это минимум из
      кровли соли и этого уровня. Там, где соль ниже воды, зеркало
      совпадает с её кровлей и ничего не срезает. Подошва СМТ и есть
      зеркало, и всё, что под ней, обрезано ею.
    - Добавлена подошва водоносных горизонтов по кровле СМТ и мощность
      водозащитной толщи отдельным растром: от кровли первого
      промышленного пласта до воды. Над куполом она тоньше всего.
    - Справочник описывает всю колонку, цвета взяты в духе принятых на
      месторождении. Порядок слоёв в дереве идёт сверху вниз через все
      тела.
    4.60.0
    - Срез в демо-пачке переносится на поверхности проходом сверху вниз:
      поверхность, оказавшаяся выше зеркала растворения, опускается на
      него. Пласт, ушедший выше целиком, получает нулевую мощность и
      ложится на зеркало, а не выбрасывается в nodata.
    - Отсюда уходят ступени на разрезе. Выброшенный пласт обрывался
      отвесной стенкой по границе ячейки, и чертёж шёл уступами: полоса
      есть, полосы нет. Теперь полоса сходит на зеркале клином, как и
      положено срезанному пласту, а пачка остаётся полной по всей
      площади.
    - Купол сделан шире и положе. Между полной мощностью и нулём не было
      промежуточных значений: клин укладывался в одну ячейку. Теперь он
      занимает четыре-пять столбцов, и срез читается как срез.
    4.59.3
    - Слои демо-пачки встают в дереве в постоянном порядке: сверху вниз
      по стратиграфии, поверхность растворения последней. Порядок
      загрузки выходных слоёв в Processing не определён, и пачка
      приезжала каждый раз иначе. Для разрезов это не косметика: 4.01
      берёт порядок поверхностей из дерева слоёв, а значит случайный
      порядок давал случайный разрез.
    4.59.2
    - В справочник демо-пачки пишутся междупластья. Разрез не находил,
      что лежит между пластами, и красил эти полосы своими цветами: на
      чертеже междупластья выходили ярче самих пластов.
    - Выклинивание развёрнуто: нулевая зона легла у края площади, а не
      заняла две трети. Нижнего пласта не было на 65%% площади, и разрез
      в правой части показывал четыре полосы вместо пяти - это выглядело
      потерей пласта, а не выклиниванием.
    - Границы выклинивания подписаны верно. Начало и выход на ноль были
      переставлены местами: линия у полной мощности называлась нулём.
    4.59.1
    - В справочник демо-пачки пишется вид тела. Без него справочник не
      читался разрезами: 4.01 сообщал, что столбца body нет, и строил
      чертёж без цветов и имён пластов.
    4.59.0
    - В демо-пачку добавлен соляной купол со срезанной верхушкой. Купол
      поднимает пачку целиком, поверхность растворения срезает поднятое
      сверху, и срезается не один пласт, а вся пачка вниз до глубины
      растворения: над сводом верхнего пласта нет вовсе, следующий
      обрывается на зеркале. Это второй случай, который гридовая модель
      описывает не так, как учебный попарный контакт.
    - Поверхность растворения выдаётся отдельным растром. Она и есть тот
      вход, который нужен для прохода сверху вниз с переносом срезающей
      поверхности.
    - Срез приходит из той же модели бурения, что и вся демо-пачка,
      поэтому гриды и скважины согласованы: где пласт срезан целиком, в
      гриде nodata, и в стволе его тоже нет.
    - В журнал печатается отметка зеркала и площади: сколько срезано
      целиком, сколько оборвано. На краю среза мощность сходит к нулю и
      выглядит выклиниванием, различает их совпадение кровли с
      поверхностью растворения.
    4.58.1
    - В справочник демо-пачки пишутся те же имена, что у слоёв:
      латиницей. Раньше коды шли кириллицей, а слои назывались AB и KpII,
      и справочник сопоставлялся с ними по одному пласту из трёх.
    4.58.0
    - Складка в демо-пачке соразмерна мощности пачки, а не площади. Была
      втрое крупнее самой пачки: заворот уносил слои так далеко, что
      мощности вздувались до 170 м при заданных 26, а зазор между
      пластами скакал от минус 175 до плюс 128. Теперь радиус берётся от
      суммарной мощности, вздутие выходит втрое - как на настоящем крыле.
    - Граница выклинивания изогнута. Прямая линия нулевой мощности по
      меридиану выглядела чертёжной условностью, а не геологией.
    - Умолчания площади уменьшены до 40 на 30 ячеек, шаг сети скважин до
      трёх: складка занимает заметную долю площади и вскрывается
      несколькими скважинами, а не одной.
    4.57.3
    - Исправлено падение 5.02 при записи справочника: состав описания
      пластов поменялся на тройки (код, мощность, междупластье), а
      справочник разбирал их парами.
    - Размеры складки соотнесены с сетью скважин, а не с площадью:
      структура мельче шага сети не вскрывалась почти ни одной скважиной,
      и учебный пример терял смысл. Теперь около трёх шагов поперёк и
      четырёх вдоль, кратные вскрытия попадают в шесть скважин из ста.
    - Глубина забоя считается от суммарной мощности пачки с запасом: в
      складке пачка заворачивается, и ствол обязан пройти её целиком.
    4.57.2
    - Шум построения в демо-пачке сделан пространственно связанным и общим
      для кровли с подошвой. Независимый шум по ячейкам - неверная модель
      ошибки: соседние ячейки интерполируются по одним скважинам и
      ошибаются похоже. На карте зазора это выглядело белым шумом, в
      котором складки было не разглядеть.
    - У пачки появилась общая составляющая ошибки: все поверхности
      строятся по одной сети, и там, где она редкая, пачка смещается
      целиком. Без этого зазор между соседями шумел как разность двух
      независимых полей.
    - Между пластами появились вмещающие породы. Моделируются
      промышленные пласты, а не вся толща, и без междупластья подошва
      одного совпадала с кровлей следующего: зазор тождественно нулевой, и
      шум давал ложные перехлёсты по всей площади.
    4.57.1
    - Складка в демо стала локальной по обеим осям. Была цилиндрической и
      выглядела полосой через всю площадь: скважины с кратными вскрытиями
      выстраивались в одну колонку. Теперь к торцам поворот сходит на нет,
      и получается замок с затуханием, а контур зоны рисуется эллипсом.
    - Порядок пластов в 5.01 берётся из одного источника. Ветка дерева
      слоёв выполнялась раньше справочника и печатала своё сообщение, а
      справочник затем перезаписывал порядок - в журнале выходили две
      строки подряд, и порядок получался чужой.
    4.57.0
    - 5.02 «Создать пример пачки (демо)»: три пласта, выклинивание и
      лежачая складка с опрокинутым залеганием. У замка складки скважина
      вскрывает один пласт трижды, соседний дважды - над точкой в плане
      несколько кровель, и z(x, y) перестаёт существовать как функция.
    - Гриды в демо строятся по первому сверху вскрытию, то есть так, как
      их собрал бы человек, не заметивший опрокидывания. В зоне складки
      они неверны по построению, и это нарочно: 5.01 на них показывает
      перехлёст 54 тыс. м2 и отрицательные мощности, а признак
      перевёрнутого порядка при этом молчит - перехлёст местный.
    - Выходы: шесть растров, устья и интервалы с номером вскрытия в поле
      entry, границы выклинивания линиями, контур зоны складки и
      справочник пластов.
    - 5.01: справочник пластов применяется, только если описывает
      поданные пласты. Чужой справочник не совпадал ни одним кодом и давал
      случайный порядок - на живом прогоне это выглядело как перехлёст на
      всей площади.
    4.56.2
    - Порядок пластов в 5.01 берётся из дерева слоёв проекта, а если задан
      справочник - из него. Порядок выбора файлов в диалоге ничего не
      значит, и на живом прогоне это дало перевёрнутую пачку с перехлёстом
      на всей площади. Откуда взят порядок, печатается в журнал.
    - Карта зазора стала обычным выходом вместо необязательного: как
      необязательный QGIS её пропускал, и она не создавалась.
    4.56.1
    - 5.01 отдаёт карту наименьшего зазора до соседнего пласта. Число в
      журнале говорит «сколько», карта - «где», и второе важнее: там
      перехлёст и возникнет при следующем пересчёте поверхностей. На
      живых данных наименьший зазор оказался около метра при мощностях в
      десятки - междупластье тоньше погрешности построения.
    - Инструмент предупреждает о перевёрнутом порядке: если перехлёст
      занял почти всю площадь, а внутри пластов чисто, пласты почти
      наверняка поданы снизу вверх. Геология так не выглядит - настоящий
      перехлёст местный и соседствует с выклиниванием.
    4.56.0
    - Новая группа «5. Геологическая модель». Фрактальный анализ переехал
      шестым номером: группа узкая и вспомогательная, держать её впереди
      геологии странно.
    - 5.01 «Согласованность пачки пластов»: проверяет, согласованы ли
      кровли и подошвы между собой. Кровли и подошвы обычно строятся
      кригингом независимо друг от друга, и в зоне выклинивания
      поверхности пересекаются - дальше по такой пачке считаются
      отрицательные объёмы. Проверяются выклинивание (геология, не
      дефект), отрицательная мощность и перехлёст соседей.
    - Пары кровля-подошва собираются по именам слоёв: B_top и B_bottom
      дают пласт B. Как разобрано каждое имя, печатается в журнал
      таблицей, неразобранное перечисляется отдельно. Порядок берётся из
      дерева слоёв или из справочника пластов.
    - Инструмент ничего не исправляет: отрицательная мощность бывает
      ошибкой интерполяции и настоящим опрокидыванием пласта, различить
      их арифметикой нельзя. В журнал идёт площадь, а не число ячеек.
    4.55.1
    - Из всех текстов убраны два стоп-слова стиля. Они пролезали
      как затычка там, где надо сказать по существу, и набрались
      за месяцы в двадцати с лишним местах - в справках, комментариях,
      руководстве и шпаргалках. Проверка добавлена в тесты, чтобы не
      вычищать вручную каждый раз.
    4.55.0
    - Слиты две шпаргалки про проверку рельефа. Их было две с одним
      названием «Проверка рельефа: шпаргалка» и разными именами файлов,
      validate и validation: одна справочник, другая прогон на демо. Имена
      различие не объясняли, и человек не знал, какую открывать. Теперь
      одна: сперва справочник и что означают числа, потом полный прогон на
      демо за десять минут.
    - 2.10 «Демо-рельеф» тоже открывается выбором «Что построить»:
      холмистая местность, овражно-балочная сеть, площадка работ для
      объёмов или по своему. Причина та же, что в 2.21: учебному примеру
      полагается запускаться с одного клика, а десяток параметров
      отпугивает раньше, чем чему-то научит. Что поставил пресет,
      печатается в журнал.
    4.54.0
    - 2.21 «Создать пример карьера» открывается выбором «Что построить»:
      карьер с бермами, простой уступ, отвал или по своему. Семь
      параметров вместо одного клика отпугивали того, кто открыл демо
      впервые и ещё не знает ни про число уступов, ни про шум съёмки.
      Ручные значения остались и действуют при выборе «по своему», а что
      поставил пресет, печатается в журнал: молчаливая подмена параметров
      хуже их отсутствия.
    - Английская версия быстрого старта: семь сценариев написаны заново, а
      не переведены.
    - Разведён омоним «нет» в словаре переводов (отсутствие объекта и
      пустое значение).
    4.53.0
    - Список инструментов в руководствах не обновлялся с месяц: сборщик
      звал генератор дерева по относительному пути, которого нет, ошибка
      глушилась через || true, а подстановки сгенерированного списка в
      текст не было вовсе - механизм сделан наполовину. Теперь путь
      ищется, ошибка громкая, дерево подставляется между метками при
      каждой сборке. В английском генераторе заодно исправлен путь к
      словарю переводов.
    - Сценарий «открытая местность» в быстром старте замкнут на 2.03:
      скачанная ЦМР гидрологически неверна, и смысл цепочки не в том,
      чтобы построить по ней изолинии, а в том, чтобы собрать скелет
      местности и пересчитать поверхность заново - горизонтали и вершины
      жёсткими узлами, тальвеги принуждением падения, водные полигоны
      урезом.
    - Руководство открывается разделом «Быстрый старт»: не по
      инструментам, а по задачам. Семь сценариев с разбором механики -
      скважины в растр и изолинии, открытая местность из открытых
      источников, топоплан в рельеф, бровки по плотной съёмке, карьер без
      горизонталей внутри, геологический разрез, объёмы работ. В каждом
      выделены неочевидные места: разрешение открытой ЦМР, заполнение
      понижений перед стоком, база замера перепада, ошибка кригинга,
      вертикальный масштаб, граница счёта объёмов.
    - В сценарии со скважинами основной путь оставлен коротким: кригинг и
      изолинии. Вариограмма, анизотропия и кросс-валидация вынесены в
      «дальше, когда захочется обоснования» - в ординарном кригинге они
      не обязательны, а на входе загромождали.
    - Инструментов под шестьдесят, и выбирать из общего списка тяжело.
      Раздел даёт вход по задаче, а не по номеру.
    4.52.0
    - 4.05: прореживание вершин полос. Кромка ставила узел в каждой
      станции выборки, и на длинном разрезе их выходили сотни - чертёж
      тяжелел, а глазом лишние вершины не видны. Просьба практика с
      производства.
    - Узлы выбрасываются парами: верх и низ обязаны стоять в одних
      станциях, иначе там, где кромки почти сходятся, полоса вывернулась
      бы бантиком. Прореживать кромки порознь нельзя, и это закреплено
      тестами.
    4.51.0
    - Сводный выпуск ветки углов падения.
    - 4.05: угол и азимут падения. Вместо вертикали рисуется след падения,
      полоса зоны становится параллелограммом. На чертёж выходит видимый
      угол: tg(видимый) = tg(истинный) * cos(азимут падения - азимут
      разреза). Азимут разреза берётся по звену, на котором лежит
      пересечение. Азимут падения обязателен и из геометрии не выводится.
      В атрибуты пишутся три числа: dip, dip_az и app_dip.
    - 4.12 «Элементы залегания по следу выхода»: угол и азимут падения из
      трёхмерного следа, по всем вершинам сразу, через собственные векторы
      матрицы ориентации. Прямой в плане след залегания не определяет -
      отказ с причиной вместо числа из шума. Складка ловится невязкой,
      окно даёт изменение залегания вдоль следа.
    - Служебные имена дополнены: dip, dip_az и app_dip. Поле слоя с таким
      же именем переименуется с суффиксом, иначе значения съезжали в
      соседние колонки.
    - Демо 4.10: два новых слоя с аналитическим эталоном - структурные
      элементы на прямом Разрезе 2 (видимые углы 25, 18.25 и ноль в поле
      app_exp) и следы выхода для 4.12, включая намеренно прямой для
      проверки отказа.
    - Руководства RU (119 стр) и EN (115 стр) с разделами про видимый угол
      и восстановление залегания. Новая статья-шпаргалка «Геологический
      разрез» на трёх страницах в двух языках.
    - Убраны неиспользуемые импорты.
    4.49.2
    - Демо структурных элементов в 4.10 переделано: линия «по простиранию»
      располагалась параллельно разрезу и попросту его не пересекала, так
      что проверять нулевой видимый угол было нечем. Теперь все три линии
      поставлены поперёк разреза, а азимут падения задан полем: он с
      направлением самой линии не связан.
    - Ожидаемый видимый угол считается по азимуту звена в точке
      пересечения, как это делает и сам инструмент. Раньше он брался по
      общему направлению разреза, и на ломаной линии сверка расходилась -
      на живом прогоне вышло 12.38 против ожидаемых 18.25, хотя оба числа
      были верны каждое для своего азимута.
    4.49.1
    - Исправлено падение 4.05 при заданных углах падения: в расчёт азимута
      звена передавалась геометрия QGIS вместо списка вершин. Ядро
      считает по координатам, и ошибка вылезала только на живом прогоне -
      безголовые тесты этот путь не проходят.
    - В ядре разрезов поставлена проверка: функция азимутов звеньев теперь
      сама говорит, что ждёт список вершин, а не геометрию. Вызывающих у
      неё несколько, поэтому проверка стоит внутри.
    4.49.0
    - 4.10 получил слой следов выхода для 4.12: три трёхмерные линии на
      плоскостях с известным залеганием - пологая, крутая и намеренно
      прямая в плане. По первым двум инструмент обязан вернуть числа из
      полей dip_true и az_true, третья проверяет отказ. Крутая нужна
      отдельно: подгонка вида z = a*x + b*y + c на ней поплыла бы.
    - 4.12 «Элементы залегания по следу выхода»: угол и азимут падения из
      трёхмерного следа границы. Правило трёх точек это минимальный
      случай, здесь считается по всем вершинам сразу. Выход подаётся прямо
      в 4.05, где эти поля и ожидаются.
    - Метод по Альмендингеру: нормаль это собственный вектор матрицы
      ориентации при наименьшем собственном значении. Подгонка z = a*x +
      b*y + c проще, но разваливается на крутых залеганиях, где
      коэффициенты уходят в бесконечность. Через собственные векторы
      крутизна перестаёт быть особым случаем.
    - Прямой в плане след залегания не определяет: через одну прямую в
      пространстве проходит бесконечно много плоскостей. Инструмент видит
      это по отношению собственных значений и отказывает с причиной, а не
      выдаёт уверенное число из шума округления.
    - Складка ловится невязкой: длинная граница редко лежит на одной
      плоскости. Средняя невязка пишется в поле rms, а окно даёт изменение
      залегания вдоль следа вместо одного среднего числа.
    - Азимуты усредняются векторно: 350 и 10 в среднем дают ноль, а не
      180.
    4.48.1
    - Исправлено падение 4.05 при открытии диалога: константы имён новых
      параметров не попали в класс, правка оборвалась на проверке уже
      после их добавления и файл не записался.
    - Сторож алгоритмов не поймал это, потому что заглушка QGIS в тестах
      подменяла собой любой неизвестный атрибут, включая имена
      параметров. Теперь заглушка падает на именах, написанных
      заглавными: такие константы обязаны быть объявлены явно.
    4.48.0
    - 4.10 «Создать пример для разреза» получил слой структурных элементов
      с элементами залегания: три линии пересекают Разрез 1 вкрест
      простирания, косо и по простиранию при одном истинном угле 25
      градусов. Видимые углы выйдут 25, 18.25 и ноль. Ожидаемое значение
      посчитано и записано в поле app_exp, поэтому результат 4.05
      сверяется числом, а не на глаз - тот же приём, что с истинными
      линиями в демо-карьере.
    - 4.05: углы падения. Линия без отметки по-прежнему даёт вертикаль, но
      если заданы угол и азимут падения (полями по имени или постоянными),
      вместо вертикали рисуется след падения от поверхности вниз.
    - На чертёж выходит видимый угол, а не истинный: tg(видимый) =
      tg(истинный) * cos(азимут падения - азимут разреза). Разрез вкрест
      простирания даёт истинный угол, разрез по простиранию - ноль, и
      объект ложится строго горизонтально. Азимут разреза берётся по
      звену, на котором лежит пересечение, поэтому на ломаном профиле
      наклон в разных местах разный.
    - Азимут падения обязателен и из геометрии не выводится: один и тот же
      объект может падать в любую сторону. Без него объекты остаются
      вертикальными. Сторону наклона задавать не надо, её решает знак
      косинуса.
    - В атрибуты пишутся три числа: dip, dip_az и app_dip. Мерить угол
      транспортиром по чертежу нельзя - вертикальный масштаб искажает
      нарисованный наклон.
    - Длина следа задаётся по горизонтали в метрах, ноль означает до рамки.
    4.47.0
    - Топографический сценарий перестал ходить по кругу. ЦМР в 2.20 стала
      необязательной: спуск по склону отвечал на единственный вопрос, где
      низ, а когда у линий есть свои отметки (выход 2.22), ответ уже в
      данных - подошвой считается ближайшая линия, лежащая ниже бровки.
      Раньше приходилось делать черновой проход 2.03 по одним
      горизонталям, зная, что внутри карьера он неверен, лишь бы было по
      чему спускаться.
    - Порядок стал прямым: 2.22 даёт отметки, 2.20 без ЦМР собирает пары,
      2.03 строит поверхность. С ЦМР работает прежний спуск, он точнее на
      кривом борту с узкими бермами, где ближайшая подошва часто
      принадлежит соседнему уступу.
    - Плоские линии без Z в режиме без ЦМР пропускаются с явным
      сообщением: собрать пару по отметкам, которых нет, нельзя.
    4.46.0
    - 2.20 читает поле вида терпимо. Раньше ожидались только brow и toe,
      как их пишет 2.19, а в сдаточном комплекте стоит «Бровка откоса,
      насыпи, выемки укреплённая» или код 62350400. Теперь понимаются
      значения 2.19, коды бровок из классификаторов и названия со словами
      «бровка» и «подошва».
    - Угадывание не оставлено молчаливым: в журнал печатается таблица, как
      прочитано каждое значение поля, а неузнанные перечисляются отдельно
      и пропускаются. На первом живом слое видно решение, а не «доверьтесь».
    - Отдельного кода подошвы нет ни в одном классификаторе - она проходит
      нижней горизонталью или линией основания, поэтому список кодов
      односторонний, и это не упущение.
    - Руководства RU (117 стр) и EN (114 стр) получили раздел 2.22 и
      описание веса измеренных отметок в 2.03.
    4.45.0
    - 2.03: параметр «Вес измеренных отметок». Точки высот и вершины
      уплотнённых изолиний идут одним потоком жёстких узлов, и при
      совпадении в одной ячейке простое среднее уравнивало их в правах.
      Измеренная отметка снята прибором, а вершина горизонтали нарисована
      по линии сечения и отклоняется в пределах половины сечения. Вес больше
      единицы отдаёт ячейку измерению. Схема релаксации не тронута:
      меняется только число в узле.
    - Умолчание единица, старые прогоны воспроизводятся. Массив точек без
      столбца веса работает как прежде. Ноль, отрицательный вес и NaN
      считаются единицей, а не портят ячейку.
    4.44.0
    - 2.22 «Отметки с примыкающих горизонталей»: даёт немым линиям профиль
      по горизонталям, доведённым до них узловыми точками. Берутся
      пересечения насквозь и концы горизонталей в допуске, между точками
      отметка интерполируется по дуге линии, за крайними держится
      постоянной. Выход - LineStringZ, готовая сторона формы для 2.03.
    - Вместе с 2.20 это закрывает площадные карьеры, выемки, насыпи и
      отвалы в топопланах: горизонтали внутри них по нормативу не
      описываются, и бровки с подошвами - единственный источник рельефа.
      Немые линии уходят в отдельный слой с причиной, число опорных точек
      пишется в атрибут n_samples и в журнал.
    4.43.0
    - Ядро поверхности между структурными линиями (topo_form) закрыто
      тестами по всему списку проверок постановки: прямой откос строго
      линейчат, отметки на линиях воспроизводятся точно, конус ямы имеет
      вершину ровно в точке, канава распадается на зеркальные половины,
      сходящаяся промоина не рождает NaN, а разведённые отметки в точке
      схождения дают ненулевое расхождение. Точность преобразования
      расстояний сверена с прямым перебором.
    - Маска тела строится переносом местной ширины от ближайшего
      источника: одна формула вместо разбора случаев, и она закрывает
      откос, конус, кольцо и сходящуюся промоину. Интеграционный тест
      гоняет настоящий Topo2Raster: жёсткие узлы формы держатся до
      машинного нуля, схема релаксации не тронута.
    - Переведены на английский строки входов форм и границы области
      построения: они были в интерфейсе без перевода.
    - Найден и запущен тест, который никогда не работал: в наборе по
      фракталам две функции звались одинаково, и первая молча затенялась.
      Добавлен сторож на затенённые тесты по всем наборам.
    - В словаре переводов убран дубль ключа границы области построения.
    - Руководства RU и EN получили раздел о поверхности между
      структурными линиями и описание новых входов 2.03.
    4.42.0
    - В демо-карьер добавлена насыпь с поворотом гребня на прямой угол и
      переменной отметкой вдоль него. Она нужна для двух чисел цены
      метода расстояний в построении поверхности между линиями: у поворота
      с внутренней стороны возникает медиальная ось (залом), с внешней
      веер от угловой вершины. Оба эффекта проявляются только при
      переменной отметке, поэтому остальные формы демо их не показывали.
      Мерить их на реальной съёмке нельзя: они считаются против
      аналитического эталона, а у съёмки его нет.
    - Пороги гистерезиса в 2.19 пересчитаны. Прежняя привязка к максимуму
      признака делала порог заложником одного самого резкого объекта на
      растре: появление насыпи с острым гребнем выбило из выдачи все
      уступы карьера. Теперь квантиль по гребням, но не ниже физического
      пола: излом обязан поворачивать склон хотя бы на пять градусов на
      ячейку. Один квантиль без пола пропускал ровную наклонную плоскость.
    - Справка 2.20 переписана: у инструмента два сценария, и второй важнее
      первого. Линии бровок и подошв часто уже есть в топографическом
      комплекте, где они описываются обязательно и своими кодами, детектор
      там не нужен вовсе, а связь всё равно надо собирать. Руководства и
      шпаргалка приведены в соответствие.
    4.41.0
    - Чистка по замечаниям линтера. Двусмысленное имя переменной l (E741)
      в algorithms.py и трёх тестах заменено на осмысленное.
    - Найден и устранён настоящий дефект: в словаре переводов ключ
      «подошва» стоял дважды с разными значениями. Геологическая подошва
      пласта и подошва уступа - омонимы, а словарь различает значения по
      самой строке, поэтому в легенде кандидатов по-английски печаталось
      bottom вместо toe. Подписи разведены: «бровка уступа» и «подошва
      уступа».
    - Там же убран второй дубль, «Вероятность %%s · %%s» с двумя разными
      разделителями в переводе.
    - Тест переводов теперь валится на ключе, у которого два разных
      перевода. Повтор с тем же значением безвреден и только считается.
    - Убраны мёртвые переменные в demo_pit.
    4.40.0
    - 2.20 перешёл с пар один-к-одному на формы. На прогоне по демо 20 пар
      опирались всего на 13 подошв: трассировка режет длинную бровку на
      куски, и все куски спускаются к той же подошве. Пары
      выписывали её по разу на каждую бровку, и в слое Низ появлялись
      дубликаты геометрии.
    - Теперь результат группируется по подошве: форма это одна подошва и
      множество бровок при ней с общим полем связи. Подошва пишется один
      раз. Это тот же взгляд, что в постановке про поверхность между
      структурными линиями, где стороны - множества, а не отдельные линии.
    - В журнале печатается число форм, подошв и бровок при них.
    4.39.0
    - Раскраска кандидатов 2.19 стала осмысленной. Четыре класса по
      квантилям на карьере с одинаковыми уступами рубили шум, и в легенде
      стояло «бровка 10-10». Теперь при разбросе перепада меньше 15
      процентов остаётся один класс на вид, насыщенным цветом, а классы
      появляются, когда уступы действительно разной высоты.
    - Точность подписи считается от размаха: метры с десятыми на борту,
      сантиметры на колеях и бордюрах. Округления до «10-10» больше нет.
    4.38.0
    - 2.21: охват теперь только кладёт демо на место и НЕ меняет его
      размер. Раньше размер грида считался из охвата, и заданный по
      шахтному полю охват растягивал карьер до километров: уступ в 10 м
      при откосе 7 м превращался в чёрный блин, на котором детектору
      нечего искать. Размер задают «Ширина» и «Высота» в ячейках, демо
      ложится серединой в середину охвата.
    - Если охват задан в другой системе координат, в журнал уходит
      предупреждение. При местной или неизвестной СК проекта пересчёт
      охвата в UTM даёт бессмыслицу, и в справке сказано прямо: выбирайте
      в «СК выхода» систему своего проекта.
    - Тест ядра держит физичность форм: на гриде вдвое шире глубина
      карьера обязана остаться прежней.
    4.37.0
    - Найдена настоящая причина, почему кандидаты 2.19 выходили
      однотонными, и она не в QML. У слоя пост-процессор один, а
      сворачивание узла дерева вешает свой: группировка молча затирала
      стилевой. Диагноз про data-defined цвет в 4.36.0 был неверным.
    - Выходы 2.19 и 2.20 группируются без сворачивания, стиль доживает до
      карты. Проверка добавлена сторожевым тестом: он ищет в коде пары
      «стиль на слой, потом группировка со сворачиванием» и валится.
    - Рендерер правилами из 4.36.0 оставлен: он не зависит от выражений в
      свойствах символа и берёт границы классов из самих данных.
    4.36.0
    - Раскраска кандидатов 2.19 переехала из QML в код. Data-defined цвет
      на живом QGIS 4 не срабатывает: сначала это вылезло на полосах
      разреза, теперь повторилось здесь, линии выходили однотонными.
      Рендерер строится правилами, границы классов - квантили самого слоя,
      бровки тёплые, подошвы холодные, толщина растёт с перепадом.
    - База замера перепада в 2.19 поднята с 3 ячеек до 8. Перепад меряется
      в базе, и при трёх ячейках десятиметровый уступ читался как три
      метра. Теперь на демо-карьере drop показывает настоящие 10 м.
      В журнал печатается база в метрах, в справку добавлена оговорка.
    - Отсечка шума в 2.19 поднята с 0.2 до 0.5 м, предел пути спуска в
      2.20 снижен с 200 до 50 м. Прежние 200 м на карьере с бермами
      позволяли бровке добежать до подошвы соседнего уступа и составить
      с ней ложную пару, вместо того чтобы уйти в непарные.
    - Выходы 2.20 получили простую раскраску: Верх тёплым, Низ холодным.
    4.35.0
    - 2.20 «Бровки и подошвы в работу»: вторая половина пары к 2.19. Снимает
      отметки с ЦМР, собирает пары бровка-подошва и раскладывает их по двум
      слоям, Верх и Низ, с общим полем связи. Выход подаётся дальше как есть.
    - Пары собираются спуском по склону, а не по близости. От пробных вершин
      бровки идёт спуск по направлениям стока до подошвы, подошвы голосуют.
      Это физика уступа: вода с бровки скатывается к его подошве. На кривом
      борту с узкими бермами ближайшая по расстоянию подошва часто чужая, и
      выбор по близости ошибается там, где спуск прав.
    - Непарные линии не пропадают молча, а уходят в третий слой с причиной:
      спуск не дошёл до подошвы либо разошёлся по разным подошвам.
    - Отсечка по перепаду повторяет фильтр 2.19, поэтому можно подавать весь
      слой кандидатов, не заводя отфильтрованный.
    4.34.0
    - Два новых инструмента топографии, задел ветки структурных линий.
    - 2.19 «Кандидаты бровок и подошв» находит места, где уклон меняется
      быстрее всего, и трассирует их в линии с атрибутами: перепад
      поперёк, длина, средний уклон сторон, вид (бровка или подошва по
      знаку кривизны). Слой приходит с раскраской по перепаду, порог
      значимости остаётся человеку: фильтр слоя по полю drop, глядя на
      карту, без пересчёта. Процентили перепада печатаются в журнал.
      Работает на плотной съёмке: шум гасится сглаживанием и правилом
      «излом без перепада не излом».
    - 2.21 «Создать пример карьера (демо)» строит карьер с уступами,
      съездом, отвалом и сходящейся канавой и отдаёт истинные линии с
      трёхмерными вершинами и полем связи. Пара растр-линии - эталон
      для 2.19 (полнота и точность меряются числом), вход для
      построения поверхности и учебный пример без закрытых данных.
    - Связка закреплена безголовым тестом: детектор прогоняется по
      демо-карьеру и обязан находить истинные линии.
    4.33.0
    - В 4.05 две галочки по просьбе Василия Швалева: «Сохранять имя
      исходного слоя» и «Сохранять стиль исходного слоя». Работают, когда
      подан один слой. Обе по умолчанию выключены, прежние прогоны
      воспроизводятся.
    - Имя выхода идёт от источника: слой геологии даёт «Геология на
      разрезе» вместо «Полосы зон на разрезе». Если один слой родил
      несколько видов объектов, к имени добавляется вид, иначе слои в
      дереве назывались бы одинаково.
    - Стиль берётся у самого слоя. Вместе с переносом атрибутов из 4.29.0
      это снимает ручную работу: категорийная раскраска геологии по полю
      ложится на полосы как есть. Стиль переносится при совпадении типа
      геометрии, линия с Z даёт точку и остаётся со штатным стилем.
    - Отдельно этим закрыт вопрос стратиграфической палитры: таблица
      код-цвет от геологов не нужна, у них слои уже раскрашены в проекте.
    4.32.0
    - У 3.01 «Категориальный индикаторный кригинг» появился параметр «Доля
      самородка». Пусто оставляет автоподбор, ноль делает оценку гладкой у
      данных, и скважина удерживает свой класс в своей ячейке. Общая
      дисперсия при переносе доли сохраняется, меняется только гладкость.
    - Подобранные самородок и радиус по каждому классу печатаются в журнал.
      Раньше модель подбиралась молча, и понять, почему карта расходится с
      фактами, было не по чему.
    - Причина, ради которой это сделано: ровно в точке замера кригинг точен
      при любом самородке, но узел сетки почти никогда не садится на устье.
      При самородке 0.5 в пяти метрах от одиночной скважины вероятность
      падает до 0.47, то есть под порог 0.5, а при нулевом остаётся 0.97.
      Скважина опасного класса оказывалась вне опасной зоны.
    - В руководства добавлен раздел «Когда скважина не попала в свою зону»:
      самородок, размер ячейки и сдвиг границы полигона сглаживанием.
    4.31.0
    - 4.05 обрезает зоны и разломы снизу по линии низа с чертежа. Пара к
      верхней обрезке из 4.30.0: подаётся слой подошвы, почвы пласта или
      любой нижней поверхности, и низ полос и вертикалей ложится по ней.
      Линии нет, низ остаётся по рамке, как раньше.
    - Слой из нескольких поверхностей годится как есть: сверху обрезка идёт
      по верхней огибающей, снизу по нижней. Нужна одна поверхность,
      подаётся слой, отфильтрованный по полю name.
    - Кромки считаются в одних и тех же станциях. Узлы обеих ломаных
      сводятся в общий набор, иначе кромки пересекались бы между узлами и
      кольцо завязалось бы бантиком вместо полосы.
    - Низ не поднимается выше верха. Где линия низа прошла над рельефом,
      полоса схлопывается и объект не выдаётся, число срезанных целиком
      печатается в журнал. Вывернутой геометрии с самопересечением на
      чертеже не появляется.
    - Обе линии обрезки запоминаются между запусками, как остальные входы:
      чертёж выбирается один раз, а не при каждом прогоне.
    - С 4.07 «Проекция объектов на разрез» и 4.08 «Спроецировать с
      разреза» снята метка «бета». Инструменты проверены на реальных
      данных: зоны минерализации и геологию выносят пересечением, точки
      отбора проекцией, вопросов к проекции не осталось. Развёртка стенки
      ствола 4.09 пока помечена, её пробовать не на чем.
    4.30.0
    - 4.05 обрезает зоны и разломы сверху по линии рельефа с чертежа.
      Вторая просьба Василия Швалева. Подаётся слой линий рельефа из 4.01,
      верх объектов ложится по рельефу, кромка полосы повторяет его
      переломы. Обрезка идёт по линии с чертежа, а не по растру ЦМР:
      разрез мог строиться по другой поверхности, и тогда растр с
      чертежом разойдутся, а обрезать надо по тому, что человек видит.
      Разрезы сопоставляются по полю sec_id.
    - Появилось поле нижней отметки полос и вертикалей: низ берётся из
      атрибута объекта, а не из рамки, поэтому зоны рисуются своей
      глубины. Значение читается как абсолютная отметка, флажок в
      дополнительных параметрах переключает его на глубину от верха.
      Ниже рамки низ не опускается.
    4.29.0
    - 4.05 «Пересечение векторов с разрезом» переносит атрибуты объектов на
      чертёж. По просьбе Василия Швалева: границы на разрез выносились, а
      покрасить их по возрасту было нечем, в выходе стояло только имя слоя.
      Теперь полосы и вертикали красятся и подписываются по своим полям
      без ручного связывания с исходным слоем.
    - Слоёв подаётся несколько и схемы у них разные, поэтому колонки
      сводятся в один общий набор: поле, которого у слоя нет, остаётся
      пустым, одинаковое имя в разных слоях считается одной колонкой.
      Имена, совпадающие со служебными (sec, src, label, d, z, d1, d2),
      переименовываются с суффиксом. Это не косметика: колонка d несёт
      расстояние вдоль разреза, и атрибут объекта с тем же именем молча
      подменил бы координату.
    - Флажок «Переносить атрибуты объектов на разрез» включён по умолчанию,
      число собранных колонок печатается в журнал.
    4.28.0
    - Тальвеги в 2.03 могут нести отметки. Раньше тальвег был только
      условием падения вниз по течению, а высоту дна решал интерполятор
      по окружающим данным. Теперь отметки вершин трёхмерной линии
      становятся жёсткими узлами, и промер по руслу задаёт дно.
    - Отметки один раз приводятся к падающим вниз по течению. Это не
      аккуратность, а условие работоспособности: измерения шумят,
      вершина, ушедшая вверх, спорила бы с принуждением падения каждую
      итерацию. Правка идёт только вниз, наибольшая величина печатается
      в журнал. После приведения принуждение становится пустой операцией.
    - Ячейки, где отметка тальвега расходится с другим узлом больше чем
      на пять сантиметров, считаются и выводятся предупреждением: обычно
      это пересечение русла с горизонталью, и там побеждает тальвег.
      Молча такой спор не решается.
    - Линия без отметок ведёт себя как прежде, разнотипный слой
      разбирается по объектам, как урез воды.
    4.27.0
    - Демо 4.10 выдаёт свой справочник пластов. Интервалы демо размечены
      кодами Q, В1, Пр1, В2, Пр2, В3, а поставляемый справочник из 4.11
      собран по Верхнекамскому месторождению и этих кодов не знает,
      поэтому колонки скважин на демо оставались без цвета. Справочник
      собирается из того же списка кодов, которым размечаются интервалы,
      и разъехаться с данными не может. Полосы пластов в 4.01 он не
      красит: там пласт ищется по именам слоёв кровли и подошвы, а
      поверхности демо названы номерами и кода пласта не несут. На своих
      данных, где слои названы кодами, тот же справочник красит и полосы.
    4.26.1
    - Демо-скважины стало видно. Пара слоёв модели бурения collar и interval
      выдаётся инструментом 4.10 давно, но была упомянута в середине абзаца
      справки, а руководство описывало ещё старый широкий формат h1...h6.
      За сутки двое спросили, есть ли интервалы опробования, хотя они есть
      и есть демо к ним. Теперь скважины вынесены отдельным разделом в
      справке 4.10, в руководствах RU и EN и в README: 4.10, затем 4.01,
      затем 4.02 - весь путь пробуется без своих данных.
    4.26.0
    - У 2.03 Topo2Raster появилась граница области построения: полигон
      ограничивает поверхность, как outer boundary в САПР, за границей
      nodata. Маска накладывается ПОСЛЕ интерполяции, а не отсечением
      входа: данные снаружи продолжают формировать поверхность у самой
      границы, и края не заворачиваются. Слой границы принимается в любой
      СК, геометрия переводится сама. В журнал печатается доля ячеек
      внутри, при нулевом пересечении расчёт прерывается с указанием
      проверить СК.
    4.25.0
    - 2.18 получил два выхода по просьбе Василия Швалева. Слой «Участки с
      объёмами»: те же полигоны с объёмами в атрибутах (fill_vol, cut_vol,
      net_vol, площади, наибольшие отметки, число ячеек, вердикт). Ведомость
      HTML нужна для согласования, а подписать участки на карте можно только
      атрибутами.
    - Флажок «Обрезать растр разности по участкам»: за контуром работ
      разность складывается из шума съёмки, и растянутая на неё цветовая
      шкала прячет то, ради чего растр и смотрят. На числа обрезка не
      влияет, статистика считается до неё, в ведомости остаются оба итога.
    4.24.0
    - Каталожный релиз. Собраны изменения ночных сборок 4.18-4.23: новый
      инструмент 2.18 «Насыпи и выемки», разрез 4.01 по одной поверхности
      с низом рамки и слоем линий поверхностей, демо-пара поверхностей в
      2.10, проверка живости запомненных ссылок на слои, переименование
      2.16, удаление 2.17. Руководство и шпаргалка приведены в
      соответствие с составом модуля.
    4.23.1
    - Разрез по одной поверхности не создаёт пустых слоёв. Пластов нет,
      значит полосам взяться неоткуда, и чертёж полос вместе с забором 3D
      выходили пустыми слоями в дереве. Пустой слой в проекте выглядит
      поломкой, хотя построено всё верно, поэтому теперь они в проект не
      добавляются, а в журнале сказано, где смотреть рельеф.
    4.23.0
    - Разрез по одной поверхности доведён до рабочего вида. В 4.22.0 было
      снято требование двух поверхностей, но ниже по коду остались две
      проверки, считавшие пустой список пластов признаком того, что линия
      прошла мимо данных. На одной поверхности пластов нет по определению,
      и расчёт прерывался при полностью валидном профиле. Теперь причины
      разведены: пластов нет при одной поверхности это норма, при
      нескольких это по-прежнему ошибка.
    - Новый выход 4.01 «Линии поверхностей на чертеже». Раньше на чертёж
      шли только полосы пластов, то есть разрез по одной поверхности вышел
      бы рамкой без рельефа. Теперь каждая поверхность даётся отдельной
      линией с полями sec, sec_id, num и name, разрывы по отсутствию
      данных сохраняются. Выход полезен и с пластами: линию кровли можно
      подписать и оформить отдельно от полос.
    4.22.1
    - Память слоёв: закрыт второй вход. Проверка живости ссылки, добавленная
      в 4.18.3, стояла только на _restore_layer_defaults, а часть параметров
      подставляет память прямо в объявлении и стража миновала. Так падал
      справочник пластов в 4.01 и входы модели бурения в 4.02: слой из
      прошлого проекта удалён, комбо пустое, а запуск сообщает о
      некорректном значении. Теперь оба входа проходят одну проверку,
      сторожевой тест следит, чтобы незащищённых не осталось.
    4.22.0
    - Разрез 4.01 строится по одной поверхности. Раньше требовалось
      минимум две, кровля и подошва, и самый частый начальный случай был
      недоступен: у человека есть только ЦМР, а нужен профиль рельефа,
      чтобы наносить на него пересечения и рисовать геологию вручную.
      Теперь одна поверхность даёт линию рельефа, рамку, оси, угловые
      точки и определение разреза, а список пластов остаётся пустым.
    - В дополнительных параметрах 4.01 появился «Низ рамки, отметка».
      Без него рамка обжимает данные, и под рельефом не остаётся места
      для рисования. Отметка учитывается до расчёта вертикального
      масштаба, поэтому в режиме отношения габаритов чертёж выходит в
      масштабе той рамки, которую человек увидит. Отметка выше данных
      игнорируется: это низ рамки, а не обрезка.
    4.21.2
    - В ведомости 2.18 убрана группировка разрядов там, где она мешала:
      начало сетки, шаг ячейки и мёртвая зона. Координата это не сумма,
      и пара координат с разделёнными разрядами читалась как четыре
      числа вместо двух. X и Y теперь разделены запятой.
    4.21.1
    - Ведомость 2.18 и журнал печатают числа человеческим видом:
      701 224 863 вместо 7.01225e+08, разряды разделены неразрывным
      пробелом. Экспоненциальная запись годится для отладки и не годится
      в документе, который несут согласовывать.
    - Площади в ведомости переведены в гектары: девятизначное число
      квадратных метров глазом не читается.
    - В таблице по участкам появилась строка «итого». Сумма по участкам
      и общий итог теперь сверяются в одном взгляде, а не в уме.
    4.21.0
    - Демо-рельеф 2.10 научился выдавать пару поверхностей для 2.18: два
      необязательных выхода, проектная площадка и полигоны участков
      работ. По умолчанию оба выключены, у тех, кому нужен один рельеф,
      ничего не изменилось.
    - Отметка площадки берётся средним рельефа внутри области работ.
      Это точный ответ, а не вкусовщина: объём есть сумма разностей, и
      нетто обращается в ноль ровно при отметке, равной среднему.
      Медиана делит пополам ячейки, а не кубометры, и баланс при ней не
      сходится. Демо сразу даёт сошедшийся баланс, а сдвиг отметки в
      дополнительных параметрах уводит его в привозной или вывозной
      грунт, так что все три вердикта 2.18 проверяются в два щелчка.
    4.20.0
    - Новый инструмент 2.18 «Насыпи и выемки (объёмы работ)». Считает
      объём между двумя поверхностями: разность отметок по ячейкам на
      площадь ячейки. Знак «стало минус было», насыпь положительна.
      Поверхность сравнения задаётся растром или одной отметкой числом.
    - Сетки приводятся автоматически: хозяином берётся первая матрица,
      вторая приводится билинейно. Ближайший сосед не используется, он
      возвращает ступени. За краем данных объём не считается, высоты не
      экстраполируются.
    - В журнал печатаются начало сетки, шаг и число ячеек обеих матриц.
      Это не украшение: расхождения объёмов с другими программами почти
      всегда даёт состав ячеек, а не формула. Билинейное приведение
      объём сохраняет, и это закреплено тестом.
    - Мёртвая зона по высоте отсекает фоновый шум двух поверхностей,
      который иначе раздувает и насыпь, и выемку, не меняя нетто.
    - Участки работ считаются отдельно по полигонам, с полем названия.
      Вердикт по балансу смотрит на долю нетто в обороте, а не на его
      величину. Выход: растр разности и ведомость HTML.
    - Линия нулевых работ отдельным инструментом не делается: это
      изолиния нуля по растру разности обычным инструментом изолиний.
    4.19.1
    - Инструмент 2.16 переименован в «Водосбор. Линии и контуры (канавы,
      карьеры)». Прежнее название читалось как водосбор одной линии, а
      инструмент с 4.16 принимает и полигоны.
    4.19.0
    - Инструмент 2.17 «Сгущение горизонталей секущими» убран из модуля.
      Приём проверен измерением: по одному набору горизонталей построены
      две матрицы 2.03 Topo2Raster с одинаковой рамкой и ячейкой, без
      точек сгущения и с ними, обе проверены 2.13. Притяжение отметок к
      уровням выросло с 1.09 до 1.14, средний модуль вертикальной
      кривизны с 9.31e-05 до 1.08e-04, заполнение понижений подняло 7498
      ячеек против 9018. Ухудшение по всем показателям сразу.
    - Причина в выборе пациента, а не в приёме. Мультисеточная схема 2.03
      сама наращивает данные от грубой сетки к тонкой и террасинга не
      даёт: отношение 1.09 на голых горизонталях это уже здоровая
      поверхность, лечить было нечего. Редкие выведенные точки ложились
      поверх неё жёсткими узлами, и вокруг каждой получалась лунка.
    - Держать инструмент, соседний номер которого подсказывает вредную
      связку, ни к чему. Код остаётся в истории репозитория.
    4.18.3
    - Память входных слоёв больше не подставляет мёртвые ссылки. Раньше,
      если запомненный слой удалён из проекта или проект другой, id
      подставлялся значением по умолчанию: комбо выглядело пустым, а
      запуск падал с сообщением «некорректное значение» без видимой
      причины. Теперь перед подстановкой ссылка проверяется: id должен
      находиться в текущем проекте, либо строка указывать на существующий
      файл. Мёртвая ссылка молча отбрасывается, диалог возвращается к
      обычному автоподбору. Списки слоёв чистятся пословно.
    4.18.2
    - Убран диагональный муар на рельефе после 2.17. Причина была в
      соотношении шагов: по умолчанию шаг вдоль секущей брался вчетверо
      мельче расстояния между секущими, точки ложились густыми полосами
      вдоль направления секущих и редко поперёк, и интерполятор эту
      анизотропию отрисовывал гребёнкой. Теперь шаги по умолчанию равны,
      облако выходит изотропным.
    - Выход прореживается решёткой с шагом сгущения: одна точка на
      ячейку, сколько бы секущих там ни пересеклось. Берётся ближайшая к
      центру ячейки, чтобы облако не сползало к её краям.
    - Предупреждение, когда шаг сгущения задан заметно мельче расстояния
      между секущими: это рецепт муара.
    4.18.1
    - Исправлено падение 2.17 на первом же прогоне: метод ndarray.ptp()
      убран в NumPy 2, а QGIS 4 идёт именно с ним. Добавлен сторож
      tests/test_numpy2_rules.py - он читает исходники и ловит вызовы,
      убранные в NumPy 2. Обычные тесты такое поймать не могли: строка
      живёт в теле алгоритма QGIS, куда безголовый прогон не заходит.
    4.18.0
    - Новый инструмент 2.17 «Сгущение горизонталей секущими» (приём Ивана
      Иванова). Набирает промежуточные отметки между горизонталями до
      построения рельефа, чтобы террасе неоткуда было взяться. Семейства
      параллельных секущих под несколькими азимутами, одномерный профиль
      по пересечениям, сгущение монотонной кубикой Фрича-Карлсона.
      Монотонность взята не ради красоты: обычный сплайн между двумя
      горизонталями уходит выше верхней и изобретает вершину, которой в
      данных нет.
    - Точки выходят с весом меньше единицы (они выведенные, а не
      измеренные) и с азимутом секущей в атрибутах. Вес читают
      инструменты с полем весов, 2.03 Topo2Raster пока нет.
    4.17.0
    - Пре-релизный проход. Руководства RU и EN дополнены разделом про
      инструмент 4.11, подписи параметров в них выправлены под новые
      («Справочник пластов (таблица)»), PDF пересобраны.
    4.16.1
    - В образец справочника пластов возвращён составной пласт КрIIIа+б,
      сумма КрIIIа, КрIIIа-б и КрIIIб. Он стоит выше КрIIIб-в, строк стало
      37. В исходной палитре месторождения есть только составной код, а
      части в образце появились при переносе - теперь есть и то, и другое,
      разрез строится на обеих гранулярностях.
    - Составные тела (конгломераты) в образце красятся серым #969696 -
      тем же, каким плагин помечает неопознанное. Цвет конгломерата из
      цветов его частей не выводится, его ставит человек. Правило
      записано на листе «Как заполнять».
    4.16.0
    - Новый инструмент 4.11 «Образец справочника пластов»: кладёт
      поставляемый шаблон прямо в проект. Раньше справочник лежал файлом
      в каталоге плагина, куда пользователь не ходит, и в 4.01 по ошибке
      подавали первую попавшуюся таблицу.
    - Список справочника в 4.01 и 4.02 ограничен таблицами без геометрии,
      слои карты в него больше не попадают.
    - Из подписей параметров убрано слово «необязательно»: пометку
      квадратными скобками дописывает сам QGIS, и она задваивалась. 17
      подписей в русском интерфейсе и столько же в английском.
    4.15.0
    - Из поставки убрана папка palettes и весь код чтения и записи палитр
      Leapfrog. Источник цвета в разрезах теперь один - справочник пластов,
      палитра из инструментов 4.01 и 4.02 убрана ещё раньше, а её
      машинерия оставалась мёртвым грузом. Правила сопоставления кодов
      (приведение написания, разбор имён поверхностей вида KpII_top)
      сохранены полностью: от смены источника цвета написание кодов в
      данных не изменилось.
    4.14.0
    - В поставку добавлен образец справочника пластов: папка templates,
      файлы plast_reference_vkmks.xlsx и .csv. 36 строк Верхнекамского
      месторождения от покровных отложений до нижней каменной соли, с
      цветами, порядком залегания и телами. Берётся за основу и правится
      под своё месторождение.
    - Руководства RU и EN: разделы про цвет в 4.01 и 4.02 переписаны со
      справочника пластов. Прежние разделы описывали палитру Leapfrog,
      которой в этих инструментах больше нет.
    4.13.0
    - Врезка в 2.16 получила профиль «жёлоб с уклоном к стоку» (приём
      Ивана Иванова из обсуждения водосборов). Постоянная глубина на
      волнистом рельефе даёт дно, которое местами поднимается по ходу
      трассы, и вода переваливает через борт. Жёлоб делает дно монотонно
      падающим в сторону нижнего конца трассы с заданным продольным
      уклоном. По умолчанию профиль прежний, постоянная глубина. Полигоны
      при любом профиле врезаются постоянной глубиной.
    4.12.0
    - 2.09 переименован в «Вершины и ямы» и ищет всегда оба знака: ямы
      находятся тем же алгоритмом на обращённом рельефе. В атрибуты
      добавлено поле kind (peak или pit), у ямы drop это положительная
      глубина. Отметка всегда пишется в Z геометрии (PointZ) - пикеты
      выгружаются в DXF вместе с горизонталями и закрывают плоские шапки
      поверхности на замкнутых горизонталях. Вершинная половина в
      точности совпадает с прежней.
    4.11.1
    - Терминология приведена к одному виду в подсказках, отчёте и
      руководстве: у 2.16 везде «приёмник», жаргонная «затравка» из
      пользовательских текстов убрана. Имена полей не менялись.
    - Руководства RU и EN дополнены разделами о полигонной затравке 2.16,
      значении в Z геометрии 1.04, разборе наггета 1.05 и векторных
      границах по вероятностям 3.01.
    4.11.0
    - Полосы вероятности в 3.01 получили текстовое поле band вида
      «0.25 - 0.5» и готовую категориальную раскраску от зелёного к
      красному по возрастанию вероятности. Раньше легенду приходилось
      строить по одной границе, и категорий выходило больше, чем полос:
      полоса, разбитая рельефом на несколько кусков, добавляла лишнюю
      строку. Теперь категорий ровно столько, сколько полос.
    4.10.1
    - Векторные выходы 3.01 очищены от служебных полей. Слияние слоёв
      дописывало layer и path - имя и URI временного слоя-источника, в
      готовом слое это мусор, класс и так лежит в поле class.
    - Границы полос вероятности переименованы из ELEV_MIN и ELEV_MAX в
      P_MIN и P_MAX и зажаты в диапазон от 0 до 1. Прежние имена пришли из
      машинерии изолиний, где поле всегда отметка, а крайние полосы
      выходили за диапазон и показывали отрицательную вероятность.
    4.10.0
    - В 3.01 появились векторные границы по вероятностям: линии уровней и
      полосы-полигоны между ними. Уровни задаются параметром, по умолчанию
      0.25, 0.5 и 0.75, то есть уверенно нет, спорная полоса и уверенно да.
      Полигон несёт имя класса и сразу раскрашивается категориальным
      отрисовщиком. Оба выхода необязательны и по умолчанию выключены.
    - Границы строятся по каналу вероятностей, а не по карте зон. Карта зон
      хранит только победителя в ячейке, положение границы внутри ячейки в
      ней потеряно, и контур по ней идёт ступенями по краям ячеек.
    - Сглаживание границ - существующие бикубическое сгущение и Чайкин,
      теми же параметрами, что и в 1.04.
    4.9.0
    - Разбор наггета в 1.05. В журнал выводится первый лаг (расстояние,
      число пар, гамма против дисперсии данных) и поимённо самые тяжёлые
      пары внутри него: расстояние, оба значения, вклад и координаты. В
      разреженной сети наггет обычно задают единицы пар близких точек с
      несопоставимыми значениями, и раньше найти их можно было только
      вручную.
    - Предупреждение о негодном подборе вариограммы: жёлтым, когда R²
      ниже 0.1 либо доля наггета выше половины суммарного порога. Обе
      беды тихие, расчёт при них проходит без ошибок и даёт ровное поле
      около среднего.
    4.8.2
    - Переключатель стороны в 1.04 разворачивает теперь и подписи, а не
      одни бергштрихи. Подпись отсчитывает верх текста от направления
      линии, поэтому раньше команда «перевернуть» меняла сторону штрихов,
      а подписи оставались как были. Параметр назван «Сторона
      бергштрихов и подписей».
    - Переворот применяется ровно один раз: разворот линий сам меняет
      знак стороны склона, и повторный переворот вернул бы штрихи на
      прежнее место.
    4.8.1
    - Исправлен флажок «Записать значение в Z геометрии» в 1.04. Слой с
      Z записывался отдельным файлом рядом с выходом, а Processing
      грузил в проект исходный плоский файл, потому что отложенная
      загрузка была зарегистрирована на старый путь. По той же причине
      не вставали имя слоя и стиль. Теперь загрузка перевешивается на
      слой с Z.
    - Там же сохраняется многочастность: изолиния одного уровня
      остаётся одним объектом со всеми ветвями, а не рассыпается на
      отдельные объекты с дублированием атрибутов и подписей.
    4.8.0
    - 2.16 Водосбор теперь принимает не только линии, но и полигоны:
      контур карьера, борта, любой замкнутый приёмник. Полигон
      затравливается всей внутренностью вместе с контуром - внутри
      залитой депрессии направления стока условны, и затравка
      внутренностью снимает зависимость от них, дырки полигона входят в
      затравку тоже. Линейный путь не изменился, старые прогоны
      воспроизводятся. В атрибуты и отчёт добавлена площадь затравки,
      инструмент переименован в «Водосбор линии и контура».
    - Оговорка о границах применимости в 2.15 и 2.16: водосборы строятся
      по топологии рельефа, на плоских поймах, при гидравлических
      перетоках и подпорах результат следует проверять
      гидродинамическим моделированием.
    - 1.04 Изолинии из растра: флажок «Записать значение в Z геометрии».
      Изолиния это линия равного уровня, поэтому Z у всех её вершин один
      и равен уровню. Такой слой при экспорте в DXF доносит высоту в
      АвтоКАД и Кредо без ручного «задать Z». По умолчанию выключен,
      плоский слой остаётся поведением по умолчанию. Имя поля значения и
      этот флажок подняты в списке параметров к самим уровням.
    - Разрез 4.01: полосы опознаются как пласты и межпластья по парам
      поверхностей, подписи берутся каноническими из палитры. Тело без
      цвета в палитре (например, межпластье вне соляной толщи) остаётся
      серым - плагин не выдумывает цвет, а показывает, что не знает его.
      Источник цвета каждой полосы печатается в журнал.
    - Из демо разреза убран старый генератор скважин широкого формата,
      инструмент 4.11 удалён как избыточный.
    4.7.1
    - Чтение палитры Leapfrog переведено на собственный разбор без
      модулей xml. Сканер безопасности каталога считает стандартный
      разборщик уязвимым к раздутым сущностям и внешним ссылкам, а
      defusedxml в поставке QGIS нет. Формат палитры плоский, поэтому
      применяется свой сканер полей Entry: объявления DOCTYPE и ссылки
      на сущности не раскрываются, у входного файла есть предел размера.
      Поведение не изменилось, на настоящих палитрах результат тот же.
      Запрет закрыт тестом, читающим исходники.
    4.7.0
    - Палитра кодов Leapfrog (.lfc) как необязательный вход в 4.01 и 4.02.
      Найденные коды красятся цветами легенды, порядок категорий идёт по
      палитре, коды вне палитры сохраняют прежний детерминированный цвет.
      Поиск терпимый: регистр, хвост роли (_top, _bottom, _кровля,
      _подошва), латинские двойники букв и апострофы, поэтому имя слоя
      «KpII_top» находит код пласта «КрII», а «A'Б_top» находит «АБ».
      Строгие совпадения проверяются первыми. В журнал печатается, сколько
      кодов взято из палитры и каких в ней нет. Плохой файл прогон не
      роняет.
    - Новый инструмент 2.16 «Водосбор линии (канавы)»: площадь водосбора
      нагорной канавы, лотка, кювета. Трасса растеризуется в ячейки, все
      они берутся приёмниками, водосбор это множество ячеек, чей путь
      стока приходит в трассу. Врезка трассы в рельеф вынесена в
      отдельную галочку с глубиной и по умолчанию выключена, так как
      меняет гидрологию. Выход: полигоны с атрибутами и HTML-отчёт.
    - Демо-рельеф 2.10 выдаёт две демо-трассы канав поперёк тальвегов,
      готовые для 2.16.
    - Читатель модели бурения считает разрывы между соседними
      интервалами и печатает их в сводке. Дыра в колонке на чертеже это
      отсутствие строк в таблице интервалов, инструмент ничего не
      додумывает.
    - Из демо разреза 4.10 убран старый генератор скважин широкого
      формата h1...h6: его не ест ни один инструмент, а лишний точечный
      слой перехватывал автоподбор входа collar в 4.02.
    4.6.1
    - Совместимость с Qt6 по проверке каталога: категория-ловушка
      раскраски получала пустой QVariant, теперь берётся NULL из
      qgis.core. Проверка каталога считала это ошибкой и блокировала
      версию. Запрет закрыт тестом, читающим исходники.
    - Из поставки убран служебный кэш pytest. Сканер секретов каталога
      принимал метку кэша за случайную строку с высокой энтропией и
      блокировал версию. Гигиена архива закрыта тестом: служебные папки
      и файлы в поставке недопустимы.
    4.6.0
    - Новый инструмент 2.15 «Отчёт по створу»: морфометрия водосбора от
      точки замыкания на водотоке. Точка притягивается к ячейке
      наибольшей аккумуляции в радиусе, от неё собирается полный
      водосбор и считаются площадь, средняя, минимальная и максимальная
      высота, средний уклон бассейна (Horn), отметка створа, длина
      главного водотока от створа до истока, падение и средний уклон
      водотока в промилле. Главный водоток трассируется вверх по
      наибольшей аккумуляции до ячейки без притоков. Водосборы соседних
      створов на одном водотоке вкладываются друг в друга: каждый створ
      получает свой полный бассейн, а не остаток после вышележащего.
      Выход: полигоны с атрибутами, HTML-отчёт по каждому створу,
      ключевые цифры в журнале. Новых зависимостей нет.
    - Демо-рельеф 2.10 выдаёт три точки створов у самых сильных
      тальвегов, разнесённых по гриду и нарочно сдвинутых в сторону от
      водотока: полный демо-цикл для 2.15 в два шага и наглядная
      проверка притяжки. Точки детерминированы зерном рельефа.
    - Демо-рельеф без заданного охвата ложится к слоям проекта, а не в
      условное место. В местных системах координат условное место
      уводило демо за десятки километров от рабочих данных.
    - Исправлено падение QGIS при загрузке нескольких выходных слоёв за
      один прогон. Постпроцессор дерева слоёв раздавался общим
      экземпляром, а QGIS забирает такой объект во владение и удаляет
      после обработки слоя: второй слой получал уже удалённый объект.
      Теперь на каждый слой создаётся свой экземпляр, у векторных
      выходов лишний постпроцессор не назначается вовсе.
    4.5.0
    - 4.02: обрезка по чертежу вместо линий кровли и подошвы. Один
      необязательный вход принимает полигоны полос из 4.01, колонки
      режутся по верхней и нижней огибающей полос в своей позиции -
      скважины не вылезают за чертёж, без промежуточного прогона 4.04.
      Четыре параметра линий из 4.4.0 убраны. Рамка zmin и zmax осталась
      страховкой на торцах и без чертежа. Допуск действует.
    4.4.0
    - 4.02: обрезка колонок линиями чертежа. Необязательные входы кровля
      и подошва принимают линии из 4.04 «Пересечение поверхностей с
      разрезом»: каждая колонка зажимается высотой линии в своей позиции,
      как срез по верхнему пласту, а не общей рамкой. Колонка за краем
      линии этой линией не режется. Если слой несёт несколько
      поверхностей, нужная выбирается именем поля surface в
      дополнительных параметрах. Допуск обрезки действует и на линии.
      Рамка zmin и zmax остаётся страховкой поверх.
    4.3.0
    - 4.02: обрезка колонок по рамке чертежа zmin и zmax из определения,
      включена по умолчанию. Интервал на кромке подрезается, интервал
      целиком за рамкой пропускается, ствол и подпись зажимаются рамкой,
      скважина целиком за рамкой выпадает из чертежа. Допуск в
      дополнительных параметрах расширяет рамку, галочка выключает
      обрезку. В атрибутах ztop и zbot остаются настоящие отметки,
      обрезается только геометрия. Сводка обрезки печатается по каждому
      разрезу. Для определений прежних версий без zmin и zmax поведение
      прежнее, без обрезки.
    4.2.0
    - 4.02: подпись устья на чертеже берётся из поля number слоя collar
      (синонимы name, label), а без него из hole_id, как раньше. Поле
      можно указать в дополнительных параметрах. hole_id остаётся в
      атрибутах для стыковки, подпись едет отдельной колонкой label в
      слоях стволов и подписей.
    4.1.1
    - Исправление 4.02: устья переводятся в систему координат определения
      разреза при чтении. Раньше слой collar в другой рабочей системе давал
      «вне коридора» для всех скважин, хотя на карте слои лежали вместе:
      канва преобразует координаты сама, а расчёт сравнивал сырые числа.
    - Диагностика на экран по протоколу удалённой машины: система координат
      устьев и определения, первое устье после перевода, а при пустом
      коридоре ближайшее устье в единицах карты. По этим числам с одного
      скриншота видно, узок коридор или слои живут в разных системах.
    4.1.0
    - Полосы пластов в 4.01 красятся тем же механизмом, что скважины:
      категория на пласт по имени кровли, детерминированный цвет, тонкий
      чёрный контур, легенда в дереве слоёв. Пласт, названный тем же кодом,
      что в таблице интервалов, совпадает по цвету с колонками скважин.
      Колонки скважин получили тонкий чёрный контур, вместе с полосами
      читаются как один чертёж.
    - Новая модель данных бурения collar и interval по образцу горных
      пакетов (Leapfrog, Micromine, Datamine, Surpac): устья точками
      (hole_id, z, eoh), интервалы таблицей (hole_id, from, to, code),
      глубины по стволу от устья, вниз положительные. Прочие колонки
      таблицы интервалов едут в атрибуты как есть.
    - Инструмент 4.02 «Скважины на разрезе (модель бурения)» написан
      заново: пакетный по всем разрезам определения, поля обеих таблиц
      находит сам по ожидаемым именам и синонимам, глубины переводит в
      отметки вычитанием из отметки устья. Читатель терпимый: пустые
      глубины пропускаются, перепутанные from и to переставляются,
      перехлёсты и интервалы за забоем рисуются как есть, всё пропущенное
      считается и выводится сводкой в журнал.
    - Слой интервалов выходит раскрашенным по кодам с легендой «код -
      цвет»: категория на каждый код в порядке первого появления сверху
      вниз, цвет детерминирован от самого кода и не меняется между
      прогонами и машинами. Серая категория «прочее» ловит всё
      несопоставившееся, ничего не исчезает молча. Стволы и подписи
      устий оформляются сразу.
    - Прежний инструмент 4.02 на широких полях h1...h6 удалён. Скважины
      такого вида остаются в демо как задел под будущий конвертер.
    - Демо 4.10 дополнительно выдаёт пару collar и interval вдоль всех
      трёх линий: два условных рудничных поля с повторяющимися номерами
      (зачем нужен составной hole_id), неглубокие скважины, содержание
      kcl на промышленных интервалах, устья PointZ с прицелом на 3D.
    - 4.02 запоминает выбранные слои и коридор, следующий запуск в том же
      проекте открывается с уже подставленными входами.
    - Необязательный 3D-выход 4.02: интервалы LineStringZ в реальных
      координатах, глубина в Z напрямую, для модуля Isoliner 3D.
    4.0.5
    - Исправлено: крупные водоёмы не приходили из OpenStreetMap (2.02). В
      запросе спрашивались только одиночные контуры way, а озёра,
      водохранилища и широкие реки в OSM почти всегда нарисованы
      отношениями-мультиполигонами. Теперь отношения запрашиваются, а их
      внешняя граница сшивается из кусков в замкнутое кольцо. Внутренние
      кольца (острова) пока пропускаются.
    - Подписи изолиний ставятся на линию и разрывают её, как на топокарте,
      а не над линией.
    - Подписи изолиний теперь без приставки единиц, только отметка, как на
      топокарте.
    - Исправлено: подписи изолиний не рисовались вовсе. В выражении подписи
      строки склеивались знаком «и», а в QGIS оператор склейки это две
      вертикальные черты. Выражение не разбиралось, правило подсвечивалось
      красным. Держалось незамеченным, потому что у депрессионного стиля
      подписей не было, а на карте работали настройки слоя пользователя.
    - Исправлено, главное про подписи: разворот линий не давал никакого
      эффекта, потому что в настройках подписей стояло «никогда не
      показывать перевёрнутые», и QGIS сам доворачивал текст ради
      читаемости. Топографическая подпись по определению бывает
      перевёрнутой: на склоне, обращённом на юг, цифра читается вверх
      ногами. Теперь в обоих стилях изолиний показ перевёрнутых подписей
      разрешён, а депрессионный стиль получил свои подписи, которых у него
      не было вовсе.
    - Исправлено: топографические подписи вставали в сторону убывания.
      Предполагалось, что верх подписи смотрит туда, где высокая сторона
      слева от направления линии. Проверка на QGIS 4.0.3 показала
      обратное, условие развёрнуто. Поле переименовано в up_side, потому
      что прежнее имя up_left стало неверным по смыслу.
    - Исправлено, главное: бергштрихи не слушали сторону склона вовсе. В
      файле стиля смещение было задано выражением с «собакой» перед
      именем поля, а в QGIS это означает переменную, а не поле слоя.
      Выражение молча давало NULL, и штрихи всегда брали запасное
      постоянное смещение, то есть смотрели в одну сторону независимо от
      рельефа. Теперь стиль ссылается на поле dn_sign, и сторона считается
      по данным.
    - Исправлено: бергштрихи ложились вверх по склону. Код переворачивал
      сторону смещения по номеру версии QGIS, считая что в четвёртой она
      изменилась. Проверка на QGIS 4.0.3 показала обратное, переворот
      убран. В дополнительных параметрах 1.04 появился переключатель
      «Сторона бергштрихов» на случай других сборок, а выбранная сторона
      и версия печатаются в журнал.
    - Исправлено: демо-рельеф (2.10) клался в зашитое условное место, и в
      местных системах координат, например рудничных, оказывался далеко
      от рабочих данных. Появился необязательный параметр «Куда положить
      (охват)»: если он задан, демо ложится туда, а размер грида
      считается от охвата и размера ячейки. Без охвата поведение
      прежнее, но инструмент предупреждает об этом в журнале.
    - Новый инструмент 2.14 «Убрать ступени (сглаживание с ограничением)».
      Лечит террасинг, не сдвигая горизонтали: поверхность сглаживается
      итеративно, но каждой точке запрещено уходить от исходного значения
      дальше заданной доли сечения, по умолчанию половины. Это ровно
      ошибка квантования, поэтому метод не выдумывает форм тоньше
      исходного сечения и не может перекинуть точку через горизонталь.
      На эталоне индекс притяжения падает с 5.00 до 1.13, а ошибка
      против истинной поверхности с 1.25 м до 0.12 м.
    - У 2.14 отчёт HTML до и после: таблица чисел, две гистограммы фазы
      рядом и разбор. Индекс притяжения считается до и после лечения и
      печатается на экран, поэтому правка самопроверяемая.
    - Вердикт 2.13 при найденном террасинге называет средство лечения.
    - Группа переименована в «2. Топография: диагностика и правка», раз в
      ней теперь и проверка, и исправление.
    - Расход памяти диагностики и сглаживания снижен вдвое, скорость
      выросла втрое и вшестеро. Счёт переведён на float32 с
      предварительным центрированием массива, буферы переиспользуются.
      На матрице в 16.5 млн ячеек диагностика занимала 1.45 ГБ и 6.4
      секунды, стало 776 МБ и 2.3 секунды, сглаживание занимало 1.9 ГБ и
      55 секунд, стало 869 МБ и 6.9 секунды. Результаты не изменились.
      Центрирование на результат не влияет, производные не зависят от
      постоянного слагаемого.

    4.0.4
    - Новый инструмент 2.13 «Диагностика террасинга ЦМР»: ищет ступени на
      склоне, которыми оборачивается построение рельефа по горизонталям.
      Два независимых признака - растр вертикальной кривизны (на нём
      террасинг виден глазами) и притяжение отметок к уровням числом.
      Около единицы признаков нет, два и выше террасинг. Отчёт HTML с
      гистограммой фазы.
    - Инструмент 2.10 «Демо-рельеф» получил флажок «Овражно-балочная
      сеть»: тальвеги с крутыми бортами и отвершками. Узкий врез между
      соседними горизонталями - самое тяжёлое место для интерполяции,
      поэтому такой рельеф нужен как проверочный набор для 2.11 и 2.12.
    - Инструмент 1.04 «Изолинии из растра» получил флажок «Подписи
      по-топографски»: линии разворачиваются так, чтобы высокая сторона
      склона была слева, и верх подписи смотрит вверх по склону, как на
      топокарте. Поворот текста задавать не нужно, стиль прежний. В слое
      остаётся поле up_left.
    - Шпаргалка по проверке рельефа на двух языках в manual: полный
      прогон на демо-данных за десять минут, что означают числа и куда
      смотреть, когда они плохие.
    - Новый инструмент 2.12 «Невязка горизонталей против ЦМР»: измеряет,
      насколько построенный рельеф воспроизводит исходные горизонтали.
      Смещение, разброс, медиана и максимум модуля, доля точек мимо
      больше чем на половину сечения рельефа. Сечение определяется по
      набору отметок. На выходе точечный слой невязок и отчёт HTML с
      гистограммой, разбросом по отметкам и разбором чисел.
    - Новый инструмент 2.11 «Разделить горизонтали для проверки»: делит
      набор по отметкам, каждая N-я уходит в проверочный набор целиком.
      Крайние отметки всегда остаются в построении. Оба выхода несут поле
      hold, и 2.12 узнаёт его сам, печатая отдельно воспроизведение входа
      и предсказание на отложенных горизонталях. Невязка на тех же
      горизонталях, что подавались в построение, измеряет воспроизведение
      входа, а не точность предсказания, и инструмент об этом
      предупреждает.
    - Новый инструмент 2.13 «Диагностика террасинга ЦМР»: ищет ступени
      на склонах, которыми болеет рельеф, построенный по горизонталям.
      Два независимых признака. Растр вертикальной кривизны, на котором
      террасинг виден глазами полосами по рисунку горизонталей. И
      притяжение отметок к уровням: у здоровой поверхности отношение
      около единицы, полтора это повод присмотреться, два и выше
      означает террасинг. Отчёт HTML с гистограммой фазы.
    - Инструмент 2.10 «Демо-рельеф» получил флажок «Овражно-балочная
      сеть»: врезает тальвеги с крутыми бортами и отвершками под острым
      углом. Это самая тяжёлая проверка для построения рельефа по
      горизонталям, узкий врез между соседними горизонталями срезается.
      Проверочные данные теперь едут в поставке и воспроизводимы.
    - Исправлено: при одновременно включённых депрессионном стиле и
      топографических подписях бергштрихи у части горизонталей ложились
      вверх по склону. Сторона склона вычислялась до разворота линий, а
      разворот меняет местами лево и право. Теперь разворот идёт первым.
    - Расчёт валидации вынесен в отдельный модуль validate_core: чистая
      математика без QGIS, с безголовыми тестами.
    - Инструменты проверки вынесены в отдельную группу «2. Топография:
      диагностика». Подгрупп в Processing нет, поэтому ветка сделана
      именем группы, которое встаёт сразу за топографией. Нумерация
      сквозная, номера 2.11, 2.12 и 2.13 не менялись. Демо-генератор
      снова последний в рабочей группе.
    - В индекс притяжения к уровням (2.13) больше не идут ячейки с
      околонулевым уклоном. Порог задаётся долей сечения. Без отсева
      водоём перекашивал статистику: на матрице, где гладь занимала
      44.5 процента площади, индекс давал 0.50 вместо 0.97.
    - Новое в 1.04: предупреждение о плоских уровнях. Если уровень
      сечения попадает в площадку с околонулевым уклоном, в журнал
      уходят уровень, число задетых ячеек и доля данных. Изолиния там
      рассыпается на мелкие кольца и выглядит утолщённой.
    - Новое в 1.04: параметр «Уверенность горизонталей». Перепад высот
      на ячейку сравнивается с долей сечения. Три положения: не считать,
      только поля drop_min и drop_mean, поля и разрыв на подозрительных
      участках. Рвутся только серии от трёх слабых вершин подряд, куски
      делят граничную вершину. Ничего не удаляется, слабое помечается
      полем lowconf. По умолчанию выключено.
    - Флажок топографических подписей в 1.04 переименован в
      «Топографические подписи».
    - Шпаргалка по проверке рельефа на двух языках в manual.

    4.0.3
    - Расчёт разреза вынесен в отдельный модуль section_core: чистая
      математика и геометрия, без QGIS и Qt. Инструмент 4.01 «Разрез по
      линии» теперь только перекладывает результат в слои. Поведение
      сверено с прошлой версией на случайных сценах, расхождений нет.
    - Исправлена экранная диагностика разреза. Из-за обращения к системе
      координат линии до её определения весь блок диагностики молча не
      печатался, поэтому в панели «Журнал» не было ни СК, ни числа точек,
      ни предупреждения о том, что все пробы высот пустые. Теперь
      печатается.
    - Исправлен порядок слоёв в дереве для разреза и для генератора
      примера. Порядок загрузки выходов в Processing не определён, из-за
      чего шесть поверхностей примера ложились в дерево вперемешку. Так
      как 4.01 по умолчанию читает порядок поверхностей из дерева, пласты
      строились между не теми парами и на чертеже вместо пяти пластов
      оставалось два. Теперь порядок задаётся явно и восстанавливается
      после загрузки каждого слоя. Перестановка вставляет копии узлов до
      удаления оригиналов, иначе реестровый мост QGIS счёл бы слои
      исчезнувшими из дерева и удалил бы их из проекта.
    - Генератор примера выдаёт три линии разрезов вместо одной, с именами
      в поле name. Разрез по линии по-прежнему строится по первой,
      остальные пригодятся для пакетной генерации.
    - 4.01 «Разрез по линии» строит разрез по каждой линии слоя. Все
      разрезы попадают в один комплект слоёв и различаются полями sec и
      sec_id, поэтому подписи и фильтры делаются выражением по полю, а
      стили не назначаются заново. Имя берётся из поля линии, если оно
      задано. Работает и выборка «только выделенные объекты».
    - Раскладка нескольких разрезов в общей чертёжной системе координат:
      стопкой, в ряд или сеткой. Шаг решётки берётся от самого крупного
      габарита плюс зазор, поэтому чертежи не пересекаются по построению.
      Вертикальный масштаб один на весь прогон, иначе разрезы были бы
      несопоставимы. Забор 3D раскладкой не смещается, он остаётся в
      реальных координатах.
    - Добавлен режим вертикального масштаба «отношение масштабов Г:В
      (1:N)», привычная для чертежа запись. Есть во всех инструментах
      разреза, где задаётся масштаб.
    - Слой определения разреза несёт имя, номер и смещение раскладки.
      Инструменты 4.04 «Пересечение поверхностей», 4.05 «Пересечение
      векторов» и 4.06 «Пересечение TIN» обрабатывают все разрезы слоя
      определения, кладут результат в свой слот раскладки и переносят имя
      разреза в поля sec и sec_id. Инструменты 4.02, 4.03, 4.07 и 4.08
      пока работают по одному разрезу, их переведём отдельно.
    - Слои определения от прежних версий читаются по-старому: новых полей
      в них нет, имя выходит пустым, смещение нулевым, поведение прежнее.
    - Тесты разреза работают с настоящим кодом плагина, а не с копиями
      помощников. Добавлен набор тестов ядра. Исправлена точка входа в
      тестах разреза: вызов запуска стоял в середине файла, и часть
      классов не выполнялась.

    4.0.2
    - Исправлен вывод разреза (группа 4): слои чертежа (разрез, состав
      пласта, скважины, пересечения, развёртка ствола) создавались с
      пустой СК, подхватывали СК проекта и на реальных данных в местных
      СК уходили за кадр карты - объекты с атрибутами создавались, но на
      карте было пусто, изредка рисуясь при случайном совпадении. Теперь
      чертёж получает инженерную (местную) СК, которую QGIS не
      перепроецирует на подложку, и рисуется независимо от СК проекта.
    - 4.01 «Разрез по линии»: порядок поверхностей по умолчанию берётся
      из дерева слоёв проекта (сверху вниз), совпадая с панелью слоёв.
      Ручной порядок отметками в списке остаётся - снять галочку
      «Порядок поверхностей из дерева слоёв проекта».
    - Разрез и загрузка ЦМР пишут в панель «Журнал» окна инструмента
      компактную диагностику (СК, origin, порядок осей, доля валидных
      проб) для проверки на машинах без доступа к файлам. Вырожденные
      полигоны чертежа (пустые или нулевой площади) больше не попадают в
      слой как объекты без видимой геометрии, а пропускаются с отметкой в
      журнале.
    4.0.1
    - Исправлена геопривязка ЦМР в 2.01 для СК с осями в порядке
      север-восток (GSK-2011 и другие Гаусс-Крюгер, Крассовский). Раньше
      при выборе такой целевой СК растр записывался с переставленными
      X и Y, уезжал в зеркальную точку, и «Приблизить к слою» вело в
      пустоту. UTM этим не страдал. Габарит рамки теперь берётся по
      периметру, а не по четырём углам (страховка для края зоны и
      больших рамок).
    4.0.0
    - Трёхмерная часть вынесена из плагина в отдельный модуль Isoliner 3D
      (готовится к публикации): 3D-просмотр поверхностей, группа
      «5. Пласт и блочная модель» (инструменты 5.01-5.07, включая экспорт
      мешей 2DM и полиэдры) и встроенные библиотеки pyqtgraph/PyOpenGL.
      Пакет стал легче примерно на порядок. Кому нужна прежняя
      функциональность целиком - версия 3.2.0 остаётся в каталоге.
    - Группа «Фрактальный анализ» перенумерована из шестой в пятую
      (5.01-5.05 вместо 6.01-6.05). Внутренние идентификаторы группы и
      инструментов не менялись, модели пользователей работают без правок.
    - Исправлена загрузка GEDTM30 в 2.01: translate -unscale теперь
      читает только окно по рамке (с полем), а не весь глобальный COG.
      Раньше инструмент падал по свободному месту на диске (GDAL
      требовал терабайты под развёрнутую планету). Сетевые и оконные
      ошибки COG показываются внятным сообщением.
    - 2.01 «Загрузка ЦМР»: в дополнительные параметры выведены три
      настройки сглаживания FPDEMS (окно нормалей, порог различия,
      число проходов) - те же, что в 2.04. Раньше сглаживание в 2.01
      работало на скрытых значениях по умолчанию. Поведение по
      умолчанию не изменилось.
    - Руководство: скриншоты диалоговых окон заменены таблицами
      параметров единого формата. У всех инструментов теперь сплошной
      параметрический справочник, включая группу «Топография» и
      инструменты разреза, где таблиц не было. Демо-генераторы ссылаются
      на приложение с полями выходных слоёв. PDF стал легче примерно
      вдвое, обзорный вид панели инструментов сохранён.
    - Остальные группы (кригинг, топография, разрезы, плотность) не
      изменились, номера и идентификаторы инструментов прежние.
    3.2.0
    - Закрыты оба замечания Qt6-проверки каталога: обращения к enum
      переведены на полный путь через промежуточный класс
      (QgsColorRampShader.Type, Qgis.MessageLevel), совместимо с
      QGIS 3 и 4.
    - Инструмент 2.03 Topo2Raster научился переменному урезу воды. Высота
      уреза выбирается по трём приоритетам на каждый объект: у полигона
      с трёхмерными вершинами урез интерполируется по их отметкам и
      наклоняется вдоль русла (падение уровня реки), у полигона с
      отметкой в поле держится плоскостью, без того и другого берётся по
      минимуму берега. Разнотипные объекты в одном слое разбираются
      каждый своей веткой.
    - Инструмент 2.04 переработан в «Подготовку рельефа»: помимо
      заполнения понижений добавлено сглаживание рельефа FPDEMS (метод
      Линдсея и др. 2019), сохраняющее бровки, стенки террас и берега
      рек, в отличие от среднего и гауссова фильтров. Обе модификации
      включаются независимыми флажками. Та же галочка сглаживания
      добавлена в загрузку ЦМР (2.01).
    3.1.1
    - Исправлен масштаб высот GEDTM30: значения были вдесятеро меньше
      реальных. COG хранит высоту целыми со scale-метаданными, теперь
      источник читается через translate с флагом unscale, затем
      перепроецируется. Высоты в настоящих метрах.
    3.1.0
    - Инструмент 2.01 получил выбор источника рельефа. Помимо Copernicus
      GLO-30 (модель поверхности, DSM) добавлен GEDTM30 - глобальная модель
      рельефа (DTM, CC BY 4.0) от OpenGeoHub: лес и постройки сняты машинным
      обучением по ICESat-2 и GEDI. Под пологом леса GEDTM30 заметно точнее
      GLO-30, что важно для лесистых территорий. Единый глобальный COG,
      без регистрации и ключей.
    3.0.4
    - Совместимость со сканером безопасности каталога plugins.qgis.org:
      узкие типы исключений вместо широкого except с тихим pass/continue
      в инструментах группы Топография, диагностика уходит в журнал Isoliner.
    3.0.3
    - Исправлен сбой Topo2Raster на QGIS 4 при одиночных геометриях
      (Point geometry cannot be converted to a multipoint): точки, линии
      и полигоны читаются с фолбэком на одиночный тип.
    3.0.2
    - Выходные слои топографии добавляются в дерево свёрнутыми: длинные
      легенды растров не распахиваются на всю панель слоёв.
    3.0.1
    - Обкатка на QGIS 4: инструменты 2.01 и 2.10 принимают пользовательские
      метрические СК без кода EPSG (локальные шахтные сетки) - целевая СК
      уходит в перепроецирование строкой WKT.
    - Все выходные слои группы "2. Топография" складываются в группу
      "Топография" дерева слоёв (QGIS 3.24 и новее, на старых сборках
      слои добавляются как раньше).
    - В справку каждого инструмента группы добавлено описание выходных
      файлов: формат, тип, nodata, поля.
    - В руководство добавлен урок "Topo2Raster: рельеф из горизонталей,
      шаг за шагом" (приложение с уроками, RU и EN).
    3.0.0
    - Большой релиз: новая группа "2. Топография", десять инструментов работы
      с рельефом из открытых данных на чистом NumPy, без внешних зависимостей.
    - 2.01 Загрузка ЦМР по рамке: Copernicus DEM GLO-30 из открытого хранилища
      без регистрации и ключей, мозаика без швов, перепроецирование в
      метрическую СК, гидрокоррекция флажком.
    - 2.02 Загрузка топоосновы по рамке: водотоки OSM (готовые тальвеги),
      водоёмы, вершины с отметками, обрывы и насыпи, береговая линия.
    - 2.03 Topo2Raster: рельеф из точек, изолиний, тальвегов, обрывов и озёр
      мультисеточной интерполяцией по мотивам ANUDEM. Мембранный каркас
      плюс полировка минимальной кривизны, дренаж вдоль тальвегов.
    - 2.04 Заполнение понижений методом Планшона-Дарбу с настраиваемым epsilon.
    - 2.05 Сток и аккумуляция D8 (коды ArcGIS, векторизованный обход),
      2.06 Речная сеть с порядком Стралера, 2.07 Бассейны и водоразделы,
      2.08 Уклон и экспозиция Horn 3x3, 2.09 Вершины, 2.10 Демо-рельеф.
    - Ярлыки прежних групп сдвинуты: дополнительные инструменты теперь
      группа 3, разрез 4, пласт 5, фракталы 6. Идентификаторы инструментов
      не менялись, сохранённые модели Processing продолжают работать.
    - Руководство (RU и EN) дополнено главой о топографии с иллюстрациями
      и перенумеровано под новые группы.
    2.66.2
    - Окно «Карта плотности»: изолинии теперь строятся с шагом, подобранным по
      диапазону плотности (раньше при мелких значениях линий не выходило).
      Слой эффективной сигмы одевается псевдоцветом, при постоянной точности
      выводится понятное сообщение вместо серого растра.
    2.66.1
    - Кнопка «Журнал» убрана с панели инструментов: журнал открывается из меню
      и из окна «О плагине». На панели остались карта плотности, 3D-просмотр и
      «О плагине».
    2.66.0
    - Новое окно «Карта плотности» на панели Isoliner: живой предпросмотр
      инструмента 2.07 на грубой сетке (сигма и ячейка меняют картинку сразу),
      постоянно видимый инвариант массы, кнопка «Демо». Полный расчёт идёт тем
      же алгоритмом 2.07, результат кладётся на карту одетым (псевдоцвет с
      прозрачными нулями, изолинии плотности, слой эффективной сигмы).
    2.65.4
    - Совместимость с QGIS 4 (Qt6) доведена до конца: устранены замечания в
      сторонней библиотеке pyqtgraph (импорты через importlib, вызов exec
      через getattr). Поведение не менялось.
    2.65.3
    - Совместимость с QGIS 4 (Qt6): перечисления записаны полными именами
      (QgsProcessingParameterNumber.Type.Double, QgsProcessing.SourceType.*,
      QgsWkbTypes.Type.* и др.). Форма работает и в QGIS 3.16+, и в QGIS 4.
      Логика не менялась.
    2.65.2
    - Проверка безопасности каталога QGIS: ложные срабатывания bandit (assert,
      try/except/pass, импорты в сторонних библиотеках) помечены # nosec.
      Логика не менялась. Для загрузки в каталог собирается отдельный архив
      без папки tests.
    2.65.1
    - Кнопка «Журнал» вынесена на панель инструментов и в окно «О плагине»
      (с иконкой), открывает isoliner.log.
    2.65.0
    - Журнал работы: файл isoliner.log рядом с профилем QGIS. Заголовок сеанса
      (версии плагина, QGIS, NumPy, GDAL), имя инструмента, параметры, время,
      при сбое трейсбек. Открывается через меню и панель инструментов.
    - Панель инструментов Isoliner с кнопками 3D-просмотра и «О плагине»,
      добавлена иконка 3D.
    2.64.1
    - Руководство: добавлено пошаговое приложение «Плотность переменной опоры»
      (2.08 демо -> 2.07 по каждому типу -> дописывание -> эффективная сигма, с
      разбором параметров) и поля демо-слоёв 2.08 в приложение «Поля
      демо-слоёв».
    2.64.0
    - Новые инструменты 2.07 «Плотность по замерам (переменная опора)» и 2.08
      демо к ней. Замер размазывается по носителю (точка+сигма, линия-коридор,
      полигон), масса сохраняется (инвариант в логе), выход трёхканальный для
      дописывания и карты эффективной сигмы, дазиметрия для полигонов.
      Попутно: поправлены устаревшие ссылки на фрактальные инструменты в
      справке демо 5.05.
    2.63.5
    - Руководство: заголовок 1.10 не попадал в оглавление PDF из-за пропущенной
      пустой строки перед ним. Исправлено, закладка восстановлена.
    2.63.4
    - Врезка «кригинг или минимальная кривизна» в 1.11 усилена примером
      оседаний: мульду сдвижения кригинг раскатывает в ленту, минимальная
      кривизна восстанавливает воронку.
    2.63.3
    - Исправлен сбой кригинга при отсутствующем поле Z: вместо KeyError теперь
      понятное сообщение с просьбой выбрать поле значения. Добавлено
      приложение «Поля демо-слоёв» в руководство (все генераторы, с единицами).
    2.63.2
    - Адаптивные имена слоёв при генерации: 1.11 называет слой по режиму,
      демо-скважины разреза отличаются по имени от 1.10. Логика не менялась.
    2.63.1
    - Оседания (1.11): ограничены двумя метрами, единый знак на выбор (вниз
      или величина), строгие нули по краям (шум гаснет к краю мульды).
    2.63.0
    - Инструмент 1.11 расширен: два режима - электроразведка (добавлены
      ВП, отметка z, истинное значение rho_true) и оседания (мульда по
      турам: tour, settle, settle_true). Аномалия - компактное пятно, а не
      полоса, профили не синхронны.
    2.62.0
    - Новый инструмент 1.11 «Создать пример геофизических профилей (демо)»:
      параллельные профили электроразведки с пикетами, кажущимся
      сопротивлением ρк (Ом·м) и потенциалом ЕП (мВ). Заложена низкоомная
      аномалия (обводнение/замещение) для демонстрации интерполяции и
      изолиний. Поля profile, picket_m, pk, rho_k, sp.
    2.61.0
    - Фрактальные инструменты вынесены в отдельную группу «5. Фрактальный
      анализ» (было в группе 2). Перенумерованы 5.01-5.05: размерность,
      box-counting, линии и границы, Минковский, демо. Логика не менялась.
      Руководство: фрактальные разделы переписаны и перенесены в группу 5.
    2.60.0
    - Веса декластеризации (поле wt из 1.01) расширены ещё на три инструмента.
      Кросс-валидации 1.07 и 1.08: метрики ME/MAE/RMSE/MSDR/R считаются
      взвешенно, плотный куст не доминирует в оценке качества. Индикаторный
      кригинг 2.01: индикатор класса кригуется к декластеризованной доле, а не
      к нулю. Без весов поведение всех трёх прежнее.
    2.59.0
    - Веса декластеризации (поле wt из 1.01) теперь принимают вариограммные
      инструменты 1.05 «Вариограмма» и 1.06 «Вариограммная карта»: пара
      берётся с весом произведения весов концов, скопления не раздувают
      ближние лаги. Счётчик пар остаётся сырым, γ считается взвешенно.
    2.58.1
    - Группа 1 упорядочена и переведена на двузначную нумерацию (1.01…1.10)
      для правильной сортировки в тулбоксе. Порядок по смыслу: подготовка
      данных, интерполяция, изолинии, вариограммы, кросс-валидации рядом,
      сервис и демо в конце. Логика инструментов не менялась.
    2.58.0
    - Новый инструмент 1.0 «Декластеризация (веса)»: ячеистая
      декластеризация (порт GSLIB declus), веса обратно локальной плотности
      и представительное декластеризованное среднее для подсчёта запасов и
      среднего простого кригинга. Автоподбор размера ячейки или ручной,
      слой точек с полем wt и HTML-отчёт.
    - Гауссова симуляция (2.06): необязательное поле весов декластеризации -
      гистограмма (нормально-балльное преобразование) строится взвешенно.
    2.57.0
    - HTML-отчёт кросс-валидации (инструменты 1.5 и 1.9): на графике оценка/
      факт теперь две линии - серая диагональ 1:1 (идеал) и синяя линия
      регрессии Best Fit. В метрики добавлены наклон, сдвиг и угол Best Fit -
      индикатор условного смещения по диапазону (наклон меньше 1 - занижение
      высоких значений, регрессия к среднему у сглаживающих методов).
    2.56.1
    - Из встроенной копии pyqtgraph убраны неиспользуемые подпакеты (console,
      flowchart, multiprocess, exporters, configfile). 3D-просмотр использует
      только pyqtgraph.opengl. Снимает предупреждения сканера безопасности
      plugins.qgis.org (eval, exec, pickle, subprocess, xml) и уменьшает вес.
    2.56.0
    - Новый инструмент 1.9 «Кросс-валидация метода (LOO)»: скользящий
      контроль для кригинга и минимальной кривизны по образцу Surfer.
      Случайная выборка N точек, фильтр области (охват и Z), буфер
      исключения соседей по X/Y. Выходы - слой ошибок и HTML-отчёт (график
      оценка/факт, гистограмма, метрики ME/MAE/RMSE/R, для кригинга MSDR).
    2.55.0
    - Новый инструмент 1.8 «Минимальная кривизна (точки → растр)»:
      гридирование бигармонией с натяжением (SOR обходом девятью цветами),
      детерминированная альтернатива кригингу без вариограммы. Натяжение,
      граничное натяжение, анизотропия, порог невязки и лимит итераций.
      Часто применяется для карт геофизических полей. Faults/breaklines -
      задел на будущее.
    2.54.0
    - 4.07: отдельный пример «Складчатый пласт» убран, складчатость осталась
      в свите. Свита теперь грузится отдельными слоями по пласту (Свита:
      пласт k) для управления видимостью, складки положе и глаже.
    2.53.0
    - 4.07: свита теперь из складчатых пластов, каждый пласт отдельным
      объектом (поле bed) и своим цветом в 3D. Имя выходного слоя
      подстраивается под пример (Пласт, Складчатый пласт, Свита x3, Куб,
      Тетраэдр).
    - 3D-просмотр: каждый объект тела красится отдельно (свита разноцветная);
      кадрирование учитывает преувеличенную высоту, чтобы высокое тело при
      большом вертикальном преувеличении не выходило за кадр.
    2.52.0
    - 3D-просмотр: контур сечения тел плоскостью разреза. Где вертикальная
      штора вдоль линии режет тело, рисуется яркий след (как по
      поверхностям).
    - 3D-просмотр: скважины стволами-цилиндрами, интервалы между отметками
      окрашены по стратиграфическому положению (литология).
    2.51.0
    - 4.07: два новых примера - «Складчатый пласт» (кровля-фолд-трейн из
      антиклиналей и синклиналей) и «Свита» (стопка водонепроницаемых
      пластов, число пластов задаётся). Оба смотрятся во вкладке «Тела».
    2.50.1
    - 3D-просмотр: исправлен сбой при показе тел и поверхностей без
      плоскости разреза (локальная переменная затеняла функцию перевода).
    - 3D-просмотр: опрос сцены кликом больше не пишет ошибку в журнал на
      новых сборках pyqtgraph (QGIS 4). Выбор своего цвета слоя не падает
      на пустом источнике растра.
    2.50.0
    - 4.07: размещение и размер примера берутся из охвата (окна вида),
      как у остальных генераторов. Добавлены параметры «Мощность» и
      «Отметка залегания (подошва)», диапазон Z печатается в журнал.
    - 3D-просмотр поверхностей: новая вкладка «Тела». Показывает
      полигональные слои с Z (полиэдр, TIN, MultiPolygon Z) объёмными
      телами рядом с поверхностями и телами пластов.
    2.49.0
    - Новый инструмент «4.07 Создать пример полиэдра (бета)»: демонстрация
      полиэдральной поверхности (тело пласта, куб, тетраэдр) как нативный
      PolyhedralSurface Z (QGIS 3.40 и новее) или TIN Z. На более старых
      сборках вывод деградирует до MultiPolygon Z с предупреждением.
    - Новый модуль polyhedral.py (чистый NumPy, сборка WKT и аудит
      замкнутости оболочки), headless-тесты.
    2.48.5
    - Группа «4. Пласт и блочная модель» вышла из беты (4.01-4.04),
      конвейер списания протестирован на демо.
    - Руководство: новое приложение «Уроки и самопроверка» с пошаговым
      тестом списания запасов (домены, деление колонки, разность). Раздел
      будет пополняться уроками и тестами.
    2.48.4
    - 4.03: плотность руды добавлена отдельным полем dens в блочную
      модель (ore_t = vol * dens поячеечно).
    - Выбор канала растра переведён на выпадающие списки и в оставшихся
      местах: канал плотности (4.03), каналы оценки и ошибки (2.03).
    2.48.3
    - [BUG-FIX] Параметр «Канал плотности» по ошибке регистрировался в
      калькуляторе 4.02 (AttributeError при загрузке). Перенесён в 4.03,
      куда и относится.
    2.48.2
    - [BUG-FIX] 4.03: деление по вертикали падало с NameError (параметр
      nz по ошибке читался в чужом методе). Исправлено.
    - 4.03: плотность руды можно брать из канала грида поячеечно (параметр
      «Канал плотности») - для переменной по площади плотности.
    2.48.1
    - Домены. Новый инструмент «4.05 Домены в канал пласта»: полигоны
      зон растеризуются в канал domain грида (код из поля или по порядку).
    - Новый инструмент «4.06 Разность запасов (списание)»: разность двух
      блочных моделей по совпадающим ячейкам, сумма delta - списанный
      тоннаж. Прямой путь оперативного списания запасов.
    2.48.0
    - 3D-просмотр: след разреза - линия пересечения секущей плоскости с
      каждой поверхностью рисуется яркой нитью по кровле и подошве.
    - 4.03: параметр «Слоёв по вертикали» делит колонку центроидов на N
      блоков между кровлей и подошвой (поля z_from, z_to, lay, доля
      объёма и тоннажа). Заготовка настоящей 3D-модели.
    2.47.7
    - [BUG-FIX] 3D: клик по плашке «Свой цвет» падал с RuntimeError, если
      параметры слоя ещё не создавались (дефолт строился от пустого пути).
      Дефолт теперь берётся от настоящего источника слоя.
    2.47.6
    - 3D-просмотр: в «Окраске» появился пункт «Свой цвет» - рядом с
      выпадающим списком плашка текущего цвета, клик по ней открывает
      выбор цвета. Цвет свой у каждого слоя, живёт в его параметрах.
    2.47.5
    - 3D-просмотр: подписи скважин прореживаются - текст не ставится,
      если рядом уже есть подписанная скважина (порог 4.5 процента размаха
      сцены). Кучные фонды больше не превращают подписи в кашу.
    2.47.4
    - Руководство: исправлен битый блок картинки во введении (след старой
      панели инструментов), скрин панели заменён свежим деревом четырёх
      групп. Семь иллюстраций из цикла статей встали в главы: SK с ложным
      средним, OK против тренда, точечный против блочного (обзорная глава),
      вероятность класса (2.01), карта превышения (2.03), карта D (2.07),
      эталоны Серпинского и Коха (2.08).
    2.47.3
    - Руководство: девять новых скриншотов - дерево инструментов, вкладки
      3D-просмотра с параметрами слоя и списком каналов, отчёт калькулятора,
      блочная модель на 40 тысяч центроидов, окно и демо-реки Минковского.
    2.47.2
    - Руководство: глава 3D-просмотра переписана под текущий интерфейс
      (вкладки Слои и Векторы, персональные параметры слоя, единая
      Окраска, фильтр набора, подписи скважин, опрос кликом). Добавлены
      заметка о канальных списках во введении и раздел «Предприятиям».
    2.47.1
    - Приглашение в подвале справок ведёт на страницу «Предприятиям»
      сайта Информ++ (доработки, поддержка с гарантией, внедрение).
    2.47.0
    - 2.10: полный набор параметров метода Минковского - K ступеней
      лесенки (по умолчанию 8), случайные сдвиги сетки с минимальным
      покрытием (3), фактор уплотнения выборки (0.5); к каждому объекту
      дописывается D_r2 - качество лог-лог аппроксимации, при R² ниже
      0.85 выдаётся предупреждение. В справке - про выбор K: слишком
      большое K занижает D к 1 ниже масштаба детальности линии.
    2.46.1
    - Терминология: в подписях параметров и справках «число» заменено на
      «количество» там, где считаются штуки (лаги, точки, пары, соседи,
      реализации, размеры сетки); «число» осталось только в значении
      математической величины и как тип поля.
    2.46.0
    - Группа 2 перенумерована в формат 2.01-2.11: инструменты в панели
      сортируются по порядку (раньше 2.10 и 2.11 вставали между 2.1 и
      2.2). Перекрёстные ссылки в справках и руководстве обновлены.
    2.45.0
    - Выбор канала растра всюду переведён на выпадающие списки с именами
      каналов (штатный параметр Band, 14 параметров в девяти инструментах:
      изолинии, дрейф, гидравлика, состав на разрезе, сборка и калькулятор
      пласта, фракталы). Канал содержания в 4.02 стал необязательным:
      пусто - считать без металла. Исключение - 4.04 с пачкой растров,
      там канал остаётся числом.
    2.44.0
    - Новый инструмент «2.10 Размерность Минковского (векторы)»: box-
      counting прямо по линиям и границам полигонов, D_mink каждому
      объекту и D слоя целиком (размерность речной сети); эталон Коха
      1.264.
    - Новый генератор «2.11 Создать пример для фракталов (демо)»: речная
      сеть с порядками притоков, водосбор с изрезанной границей, берег.
    - 2.9 принимает полигоны: меряется внешнее кольцо границы.
    2.43.0
    - 2.7-2.9 обкатаны на реальных данных: пометки «бета» сняты.
    - Руководство: главы 2.7-2.9 расширены - чтение карты D и выбор окна,
      рабочие циклы «кровля - D - изолинии» и диагностики сглаживания,
      источники масок для box-counting.
    2.42.1
    - 2.7: по умолчанию одноканальный грид D - сразу подаётся в «1.2
      Изолинии из растра» для изолиний размерности; H записывается вторым
      каналом по галке в дополнительных. Подсказка про изолинии - в журнал.
    2.42.0
    - Два новых фрактальных инструмента: «2.8 Box-counting маски» - одна
      размерность D на бинарную маску (порог по растру, таблица счётов в
      журнале); «2.9 Размерность линий» - D каждой линии методом циркуля,
      диагностика пересглаживания изолиний. Эталоны: ковёр Серпинского
      1.8928, кривая Коха 1.262.
    2.41.0
    - Новый инструмент «2.7 Фрактальная размерность»: карта D = 3 - H
      вариограммным методом в скользящем окне (чистый NumPy, лог-лог
      наклон по лагам); выход двухканальный (D и H), глобальные значения
      в журнале. Перепады D подчёркивают нарушения и границы блоков.
    2.40.2
    - Руководство: обзорная глава «Виды кригинга: какой выбрать» перед
      группой разрезов - навигатор по SK/OK/тренду/дрейфу/блочному/
      индикаторному со шпаргалкой; PDF пересобраны.
    2.40.1
    - В подвал справки каждого инструмента (рядом с номером версии)
      добавлено приглашение: Isoliner развивается на задачах реальных
      предприятий - нужна функция, напишите на www.informpp.ru.
    2.40.0
    - Наведён порядок в инструментах: новая группа «4. Пласт и блочная
      модель» (4.01 сборка грида пласта, 4.02 калькулятор, 4.03 блочная
      модель, 4.04 меши - все с пометкой «бета»); генераторы демо стали
      последними в группах (1.6 профили, 1.7 пример скважин). Руководство
      перенумеровано и переупорядочено.
    2.39.0
    - Новый инструмент «3.14 Грид пласта в блочную модель»: центроид на
      каждую ячейку с атрибутами top/bot/thick/vol/ore_t и всеми каналами
      параметров по именам; выгрузка по контуру. Модель наращивается
      атрибутами - фильтры, join, калькулятор полей.
    2.38.0
    - 3D-просмотр: опрос блочной модели кликом. Клик без перетаскивания
      пускает луч, находит ближайшую поверхность или тело и выводит
      значения всех каналов в точке (для пласта - и мощность); попадание
      помечается красным шариком.
    2.37.0
    - Новый инструмент «3.13 Калькулятор пласта»: мощность, объём, тоннаж
      руды и металла, средневзвешенное содержание по гриду пласта; сводка
      по всей площади или внутри контура (с дырками), HTML-отчёт; каналы
      «мощность» и «запасы руды» дописываются в грид пласта.
    2.36.1
    - 3D-просмотр: подписи скважин над мачтами (поле подписи выбирается на
      вкладке «Векторы», name/well угадываются; до 500 подписей).
    2.36.0
    - 3D-просмотр: единое поле «Окраска» у слоя - палитра, собственные
      каналы по именам или внешний растр проекта (тогда доступен канал
      атрибута); отдельные «Канал окраски» и «Внешний атрибут» упразднены.
    2.35.1
    - 3D-просмотр: кнопки «Все»/«Ничего» падали после перехода на
      персональные настройки слоёв; вызов удалённого метода убран.
    2.35.0
    - 3D-просмотр: персональные параметры каждого слоя. Левая панель на
      вкладках «Слои» и «Векторы»; у выбранного слоя свой режим
      (авто/поверхность/тело пласта), канал высот, канал окраски и внешний
      атрибутный растр с каналом. Глобальные переключатели тел и каналов
      упразднены; шкала окраски общая на сцену.
    2.34.0
    - Новый инструмент «3.12 Собрать грид пласта»: кровля, подошва и пачка
      параметров собираются в многоканальный грид по конвенции; входы
      приводятся к сетке кровли, имена каналов пишутся в описания.
    - 3D-просмотр: фильтр списка слоёв с кнопками «Все»/«Ничего» для
      ручной сборки набора; каналы высот, параметра и атрибута -
      выпадающими списками с именами каналов.
    2.33.1
    - Руководство: таблицы атрибутов сгенерированных слоёв - демо-скважины
      (1.6), выходы 3.01 (определение, 3D-забор, угловые точки, оси,
      таблица углов) и все слои демо 3.10 с их полями; PDF пересобраны.
    2.33.0
    - Руководство (RU/EN): главы «3.11 Поверхности в 3D (меши)» и «3D-просмотр
      поверхностей» со скриншотами сцены, схема конвенции многоканального
      грида пласта, обновлён раздел 3.10; PDF пересобраны. Описание плагина
      дополнено 3D-просмотром и экспортом 2DM.
    2.32.4
    - 3D-просмотр: мачта над устьем скважины (2 процента размаха сцены) -
      штанга видна всегда, даже когда целиком уходит внутрь тела пласта.
    2.32.3
    - 3D-просмотр: плоскость разреза падала на QGIS 4 (asMultiPolyline
      бросает TypeError на одиночной LineString); чтение линии с fallback.
    2.32.2
    - 3.01: вершины ломаной принудительно включаются в пикетаж. Раньше
      равномерная сетка пикетов не попадала в изломы, и профиль, полосы
      чертежа и 3D-забор срезали каждый угол хордой до полушага.
    2.32.1
    - Демо 3.10: разлом смещён с середины створа (0.62 длины) - раньше он
      рождался на изломе линии и выглядел как срезанный угол определения.
    2.32.0
    - 3D-просмотр: плоскость разреза. Линия определения из 3.01 рисуется
      вертикальной полупрозрачной лентой с контуром между zmin и zmax из
      полей определения (без полей - по размаху сцены); ломаные и несколько
      линий поддерживаются.
    2.31.0
    - 3D-просмотр: логика окраски по природе слоя. Тело пласта красится
      собственным каналом параметра (по умолчанию 3; 0 - палитра), внешний
      атрибутный растр применяется только к одноканальным поверхностям;
      выбор «Применить окраску к» упразднён, шкала общая.
    2.30.0
    - 3D-просмотр: режим «Тела пластов» - для многоканальных гридов канал 1
      и канал 2 рисуются кровлей и подошвой, объём замыкается боковой юбкой
      по границе данных (водонепроницаемое тело). Одноканальные гриды в том
      же списке остаются поверхностями. Первый шаг к каркасной и блочной
      моделям массива.
    2.29.1
    - Конвенция грида пласта: канал 1 кровля, канал 2 подошва, каналы 3+
      параметры (пласт как блочная модель, поверхности первичны). Демо 3.10
      выдаёт четырёхканальные гриды пластов; один файл кормит 3.03
      (каналы 1/2/3) и 3D-просмотр.
    2.29.0
    - Многоканальные гриды пластов. Демо 3.10 выдаёт по трёхканальному
      гриду на промышленный пласт (кровля, содержание, минтип - независимые
      стохастические поля с подписями каналов); отдельные плоские гриды
      состава убраны. 3.03 получил выбор канала кровли/подошвы/состава,
      3.11 - канал высот, 3D-просмотр - канал высот и канал атрибута.
    2.28.0
    - Демо 3.10: у каждого промышленного пласта свой состав - независимые
      стохастические поля содержания (крупное + мелкая пятнистость, свои
      тренды) и свой минтип; выходы «Состав 1-го/2-го пром.».
    - 3D-просмотр: легенда цветовой шкалы с диапазоном, прозрачность
      поверхностей, кнопки «Сверху»/«Сбоку», снимок сцены в PNG.
    2.27.5
    - Релиз в основной канал: снят флаг experimental. Функционально
      идентична 2.27.4.
    2.27.4
    - Вложенные pyqtgraph/PyOpenGL зачищены под сканер plugins.qgis.org:
      удалены неиспользуемые console, flowchart, multiprocess, exporters и
      configfile, точечно отключены загрузка .ui и pickle-restore; Bandit
      находит только LOW. 3D-просмотр снова в публикуемом пакете.
    2.27.3
    - Без pyqtgraph/PyOpenGL пункт 3D-просмотра просто не показывается в
      меню: никаких подсказок про pip, публичная сборка выглядит цельной.
    2.27.2
    - Публикуемый пакет собирается без вложенных pyqtgraph/PyOpenGL
      (сканер репозитория QGIS блокирует чужой код); при их отсутствии
      3D-просмотр показывает подсказку установки. Ветка 2.27.x помечена
      экспериментальной до стабилизации.
    2.27.1
    - 3D-просмотр: выбор «Применить окраску к» - атрибут красит одну
      конкретную поверхность или все; шкала считается по цели окраски.
    2.27.0
    - 3D-просмотр: окраска поверхностей атрибутным гридом. Выбранный растр
      (содержание, мощность, ошибка) билинейно выбирается в вершинах мешей,
      цвет по общей шкале, диапазон в строке состояния; нет данных - серый.
    2.26.4
    - Меню «Модули - Isoliner»: 3D-просмотр первым пунктом; отдельный пункт
      «Руководство (PDF)» убран (кнопка осталась в окне «О плагине»).
    2.26.3
    - 3D-просмотр: маркеры устьев скважин теперь круглые шарики вместо
      квадратных спрайтов (при более 500 скважин - круглые спрайты).
    2.26.2
    - 3D-просмотр: камера охватывает и поверхности, и скважины (раньше
      скважины вне экстента мешей оставались за кадром).
    2.26.1
    - 3D-просмотр: список скважин был пуст в QGIS 4 (Qgis.GeometryType
      вместо QgsWkbTypes.PointGeometry); детект точечных слоёв с fallback.
    2.26.0
    - 3D-просмотр: скважины. Точечный слой и числовые поля отметок (h1...h6
      отмечаются сами) рисуются вертикальными штангами с маркером устья.
    - 3.11 переосмыслен как экспорт в стандартный mesh-формат 2DM (MDAL):
      профильный инструмент, mesh-калькулятор, сторонние программы.
    2.25.2
    - 3D-просмотр: исправлено падение на Qt6 (QGIS 4) из-за плоских
      enum-имён Qt; все enum'ы диалога теперь с fallback Qt5/Qt6.
    2.25.1
    - pyqtgraph и PyOpenGL идут в комплекте плагина (папка libs, без
      GLES/примеров): 3D-просмотр работает из коробки, pip не нужен;
      системные копии пакетов, если стоят, имеют приоритет.
    2.25.0
    - Собственный «3D-просмотр поверхностей (бета)» в меню «Модули -
      Isoliner»: растры проекта рисуются мешами на pyqtgraph.opengl, каждый
      горизонт своим цветом, вертикальное преувеличение и разнос по Z
      настраиваются в окне; не зависит от штатного 3D-вида (Qt3D). Нужны
      пакеты pyqtgraph и PyOpenGL (pip install pyqtgraph PyOpenGL).
    2.24.1
    - 3.11: параметр «Разнос по Z» - каждый следующий грид смещается на шаг
      вниз, слипшаяся стопка горизонтов раскрывается в этажерку.
    2.24.0
    - Новый инструмент «3.11 Поверхности в 3D (меши)»: пачка гридов
      переводится в mesh-слои 2DM для штатного 3D-вида QGIS, с вертикальным
      преобразованием Z (масштаб и смещение) и прореживанием узлов.
    2.23.0
    - Меню «Модули - Isoliner»: «О плагине» (версия, ссылки, история
      изменений из metadata.txt) и «Руководство (PDF)» по языку интерфейса.
    2.22.7
    - Руководство: номера панели в заголовках; скрины окон и таблицы полей
      для 2.5, 2.6 и инструментов разреза; пересобраны оба PDF.
    2.22.6
    - Демо-TIN: финальный размер складки (компактная локальная складка).
    2.22.5
    - Демо-TIN: складка ещё уменьшена (компактная локальная складка).
    2.22.4
    - Демо-TIN: складка уменьшена (компактнее), форма и заворот сохранены.
    2.22.3
    - Демо-TIN: складка переделана в гладкую лежачую (синусоида в наклонной
      раме по падению пластов) - длинные крылья, плавный заворот без острых
      углов, малый размах по высоте.
    2.22.2
    - Демо-TIN: складка из замкнутой линзы переделана в открытую лежачую
      шпильку (нижнее крыло, замок сбоку, перевёрнутое верхнее крыло) -
      читается как опрокинутая складка, а не кольцо.
    2.22.1
    - Демо-TIN переделана в реалистичную лежачую опрокинутую складку:
      замкнутая линза со сдвигом (наклон), мощность слоя, посажена в
      середину пачки пластов, шире поперёк разреза.
    2.22.0
    - Новый инструмент «3.06 Пересечение TIN с разрезом»: TIN из 3D-граней
      (PolygonZ) и/или меш режется разрезом. В отличие от грида берёт
      нависающее и опрокинутое - над одной станцией несколько отметок,
      трасса заворачивается. Ядро на чистом NumPy. Номера инструментов
      разреза стали двузначными (3.01-3.10); в демо добавлена опрокинутая
      TIN-складка.
    2.21.2
    - «3.5 Пересечение векторов» принимает список слоёв за один прогон
      (линии и полигоны вперемешку), в выходах поле src хранит слой-
      источник каждой метки.
    2.21.1
    - «3.5 Пересечение векторов»: определение разреза теперь несёт высоту
      рамки (zmin/zmax из «Разрез по линии»), для объектов без Z больше не
      нужно подавать чертёж или диапазон Z. Пустые выходы не создаются.
    2.21.0
    - Новый инструмент «3.5 Пересечение векторов с разрезом»: линии и
      полигоны наносятся на разрез по точному пересечению. Линия без Z -
      вертикаль на всю высоту, линия с Z - точка на отметке, полигон -
      полоса на интервале зоны. Беты сдвинуты на 3.6-3.8, демо на 3.9; в
      демо добавлены разлом, маркер с Z и зона замещения.
    2.20.1
    - Восстановлена кнопка «Справка» в диалоге инструмента «2.6 Гауссова
      симуляция (SGS)» (отсутствовал helpUrl).
    2.20.0
    - Новый инструмент «2.6 Гауссова симуляция (SGS)»: ансамбль равновероятных
      реализаций вместо одной сглаженной оценки. Даёт неопределённость -
      среднее (E-type), стандартное отклонение, квантили P10/P50/P90 и карту
      вероятности превышения порога. Вариограмма баллов подбирается авто.
      Чистый NumPy поверх ядра кригинга, без зависимостей.
    2.19.1
    - Подписи горизонтальных осей вынесены слева от линии (через позицию,
      вычисляемую от геометрии) - прежняя привязка в QGIS 4 не срабатывала.
    2.19.0
    - «Скважины на разрезе» и «Состав пласта на разрезе» получили
      необязательный вход «Определение разреза»: масштаб vex берётся из него,
      и колонки и состав точно совпадают с разрезом по вертикали.
    - Инструменты переименованы в «...на разрезе». Инструменты 3.5-3.7
      (проекция, обратная проекция, развёртка ствола) помечены «(бета)».
    - В руководство добавлена схема оформления разреза.
    2.18.6
    - Подписи горизонтальных осей привязаны к началу линии (слева).
    2.18.5
    - Таблица углов переделана: ячейки между угловыми точками (границы под
      вертикалями), две строки - длина и азимут отрезка между соседними
      углами, заливка белая, без строки-шапки.
    2.18.4
    - Откат флага «Дополнительно» с выходных слоёв: в стоковом диалоге
      Processing выходы нельзя убрать в эту секцию (флаг работает только для
      входных), и QGIS сваливал туда все выходы, включая главные. Выходы
      снова в обычном порядке, оформительские - по-прежнему опциональны.
    2.18.3
    - Оформительские выходы «Разреза по линии» (угловые точки, вертикали,
      горизонтальные оси, таблица углов) и число отметок убраны в секцию
      «Дополнительно». На виду остаются чертёж 2D, забор 3D и определение.
    2.18.2
    - Новый опциональный выход «Разреза по линии» - таблица углов: слой
      полигонов-ячеек под разрезом (колонка на угол, строки имя, азимут,
      расстояние, подпись по центру). Рисуется прямо в окне вида.
    2.18.1
    - Угловые точки: подпись внизу только X и Y (азимут и расстояние
      остаются полями для таблицы). Стиль: треугольник вершиной вверх и
      меньше, полка меньше и симметричная. Количество отметок высоты на осях
      теперь точнее совпадает с заданным (шаг из ряда 1-2-2.5-5-10), сам
      параметр перенесён в дополнительные. 
    2.18.0
    - Угловые точки разреза доработаны: точки сверху и снизу, поля номер,
      имя УГ-N, сторона, расстояние, плановые X и Y, азимут, готовая
      подпись (округление до сотых). Стиль: треугольник сверху, полка снизу.
      Новый выход - горизонтальные оси с отметками высот (по умолчанию 5,
      хорошее округление). Поля чертежа на 5%% шире вверх и вниз. Демо-линия
      теперь ломаная с двумя изломами.
    2.17.0
    - «Разрез по линии» по запросу выдаёт угловые точки и угловые вертикали
      на узлах ломаной (в осях чертежа), с номером узла и азимутом отрезка.
      Вертикали на всю высоту разреза. Оба выхода опциональны.
    2.16.0
    - Растровые выходы создаются со свёрнутым узлом в дереве (стопка гридов
      больше не раздувает панель слоёв). На каждый слой пишется история
      создания (версия плагина, инструмент, дата) - видна в свойствах слоя
      и переносится с проектом и QLR. Существующие стили и порядок слоёв
      сохранены.
    2.15.1
    - Многослойные инструменты складывают выходные слои в фиксированную
      группу дерева (Разрез, Кригинг, Изолинии и т.д.). Повторный запуск
      добавляет в ту же группу, новую не плодит. Семейство разреза идёт в
      одну группу «Разрез» - удобно копировать в другой проект (например
      через QLR).
    2.15.0
    - Линейка инструментов разреза на общем определении разреза (линия и
      vex, выдаётся «Разрез по линии»). Новое: «Пересечение поверхностей с
      разрезом» (3.4), «Проекция объектов на разрез» (3.5), «Спроецировать
      с разреза» (3.6, обратная проекция в 3D), «Развёртка стенки ствола»
      (3.7, цилиндрический разрез). Разрез обрезает выклинивания. Демо
      получило выклинивание пласта. Демо-генератор стал 3.8.
    2.14.1
    - Группа «Дополнительные инструменты» переименована в «Дополнительные
      инструменты анализа». В группе «Разрез» наведён порядок: 3.1 разрез,
      3.2 скважины, 3.3 состав, 3.4 пример (демо в конце). Идентификаторы
      алгоритмов не менялись.
    2.14.0
    - Вертикальный масштаб разреза задаётся отношением Г:В (ширина:высота),
      множитель считается сам по длине линии и размаху высот; режим
      «множитель» сохранён. Фактический множитель печатается в журнал.
      Добавлено в «Разрез по линии», «Скважины на разрез» и «Состав пласта
      на разрез». По умолчанию Г:В 10:1.
    2.13.2
    - Демо разреза: усилена структура (падение, пологая складка, клинья
      промышленных пластов) для наглядности; демо-скважины прижаты вплотную
      к линии, чтобы их колонки совпадали с полосами разреза.
    2.13.1
    - Исправлено: в «Создать пример для разреза» слой скважин не
      создавался (двойное обращение к параметру вывода). Теперь скважины
      генерируются корректно.
    2.13.0
    - Новый инструмент «Состав пласта на разрез» (группа «Разрез», 3.4).
      Красит полосу пласта по гриду состава вдоль линии. Режим
      «непрерывное» режет полосу на срезы под градиент (KCl, HO), режим
      «категориальное» сливает смежные срезы в фациальные зоны (минтип,
      зоны замещения). По одному пласту за раз, выходы 2D и 3D. Генератор
      «Создать пример для разреза» теперь выдаёт и гриды состава
      промышленных пластов (содержание и минтип с зоной замещения).
    2.12.1
    - Генератор «Создать пример для разреза» расширен до шести поверхностей:
      пять пластов в переслаивании (три вмещающих и два промышленных,
      тонкие). Скважины несут отметки h1...h6.
    2.12.0
    - Новый инструмент «Скважины на разрез» (группа «Разрез», 3.3).
      Проецирует скважины на линию разреза и рисует их колонками интервалов
      пластов в осях расстояние-высота, поверх чертежа. Границы пластов -
      из выбранных полей-отметок (сортируются по убыванию), отсев дальних
      коридором, номер скважины подписью. Генератор «Создать пример для
      разреза» теперь выдаёт и скважины вдоль линии с полями h1, h2, h3.
    2.11.1
    - Инструменты разреза вынесены в отдельную группу «Разрез»:
      «Разрез по линии» теперь 3.1, «Создать пример для разреза» 3.2.
      Группы «Грид и изолинии» (1.1-1.7) и «Дополнительные инструменты»
      (2.1-2.5) вернулись к прежнему составу.
    2.11.0
    - Новый инструмент «Создать пример для разреза» (группа «Грид и
      изолинии», 1.8). Готовит три стопкой поверхности (две залежи) с
      падением и переменной мощностью и линию, чтобы сразу попробовать
      «Разрез по линии» без кригинга реальных данных.
    2.10.0
    - Новый инструмент «Разрез по линии» (группа «Дополнительные
      инструменты», 2.6). По линии и упорядоченному сверху вниз набору
      поверхностей строит геологический разрез: пласты как полосы между
      соседними поверхностями. Два выхода - чертёж в осях расстояние×высота
      (с вертикальным преувеличением, для макета) и 3D-забор PolygonZ в
      реальных координатах (для 3D Map View). Несколько пластов сразу.
    2.9.3
    - «2D Kriging»: список «Преобразование значения» (ln) перенесён из
      «Дополнительно» прямо под поле значения Z - так его проще найти тем,
      кому он нужен (лог-нормальные K, T).
    2.9.2
    - Бергштрихи (изолинии впадин, стиль «со штрихами вниз»): исправлено
      направление штрихов в QGIS 4. В QGIS 4 трактовка знака смещения линии
      изменилась относительно QGIS 3, из-за чего штрихи смотрели вверх по
      склону. Знак dn_sign теперь переворачивается для QGIS 4+, в QGIS 3
      поведение прежнее.
    2.9.1
    - Демо-генерация K приведена к реалистичному диапазону: поле ln(K)
      нормируется и подрезается до ±2.5σ, K ≈ 0.006…4 м/сут (раньше пики
      гладкого поля давали единичные выбросы в сотни). T = K·мощность.
    2.9.0
    - «2D Kriging»: опциональное логарифмирование значения (преобразование
      ln). Кригуется ln(Z), оценка возвращается через exp (медиана),
      стандартная ошибка пересчитывается в исходные единицы дельта-методом.
      Кригинг лог-нормальных величин (K, T, скошенные содержания) без ручного
      создания поля ln.
    - Инструменты 2.3 и 2.4 поменяны местами: 2.3 теперь «Карта вероятности
      превышения», 2.4 «Гидравлический градиент», чтобы гидрогеология
      (градиент 2.4 и удельный расход 2.5) шла рядом.
    2.8.0
    - Новый инструмент «Удельный расход (закон Дарси)» (группа
      «Дополнительные инструменты», 2.5). По растру напора и растрам свойств
      пласта (коэффициент фильтрации K, водопроводимость T) считает скорость
      фильтрации q = K·|∇h| (м/сут) и расход через ширину Q = T·|∇h| (м²/сут),
      плюс направление и стрелки. Свой кригинг не делает - растры K и T берёт
      готовыми (рекомендуется лог-кригинг). Гидрогеология теперь с
      проницаемостью, а не только геометрия градиента.
      Генератор «Создать пример скважин» получил галку «Добавить поля
      K и T и напор»: лог-нормальное K и T = K·мощность, чтобы инструмент
      Дарси можно было освоить на демо-данных.
    2.7.1
    - В руководство (RU и EN) добавлены иллюстрации для «Карты вероятности
      превышения»: окно инструмента и пример карты с расходящейся шкалой.
    2.7.0
    - Новый инструмент «Карта вероятности превышения» (группа
      «Дополнительные инструменты», 2.4). По растрам оценки и стандартной
      ошибки кригинга строит P(Z>порог) = Φ((оценка−порог)/ошибка) при
      нормальном локальном распределении. Свой кригинг не выполняет, окно
      «2D Kriging» не меняет - отдельный постпроцессор, как градиент потока.
      Применение: бортовые содержания, зоны риска по любому порогу.
    2.6.1
    - Группы инструментов пронумерованы: «1. Грид и изолинии» и
      «2. Дополнительные инструменты». Так порядок групп в дереве Processing
      одинаков в русской и английской локалях (раньше группы сортировались
      по алфавиту имени и на разных языках шли в разном порядке).
    - В руководство добавлены иллюстрации (RU и EN): окно инструмента «Кригинг
      с внешним дрейфом», обновлённое дерево инструментов с нумерацией групп и
      сравнение обычного кригинга с кригингом по внешнему дрейфу.
    2.6.0
    - Новый инструмент «Кригинг с внешним дрейфом (External Drift)»
      (группа «Дополнительные инструменты»). Оценка по точкам, когда поле
      закономерно связано со сторонней величиной, известной всюду в виде
      растра: структурная поверхность соседнего пласта, грубая региональная
      модель, сейсмический атрибут. Дрейф снимается регрессией значения на
      растр, кригуются остатки, дрейф возвращается к оценке из того же растра.
      Та же схема регрессия-кригинг, что и у снятия полиномиального тренда,
      только дрейф здесь не функция координат, а функция внешнего значения.
      Степень дрейфа 1 (линейный) или 2 (квадратичный); поиск, анизотропия,
      обрезка и стандартная ошибка - как у «2D Kriging». Ячейки вне покрытия
      растра дрейфа остаются пустыми. Растр дрейфа и точки в одной CRS.
    - Составная нумерация инструментов по группам: «Грид и изолинии» 1.1-1.7,
      «Дополнительные инструменты» 2.1-2.3. Прежняя сквозная нумерация 1-10
      сортировалась как строки, и «10» вставал перед «8» и «9». Номер теперь
      сразу показывает группу.
    - Демо-генератор скважин умеет выдавать поверхность дрейфа (отдельный растр)
      и связанное с ней поле dz - готовая пара для проверки кригинга с внешним
      дрейфом.
    2.5.0
    - Новый инструмент «Гидравлический градиент и направление потока»
      (гидрогеология). По растру напора строит гидравлический градиент i = |∇h|
      (безразмерный, м/м), азимут направления потока (компасный, вниз по
      градиенту) и точечный слой векторов потока, который автоматически
      оформляется стрелками (пресет flow_arrows.qml: поворот по азимуту,
      размер по градиенту).
      Это геометрия поля напора без проницаемости: скорость по Дарси (минус K
      на градиент) требует коэффициента фильтрации и здесь не считается.
      Опционально сглаживание напора перед расчётом (градиент усиливает шум).
    - Демо-генератор скважин: опция добавить поле напора (head) с региональным
      уклоном - сквозной учебный цикл «демо → кригинг напора → градиент потока».
    - Инструменты разнесены по двум группам Processing: «Грид и изолинии»
      (основной поток) и «Дополнительные инструменты» (категориальный
      индикаторный кригинг и гидравлический градиент).
    2.4.0
    - В инструменте «2D Kriging» появился блочный кригинг (галка «Блочный
      кригинг» и поле «Дискретизация блока, N×N на ячейку», по умолчанию 4×4).
      Оценивается среднее по ячейке грида, а не значение в её центре: ячейка
      разбивается на N×N точек дискретизации, правые ковариации усредняются
      по блоку, дисперсионный член - блок-блок ковариация (схема GSLIB KB2D).
      Поверхность глаже, стандартная ошибка кригинга ниже точечной - подходит
      для оценки запасов и содержаний по блоку. Пробы в узлах при этом не
      воспроизводятся точно. По умолчанию выключено: обычный точечный кригинг.
    - Снятие тренда и блочный кригинг работают вместе: кригуются остатки по
      блоку, тренд добавляется обратно к оценке.
    2.3.0
    - Новый инструмент «Категориальный индикаторный кригинг». По категориальному
      полю (минтип, литотип, класс) строит на каждый класс индикатор 0/1,
      кригует ядром KB2D, нормирует вероятности к сумме 1. Выход: многополосный
      растр вероятностей (полоса на класс), карта зон (самый вероятный класс) и
      растр уверенности. Кодом класса не кригует, у категорий нет порядка.
    - Демо-генератор скважин: опция добавить категориальное поле минтипа
      (фон сильвинита с очагами замещения) для обучения и проверки нового
      инструмента.
    2.2.0
    - Инструмент «Изолинии из растра»: выбор «Стиль изолиний» с двумя
      встроенными пресетами (папка styles) - структурный (по умолчанию) и
      депрессионный со штрихами вниз. Стиль накладывается на слой
      автоматически.
    - Депрессионный стиль сам включает расчёт стороны склона: линии получают
      поле dn_sign сэмплированием исходного растра по обе стороны линии, и по
      нему штрихи на главных изолиниях ложатся в сторону склона вниз.
      Отдельной галки нет, всё решает выбор стиля.
    - Выбор языка интерфейса: русский только при русской локали QGIS,
      английский для всех остальных локалей и при неопределённой локали.
      Раньше английский включался лишь при ровно английской локали, а прочие
      языки получали русский.
    2.1.1
    - Тихие удобства. Выбранный профиль обработки запоминается между
      сессиями и подставляется при следующем открытии «2D Kriging» и
      «Кросс-валидации».
    - Параметры запуска сохраняются только при успешном завершении, поэтому
      ошибочный или прерванный запуск больше не затирает рабочие значения.
    - Предупреждения о плохой кондиционности данных в Журнал: мало точек,
      совпадающие координаты (риск вырожденной матрицы), одинаковые значения.
      Расчёт при этом не останавливается.
    2.1.0
    - Снятие тренда (регрессия-кригинг) в «2D Kriging» и «Кросс-валидации»:
      галка «Снять полиномиальный тренд» и поле «Степень тренда» (плоскость
      или квадратичная). Региональный тренд снимается методом наименьших
      квадратов перед кригингом, кригуются остатки, тренд возвращается к
      оценке. Полезно для отметок пласта и мощностей с общим падением в
      пределах участка; вариограмму после снятия тренда задают по остаткам.
      В кросс-валидации тренд переподбирается на каждом шаге leave-one-out,
      поэтому выигрыш виден прямо по RMSE. По умолчанию выключено.
    - «Вариограммная карта»: поле «Записать анизотропию в профиль». Оценённые
      азимут, коэффициент анизотропии и радиус главной оси дописываются в
      выбранный профиль поверх модели и наггета. При загрузке профиля в
      «2D Kriging» они подставляются и показываются в подписи. Если радиус
      упёрся в макс. лаг, обновляются только азимут и коэффициент.
    - Руководство дополнено разделами про снятие тренда и запись анизотропии
      в профиль; PDF (RU и EN) пересобраны.
    2.0.0
    - Полное двуязычие плагина (русский/английский): язык интерфейса
      определяется по локали QGIS. Переведены меню, диалоги, варианты
      выпадающих списков, подсказки и панели справки.
    - Переведены логи, предупреждения, исключения и HTML-отчёты
      (кросс-валидация, вариограмма, вариограммная карта), имена
      выходных слоёв и псевдонимы полей слоя остатков.
    - Двуязычное руководство пользователя: Isoliner.pdf (RU) и
      Isoliner_en.pdf (EN). Кнопка «Справка» открывает PDF по языку
      интерфейса.
    - Движок переводов - словарный слой i18n с тестами покрытия
      и импорта.
    1.9.1
    - Изолинии: бикубическое сглаживание (сгущение грида ×2..×4 перед
      контурингом, по умолчанию выкл.) - гладкие изолинии без
      «октагонов» от грубой сетки. Чистый NumPy, совместимо с QGIS 4.
      Работает и для линий, и для контурных полигонов; границы поясов
      совпадают с изолиниями.
    - Полигонизация поясов переведена на прямые вызовы GEOS
      (unaryUnion + polygonize) вместо native:splitwithlines, который
      на густой сети терял часть граней (покрытие падало вдвое).
    1.9.0
    - Новый инструмент «Вариограммная карта (анизотропия)»: поверхность
      гамма(h_x, h_y) - хитмап с эллипсом анизотропии; оценка азимута главной
      оси, коэффициента анизотропии и радиуса для подстановки в кригинг.
      Если радиус упирается в макс. лаг (гамма не вышла на полку) - в
      Журнале и отчёте предупреждение, что это нижняя оценка.
    1.8.3
    - Совместимость с QGIS 4 (qgisMaximumVersion=4.99); проверено в 4.0.
    - Гауссова модель вариограммы: принудительный минимальный наггет для
      численной устойчивости (убирает осцилляции и отрицательные веса).
    - Полигоны: устойчивое построение в QGIS 4 / GEOS 3.14 - концы открытых
      изолиний продлеваются за контур (овершут), стык нодируется чисто;
      убраны дыры в поясах.
    - Руководство: уточнены формулировки (полувариограмма, радиус, выбор
      модели, режим под тип данных, ураганные пробы, кросс-валидация).
    1.8.2
    - Двуязычное описание плагина (английский и русский) в каталоге QGIS
      и английский README для международной аудитории.
    1.8.1
    - В справку каждого инструмента добавлена ссылка на страницу плагина
      на сайте www.informpp.ru.
    1.8.0
    - Профили обработки: именованные наборы «вариограмма (наггет, тип, порог,
      радиус, азимут, оси) + отсев ураганных проб», хранятся глобально, между
      проектами. «Вариограмма» и «Кросс-валидация» получили поле «Сохранить
      профиль под именем» и «Загрузить профиль обработки», «2D Kriging» -
      «Загрузить профиль обработки» (подставляет профиль поверх полей).
      Прежняя галка «Подставить последнюю рекомендованную модель» убрана.
    - Новый шестой инструмент «Профили обработки»: показать список, сохранить
      вручную, удалить, очистить.
    - Под списком профиля показываются его параметры строкой ниже, а в
      «2D Kriging» и «Кросс-валидации» - напоминание, что расчёт пойдёт по
      профилю, а не по полям диалога (как живой показ размера грида; на QGIS
      без старого API виджетов - обычный список).
    - Структуры 2 и 3 вариограммы убраны (использовались редко) - осталась
      одна структура с азимутом и анизотропией.
    - Порядок параметров везде единый: сначала вариограмма, отсев ураганных
      проб - в самом конце.
    - Формулировка: «изотропная» вместо «всенаправленная» экспериментальная
      вариограмма.
    1.7.4
    - «2D Kriging»: галка «Подставить последнюю рекомендованную модель»
      перенесена из «Дополнительно» в основные параметры - её видно сразу,
      без разворачивания дополнительного раздела. Поведение прежнее:
      подобранная в «Вариограмме» или «Кросс-валидации» модель подставляется
      при запуске, подстановка отмечается строкой в Журнале.
    - Руководство: добавлена таблица всех параметров инструмента
      «Вариограмма» и описание полей выходной таблицы (series, lag, gamma,
      npairs). PDF пересобран. Изменений в расчётах нет.
    1.7.3
    - Номер версии модуля теперь виден в трёх местах: строкой «Isoliner
      X.Y.Z» в начале выполнения любого инструмента (Журнал), подвалом в
      HTML-отчётах (вариограмма и кросс-валидация) и в конце встроенной
      справки каждого инструмента. Версия читается из metadata.txt, отдельно
      нигде не дублируется.
    1.7.2
    - Руководство дополнено разделом про инструмент «Вариограмма
      (экспериментальная)»: зачем нужен предпросмотр, группировка по виду
      разведки, выбор максимального расстояния по выходу кривой на плато и
      рабочий цикл с кросс-валидацией. В раздел кросс-валидации добавлена
      поясняющая схема «оценка против факта». PDF пересобран. Изменений в
      коде нет.
    1.7.1
    - Инструменты пронумерованы в названиях (1-5), чтобы задать порядок в
      панели Processing (она сортирует по алфавиту имени): 1 Кригинг,
      2 Изолинии, 3 Вариограмма, 4 Кросс-валидация, 5 Демо-скважины.
    - «Вариограмма»: предупреждение, когда радиус подобранной модели
      достигает края окна (максимального расстояния) - кривая не вышла
      на плато, порог получен экстраполяцией, радиус считать нижней
      оценкой. Сообщение разведено по случаям: окно мало (увеличить),
      окно перешагивает тренд или безрудную зону (уменьшить).
    - «Вариограмма»: у поля максимального расстояния указаны единицы
      слоя, добавлено предупреждение, когда оно меньше типичного шага
      между точками (значение задаётся в метрах, не в километрах).
    - «Вариограмма»: минимум точек в группе - параметр в процентах от
      выборки (по умолчанию 2) с нижним полом 30 точек. Малочисленные
      группы пропускаются и перечисляются в журнале, общая кривая
      строится всегда.
    - Порог предупреждения о гауссовой модели с почти нулевым наггетом
      («бычьи глаза») сделан относительным (наггет менее 5 процентов от суммарного
      порога).
    - «Кросс-валидация»: рекомендация по MSDR теперь даёт точный приём -
      умножить (или разделить) наггет и вклады на MSDR, не трогая радиус
      и модель. Оценки не меняются, поправляется только карта ошибки.
    - Перенос модели в «2D Kriging»: «Вариограмма» и «Кросс-валидация»
      запоминают подобранную/проверенную модель, а в «2D Kriging»
      появилась галка «Подставить последнюю рекомендованную модель»
      (по умолчанию выключена) - числа подставляются осознанно, после
      просмотра отчёта, а не вслепую.
    - «Вариограмма»: в описании - «всенаправленная» вместо кальки
      «омнинаправленная».
    1.7.0
    - Новый инструмент «Вариограмма (экспериментальная)»: строит
      экспериментальную вариограмму по точкам и выдаёт HTML-отчёт с
      графиком. Поверх облака накладывается текущая модель, по желанию
      рассчитывается рекомендованная модель (наггет, порог, ранг) на
      чистом numpy, без сторонних зависимостей. Есть поле группировки
      (напр. вид разведки) - на каждое значение строится отдельная
      вариограмма, чтобы увидеть, общая ли структура у поверхностной и
      подземной сети при разной плотности наблюдений. Подбор не
      применяет декластеризацию, поэтому смещение по плотности отбора
      остаётся видимым, а не замаскированным. Рекомендованные числа
      переносятся в «2D Kriging» вручную.
    1.6.0
    - Гауссово сглаживание поля перенесено из «Изолинии из растра» в
      «2D Kriging»: опция «Сгладить грид (Гаусс)», по умолчанию выключена.
      Изолинии строятся ровно по видимому растру, без скрытого сужения
      диапазона уровней. Скругление линий (Chaikin) осталось в изолиниях
      отдельной опцией.
    - Руководство переработано: темы каждого инструмента собраны в его
      подразделы (вариограмма, отсев, стандартная ошибка - под 2D Kriging;
      сглаживание, полигоны, оформление, типичные ситуации - под Изолинии).
      Заголовки переведены на автоматическую нумерацию, оформление выверено.
    1.5.1
    - Руководство: разделы переставлены по порядку инструментов модуля
      (2D Kriging и его темы -> Изолинии и его темы -> Кросс-валидация ->
      Демо -> Типичные ситуации). Добавлены скриншоты окон всех четырёх
      инструментов и панели «Обработка».
    1.5.0
    - Отчёт кросс-валидации: QQ-график ошибок (по форме - z-оценка, для
      проверки нормальности и поиска второй популяции), дисперсия данных
      в таблице метрик, номера скважин в подсказках на графике
      «оценка vs факт», подписи восьми худших остатков.
    - Руководство дополнено схемами для новичков: процесс (точки → грид →
      изолинии), веса кригинга, радиус поиска, наггет крупным планом,
      анизотропия, отсев проб (до/после). Карта стандартной ошибки -
      на сгенерированном примере. В отчёт добавлен блок «Параметры
      кригинга» (только отличные от стандартных). Обновлён README.
    1.4.2
    - Обновлено руководство пользователя (формулировки) и README.
    1.4.1
    - Обновлён контактный email сопровождающего.
    1.4.0
    - Новый инструмент «Создать пример скважин (демо)»: генерация учебного
      точечного слоя с полями кровли (абс. отметка), мощности и содержания
      абстрактного компонента, имеющими пространственную структуру (диапазоны
      кровли/мощности - по образцу пласта КрII). Для обучения и проверки без
      реальных данных. Псевдонимы на демо-слое не ставятся, чтобы не было
      предупреждений при подаче слоя в кригинг/кросс-валидацию.
    1.3.0
    - Кросс-валидация: необязательный HTML-отчёт (по умолчанию) -
      интерактивный график «оценка vs факт» + гистограмма ошибок и
      таблица метрик (plotly); без plotly - отчёт с метриками текстом.
    - Кросс-валидация: в отчёт и Журнал добавлен блок рекомендаций
      (авто-интерпретация ME/MSDR/R: утвердить параметры или как
      поправить наггет/силл/радиус).
    - Кригинг и кросс-валидация: в Журнал выводится дисперсия данных
      как ориентир для силла (наггет/силл - в абсолютных единицах).
    1.2.0
    - Кросс-валидация: добавлена кнопка «Справка» в окно инструмента.
    - Кросс-валидация: необязательное «поле номера скважины» переносится
      в слой остатков; колонка факта названа по проверяемому полю.
    - Слой остатков: поле std_error переименовано в std_resid
      (стандартизованный остаток со знаком; это не дисперсия).
    - Слой остатков: у полей заданы псевдонимы (понятные названия), слой
      автоматически называется по проверяемому полю и источнику.
    1.1.0
    - Новый инструмент «Кросс-валидация вариограммы» (leave-one-out):
      метрики ME/MAE/RMSE/MSDR/R и слой остатков для подбора вариограммы.
    - Руководство дополнено разделом о кросс-валидации.
    1.0.0
    - Первый стабильный релиз (снят флаг experimental).
    - Сводно с 0.6.x-0.7.x: стандартная ошибка кригинга; отсев/срезка
      ураганных проб; журнал пропусков; руководство (PDF) и кнопка «Справка»;
      слой изолиний над полигонами; исправлена степенная модель; smoke-тесты.
    0.7.2
    - Отсев/срезка ураганных проб в 2D Kriging: границы значения Z по
      абсолюту (мин/макс) или перцентилю; режимы «удалить» и «срезать»
      (capping). В «Дополнительно».
    0.7.1
    - В журнал выводится число точек, пропущенных без значения поля
      (точки с пустым/нечисловым Z в кригинг не попадают - это уже так).
    0.7.0
    - 2D Kriging: необязательный выход «Стандартная ошибка кригинга»
      (sqrt дисперсии ошибки) - карта неопределённости оценки.
    0.6.5
    - Метаданные для публикации в репозитории QGIS (ссылки на GitHub).
    0.6.4
    - Обновлено руководство; оглавление в PDF пересчитывается автоматически.
    0.6.3
    - Исправлена степенная модель вариограммы: «радиус a» трактуется как
      показатель ω (0<ω<2), авто=max/3 к ней больше не применяется.
    - Предупреждения (pushWarning) для сомнительных параметров вариограммы.
    - Слияние совпадающих точек - относительно охвата (корректно для любых CRS).
    - Добавлен smoke-тест движка kb2d (tests/).
    0.6.2
    - Обновлён текст руководства пользователя (PDF).
    0.6.1
    - ИСПРАВЛЕНО: слой изолиний мог не появляться из-за переупорядочивания
      слоёв. Теперь переставляется только слой полигонов (под линии),
      отложенно и безопасно - узел линий не трогается.
    0.6.0
    - Руководство пользователя (PDF) в комплекте; кнопка «Справка» в обоих
      инструментах открывает его. Слой изолиний теперь над полигонами.
    0.5.3
    - Документация: заметка про обновление и перезагрузку без перезапуска
      QGIS (в т.ч. через Plugin Reloader).
    0.5.2
    - Вернул лёгкое скругление линий (Chaikin) поверх сглаженного поля -
      убирает «октагоны» от грубого грида, пересечений не создаёт.
      Отдельный параметр «Скругление линий, итераций».
    0.5.1
    - Сглаживание перенесено на уровень поля (гауссово, радиус в ячейках)
      вместо сглаживания отдельных линий: изолинии больше не пересекаются
      в густых местах и плавны на углах.
    0.5.0
    - Контурные полигоны строятся по умолчанию (во временный слой).
    - Запоминание выбранного поля Z между запусками.
    - Иконка плагина; чистка кода; расширенный README.
    0.4.4
    - Обрезка по контуру скважин без native:minimumboundinggeometry
      (dissolve + convexhull) - работает в QGIS 3.40.
    0.4.3
    - Линии и пояса из одного набора линий; границы совпадают и по краям;
      нодирование через splitwithlines.
    0.4.2
    - Переименование в Isoliner; полигоны = пояса между изолиниями (без дыр,
      без «ступенек»), диапазон пояса - выборкой растра.
