Метод приводит в соответствие записи базовой таблицы семантической базы данных, подключенной к слою, с графическими объектами слоя.
Visual Basic:
Function SynchronizeDatabase(BaseID As Long, Flags As Long) As Long
BaseID - ID базы данных слоя.
Flags - флаги:
1 - удаление записей, для которых нет графических объектов.
2 - создание пустых записей для графических объектов, у которых нет записей в базе данных.
3 - включает оба действия.
Параметр BaseID - это идентификатор базы данных слоя, который присутствует в списке баз слоя - Layer.Bases. Для примитивов BaseID хранится в свойстве Layer.BaseID. Для типовых объектов - Layer.ObjectTypes.Item(TypeID).BaseID.
Метод делает работу, но по возвращаемому значению об этом не судить: при флагах 1, 2 и 3 он отвечает -1 независимо от того, изменилось что-нибудь или нет, а при флаге 0 и на несуществующей базе - 0. Проверять нужно сами записи.
Например, если в слой добавлен типовой объект без записи в базе, вызов с флагом 2 создает для него пустую запись; если объект удален, а запись осталась, вызов с флагом 1 ее удаляет.
Пример добавляет в слой свой объект, создает для него запись в базе, а затем убирает и объект, и лишнюю запись.
Visual Basic:
Function Records(L, BaseID) Dim DS, n Set DS = L.OpenDatabase(BaseID, "").SelectAll n = 0 DS.MoveFirst Do While Not DS.Eof n = n + 1 DS.MoveNext Loop Records = n End Function Sub Layer_SynchronizeDatabase 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle S = "Объектов типа 3: " & L.SelectByType(3, 0).Count & ", записей в базе: " & Records(L, 3) 'Добавляем свой объект - записи в базе у него нет Key = L.AddSymbol(R.Xmax + 100, R.Ymin, 3, 1) S = S & vbCrLf & "после добавления объекта: " & L.SelectByType(3, 0).Count & " и " & Records(L, 3) 'Создаем недостающие записи L.SynchronizeDatabase 3, 2 S = S & vbCrLf & "после синхронизации (флаг 2): " & Records(L, 3) 'Убираем свой объект и оставшуюся без объекта запись L.DeleteElement Key L.SynchronizeDatabase 3, 1 S = S & vbCrLf & "после уборки (флаг 1): " & L.SelectByType(3, 0).Count & " и " & Records(L, 3) MsgBox S End SubPython:
import zulu def Macro_Layer_SynchronizeDatabase(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() def records(base_id): ds = L.OpenDatabase(base_id, "").SelectAll() n = 0 ds.MoveFirst() while not ds.Eof: n += 1 ds.MoveNext() return n print("Объектов типа 3:", L.SelectByType(3, 0).Count, ", записей в базе:", records(3)) # Добавляем свой объект - записи в базе у него нет key = L.AddSymbol(R.Xmax + 100, R.Ymin, 3, 1) print("после добавления объекта:", L.SelectByType(3, 0).Count, "и", records(3)) # Создаем недостающие записи L.SynchronizeDatabase(3, 2) print("после синхронизации (флаг 2):", records(3)) # Убираем свой объект и оставшуюся без объекта запись L.DeleteElement(key) L.SynchronizeDatabase(3, 1) print("после уборки (флаг 1):", L.SelectByType(3, 0).Count, "и", records(3))