[general]
name=Isoliner3D
qgisMinimumVersion=3.16
qgisMaximumVersion=4.99
description=Standalone 3D viewer and bed/block-model toolset: surfaces, watertight bed bodies, boreholes, polyhedra, reserves. Автономный 3D-просмотр поверхностей, тел пластов, скважин и полиэдров, плюс подсчёт запасов по блочной модели.
about=A standalone 3D viewer for geological surfaces and bodies in QGIS, independent of the built-in 3D map. Renders project rasters as triangular-mesh surfaces (each horizon in its own colour, with vertical exaggeration and Z spacing), builds watertight bed bodies from multiband grids (band 1 roof, band 2 bottom), draws boreholes as coloured stems with collar masts and labels, shows a section plane with a bright section trace, and displays polyhedral / TIN / MultiPolygon Z bodies. Click-query prints layer name, coordinates, all band values and thickness. Colouring by palette, custom colour, own band, an external raster or a real map texture with shading: an orthophoto, a basemap or a styled geological map. A section drawing is draped onto the section ribbon, several sections at once. A Processing group of seven bed and block-model tools computes thickness, volume and reserves from a bed grid. PNG snapshot for reports. A companion to the Isoliner kriging and contouring toolset (plugins.qgis.org/plugins/grid_isolines) and to Topoliner, topology cleaning (plugins.qgis.org/plugins/topoliner). pyqtgraph and PyOpenGL are bundled - nothing to install. Companion to the Isoliner kriging toolset. Developed with the support of Inform++ LLC (www.informpp.ru).
    .
    Автономный 3D-просмотр геологических поверхностей и тел в QGIS, не зависящий от штатного 3D-вида. Растры проекта рисуются треугольными мешами (каждый горизонт своим цветом, с вертикальным преувеличением и разносом по Z), из многоканальных гридов строятся водонепроницаемые тела пластов (канал 1 - кровля, канал 2 - подошва), скважины показываются цветными стволами с мачтами и подписями, плоскость разреза даёт яркий след сечения, а полиэдры / TIN / MultiPolygon Z отображаются объёмными телами. Клик по сцене печатает имя слоя, координаты, значения всех каналов и мощность. Окраска палитрой, своим цветом, собственным каналом, внешним растром или настоящей текстурой карты с затенением: ортофото, подложка, геологическая карта со своей символикой. На ленту разреза накладывается чертёж, несколько разрезов сразу. Группа Processing из семи инструментов пласта и блочной модели считает мощность, объём и запасы по гриду пласта. Снимок PNG для отчётов. Спутник набора кригинга и изолиний Isoliner (plugins.qgis.org/plugins/grid_isolines) и чистки топологии Topoliner (plugins.qgis.org/plugins/topoliner). pyqtgraph и PyOpenGL идут в комплекте - устанавливать ничего не нужно. Спутник набора кригинга Isoliner. Разработано при поддержке ООО «Информ++» (www.informpp.ru).
version=0.42.0
author=ООО «Информ++»
email=xbbster@gmail.com
homepage=https://github.com/Valery35/qgis-isoliner3d
tracker=https://github.com/Valery35/qgis-isoliner3d/issues
repository=https://github.com/Valery35/qgis-isoliner3d
tags=3d,visualization,surfaces,geology,mesh,boreholes,cross-section,polyhedral,tin,pyqtgraph,opengl,kriging,geostatistics
category=Analysis
icon=icon.svg
experimental=False
deprecated=False
hasProcessingProvider=yes
changelog=0.42.0
    - Свой цвет у векторного слоя убран. Он дублировал оформление
      слоя и стирал раскраску по отметке, а задаётся оно всё равно
      в самом слое. Цвет объекта берётся из стиля, запасной остаётся
      на случай, когда стиль цвета не дал.
    - Свойства векторного слоя подбираются под слой. Строка, которая
      к нему не относится, убирается, а не гасится: погашенная всё
      равно занимает место и заставляет гадать, отчего она серая.
      У точечного слоя нет строк призмы, у линий и полигонов нет
      строки типа точек, поля отметки и поверхности видны каждое
      при своём источнике высоты, поля скважин только в режиме
      скважин, разрез только у линейных слоёв.
    - Строка прячется вместе с подписью: одно поле спрятать мало.
    0.41.0
    - Исправлено: у слоя без своей высоты Z отметка с поверхности
      теряла все объекты. Вершина без отметки отсеивается ещё
      при разборе геометрии, до укладки дело не доходило. Точки
      и любые плоские слои теперь ложатся на поверхность.
    - У края данных отметка добирается ближайшей ячейкой. Билинейной
      выборке нужны четыре соседа, и на границе она молчит даже там,
      где ячейка есть: отсюда лишние разрывы линий.
    - Новый параметр слоя «Смещение по вертикали, м». Работает поверх
      любого источника высоты, включая укладку на поверхность.
      Небольшой подъём убирает спор за глубину, когда линия лежит
      ровно на поверхности.
    0.40.0
    - Новый источник высоты у векторного слоя: «Отметка
      с поверхности». Растровый слой выбирается строкой ниже,
      и отметка читается в каждой вершине, поэтому объект ложится
      на рельеф, а не встаёт на общую отметку.
    - Там, где у поверхности нет данных, объект обрезается. Точка
      выбрасывается, ломаная рвётся на куски, а треугольник тела
      с пропуском в любой вершине не строится вовсе. Ноль это
      отметка, а не отсутствие отметки, и сажать на него нельзя.
    - Работает у точек, линий, контуров и тел. Слой без выбранной
      поверхности отказывается с внятной строкой, а не молчит.
    0.39.0
    - Список слоёв в окне строится в порядке дерева карты, сверху
      вниз. Раньше он брался из словаря слоёв, у которого порядка
      нет вовсе, и список выходил случайным.
    - Верхний слой карты рисуется поверх нижнего. Совпадающая
      геометрия иначе спорит за глубину: изолинии то видны,
      то тонут в поверхности, на которой лежат. Подъём считается
      от места в списке и на глаз не заметен.
    - Список сцены следует за деревом карты сам: добавили слой,
      убрали, переставили - список обновляется, а кнопка обновления
      подсвечивается. Сцена при этом не пересобирается.
    - Точку опроса можно убрать. Клик по пустому месту снимает её,
      Esc вне режима рисования тоже, и кнопка очистки теперь снимает
      обрезку, наброски и точку разом.
    0.38.0
    - Сцена приведена к системе координат проекта, как холст карты.
      Раньше преобразования не было вовсе: слой попадал в сцену
      в своих координатах, слой в другой системе уезжал в сторону,
      а смена системы координат слоя ничего не меняла, потому что
      записанные координаты она и не двигает.
    - Переводятся тела, линии, точки, скважины, контур обрезки
      и сетка растровой поверхности. Отметка не трогается,
      она и так в метрах.
    - Значения растра читаются в его собственной системе: окраска
      по каналу, внешний атрибутный растр, шкала слоя, опрос
      по клику и поиск поверхности лучом. Иначе всё это брало бы
      значения мимо данных.
    - Обрезка растра считается по его сетке, поэтому контур
      переводится обратно в систему слоя.
    - В строке состояния печатается, сколько слоёв перепроецировано.
    0.37.0
    - Поверхность красится шкалой самого слоя. Читается то же
      оформление, что рисует карту: непрерывная шкала, ступенчатая,
      точная и палитра классов. Раньше растр без заданного канала
      окраски уходил в сцену ровным цветом из палитры, и синь-зелень-
      краснота с холста пропадала.
    - Порядок источников цвета: текстура карты, заданный канал
      окраски, внешний атрибутный растр, шкала слоя, палитра.
      Выбранное руками главнее оформления.
    - Своя шкала слоя главнее общей шкалы сцены. Общая растягивается
      сразу на все слои, и расцветка ушла бы от карты ровно там,
      где её просили повторить.
    - Значения вне шкалы прижимаются к её концам, пропуски уходят
      серым.
    0.36.0
    - Точки в сцене рисовались аддитивным смешением, как оно задано
      по умолчанию в pyqtgraph. Фон сцены почти белый, и точки
      выцветали в него целиком. Теперь непрозрачно, как всё остальное.
    - Точки берут цвет из стиля слоя, как линии и тела.
    - Класс, снятый в легенде слоя, больше не попадает в сцену: ни
      телом, ни линией, ни точкой. Нечитаемый стиль при этом ничего
      не прячет, эти два случая различаются.
    - В журнал по стилю слоя пишется, сколько объектов скрыто классами.
    0.35.0
    - Линии в сцене красятся по стилю слоя, как это давно делают тела.
      Изолинии почти всегда раскрашены по отметке, а в сцену шёл один
      цвет на весь слой: вместо шкалы глубин выходила ровная бурая
      паутина. Полигоны в режиме контура красятся так же.
    - Заданный в свойствах слоя цвет по-прежнему главнее стиля,
      и тогда стиль не читается вовсе.
    0.34.0
    - Разбор тел с переменной отметкой пошёл через кэш. Кэш
      триангуляции был, но этот путь мимо него шёл: слой из 237 тел
      разбирался заново на каждое нажатие кнопки обновления.
      Теперь повторная сборка берёт готовое, а в строке состояния
      видно, сколько разбивок пришло из кэша.
    - У разбора по кольцам свой ключ кэша. Плоская разбивка и разбивка
      по кольцам для одного объекта дают разное, и подменять одну
      другой нельзя: в плане вертикальная стенка вырождается в линию.
    0.33.0
    - Тела показывались не полностью не из-за памяти, а из-за бюджета
      вершин. Бюджет делился между всеми отмеченными векторными
      слоями, хотя линии и точки из него не берут ничего: отмеченный
      слой изолиний забирал половину, и слой тел обрезался. Теперь
      бюджет делится только между слоями, которые идут телами.
    - Сообщение об урезании называет числа: сколько вершин набрано
      и каков предел. Прежнее «показаны первые 237» читалось как
      нехватка памяти, а крутить было нечего.
    - Предел вершин на сцену вынесен в свойства сцены и хранится
      в проекте. Умолчание прежнее, шестьсот тысяч.
    0.32.0
    - Сцена считается по кнопке «Обновить сцену». Отметки видимости
      и ползунки теперь только записывают, что показывать. Раньше
      каждый щелчок в списке тянул полную пересборку, и на тяжёлом
      кубе это выглядело зависанием.
    - Кнопка обновления стоит первой на плашке инструментов
      и отделена разделителем от остальных.
    - Пока показанная сцена отстаёт от настроек, кнопка подсвечена,
      а в строке состояния написано, что нажать.
    - Галка «Обновлять автоматически» осталась, но по умолчанию снята.
      При её включении сцена подтягивается сразу.
    0.31.1
    - Умолчания 2.01 были тяжёлые: 36 скважин с пробой 2 м давали
      3389 проб, и на них интерполяция считалась долго. Стало
      25 скважин с пробой 3 м, это 1547 проб. Тело по-прежнему
      воспроизводится, цепочка по умолчанию идёт около двух секунд
      вместо семи.
    - При числе проб больше двух тысяч 2.01 предупреждает в журнале:
      узел в объёме взвешивается по всем пробам, и время растёт
      вместе с их числом.
    - Интерполяция в объёме считает расстояния блоками узлов через
      произведение матриц, а не по одному узлу. Ускорение около
      полутора раз, расхождение с прежним расчётом до 1e-10
      от округления.
    - Воксели оценивают размер до сборки. Счёт видимых граней идёт
      на NumPy и стоит доли секунды, а сборка при миллионах граней
      уводила окно в неотзывчивость. Выше полутора миллионов граней
      сцена не строится, а в журнал пишется число и что покрутить.
    0.31.0
    - Инструмент 2.03 «Куб в блочную модель». Точка-центроид
      на занятую ячейку, поля bid, lev, row, col, x, y, z, dx, dy, dz,
      vol, val, cls, при заданной плотности dens и ore_t. Дальше
      работает обычный векторный аппарат QGIS.
    - Инструмент 2.04 «Тело куба вокселями». Слой MULTIPOLYGON Z,
      объект на интервал окраски. То же, что видно в сцене, но слоем.
    - Найден и закрыт защип по ребру: две ячейки, соприкасающиеся
      одной диагональю, дают ребро на четырёх гранях, и проверка
      замкнутости такое тело отвергает. Инструмент 2.04 считает
      защипы и по умолчанию убирает их заполнением угла. Проверено
      сквозь GeoPackage внешней проверкой оболочек.
    - Выключатель слияния граней выведен в свойства слоя окна
      просмотра. Со слиянием сцена в разы легче, без слияния
      оболочка замкнута.
    0.30.0
    - Новый режим слоя «Воксели по кубу». Ячейка показывается коробкой,
      цвет по интервалу содержания. Куб перестал быть просто набором
      каналов: у него появилась форма, которую видно.
    - Строятся только видимые грани. Грань между двумя занятыми
      соседями не видна никогда, поэтому её отбрасывают. На кубе
      двести на двести на сто это сто двадцать шесть тысяч граней
      вместо двадцати четырёх миллионов.
    - Соседние грани одного интервала сливаются в прямоугольник.
      Демонстрационный пласт на четырёх миллионах ячеек даёт
      тридцать четыре тысячи прямоугольников и две с половиной
      мегабайты сцены, сборка около секунды.
    - Обрезка контуром и коридором работает и для вокселей. Там это
      отбор ячеек, поэтому крышку строить не нужно и срез выходит
      плоским сам по себе.
    - Число интервалов окраски задаётся в свойствах слоя. Чем меньше
      интервалов, тем крупнее прямоугольники и легче сцена.
    - Слияние можно выключить: тогда каждая видимая грань идёт
      отдельно и каждое ребро принадлежит ровно двум граням. Это форма
      для подсчёта объёма, а слитая - для показа.
    - Инструмент 2.01: прямоугольник площадки задаётся координатами
      левого нижнего угла, шириной и высотой. Охват, если он задан,
      по-прежнему главнее.
    0.29.0
    - Инструмент 2.01 переписан. Тип залежи выбирается: пласт
      со складкой и падением, линза, крутая жила. Пласт нужен, чтобы
      было видно, как горизонтальные уровни куба режут залежь поперёк.
    - Опробование идёт интервалами: поля from_m и to_m вместо одной
      глубины, длина пробы задаётся в метрах. Добавлено поле zone,
      единица внутри тела.
    - Сеть скважин со сбивкой, устья по рельефу, глубина разная, часть
      скважин недобурена. Правильная сетка одинаковой глубины давала
      интерполяции слишком лёгкую задачу.
    - Содержание с плоской вершиной и быстрым спадом. Граница тела там,
      где содержание падает до половины ядра над фоном, отсечка
      печатается в журнал. Внутри тела содержание меняется по площади,
      поэтому методы расходятся между собой.
    - Шум логнормальный: отрицательных содержаний не возникает
      и обрезка по нулю больше не смещает выборку.
    - Исправлено: размер площадки в модели содержаний подменялся
      номером скважины, и у первой скважины содержание считалось
      делением на ноль.
    - Модель вынесена в demo3d.py и проверяется отдельно,
      семнадцать проверок.
    0.28.0
    - Группы пронумерованы: «1. Пласт и блочная модель»
      и «2. 3D-интерполяция». Номера инструментов приведены к номеру
      группы: 2.01 и 2.02 вместо 3.01 и 3.02. Прежние взялись
      из нумерации Isoliner, где эта ветка третья, а здесь группа всего
      вторая.
    - В демонстрационных точках задаётся охват площадки: можно выбрать
      окно карты или слой, а не только сторону квадрата от начала
      координат. Так демо ложится на реальный участок.
    0.27.1
    - Инструменты не открывались в QGIS 4: базовый класс Processing
      больше не даёт метод перевода, а им пользуются все инструменты.
      Метод заведён в своём базовом классе, разом для всех.
    0.27.0
    - Инструмент 3.02: интерполяция точек в объёме, ближний сосед
      и обратные расстояния. Результат многоканальный грид, канал это
      уровень, отметка первого уровня и шаг пишутся в метаданные,
      поэтому куб сразу показывается изоповерхностью и читается
      блочной моделью.
    - Анизотропия задаётся отношением вертикального масштаба
      к горизонтальному: без неё ближайшей точкой оказывается соседняя
      скважина, а не соседний замер в той же точке плана.
    - Поиск соседей идёт по ячейкам, а не перебором: на четырёх
      миллионах узлов перебор всех точек не проходит.
    - Узлы, где точек в радиусе меньше нужного, остаются пропуском.
    0.26.0
    - Новая группа «3D-интерполяция» и первый инструмент 3.01:
      демонстрационные точки в объёме. Скважины с замерами по глубине,
      плавная рудная линза и шум, содержание без шума пишется отдельным
      полем. Истина известна, поэтому на этих данных сравниваются методы
      интерполяции: ошибка считается по расхождению с моделью, а не
      на глаз. Линза по горизонтали шире, чем по вертикали, поэтому
      на ней проверяется и анизотропия.
    0.25.0
    - Куб значений показывается изоповерхностью: в свойствах растрового
      слоя появился режим «Изоповерхность по кубу» и отсечка. Каналы
      грида считаются уровнями, отметка первого уровня и шаг берутся
      из метаданных. Оболочка замкнута, поэтому по ней считается объём,
      режется контуром и коридором и выгружается в GLB наравне
      с остальным.
    0.24.0
    - Изоповерхность по кубу значений: оболочка по отсечке из
      многоканального грида. Взят марш по тетраэдрам, а не по кубам:
      у кубов есть неоднозначные случаи, на которых соседние ячейки
      расходятся и оставляют дыру, а нам нужна замкнутая оболочка.
      Грани разворачиваются наружу по данным, поэтому по такому телу
      считается объём. Пропуски остаются снаружи.
    0.23.0
    - При выгрузке в GLB спрашивается, применить ли вертикальное
      преувеличение. Настоящие высоты верны для расчёта, но пласт
      в километры по площади и десятки метров по мощности сплющивается
      в блин, и для показа нужна модель как на экране.
    0.22.2
    - В журнал пишется состав выгрузки: какие части собраны и сколько
      в них вершин и граней. По этой строке видно, доходит ли слой
      до файла вообще.
    0.22.1
    - В выгрузку GLB попадают и поверхности с текстурой: прежде они
      пропускались, и в файле оставались только слои, рисуемые цветом.
      Сама текстура пока не уходит, поверхность выгружается ровным
      цветом: для картинки нужны координаты текстуры у каждой вершины
      и сама картинка внутри файла.
    0.22.0
    - Выгрузка сцены в файл GLB. Формат выбран из-за читателей: его
      открывают браузерные просмотрщики, Blender и Windows, поэтому
      модель можно просто отправить письмом. Выгружается ровно то, что
      видно, включая обрезку, с цветами в вершинах. Координаты пишутся
      настоящие, без центрирования сцены и без вертикального
      преувеличения: преувеличение это способ смотреть, а не свойство
      модели.
    0.21.1
    - Убраны прежние подходы к срезу: отбор граней по центру и лента
      между отметками. Работает разрезка граней по контуру с крышкой
      по кольцам среза, две реализации одного и того же держать рядом
      незачем.
    0.21.0
    - Замкнутые оболочки режутся контуром и срез закрывается крышкой.
      Рёбра отверстия собираются в кольца, кольцо перекладывается
      в координаты «путь вдоль контура на отметку», где оно плоское,
      там разбивается и возвращается обратно. Открытым поясам крышка
      не строится: замкнутость определяется по рёбрам.
    0.20.1
    - Грани, пересечённые контуром обрезки, режутся по нему, а не
      отбираются по своему центру. У пояса встречаются треугольники
      крупнее коридора: по центру они торчали за краем. Новым вершинам
      высота берётся из плоскости исходной грани.
    0.20.0
    - Пояса режутся по треугольникам, а не выбрасываются целиком
      по центру объекта. Это открытые поверхности, крышка на срезе им
      не нужна, поэтому край идёт по контуру обрезки. Прежде пояс либо
      оставался весь, либо исчезал весь.
    0.19.4
    - В журнал пишется, какие цвета прочитаны из стиля слоя: по этой
      строке видно, читается ли стиль вообще, или дело в отрисовке.
    0.19.3
    - Тела из векторных слоёв рисуются без затенения. Цвет берётся
      из стиля слоя, а затенение его умножало и уводило оранжевый
      в бурый. Пояса плоские, светотень им ничего не добавляет,
      а совпадение с картой важнее.
    0.19.2
    - Грани тел разворачиваются нормалью вверх. Прежняя попытка
      дублировать грань обратной копией оказалась неверной: копия
      ложится ровно на оригинал, две грани спорят за глубину, отчего
      появляются полосы, а цвет уходит в чёрный.
    - Цвет объекта берётся из стиля слоя QGIS, если свой цвет не задан:
      как слой покрашен на карте, так он выглядит и в объёме. Своей
      легенды не заводим, раскраска уже сохраняется вместе с проектом.
    0.19.0
    - Объект с переменной высотой разбирается по кольцам, каждое в своей
      плоскости. Разбивка в плане не годится для вертикальных стенок:
      там кольцо вырождается в линию, и грань превращалась в мусор.
      Нормаль кольца берётся по формуле Ньюэлла, то есть по всему
      кольцу, а не по первым трём точкам.
    0.18.3
    - Обрезка объёмных тел отключена: отбор треугольников по центру
      с крышкой по линии реза давал рваную оболочку на юбках. Такие тела
      снова показываются или скрываются целиком, как в 0.17. Срез по ним
      требует разрезки треугольников плоскостью, это отдельная работа.
      Обрезка призм, поверхностей, линий и точек работает как прежде.
    0.18.2
    - Обрезанное тело разбивается так же, как необрезанное: в новой ветке
      полигон снова уходил на веерную разбивку, и на плоском контуре она
      тянула лучи через всю фигуру.
    - Отбор треугольников считается разом по массиву, а не по одной
      точке: на слое из десятков тысяч треугольников сборка занимала
      почти сорок секунд.
    0.18.1
    - Тела с объёмной геометрией (юбки, полиэдры) режутся контуром,
      и срез закрывается крышкой: в каждой точке линии реза берётся
      интервал, который тело занимает по вертикали, и строится лента.
      Прежде на месте среза была дыра, сквозь которую видна изнанка
      оболочки.
    0.18.0
    - Призмы режутся контуром по-настоящему: контур объекта пересекается
      с областью обрезки, и призма строится по новому контуру заново
      вместе с крышками. Срез получается закрытым, а не дырой в оболочке,
      и виден как разрез. Прежде объект выбрасывался целиком по своему
      центру.
    0.17.0
    - Вытягивание объектов от поверхности: низ призмы берётся с выбранного
      растра, верх это низ плюс высота из поля. Подошва дома садится
      на рельеф, а не на общую отметку. Прежний вариант «от поля до поля»
      остался.
    - Настройки сцены сохраняются в проект QGIS и восстанавливаются при
      открытии окна: отмеченные слои, свойства каждого, преувеличение,
      разнос, прозрачность, разрешение текстуры, обрезка вместе
      с нарисованными контуром и линией. Отдельного файла нет намеренно:
      настройки описывают те же слои и должны ехать вместе с проектом.
    0.16.3
    - Разметка кладётся на один уровень над сценой. Отметка вершины
      берётся с поверхности только ради попадания луча, для обрезки
      важно плановое положение, а разброс высот при вертикальном
      преувеличении читался как ошибка.
    0.16.2
    - Окно снова не открывалось: обработчик показа разметки трогал сцену,
      которой ещё нет. Сцена объявлена заранее, обработчики проверяют,
      что она уже создана.
    - Изолинии и прочие векторы теперь режутся с первой же сборки: контур
      обрезки сбрасывался после их разбора, и они резались по прошлому
      состоянию.
    - Размечать можно и в сцене без растровых поверхностей: вершина
      берётся с уровня середины сцены. Раньше на слое одних изолиний
      нарисовать линию обрезки было нечем.
    0.16.1
    - Окно не открывалось: кнопка показа разметки включается при сборке
      окна и вызывала перерисовку раньше, чем появлялось состояние сцены.
      Всё состояние теперь заводится до создания виджетов, а тест это
      стережёт.
    0.16.0
    - Обрезка режет и векторные слои, а не только растры. Линии рвутся
      там, где выходят за кусок, точки и скважины отбираются по своему
      положению, тела по центру объекта. Раньше изолинии и разломы
      торчали за краем обрезанной модели.
    - Контур обрезки считается один раз за сборку, а не на каждую
      вершину.
    0.15.1
    - Перечисления Qt берутся по имени через getattr во всех местах:
      ветвление через hasattr оставляло в коде короткое имя, и проверка
      совместимости с Qt6 на него ругалась. Вызов exec_ заменён на exec,
      взятый по имени: в Qt6 подчёркнутого варианта нет.
    0.15.0
    - Показ разметки включается и выключается кнопкой: контур и линия
      разреза нужны, пока размечаешь, и мешают, когда смотришь результат.
      Обрезка при этом продолжает работать.
    0.14.5
    - Замыкание контура больше не выворачивает обрезку наизнанку: режим
      куска мог остаться от работы с линией, а в обрезке по контуру всё,
      кроме «оставить внутри», понималось как «убрать внутри». Теперь
      контур ставит осмысленное умолчание, а вывернутым считается только
      явный вариант «убрать внутри».
    0.14.4
    - Исправлена отрисовка контура поверх модели: в опциях отрисовки
      был передан лишний ключ и функция смешивания вместе с аргументами,
      из-за чего линия не рисовалась вовсе. Набор ключей теперь повторяет
      штатный, только проверка глубины выключена.
    0.14.3
    - Нарисованный контур и линия рисуются поверх модели, не считаясь
      с глубиной: высота вершин для работы не нужна, важно плановое
      положение, а линия, спрятанная под складкой рельефа или под
      верхним пластом, мешает постоянно.
    0.14.2
    - Кнопки на панели над сценой снова отзываются на наведение
      и нажатие: стиль плашки распространялся на кнопки внутри и стирал
      у них подсветку. Нажатая кнопка режима теперь видна по заливке.
    0.14.1
    - Прежние наброски больше не висят поверх модели: они живут вне
      списка элементов сцены, и при пересборке обнулялась только ссылка,
      а сама линия оставалась в сцене.
    - Клик при рисовании попадает только по видимой части модели. Луч
      ищет пересечение по исходным гридам, поэтому вершина ставилась
      и там, где сцена уже обрезана.
    0.14.0
    - Появилась настоящая параллельная проекция и кнопка переключения
      между ней и перспективной. Вид сверху включает её сам: план
      с перспективой это не план, объекты на разной высоте смещаются
      в кадре и перестают совпадать в плане. Прежний приём со сжатием
      раствора камеры убран: он уводил камеру далеко и портил точность
      буфера глубины, отчего близкие поверхности спорили полосами.
    0.13.4
    - Убрана рябь между близкими поверхностями на виде сверху: раствор
      камеры в один градус уводил её слишком далеко, и буфер глубины
      терял точность. Теперь двенадцать градусов, перспективы почти нет,
      а глубина считается верно.
    - После обрезки сцена снова попадает в кадр: если охват изменился
      заметно, камера кадрируется заново.
    - Новая кнопка снимает обрезку и убирает наброски, возвращая сцену
      целиком.
    0.13.3
    - Вид сверху стал настоящим планом: раствор камеры сжимается почти
      до нуля, расстояние растёт так, чтобы масштаб не менялся. Раньше
      вид сверху оставался перспективным, и объекты, лежащие выше,
      уезжали в кадре к краям: нарисованная линия переставала совпадать
      с коридором, собранным из нескольких поверхностей.
    0.13.2
    - Полуширина коридора вводится прямо на панели над сценой, рядом
      с кнопкой линии, и видна только тогда, когда режут коридором.
      В свойствах сцены её никто не искал.
    0.13.1
    - В сцене рисуется не только замкнутый контур, но и линия: кнопка
      «Завершить линию» отдаёт её в обрезку коридором и сама включает
      нужный режим. Контур режет площадь, линия режет вдоль профиля.
    - Наброски показываются только пока они режут сцену: нарисованный
      контур больше не висит поверх модели, когда обрезка идёт по другому
      слою.
    0.13.0
    - Резать сцену можно и линией, не только контуром. В списке обрезки
      появились линейные слои, а в вариантах куска: слева от линии,
      справа и коридор вдоль неё с заданной полушириной. Коридор даёт
      профиль разреза вместе с данными по обе стороны, а не голую линию.
    - Сторона считается по ближайшему звену, поэтому на изломах ломаной
      она меняется там же, где меняется ближайшее звено.
    0.12.5
    - Нарисованный контур больше не расходится с моделью. Он живёт
      в координатах сцены, а центр сцены меняется вместе с данными:
      после обрезки охват уменьшался, и линия оставалась висеть
      по прежнему центру. Теперь контур перерисовывается при каждой
      сборке.
    0.12.4
    - На панель сцены вернулся вид сверху: рисовать контур по плану
      удобнее именно с него.
    0.12.3
    - Подсказка держится всё время рисования и показывает число вершин,
      а не гаснет после первого клика.
    - За курсором тянется резинка от последней вершины, поэтому видно,
      куда ляжет следующая сторона.
    - В режиме рисования правая кнопка снимает последнюю вершину: она
      отбирается у камеры только на это время.
    0.12.2
    - Вершины больше не ставятся в пустоту: поблажка на попадание
      впритирку убрана, точка берётся только при настоящем пересечении
      луча с поверхностью.
    - Снять последнюю вершину и замкнуть контур теперь можно кнопками
      рядом со значком рисования: правая кнопка и Esc в сцене заняты
      камерой и до рисовалки не доходили.
    0.12.1
    - Рисование контура стало попадать. Луч бьётся вчетверо мельче
      (4096 отсчётов вместо 512), а если пересечения нет, но луч прошёл
      впритирку к поверхности, точка берётся по ближайшему сближению
      в пределах четверти ячейки.
    - Правая кнопка снимает последнюю вершину, Esc отменяет рисование,
      Backspace тоже снимает вершину. Красный шарик опроса убирается
      при входе в режим рисования.
    0.12.0
    - Инструменты переехали на сцену маленькими значками, как на холсте
      карты: рисование контура, сохранение контура слоем, копирование
      и сохранение снимка, пересборка при снятом автообновлении. Список
      слоёв больше не тесним кнопками. Значки рисуются кодом, поэтому
      одинаково выглядят в светлой и тёмной теме.
    0.11.1
    - В режиме рисования контура отказ больше не молчит: клик мимо
      поверхности и отсутствие растровых поверхностей в сцене
      объясняются в строке состояния.
    0.11.0
    - Контур обрезки рисуется прямо по сцене. Кнопка «Рисовать контур»,
      клик по поверхности ставит вершину, двойной клик замыкает. Готовый
      контур сразу режет сцену, кнопка «Контур в слой» сохраняет его
      слоем проекта.
    0.10.0
    - Обрезка сцены по контуру. В свойствах сцены выбирается любой
      полигональный слой и что показать: кусок внутри контура или всё
      остальное. Поверхности и тела пластов режутся по границе контура,
      а не по прямоугольнику охвата, дырки контура остаются дырками.
    0.9.5
    - Кадр сцены копируется в буфер обмена кнопкой «Копировать снимок»
      или сочетанием Ctrl+C: чаще всего снимок нужен, чтобы сразу
      вставить его в письмо или в записку, а не хранить файлом.
    0.9.4
    - На время сборки сцены курсор меняется на часы, а в строке
      состояния стоит «Собираю сцену…». Полоса не годилась: сборка идёт
      в потоке интерфейса, и бегущая полоска всё равно не двигалась бы.
    - Кнопок видов больше нет, сцена крутится мышью. Внизу осталась одна
      кнопка «Сохранить снимок…». Кнопка сборки появляется только тогда,
      когда снята галка «Обновлять автоматически».
    - Из строки состояния убрана подпись о числе поверхностей.
    0.9.2
    - Исправлена рекурсия в приёмнике элементов сцены: массовая замена
      вызовов переписала и его собственное тело, поэтому сборка падала
      с maximum recursion depth exceeded. Добавлена проверка, которая
      ищет вызовы по кругу между методами окна.
    0.9.1
    - Сбой сборки сцены больше не выглядит пустым окном: причина
      выводится в строку состояния, полный след уходит в журнал
      сообщений QGIS, раздел Isoliner3D.
    0.9.0
    - Галка слоя прячет и показывает его сразу, без пересборки сцены:
      элементы уже лежат в видеопамяти, поэтому отклик мгновенный
      на сцене любой тяжести.
    - Правка свойств сама пересобирает сцену, с задержкой в четверть
      секунды после последнего изменения, чтобы кручение ползунка
      не вызывало десяток сборок подряд. В свойствах сцены есть галка
      «Обновлять автоматически» на случай тяжёлой сцены.
    - Тела, линии и точки собираются в один меш на слой, а не на всю
      сцену: иначе слой нельзя было спрятать, не пересобирая всё.
    0.8.3
    - Убраны семь конструкций except/continue, на которых сканер каталога
      QGIS отклоняет загрузку (B112). Добавлена проверка, которая ищет
      такие места и не даёт им вернуться: сканер сообщает о них только
      при отправке, поэтому ловить их надо у себя.
    0.8.2
    - Слой, свойства которого ни разу не открывали, рисуется по своим
      умолчаниям. Показ читал словарь настроек напрямую и на пустой
      записи брал контурный режим, поэтому полигоны с Z выходили
      линиями, хотя в свойствах стояло «Телом (заливка)». После
      переустановки плагина словарь пуст, отсюда линии вместо тел.
    - Полигоны в режиме призмы больше не дублируются контуром.
    0.8.1
    - Поверхность полигона с переменной Z строится триангуляцией Делоне
      с сохранением вершинных отметок. Прежде такой объект уходил на
      веерную разбивку: она рассчитана на простые грани полиэдра, а на
      поясе между изолиниями тянула лучи через фигуру и теряла
      внутренние кольца. Пояс с нижней границей на одном уровне и
      верхней на другом теперь выходит скатом, шапки вершин и днища
      впадин остаются плоскими.
    - Распознавание плоского объекта смотрит все вершины, а не первые
      4096. Обход контура идёт сначала по одной границе, поэтому пояс в
      двадцать пять тысяч вершин объявлялся плоским по своему началу и
      скат превращался в плиту.
    - Отбор объектов в сцену считает вершины, а не объекты. Слой из 1174
      поясов показывался наполовину, упираясь в потолок в пятьсот
      объектов, тогда как весит он меньше одного растра.
    - Триангуляция Делоне без ограничений (сборки без GEOS 3.11)
      отсеивает треугольники вне фигуры по центру. Раньше на вогнутом
      контуре она затягивала заливы и закрывала дыры.
    0.8.0
    - Показ полигонов призмой: контур выдавливается от поля низа до поля
      верха, получаются две крышки и вертикальные стенки. Так ступени
      рельефа, уступы карьера и подсчётные блоки с кровлей и подошвой
      становятся объёмом, а не стопкой плит.
    - Диагностика геометрии слоя: если все объекты плоские, в окно
      выводится их число, размах отметок и подсказка про призму.
    0.7.4
    - Кэш триангуляции полигонов. Разбивка повторялась на каждую сборку
      сцены, хотя геометрия не менялась: на пятистах контурах это шесть
      секунд каждый раз. Ключ считается без разбора геометрии: слой,
      объект, число вершин, охват и отметка. Потолок 128 МБ.
    0.7.3
    - Тела собираются в один меш вместо элемента на объект, цвет каждого
      хранится в вершинах. На 500 объектах это было 500 наборов буферов
      плюс нормали в двойной точности на каждый: сотни мегабайт при
      34 МБ полезных данных. Шарики на устьях скважин собраны так же.
    - Прореживание считает бюджет вершин на всю сцену, а не потолок
      на слой. Одиночная поверхность получает вдесятеро больше деталей,
      чем раньше, а тяжёлая пачка перестаёт складывать миллионы вершин.
    - В отчёт перестройки добавлена оценка занятой видеопамяти.
    0.7.2
    - Честная триангуляция подключена и к полигонам со своей высотой Z.
      Раньше она работала только при отметке из поля, а плоский контур
      с собственной Z по-прежнему разбивался веером и давал лучи через
      всю фигуру. Теперь плоский объект распознаётся по постоянной Z
      и разбивается Делоне, а настоящая поверхность с переменной Z
      идёт прежним путём: её грани простые, веер для них верен.
    0.7.1
    - После слияния списков отбор слоёв перестал фильтровать по типу:
      векторный слой уходил в чтение как растр, не открывался и попадал
      в «Пропущено», хотя рисовался телами. Отбор снова разделён.
    0.7.0
    - Вкладки убраны, список слоёв один: растры и векторы вместе, как
      в дереве QGIS, тип слоя помечен в строке. Первой строкой закреплена
      «Сцена». Фильтр действует на весь список.
    - Разрез стал свойством линейного слоя: галка «Показывать плоскостью
      разреза» и выбор чертежа в свойствах. Отдельная вкладка не нужна,
      а разрезов в сцене может быть несколько, каждый со своим чертежом.
    - Окно свойств показывает набор по типу выделенного: растру каналы
      и окраска, вектору источник высоты и цвет, линейному слою вдобавок
      разрез, «Сцене» общие настройки.
    0.6.4
    - Кольца полигона больше не склеиваются в одну ломаную. Внутри части
      геометрии кольца идут подряд, и обход всех вершин соединял конец
      внешнего кольца с началом дыры: через фигуру тянулся прямой штрих,
      а на слое контуров рельефа такие штрихи давали паутину.
    - Число линий на слой ограничено полутора тысячами, с сообщением.
    0.6.3
    - У полигонального слоя появился выбор показа: контуром или телом.
      Вложенные контуры уровней осмысленно смотреть линиями, заливка
      нужна телам пласта и полиэдрам. Слой без Z по умолчанию идёт
      контуром, слой с Z телом.
    - Предупреждения выводятся в окно, а не только в журнал: нет высоты Z,
      не выбрано поле отметки, слишком много объектов.
    - Убрана подсказка над списком векторных слоёв.
    0.6.2
    - Полигоны разбиваются триангуляцией Делоне с ограничениями. Прежняя веерная разбивка годится для выпуклых
      граней полиэдра и на вогнутом контуре с дырами давала лучи через
      всю фигуру.
    - Несовместимые параметры слоя больше не выбираются: источник высоты
      гаснет у скважин, поле отметки доступно только при высоте из поля,
      поля отметок только в режиме скважин, «Своя высота геометрии»
      недоступна слою без Z и заменяется отметкой из поля.
    0.6.1
    - Линии и точки не рисовались вовсе: высота бралась через asPolyline
      и asPoint, а они отдают точки без Z. Теперь читаются настоящие
      вершины геометрии.
    - Полигональный слой без высоты Z больше не превращает сцену в кашу:
      такой слой пропускается с записью в журнал, а число объектов
      на слой ограничено пятьюстами.
    - Пустая сцена без объяснений заменена записью в журнал: не выбрано
      поле отметки, нет Z, слишком много объектов.
    0.6.0
    - Диалог перестроен. Все настройки убраны с главного окна в свойства:
      открываются двойным кликом по строке списка и правой кнопкой, как
      в QGIS. Первой строкой списка закреплена «Сцена», её свойства это
      преувеличение, разнос по Z, прозрачность и сторона текстуры.
    - Вкладка «Тела» стала «Векторами» и переехала на второе место.
      Она принимает любые векторные слои: полигоны с Z рисуются телами,
      линии и точки берут высоту из геометрии или из числового поля.
      Изолинии с отметкой в поле ложатся в сцену на своей высоте.
    - Скважины переехали в «Векторы» и стали режимом точечного слоя,
      поэтому вкладка «Разрезы» занята только разрезами.
    - Вокруг сцены появилась тонкая рамка, как у холста карты QGIS.
      Кнопки видов дополнены наклонным ракурсом.
    0.5.4
    - Выбранная окраска больше не сбрасывается на палитру при переходе
      на другой слой. Штатный findData сравнивает данные пункта через
      QVariant и на кортежах Python молча возвращает -1, поэтому в списке
      показывалась палитра, хотя в сцене оставалась прежняя окраска.
      Тем же были задеты списки чертежа разреза, скважин и каналов.
    0.5.3
    - В инструменте 1.07 вернулся вариант «Карта (растр для текстуры)»:
      при слиянии демо-инструментов он остался в коде, но пропал из списка
      вариантов и лишился своих параметров, поэтому выбрать его было
      нельзя. Добавлен тест: каждый вариант обязан быть виден в диалоге.
    0.5.2
    - Исправлен перенос группы инструментов из Isoliner: не были захвачены
      импорт QVariant и три служебных объекта пост-процессора мешей.
      Инструмент 1.04 при запуске падал, остальные при записи полей.
      Ошибку добавлен ловить новый тест: pyflakes по всем модулям
      с требованием нуля неопределённых имён.
    0.5.1
    - Первый выпуск. 3D-просмотр выделен в отдельный плагин из набора
      Isoliner. Поверхности из растров проекта, водонепроницаемые тела
      пластов из многоканальных гридов, скважины стволами с мачтами
      и подписями, плоскость разреза, полиэдры, TIN и MultiPolygon Z,
      опрос сцены кликом, снимок PNG. pyqtgraph и PyOpenGL в комплекте,
      устанавливать ничего не нужно.
    - Наложение карты на поверхность настоящей текстурой с затенением
      по нормали: ортофото, подложка, геологическая карта со всей
      символикой. Разрешение задаётся отдельно и от плотности сетки
      не зависит. Отдельно накладывается чертёж разреза на ленту,
      несколько разрезов показываются одновременно.
    - Группа Processing «Пласт и блочная модель», семь инструментов:
      сборка грида пласта, калькулятор запасов, блочная модель, экспорт
      поверхностей в меши 2DM, домены в канал пласта, разность запасов
      и генератор демонстрационных данных.
    - Кэш прочитанных гридов и отрисованных текстур: повторная сборка
      сцены идёт из памяти. Счётчики перестройки сцены в окне
      и с разбивкой по фазам в журнале сообщений.
    - Двуязычное руководство (PDF, RU и EN) в комплекте, открывается
      по языку интерфейса кнопкой Справка.
