Записывает в новую карту результат пересечения слоев карты с заданной областью.
Visual Basic:
Function CutLayersByRegion(Region, inCRS As CRS, destMapName As String, destMapUserName As String, DataSrc, flags As Long) As Long
Region - задает область пересечения.
На данный момент область можно задавать как Contour, PolyContour и Layer.Selection
inCRS - проекция в которой задана область.
destMapName - путь или URL карты для записи.
destMapUserName - пользовательское название карты.
DataSrc - имя источника базы данных.
Параметр может содержать либо строку конкретного источника данных, либо принимать одно из предопределенных значений:
$sqlite - база sqlite
$msaccess - база Microsoft Access
$localdb - база Microsoft SQL LocalDB
flags - флаги:
0x01 - наследовать ключи объектов,
0x08 - копировать только геометрию,
0x10 (16) - включать объекты полностью или частично попавшие в область,
0x20 (32) - включать объекты полностью попавшие в область,
0x10 + 0x20 - обрезать объекты по границе области,
0x80 (128) - помещать слои в подпапку с именем карты.
При успехе метод возвращает 0. Исходная карта не меняется: результат - новый файл карты по пути destMapName с названием destMapUserName, а слои пишутся рядом с ним под своими прежними именами файлов. С флагом 0x80 слои попадают в подпапку, названную по имени файла карты, а сам файл карты остается снаружи.
Что попадет в вырезку, решают флаги. С флагом 0x10 в карту попадает все, что задето областью, причем объекты на границе переходят целиком, без обрезки; с флагом 0x20 - только объекты, лежащие внутри. Сочетание 0x10 + 0x20 дает тот же результат, что и один флаг 0x20: объекты, пересекающие границу, в вырезку не попадают и не обрезаются.
Без флага 0x01 объекты в новом слое нумеруются заново с единицы, с ним сохраняют прежние ключи. С флагом 0x08 у нового слоя нет баз данных, хотя набор типов объектов остается прежним.
Если область не задевает ни одного объекта, карта все равно создается - с пустыми слоями, - и метод возвращает 0. Вместо системы координат можно передать Nothing - тогда область считается заданной в координатах карты.
В макросах на python метод недоступен: он возвращает -1 и ничего не создает - с любой областью (Contour, PolyContour, Layer.Selection), системой координат и источником данных.
Пример вырезает левую половину карты в новую карту с прежними ключами объектов и открывает результат.
Visual Basic:
Sub MapDoc_CutLayersByRegion 'Берем рабочую карту Set Doc = Zulu.ActiveMapDoc Set R = Doc.GetBoundsRectangle 'Область - левая половина карты, с запасом по краям Ym = (R.Ymin + R.Ymax) / 2 Set C = CreateObject("ZuluLib.Contour") C.AddPoint R.Xmin - 100, R.Ymin - 100 C.AddPoint R.Xmax + 100, R.Ymin - 100 C.AddPoint R.Xmax + 100, Ym C.AddPoint R.Xmin - 100, Ym '0x10 - все задетое, 0x01 - прежние ключи, 0x80 - слои в подпапку r = Doc.CutLayersByRegion(C, Doc.GetCRS, "C:\Data\cut.zmp", "Левая половина", "$sqlite", &H10 + &H1 + &H80) S = "CutLayersByRegion вернул " & r 'Открываем результат Set M = CreateObject("ZuluLib.MapDoc") If M.Open("C:\Data\cut.zmp") Then S = S & vbCrLf & "карта """ & M.Name & """, слоев " & M.Layers.Count For i = 1 To M.Layers.Count S = S & vbCrLf & M.Layers.Item(i).UserName & ": объектов " & M.Layers.Item(i).ElementKeys.Count Next End If MsgBox S End Sub