и сновас символы полилиний

0 голосов
спросил 21 Июль, 05 от BigSerg (4,080 баллов) в категории Программные продукты Esri
вроде как с символом(точка-тире) разобрался (см. по аналогичному запросу)
перейдем к CompositePen символам
Создаю символ присваиваю легенде темы - все нормально как и должно быть, добавляю его в палитру - он там выглядит красиво, но как только пытаюсь настроить на него другую тему - все рушиться. В чем я не прав????
Пример моего скрипта:

'определение темы, таблицы и легенды
th = av.GetActiveDoc.GetActiveThemes.Get(0)
ft = th.GetFtab
lgnd = th.GetLegend


' задание палитры
theSymWin = av.GetSymbolWin
aPaletteList = theSymWin.GetPalette.GetList( #PALETTE_LIST_MARKER )
theSymWin.Open
theSymWin.SetPanel(#SYMBOLWIN_PANEL_MANAGER)
thePalette = theSymWin.GetPalette


'размер символа
sz = 2


'создание CompositePen символа
sList = SymbolList.Make

bp = BasicPen.Make
bp.SetSize(sz)

mrk = BasicMarker.Make
mrk.SetStyle(#BASICMARKER_STYLE_PATTERN)
fnt = Font.Make("ESRI Cartography","Normal")
mrk.SetFont(fnt)
mrk.UnHook
mrk.SetSize(sz*5)
mrk.SetBgColor (Color.GetBlack)
mrk.SetCharacter(74)

vpm = VectorPenMarker.Make(mrk)
vpm.SetMarkLayer (sz*2,sz*2)
vpm.SetTemplate("081")
vpm.SetInterval(0.5)
vpm.SetAltSize (0)
vpm.SetSize(sz*5)


sList.Add(bp)
sList.Add(vpm)
compLine = Compositepen.Make( slist )

'задаем легенду
lgnd.SetClassInfo (0,{lgnd.ReturnClassInfo(0).Get(0),lgnd.ReturnClassInfo(0).G et(1),compLine.Clone,lgnd.ReturnClassInfo(0).Get(3),lgnd.Ret urnClassInfo(0).Get(4)})
th.UpdateLegend
theSymbol = lgnd.GetSymbols.Get(0)

'заносим новый символ в палитру
thePalette.GetList(#PALETTE_LIST_PEN).Add(theSymbol.Clone)
av.GetSymbolwin.RefreshPalette(#PALETTE_LIST_PEN)




6 Ответы

0 голосов
ответил 22 Июль, 05 от BigSerg (4,080 баллов)
как я понял вообще то это происходит со сменой размера символа CompositePen (команда SetSize).При установке этого символа из палитры Арка выполняет эту команду сама - поэтому все настройки слетают.Я так понимаю она выравнивает размеры BasicPen и VectorPenMarker и приравнивает их к размеру CompositePen. Как это можно вылечить?
0 голосов
ответил 28 Июль, 05 от BigSerg (4,080 баллов)
Неужели никто ничего не может предложить или хотябы пихнуть в нужном направлении??????
0 голосов
ответил 01 Авг, 05 от SV_P (9,350 баллов)

Hi Serge!

В такую жару разбираться в твоем скрипте как-то неохота, вот для примера можешь глянуть мой. Там создается палитра линейных символов вроде надвига. Потом ее можно открыть стандартными методами и покрасить любую линейную тему. И вроде-бы ничего не рушится (пока).

Успехов.

Сергей.

Для всех, кто будет делать свое: имейте ввиду, что определяющим размером в составном символе является размер первого символа списка. Поэтому  на первое место в команде SymbolList.FromList({b1,vpm2}) нужно ставить размер базовой линии.  Тогда размеры вашего символа будут приемлемыми (2-3-5). Если вы поставите вперед vpm2, то для получения заданного размера придется в данном случае в окне Палитры набрать 25, а у кого из пользователей хватит на это воображения?

'СВП-создание линий надвигов

'Создать асимметричные маркеры треугольников

mrk1 = BasicMarker.Make

mrk1.SetStyle(#BASICMARKER_STYLE_PATTERN)

mrk1.SetFont(Font.Make("ESRI Geology","Normal"))

mrk1.SetCharacter(40) 'угол вверх

vpm1 = VectorPenMarker.Make(mrk1)

vpm1.SetTemplate("13") '13

vpm1.SetInterval(1)

vpm1.SetMarkLayer(0,0.4)

vpm1.SetSize(25)

'vpm1.SetColor(Color.GetMagenta) 'SetRgbList(213,255,255)

' Создать сплошную линию

b1 = BasicPen.Make

b1.SetSize(3)

'b1.SetColor(Color.GetMagenta) 'можно и покрасить

mrk2 = BasicMarker.Make

mrk2.SetStyle(#BASICMARKER_STYLE_PATTERN)

mrk2.SetFont(Font.Make("ESRI Geology","Normal"))

mrk2.SetCharacter(52) 'полукруг

vpm2 = VectorPenMarker.Make(mrk2)

vpm2.SetTemplate("011") '"011313131313131"

vpm2.SetInterval(1)

vpm2.SetMarkLayer(0,0.3) 'для Х-а натуральная дурь

vpm2.SetSize(25)

'vpm2.SetColor(Color.GetMagenta)

'** Создать составные символы

aSymList = SymbolList.FromList({b1,vpm1})

CAIP1 = CompositeArcInfoPen.Make(aSymList)

aSymList = SymbolList.FromList({b1,vpm2})

CAIP2 = CompositeArcInfoPen.Make(aSymList)

aSymList = SymbolList.FromList({b1,vpm1,vpm2})

CAIP3= CompositeArcInfoPen.Make(aSymList)

'** Добавить символы к палитре линий

av.GetSymbolWin.Open

av.GetSymbolWin.SetPanel(#SYMBOLWIN_PANEL_PEN)

p = av.GetSymbolWin.GetPalette

pl = p.GetList(#PALETTE_LIST_PEN)

pl.Add(CAIP1)

pl.Add(CAIP2)

pl.Add(CAIP3)

av.GetSymbolwin.RefreshPalette(#PALETTE_LIST_PEN)

'** Создайте новую палитру и получите ее список линий

pal = Palette.Make

pens = pal.GetList(#PALETTE_LIST_PEN)

'** Добавьте символы в список линий новой палитры

pens.Add(CAIP1)

pens.Add(CAIP2)

pens.Add(CAIP3)

'** Сохраните новую палитру в файловой системе для последующего использования

'здесь нужно прописать свой путь или вставить окно запроса.

mypal = "d:/scriptest/Linestyles/tecline44.avp".AsFileName

pal.SaveToFile(#PALETTE_LIST_PEN,mypal)

0 голосов
ответил 01 Авг, 05 от BigSerg (4,080 баллов)
Здравствуйте SV_P
Ваш скрипт отличается от моего тем что я использовал класс символов CompositePen, а вы CompositeArcInfoPen
насчет того что не рушится это только для размеров > либо = 1.Если размер меньше 1 опять рушится.
Все равно спасибо за ответ.
0 голосов
ответил 02 Авг, 05 от SV_P (9,350 баллов)

Здравствуйте, BigSerg!

Проверил на разных размерах: 0,5 0,25 и 0,3. Сохранил легенду (avl). Создал вторую тему, покрасил ее той же avl-кой, закрыл проект и открыл его заново и ничего не упало.

Может все-таки что-то с данными? А может когда-то раньше Вы использовали Symbolizer? Я пару раз его пробовал - вот после него точно творится что-то непонятное, вплоть до segmentation.

Есть еще вариант, когда при оцифровке в Easy Trace некоторые темы имеют экстент намного больше, чем другие (за счет наличия какого-то ложного мелкого объекта "в стороне") и пока вручную не обрежешь тему до нужных размеров все время появляется segmentation.

Успехов.

0 голосов
ответил 02 Авг, 05 от BigSerg (4,080 баллов)
Я вообще то немного про другое
после того как сохранил нужную мне палитру
если при настройке легенды выбирать новый (полученный) символ и указывать ему размер меньше 1 то он становиться простой прямой линией с толшиной 0.1, если больше, то все в норме

Темы отцифровывал сам - никаких побочных эффектов не замечено - хранятся в Базе данных
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...