Пересчитать символ

0 голосов
спросил 19 Март, 10 от 2008sean (1,020 баллов) в категории Программные продукты Esri
Как бы это яснее пояснить... задача довольно распространенная:
На карте нужный слой обозначен символом из закладки Charts (взял Bar). Bar - это столбики диаграммы.
Если данные статичные в слое - то один раз стоит этот символ создать, он сам рассчитает пропорции и нарисует диаграмму.

Но если данные меняются - то есть этот слой не shp, а таблица в sde, которую праваят другие пользователи, то по вызову метода ActiveView.Refresh данные одновляются, и график меняется, но вот его пропорции не пересчитываются. К примеру значения увеличиваются на порядок, символ тоже увеличиватся в 10 раз и не влазит на экран)
Приходится каждый раз заходить в настройки символа и жать кнопку "Ok", тогда размер символа становится равным указаному в пунктах, а значения столбиков пропорционально соответсвенно уменьшаются\увеличиватся.

Как этому символу программно сказать пересчитать пропорции?

    

19 Ответы

0 голосов
ответил 22 Март, 10 от 2008sean (1,020 баллов)
Нашел я таки как этот символ можно пере-масштабировать - в IChartSymbol есть MaxValue... видимо придется "вручную" смотреть какие поля входят в IChartSymbol, потом искать в них максимум, и потом его писать в MaxValue image
А я то думал при отрытии проекта все само пересчитается ArcMap-ом))) Терь придется писать dll и заставлять пользователя её жать image
0 голосов
ответил 22 Март, 10 от pooperec (10,820 баллов)
Написал долгую портянку, а потом таки решил попробовать... И "О ЧУДО" (тм), обнаружил что на самом деле всё гораздо проще.

Для обновления используйте не "ActiveView.Refresh" (где Вы его там используете), а ActiveView.PartialRefresh(esriViewGeography ,nil,nil).

И читайте документацию, хотя я и сам хорош, не мог догадаться сразу (хотя это был 3 вариант).

З.Ы. И кстати совершенно не обязательно делать нажатие кнопки пользователя, элемент может быть вообще "невидимый".
0 голосов
ответил 22 Март, 10 от pooperec (10,820 баллов)
Нашел я таки как этот символ можно пере-масштабировать - в IChartSymbol есть MaxValue... видимо придется "вручную" смотреть какие поля входят в IChartSymbol, потом искать в них максимум, и потом его писать в MaxValue image
А я то думал при отрытии проекта все само пересчитается ArcMap-ом))) Терь придется писать dll и заставлять пользователя её жать image


Clap
Вот таким людям и помогать не жалко, сам пытаеться разобраться...

З.Ы. Ответ выше, попробуйте, если что не так вместе будем разбираться...


0 голосов
ответил 22 Март, 10 от 2008sean (1,020 баллов)
Написал долгую портянку

интересно )

Для обновления используйте не "ActiveView.Refresh" (где Вы его там используете), а ActiveView.PartialRefresh(esriViewGeography ,nil,nil).И читайте документацию, хотя я и сам хорош, не мог догадаться сразу (хотя это был 3 вариант).

я не понял задумки, но заменил свой

mxDocument.ActiveView.Refresh();

на

mxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, nothing, nothing);

ничего не поменялось, как по моему то и не должно было image
Так попробовал все
            mxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, nothing, nothing);
            mxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, nothing, nothing);
            mxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, nothing, nothing);
и пр.
все эти фишки обновления символа никак не касаются.

***
вообщем судя по примерам из ЕДН, единственный вариант это пересчитывать MaxValue для символа самому. Оно как бы и логично, не логично что это нельзя зделать автоматом)))

    
    
    
0 голосов
ответил 22 Март, 10 от pooperec (10,820 баллов)
1. Хммм... А версия у Вас ArcGis какая?
2. Просто у меня это работает... Вот цельный пример обработчика:
TPieCharter = class(TAutoObject, ICommand)
  pApp : iApplication;
  (*...

...*)
procedure TPieCharter.OnClick;
begin
 (pApp.Document as IMxDocument).UpdateContents;
 (pApp.Document as IMxDocument).ActiveView.PartialRefresh(esriViewGeography ,nil,nil);
 (pApp.Document as IMxDocument).ActiveView.Refresh;
end;

Именно в этом варианте работало, хотя строки Refresh и UpdateContents сами по себе не работают, попробуйте эту комбинацию.

=Добавленно позже=
Что я понимаю под работает:
Запущено два ArcMap, оба держут открытым точечный слой ГБД СДЕ. Один меняет значение поля, во втором соответственно обновляю (ничего не перерисовываеться, пропорции старые). Нажимаю на инструмент - пропорции менятються.

З.Ы. Чем отличаеться Рефреш и ПартиалРефреш
IActiveView::PartialRefresh uses its knowledge of the cache layout to invalidate as little as possible. 
IActiveView::Refresh , on the other hand, invalidates all the caches which is very inefficient. 
Use PartialRefresh whenever possible.
0 голосов
ответил 22 Март, 10 от 2008sean (1,020 баллов)
1. ArcGis 9.3 SP1 (9.3.1 недоступен( ), C#
2. Попробовал и так. Обновление вида проиходит, карта дергается, но символ отрисовывается опять огромный))

да, чем рефреш отличается понятно, и он все правильно делает на мой взгляд)
    
0 голосов
ответил 22 Март, 10 от pooperec (10,820 баллов)
У Вас есть кнопка "Size" на закладке Chart-Bar/Colums?
Там есть параметр "Maximum Length" - максимальная высота в пикселях?
0 голосов
ответил 22 Март, 10 от pooperec (10,820 баллов)
Не дабл пост!!!
Попробуйте вот так:
procedure TPieCharter.OnClick;
var
  x : ICalcRendererValues;
  min, max : double;
begin
  x:=CoCalcRendererValues.Create as ICalcRendererValues;
  x.SetData(((pApp.Document as IMxDocument).FocusMap.Layer[0] as IFeatureLayer),((pApp.Document as IMxDocument).FocusMap.Layer[0] as IGeoFeatureLayer).Renderer);
  x.CalcMinMax(min,max);
  (((pApp.Document as IMxDocument).FocusMap.Layer[0] as IGeoFeatureLayer).Renderer as IChartRenderer).ChartSymbol.MaxValue:=max;


 (pApp.Document as IMxDocument).ActiveView.PartialRefresh(esriViewGeography ,nil,nil);
 (pApp.Document as IMxDocument).ActiveView.Refresh;
 (pApp.Document as IMxDocument).UpdateContents;
 
end;

У меня опять таки работает...

Простите за код в индийском стиле,  я немного занят...
0 голосов
ответил 22 Март, 10 от 2008sean (1,020 баллов)
Да, это именно то!!!!!!!!!!!!!!
P.S. спасибо огромное
    
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...