pointFtab=pointTheme.getftab pointShape=pointFtab.findfield("Shape") pointSrcName=pointFTab.GetSrcName |
Получение источника таблицы |
str_pointFileName=pointSrcName.GetName |
Получение имени файла источника |
StrLineName="line_"+str_pointFileName |
Создание имени нового файла. Разумеется, можно имя нового линейного файла задавать в диалоговом режиме, однако предлагаемый способ сохраняет преемственность имён файлов. |
PointFieldsList=pointFtab.GetFields |
Создание списка полей темы точек |
nPointFields=PointFieldsList.Count |
Определение числа полей в списке |
LineFieldsList=PointFieldsList.DeepClone |
Глубокое клонирование списка
полей. Глубокое клонирование создаёт копию не только самого списка, но и каждого его элемента, чем отличается от простого клонирования. Оно нам необходимо для создания списка полей новой линейной темы, т.к. линейные объекты должны наследовать семантику точечных объектов
|
LineFieldsList.Remove(0) |
Убираем первое поле – Shape, т.к. в новой таблице оно будет создано |
AtrNamesList=List.Make |
Создание списка имен атрибутивных полей |
IdenList=List.Make |
Создание списка идентификаторов атрибутивных полей |
for each pole in 1..(nPointFields-1) |
Цикл по всем атрибутивным полям таблицы точек, первое поле Shape пропущено |
tekpole=PointFieldsList.Get(pole) |
Получение текущего поля из списка |
tekName=tekpole.AsString |
Превращение его в строковый объект |
AtrNamesList.Add(tekName) |
Добавление имени поля в список имен атрибутивных полей |
iden=pointFtab.findfield(tekName) |
Получение идентификатора текущего поля |
IdenList.Add(iden) |
Его добавление в списка идентификаторов атрибутивных полей |
end |
Конец цикла |
nIdenList=IdenList.Count |
Подсчёт числа идентификаторов. Создание новой темы объектов Line (т.е. прямых отрезков) с атрибутикой Point |
lineName=StrlineName.AsFileName |
Создание объекта «имя файла» |
lineName.SetExtension("shp") |
Задание ему расширения "shp" |
lineFTab = FTab.MakeNew(lineName, Polyline) |
Создание новой атрибутивной таблицы объектов типа Polyline: каждый из них будет состоять из одного объекта Line |
nlinefields=LineFieldsList.Count |
Подсчёт числа полей в списке атрибутивных полей новой таблицы линейных объектов |
lineFTab.AddFields(LineFieldsList) |
Добавление списка атрибутивных полей в новую атрибутивную таблицу линейных объектов |
lineShape = lineFTab.FindField("Shape") |
Получение идентификатора поля Shape новой атрибутивной таблицы линейных объектов |
IdenLineList=List.Make |
Создание листа идентификаторов атрибутивных полей для новой темы |
for each pole in 0..(nLineFields-1) |
Начало цикла по всему списку атрибутивных полей создаваемой линейной темы |
teklinepole=LineFieldsList.Get(pole) |
Получение текущего поля из списка |
teklineName=teklinepole.AsString |
Получение имени поля как строкового объекта |
lineiden=lineFtab.findfield(teklineName) |
Получение идентификатора этого поля |
IdenLineList.Add(lineiden) |
Его добавление в лист идентификаторов |
end |
Конец цикла |
nIdenLineList=IdenLineList.Count |
Определение числа идентификаторов атрибутивных полей новой линейной темы |
Spis_List_V_in_rec=List.Make |
Создание списка списков значений атрибутивных полей |
Points=List.Make |
Создание списка точечных объектов |
for each rec_point in pointftab |
Начало цикла по записям таблицы точечной темы |
List_V_in_rec=List.Make |
Создание списка значений атрибутивных полей в данной записи |
for each atrpole in 0..(nIdenList-1) |
Начало цикла получения значений полей записи |
tekiden=IdenList.Get(atrpole) |
Получение текущего идентификатора поля |
tekzn = pointFtab.returnvalue(tekiden, rec_point) |
Получение значения поля |
List_V_in_rec.Add(tekzn) |
Его добавление в список значений полей записи |
end |
Конец цикла по полям |
obj_point = pointftab.returnvalue(pointShape,
rec_point)
|
Получение объекта - точки |
Points.Add(obj_point) |
Добавление точки в список точек |
Spis_List_V_in_rec.Add(List_V_in_rec) |
Добавление списка значений атрибутивных полей текущей записи в список |
end |
Конец цикла по записям таблицы точечной темы |
npoints=Points.Count |
Определение числа точек |
for each tochka in 0..(npoints-2) |
Начало цикла по точкам списка от первой до предпоследней |
ntochka=Points.Get(tochka) |
Получение текущей точки – начальной точки объекта Line |
ktochka=Points.Get(tochka+1) |
Получение следующей точки – конечной точки объекта |
linia=PolyLine.Make({{ntochka,ktochka}}) |
Создание линии |
rec_line=lineFTab.AddRecord |
Добавление новой записи в таблицу линейных объектов |
lineFTab.SetValue(lineShape, rec_line, linia) |
Запись в поле Shape таблицы созданной линии |
tekznachlist=Spis_List_V_in_rec.Get(tochka) |
Получение списка значений атрибутивных полей |
ntekznlst=tekznachlist.Count |
Определение числа значений в списке |
for each atrpole in 0..(nIdenLineList-2) |
Начало цикла по идентификаторам атрибутивных полей линейной темы |
tekpolelin=LineFieldsList.Get(atrpole) |
Получение текущего поля |
teklineiden=IdenLineList.Get(atrpole) |
Получение идентификатора текущего поля |
znach=tekznachlist.Get(atrpole) |
Получение значения текущего поля |
pole_class = tekpolelin.GetType |
Получение типа текущего поля |
if ((Pole_class=#FIELD_BYTE) or (Pole_class=#FIELD_DECIMAL) or (Pole_class=#FIELD_DOUBLE) or (Pole_class=#FIELD_FLOAT) or (Pole_class=#FIELD_LONG) or (Pole_class=#FIELD_SHORT)) then lineFTab.SetValueNumber (teklineiden,rec_line,znach) |
Запись значения в таблицу линейной темы в зависимости от типа поля
|
else
lineFTab.SetValue(teklineiden,rec_line,znach)
|
end |
|
end |
Конец цикла по идентификаторам |
end |
Конец цикла по точкам списка |
lineFTab.Flush |
Запись составляющих атрибутивной таблицы линейной темы в файлы |
lineFTab.Refresh |
Обновление таблицы по данным на диске |
lineName = lineName.AsString lineSrcName = SrcName.Make(lineName) lineTheme = Theme.Make( lineSrcName ) lineThemeName = lineSrcName.GetName nsimv=lineThemeName.Count |
Создание линейной темы и её добавление в Вид |
lineThemeName = lineThemeName.Left(nsimv-4) lineTheme.SetName(lineThemeName)lineThemeName |
Убираем в названии темы расширение |
theView.AddTheme(lineTheme) |
Добавление темы в Вид |
lineTheme.SetVisible(true) |
Установка её видимой |
theView.Invalidate |
Обновление изображения Вида |