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 |
Обновление изображения Вида |