RUS  ENG 

Расширенное управление надписью

Страницы: 1 2 След.
RSS
Расширенное управление надписью
 
Здравствуйте. Возможно ли расширить программное управление надписями для следующих случаев:
1) добавить управление видимостью надписей для типовых объектов в зависимости от:
а) режимов, например, для состояния типового объекта "Выключен" скрыть надпись автоматически или, например, показывать надпись только для потребителя СО, а для остальных потребителей (ГВС, СВ) 4-х трубной модели скрыть?
б) значения поля, например, для значения равного null (nil, blank, 0) автоматически скрывать поле надписи или ставить прочерк(если для надписи используется выносная линия с типом бирки "Угол с полками", то при неизвестных значениях полки пустые)?
2) добавить управление шрифтом надписи (цвет, шрифт, начертание, размер) в зависимости от значений полей, например, так как это сделано для тем.
За ранее благодарю за ответ.
 
Здравствуйте. Как выяснилось, что для надписи с полем, значение которого null, надпись не рисуется - это хорошо!:) Хотелось бы услышать ответ на предыдущий пост... Из оболочки zulu есть возможность хотя бы скрывать надпись из контекстного меню, можно ли скрыть элемент надписи над определенным объектом программно?
 
Kostya_LeoG, добрый день!
надписи делаются на все объекты одного типа в структуре, как же можно скрыть элемент надписи для одного определенного объекта. Это надо тогда выдумывать надпись, состоящую из двух различных надписей. Скрывать надпись можно из контекстного меню в окне "Рабочее место", но на все объекты данного типа.
 
Здравствуйте. Поясню
Цитата:
...как же можно скрыть элемент надписи для одного определенного объекта
надпись над любым объектом можно скрыть в оболочке Zulu, для чего нужно перейти в режим редактирования слоя, а потом перейти в режим редактирования надписей в слое (нажать кнопочку "АБ"), и вот в этом режиме можно скрыть надпись из контекстного меню, после выхода из режима редактирования надпись будет скрытой... Поэтому, как мне кажется, механизм тонкой настройки надписей уже существует, его может быть нужно слегка доработать, чтобы он был доступен из объектной модели, если это возможно. И, если будет возможно скрывать надписи из объектной модели, то тогда можно будет сделать настройку надписей относительно значения или режима типового объекта слоя.
Еще одна просьба, можно ли изменить разделитель дробной части в надписи с точки на запятую, так как точка при некоторых углах сливается с предшествующей двойкой... Или выделять цифры целой части большим шрифтом, по отношению к дробной части...
 
Программно видимость из объектной модели сделаем, раз из оболочки можно. А вот менять точки на запятые не обещаем.
 
Здравствуйте. На счет разделителя
Цитата:
А вот менять точки на запятые не обещаем.
Не столько нужна замена, сколько видимость той самой точки. Повторю и немного уточню описание проблемы - точка, при некоторых углах расположения надписи относительно участка, сливается с предшествующей двойкой. Я вначале подумал, что это вообще какая-то ошибка, потому что в семантике отображается значение, например, 2.34, а в надписи вижу - 234. Согласитесь, цифры получились разные, а Заказчику не объяснишь, что это не ошибка вычисления, а всего лишь отрисовка самого вычисления методами Zulu. Вот отсюда и пошло предложение как-нибудь выделить целую часть числа. Та же картинка появляется и в самой оболочке Zulu, а решается "появление" точки поворотом карты. Привожу основные настройки для надписи: Ориентация - вдоль линии; без сдвига; без наклона; шрифт: Arial, полужирный, размер 14.
За ранее благодарю
 
Картинку пришлите или лучше пример со слоем
 
Добавили свойство для управления видимостью надписи из программы: http://politerm.com/zuludoc/zuluax/ZLabel_cls.htm http://politerm.com/zuludoc/zuluax/ZLabel_Visible.htm

Насчет точки при определенных углах видел, но что с этим делать пока не ясно.
 
Здравствуйте. Спасибо за добавленное свойство для управления видимостью надписи из программы.
 
Здравствуйте. Подскажите, пожалуйста, есть ли возможность программно назначить поле для вывода для надписи? То есть хочется создать надпись полностью программно...
 
Можно полностью программно. Создаете LabelLayer, заполняете свойства, создаете LabelField, заполняете свойства и добавляете в коллекцию LabelLayer.LabelFields.AddItem
Когда все заполнено Добавляете вариант надписи в слой Layer.LabelLayers.AddItem либо через Layer.LabelLayers.SetLabelLayer (http://politerm.com/zuludoc/zuluax/LabelLayers_cls.htm)
 
Делаю, как сказано
Цитата:
Создаете LabelLayer, заполняете свойства, создаете LabelField, заполняете свойства..
, но натолкнулся на проблему - свойство LabelField->FieldNum, в которое, как я понимаю, нужно передать номер поля из основного запроса для формирования надписи - только для чтения. Версия Zulu 7.0.0.5362 от 05.09.2014г.
 
Нужно имя поля задавать. В общих чертах так для участков тепловой сети (тип = 6) для поля длина ("L"):

Dim L As LabelLayer
Dim F As LabelField
Dim id As Long

Set L = New LabelLayer
Set F = New LabelField

L.BaseID = MapCtrl1.Map.Layers.Active.ObjectTypes.Item(6).BaseID

F.FieldName = "L"

L.LabelFields.AddItem F

L.UserName = "Lengths"
L.TypeID = 6

id = MapCtrl1.Map.Layers.Active.LabelLayers.SetLabelLayer(-1, L, True, True, 0, 0, 0)

MapCtrl1.Map.Layers.Active.LabelLayers.ItemById(id).Enable = True
 
Значит, у вас онлайн справка "немного" устарела, сразу и не догадаешься. Ещё вопрос - можно ли аналогичным образом подправить существующую надпись: добавить/убрать поле?
 
Можно.

Dim L As LabelLayer

Set L = MapCtrl1.Map.Layers.Active.LabelLayers.ItemById(1)

Dim F1 As LabelField
'Получили существующее поле
Set F1 = L.LabelFields.Item(0)
'Добавили перенос строки
F1.LineBreak = True

'Обновили поле
L.LabelFields.RemoveItem 0
L.LabelFields.InsertItem 0, F1

'Добавили еще одно поле
Dim F As LabelField
Set F = New LabelField
F.FieldName = "Dpod"
L.LabelFields.AddItem F

'Обновили вариант надписей
MapCtrl1.Map.Layers.Active.LabelLayers.SetLabelLayer 1, L, False, True, 0, 0, 0
 
Спасибо за помощь.
 
Здравствуйте. Можно ли программно изменить префикс (постфикс) для существующей надписи, например, так tmpLabelLayer.LabelFields.Item[i].Prefix := '+'; или для этого нужно каждый раз обновлять все поля LabelFields, как в предыдущем примере
Цитата:
Dim L As LabelLayer
Dim F1 As LabelField
.....
L.LabelFields.RemoveItem 0
L.LabelFields.InsertItem 0, F1

, тоже, наверное, относится и к настройке/изменению шрифтов в надписи. И еще: при создании надписи программно, видимо, по умолчанию настраивается ориентация, доступно только выравнивание, например так - tmpLabelLayer.align := eNorth; (Над объектом), а опция "Вдоль линии" недоступна для программного изменения.
 
Каждый параметр таким образом как tmpLabelLayer.LabelFields.Item[i].Prefix менять нельзя иначе на каждое = будет идти обновление слоя (аналогично с ElemStyle). Принцип общий: все получили, все задали и один раз в слой записали.

Для LabelFields можем добавить UpdateItem, чтобы Remove+Insert не вызывать.

"Вдоль линии" задается в L.LabelLayers.SetLabelLayer 1, L, False, True, 0, 0, 0 (http://politerm.com/zuludoc/zuluax/LabelLayers_SetLabelLayer.htm)
 
Спасибо за разъяснение. Если сделаете
Цитата:
Для LabelFields можем добавить UpdateItem, чтобы Remove+Insert не вызывать.
, то будет здорово...
 
В ближайшем обновлении будет. http://politerm.com/zuludoc/zuluax/LabelFields_cls.htm
 
Подскажите еще пожалуйста, почему не присваивается префикс, постфикс, шрифт, размер шрифта и перенос строки от надписи, которая берется в качестве шаблона? Такое ощущение что RemoveItem/InsertItem не срабатывают. Привожу код ниже


lField:ILabelField;
lFields:ILabelFields;
...............
lFields := Layer.LabelLayer.LabelFields;
cnt := lFields.Count;
for i := 0 to cnt -1 do
begin
tmpLField[i] := CoLabelField.Create;
lField := lFields.Item[i];
tmpLField[i].FieldName := 'LabelPar' + IntToStr(1+i);
tmpLField[i].NumDigits := lField.NumDigits;
tmpLField[i].FontColor := lField.FontColor;
tmpLField[i].Prefix := lField.Prefix;
tmpLField[i].Postfix := lField.Postfix;
tmpLField[i].Font := lField.Font;
cnt > 1 then tmpLField[0].LineBreak := true;
tmpLabelLayer.LabelFields.RemoveItem(i); //удаляем старое поле и на его место новое
tmpLabelLayer.LabelFields.InsertItem(i,tmpLField[i]);

end;

 
tmpLField[i].Prefix := lField.Prefix;
Работает.
Выведите после этой строчки MessageBox

А чтобы все это записалось нужно потом вызвать
Layer.LabelLayers.SetLabelLayer(tmpLabelLayer ........)
 
Спасибо, вроде бы работает... tmpLField[i].Prefix := lField.Prefix; ShowMessage(tmpLField[i].Prefix);
 
Здравствуйте. Есть предложение: раз Вы пообещали
Цитата:
Для LabelFields можем добавить UpdateItem, чтобы Remove+Insert не вызывать.
, то может быть добавить метод, который одновременно выполнял и обновление полей и запись в слой, то есть объединить с Layer.LabelLayers.SetLabelLayer(tmpLabelLayer ........)?
 
А как этот метод должен выглядеть? И в чем трудность, чтобы сперва обновить поля в tmpLabelLayer а затем вызвать Layer.LabelLayers.SetLabelLayer?
Страницы: 1 2 След.