Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Список карт и слоёв

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Iron_Man



Зарегистрирован: 02.09.2011
Сообщения: 20

СообщениеДобавлено: Пн 10 Окт 2011 18:20    Заголовок сообщения: Список карт и слоёв Ответить с цитатой

Мой вопрос заключается в следующем.
Подскажите, пожалуйста, как вывести список карт и слоёв в строго заданном порядке? Предполагается, что для каждого пользователя системы при входе будет жёстко задан свой набор карт и слоёв. Каким именно образом этого можно достичь? Вариант решения, который вижу я:
После открытия базы данных открываем нужный проект, в котором задаём нужный порядок карт и слоёв. Копать я думаю, нужно в сторону объекта IIngeoProject, а именно использовать его свойство Contents по типу IIngeoProjectContents. Спасибо.
P.S. Немного подумав, пришёл к выводу о том, что для каждого пользователя нужно будет создавать свой проект, и включать в него нужные карты из активной базы данных, какой-то конкретной территории. Со слоями я даже и не знаю как быть, подскажите. Есть ли возможность управлять не просто видимостью слоя, но и полностью скрывать его из поля зрения пользователя?
P.P.S. На форуме есть тема: "Порядок отображения слоев и карт в проекте", но в ней не раскрыта тема, имхо. Там просто устанавливается видимость слоёв текущего проекта.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Дамир



Зарегистрирован: 14.10.2009
Сообщения: 75
Откуда: Туймазы, Архитектура

СообщениеДобавлено: Ср 12 Окт 2011 09:21    Заголовок сообщения: Ответить с цитатой

Вопрос не из легких.
Мы делаем так:
    - создаем группу
    - добавляем пользователей в группу
    - для определенных карт и слоев задаем права доступа, т.е. добавляем группу (можно и пользователей)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Ср 12 Окт 2011 14:16    Заголовок сообщения: Ответить с цитатой

в проекте вы можете задать набор возможных для просмотра карт (отдельно слои задать невозможно), причем порядок карт и слоев задается не в проекте, а в IIngeoProjectView. Так как каждый пользователь может самостоятельно менять порядок карт/слоев, по порядок нужно устанавливать через IIngeoProjectView для каждого пользователя
_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Iron_Man



Зарегистрирован: 02.09.2011
Сообщения: 20

СообщениеДобавлено: Ср 12 Окт 2011 14:22    Заголовок сообщения: Ответить с цитатой

Дамир, Понятно, спасибо за подсказку про пользователей, но стоит немного другая задача.
У меня вопрос в следующем: Для чего у территорий, проектов, карт, слоёв, стилей имеется метод AddWithID? Когда я пытаюсь при помощи этого метода добавить слой, Ингео выдаёт ошибку о том, что такой объект существует - primary key error.
Стоит задача копирования карт со всеми слоями и стилями в них.
Простым перебором слоёв, стилей и методов отображения видимо не получится забороть эту проблему, потому как многие методы символьные и для каждого из них рисовался отдельный рисунок средствами Ингео.
Меж тем как Ингео прекрасно справляется с этой задачей, когда карты копируются с помощью контекстного меню: "Копировать с вложенными объектами". Как эту же фичу можно реализовать программно?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Ср 12 Окт 2011 15:35    Заголовок сообщения: Ответить с цитатой

метод AddWithID сделан в основном для целей импорта/экспорта.
он используется, если вы хотите в другой базе создать слой именно с этим идентификатором, естественно если слоя с таким идентификатором нет в базе.
Цитата:
Простым перебором слоёв, стилей и методов отображения видимо не получится забороть эту проблему, потому как многие методы символьные и для каждого из них рисовался отдельный рисунок средствами Ингео.

скорее всего это направление верное. копию символьного метода тоже можно создать програмно, так что это не неразрешимая проблема.
вот примерный код копирования рисунка символьного элемента:
Код:
function CopyPicFigureTo(const destFigures:IInPictureFigures;
                         const srcFigure:IInPictureFigure):IInPictureFigure;
  var newFig         :IInPictureFigure;
      figRect        :IInPictureRectFigure;
      figElps        :IInPictureEllipseFigure;
      figLine        :IInPictureLineFigure;
      figPoly        :IInPicturePolygonFigure;
      figText        :IInPictureTextFigure;
      figPict        :IInPicturePictureFigure;
      //figGrid        :IInPictureGridFigure;
      figMap         :IInPictureMapFigure;
begin
  newFig := destFigures.Add(srcFigure.FigureType);
  newFig.Left := srcFigure.Left;
  newFig.Bottom := srcFigure.Bottom;
  newFig.Width := srcFigure.Width;
  newFig.Height := srcFigure.Height;
  newFig.Visible := srcFigure.Visible;
  case newFig.FigureType of
    inftRect:with srcFigure as IInPictureRectFigure do begin
      figRect := newFig as IInPictureRectFigure;
      AssignPenProp(Pen, figRect.Pen);
      AssignBrushProp(Brush, figRect.Brush);
      figRect := nil;
    end;
    inftEllipse:with srcFigure as IInPictureEllipseFigure do begin
      figElps := newFig as IInPictureEllipseFigure;
      AssignPenProp(Pen, figElps.Pen);
      AssignBrushProp(Brush, figElps.Brush);
      figElps := nil;
    end;
    inftLine:with srcFigure as IInPictureLineFigure do begin
      figLine := newFig as IInPictureLineFigure;
      AssignPenProp(Pen, figLine.Pen);
      figLine.X1 := X1;
      figLine.Y1 := Y1;
      figLine.X2 := X2;
      figLine.Y2 := Y2;
      figLine.X1 := X1;
      figLine := nil;
    end;
    inftPolygon:with srcFigure as IInPicturePolygonFigure do begin
      figPoly := newFig as IInPicturePolygonFigure;
      AssignPenProp(Pen, figPoly.Pen);
      AssignBrushProp(Brush, figPoly.Brush);
      figPoly.Closed := Closed;
      figPoly.Points := Points;
      figPoly := nil;
    end;
    InScripting_TLB.inftText:with srcFigure as IInPictureTextFigure do begin
      figText := newFig as IInPictureTextFigure;
      AssignPenProp(Pen, figText.Pen);
      AssignBrushProp(Brush, figText.Brush);
      AssignFontProp(Font, figText.Font);
      figText.Alignment := Alignment;
      figText.Orientation := Orientation;
      figText.Indent := Indent;
      figText.Text := Text;
      figText := nil;
    end;
    inftPicture:with srcFigure as IInPicturePictureFigure do begin
      figPict := newFig as IInPicturePictureFigure;
      AssignPenProp(Pen, figPict.Pen);
      AssignBrushProp(Brush, figPict.Brush);
      figPict.HorAlign := HorAlign;
      figPict.VerAlign := VerAlign;
      figPict.Stretch := Stretch;
      figPict.TransparentBack := TransparentBack;
      figPict.Picture := Picture;
      figPict := nil;
    end;
    inftMap:with srcFigure as IInPictureMapFigure do begin
      figMap := newFig as IInPictureMapFigure;
      AssignPenProp(Pen, figMap.Pen);
      AssignBrushProp(Brush, figMap.Brush);
      figMap.MapVisible := MapVisible;
      figMap.CenterX := CenterX;
      figMap.CenterY := CenterY;
      figMap.ZoomScale := ZoomScale;
      figMap.XAngle := XAngle;
      figMap.YMirror := YMirror;
      figMap := nil;
    end;
    inftGrid:;//забъем на этот элемент; кто герой, тот нехай и пишет копирование этого чудесного элемента
  end;//case newFig.FigureType of
  Result := newFig;
  newFig := nil;
end;

procedure CopyLayerStyles(const FromLayer, ToLayer: IIngeoLayer;
                          const StyleMappingList:TStrings);
  var nStyle, nPaint, nFig :integer;
      newStyle       :IIngeoStyle;
      newPainter     :IIngeoPainter;
      newStdP        :IIngeoStdPainter;
      newTxtP        :IIngeoTextPainter;
      newSmbP        :IIngeoSymbolPainter;
      oldSmbPict     :IIngeoPicture;
      needMapping    :boolean;
begin
  if (FromLayer=nil)or(ToLayer=nil) then
    raise Exception.Create('Не найден слой-шаблон и/или конечный слой!');
  needMapping := assigned(StyleMappingList);
  for nStyle:=0 to FromLayer.Styles.Count-1 do begin
    newStyle := ToLayer.Styles.Add;
    with FromLayer.Styles.Item[nStyle] do begin
      newStyle.Name := Name;
      newStyle.Flags := Flags;
      newStyle.CreationStart := CreationStart;
      newStyle.CreationClosing := CreationClosing;
      newStyle.CreationStartOrtho := CreationStartOrtho;
      newStyle.CreationClosingOrtho := CreationClosingOrtho;
      newStyle.MinPoints := MinPoints;
      newStyle.MaxPoints := MaxPoints;
    end;
    newStyle.Update;
    if needMapping then StyleMappingList.Values[string(FromLayer.Styles.Item[nStyle].ID)] := newStyle.ID;
    for nPaint:=0 to FromLayer.Styles.Item[nStyle].Painters.Count-1 do
    with FromLayer.Styles.Item[nStyle] do begin
      newPainter := newStyle.Painters.Add(Painters.Item[nPaint].PainterType);
      newPainter.Comment := Painters.Item[nPaint].Comment;
      newPainter.VisibleMin := Painters.Item[nPaint].VisibleMin;
      newPainter.VisibleMax := Painters.Item[nPaint].VisibleMax;
      case newPainter.PainterType of
        inptStd:with Painters.Item[nPaint] as IIngeoStdPainter do begin
          newStdP := newPainter as IIngeoStdPainter;
          AssignPenProp(Pen, newStdP.Pen);
          AssignBrushProp(Brush, newStdP.Brush);
        end;//inptStd
        inptText:with Painters.Item[nPaint] as IIngeoTextPainter do begin
          newTxtP := newPainter as IIngeoTextPainter;
          AssignFontProp(Font, newTxtP.Font);
          newTxtP.Flags := Flags;
          newTxtP.BackColor := BackColor;
          newTxtP.Text := Text;
        end;//inptText
        inptSymbol:begin
          with Painters.Item[nPaint] as IIngeoSymbolPainter do begin
            newSmbP := newPainter as IIngeoSymbolPainter;
            newSmbP.PaintMethod := PaintMethod;
            newSmbP.PictureZoomScale := PictureZoomScale;
            oldSmbPict := Picture;
          end;
          newSmbP.Picture.X1 := oldSmbPict.X1;
          newSmbP.Picture.X2 := oldSmbPict.X2;
          newSmbP.Picture.Y1 := oldSmbPict.Y1;
          newSmbP.Picture.Y2 := oldSmbPict.Y2;
          for nFig:=0 to oldSmbPict.Figures.Count-1 do
            CopyPicFigureTo(newSmbP.Picture.Figures, oldSmbPict.Figures.Item[nFig]);
          oldSmbPict := nil;
        end; //inptSymbol
      end;//case newPainter.PainterType of
      newStdP := nil;
      newTxtP := nil;
      newSmbP := nil;
      newPainter := nil;
    end;//with FromLayer.Styles.Item[nStyle].Painters do begin
    newStyle.Update;
    newStyle := nil;
  end;//for nStyle:=0 to FromLayer.Styles.Count-1 do begin
  ToLayer.Update;
end;


здесь исходники не всех функций, нужных при копировании, но идею из кода наверное можно понять Smile

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Iron_Man



Зарегистрирован: 02.09.2011
Сообщения: 20

СообщениеДобавлено: Чт 13 Окт 2011 19:49    Заголовок сообщения: Ответить с цитатой

vvHedgehog,
Этот код жестяная жесть. Very Happy Но за находчивость ставлю пять. Very Happy
Спасибо, может быть ещё пригодится. Решил проблему тем, что создаю в Ингео проект, копирую карты врукопашную в Ингео, и подключаю их в нужном порядке во вновь созданные проекты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Пн 17 Окт 2011 12:24    Заголовок сообщения: Ответить с цитатой

В чем же здесь находчивость? Very Happy реализовано копирование "в лоб", без изысков. а код действительно получился большой, ибо элементы не совсем простые.
_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB