SaveToLayer method (IReliefLayer)

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

Применяется к:

IReliefLayer

Синтаксис:

Visual Basic:

Function SaveToLayer(Path As String, UserName As String, nFlags As Long, vSrc As Variant) As Boolean

Path - имя слоя для записи.

UserName - пользовательское название слоя для записи.

nFlags - флаги, складываются:

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

1024 - создать описатель слоя

vSrc - с флагом 1 полный путь двоичного файла, иначе имя источника данных для таблицы.

Описание:

Каждый треугольник триангуляции становится отдельным площадным объектом нового слоя (графический тип eGraphTypePrimSquare из eElemGraphType). Сам слой рельефа при этом не меняется.

Вместе со слоем создаётся семантическая таблица со столбцами Sys, X, Y, Z, Ngb1, Ngb2, Ngb3: координаты центра треугольника и номера трёх смежных с ним треугольников. Номера ссылаются на Sys той же таблицы и взаимны; 0 означает, что с этой стороны соседа нет, то есть сторона лежит на границе триангуляции.

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

Флаг 1 отменяет создание семантической таблицы: вместо неё создаётся двоичный файл, полный путь которого задаётся в vSrc. Путь должен быть полным — при относительном имени файл не создаётся, хотя метод возвращает True. В файле лежат записи по 16 байт, по одной на треугольник и в том же порядке, что и строки таблицы: три четырёхбайтовых целых — номера смежных треугольников, затем четырёхбайтовое число с плавающей точкой — высота.

Флаг 1024 добавляет к слою файл-описатель с расширением zl. Флаги складываются: 1025 и описатель создаёт, и таблицу отменяет.

Без флага 1 аргумент vSrc задаёт источник данных для таблицы. Имя источника начинается со знака доллара: $sqlite, $msaccess, $localdb. Пустая строка равнозначна $sqlite: таблица ложится в файл с расширением sqlite рядом со слоем, а $msaccess создаёт вместо него базу Microsoft Access с расширением mdb.

Есть ещё имя $local — оно относится к локальным таблицам Paradox и оставлено только для совместимости со старыми версиями. В 64-разрядной программе оно не работает, а в 32-разрядной требует установленного BDE.

Если источник недоступен, таблица не создаётся вовсе, а метод всё равно возвращает True. Наличие таблицы стоит проверять по самому слою.

Пример:

Visual Basic:

Sub IReliefLayer_SaveToLayer
'Слой рельефа из примеров поставки
Set L = CreateObject("ZuluLib.Layer")
L.Open "C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr"
Set R = L.ReliefLayer
'Сохраняем треугольники триангуляции в новый слой
R.SaveToLayer "C:\Data\triangles", "Треугольники рельефа", 0, ""
'Возврату метода доверять нельзя, проверяем по самому слою
Set T = CreateObject("ZuluLib.Layer")
T.Open "C:\Data\triangles"
'Обход завершается по Key = -1, коллекция никогда не отдает Nothing
Set els = T.Elements
Set e = els.FirstItem
n = 0
Do While e.Key <> -1
  n = n + 1
  Set e = els.NextItem
Loop
MsgBox "Треугольников в слое: " & n
End Sub

Python:

import zulu

def Macro_IReliefLayer_SaveToLayer():
    # Слой рельефа из примеров поставки
    L = zulu.Layer()
    L.Open(r"C:\Program Files\ZuluGIS\Examples\Thermo\Kvartal\relief.ztr")
    R = L.ReliefLayer
    # Сохраняем треугольники триангуляции в новый слой
    R.SaveToLayer(r"C:\Data\triangles", "Треугольники рельефа", 0, "")
    # Возврату метода доверять нельзя, проверяем по самому слою
    T = zulu.Layer()
    T.Open(r"C:\Data\triangles")
    # Обход завершается по Key = -1, коллекция никогда не отдает None
    els = T.Elements
    e = els.FirstItem
    n = 0
    while e.Key != -1:
        n += 1
        e = els.NextItem
    print("Треугольников в слое:", n)