  | 
				www.integro.ru ЦСИ ИНТЕГРО   
				 | 
			 
		 
		 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		Сергей Попов
 
 
  Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
  | 
		
			
				 Добавлено: Чт 24 Май 2012 10:44    Заголовок сообщения: Программное копирование свойств проекта | 
				     | 
			 
			
				
  | 
			 
			
				В упрощённом понимании ПРОЕКТ - это набор карт.
 
IngeoApplication\ActiveDb\Areas\Item[]\Projects\Item[] - Contents (список карт включённых в проект)
 
В ИнГЕО есть ещё IngeoProjectView - персональные (для текущего пользователя) настройки в текущем проекте.
 
Обращаю внимание: доступны не для всех пользователей и всех проектов, а только для текущего пользователя в текущем проекте.
 
Перечислю настройки:
 
1. Последовательность карт, видимость включена, выключена, развёрнут список слоёв или нет.
 
2. Последовательность слоёв, видимость, развёрнут список стилей или нет.
 
3. Вкл./выкл. видимость стилей.
 
4. Активная карта, слой.
 
5. Выделенные карта, слой, стиль.
 
6. Текущий масштаб, и координаты центра отображённой карты на экране.
 
Эти настройки очень важны в момент формирования макета печати, так как при повторном использовании макета, результат может отличаться от ожидаемого только из-за этих параметров: изменилась последовательность карт или видимость некоторых из них.
 
Ещё одна задача: скопировать эти настройки от одного пользователя другому, чтобы исключить рутинную работу и ошибки.
 
Вроде всё просто:
 
1. Запустить модуль в сеансе нужного пользователя в нужном проекте (или перейти в нужный проект).
 
2. Запомнить в некоторой структуре в памяти или файле настройки проекта.
 
3. Выйти из базы данных, но не из ИнГЕО (IngeoApplication - CloseActiveDb).
 
4. Войти в базу данных под другим пользователем в нужный проект.
 
5. Заменить настройки проекта данными из структуры.
 
У меня сложности с пунктом 4. Понятно что надо вызывать IngeoApplication\OpenDb(const Server: WideString; const DbID: WideString; const UserName: WideString; const Password: WideString);
 
Где брать значения передаваемых параметров: Server и DbID? 
 
Допустим оба пользователя находится в одной базе, тогда DbID = IngeoApplication\IngeoDb.ID сеанса первоначального пользователя.
 
Само ИнГЕО вероятно во всю пользуется файлом InGeo.cfg в котором есть разделы:
 
<logon id="{A9714FEA-910F-4D40-840E-4A830F45BE4D}" user="Попов" server="192.168.0.XXX"><![CDATA[]]></logon>
 
и
 
<database id="{CC0233F3-B958-4E9F-916B-3DD398D54D40}" caption="TEST" use-server-semparams="1"><![CDATA[]]></database>
 
Возможно это и есть то, что требуется, но правильнее будет иметь нужную функцию в API.
 
Ещё нужны в API работа с фильтрами (параметрами отображения).
 
Ещё не знаю где находится и как программно добраться до параметров "Направление осей координат" (и считать и изменить). _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		APopov
 
 
  Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
  | 
		
			
				 Добавлено: Сб 26 Май 2012 19:54    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				У нас есть модуль который серелизует/десерелизует текущее состояние карты в/из xml-файл.
 
видимо это, то что вам нужно (там и запоминание направление осей есть).
 
ща выложу код. _________________ ОАО "Самара-Информспутник",
 
   инженер-программист Попов Артем
  Последний раз редактировалось: APopov (Сб 26 Май 2012 20:09), всего редактировалось 1 раз | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		APopov
 
 
  Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
  | 
		
			
				 Добавлено: Сб 26 Май 2012 20:08    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Это все куски из большого inm с разными улилитами
 
 	  | Код: | 	 		  option explicit
 
 
dim supStyleView ' boolean is style view supported in curr version
 
 
'---------------------------------
 
'|   Initalization & finalization of Util Objects
 
'---------------------------------
 
sub Init
 
  on error resume next
 
  supStyleView = strcomp("4.4",  Left(Application.Version,3)) >= 0
 
  if err.number<>0 then supStyleView = false
 
  on error goto 0
 
end sub
 
 
sub UnInit
 
end sub
 
 
'---------------------------------
 
'----------------для записи/чтения настроек в БД-----------------
 
'---------------------------------
 
sub SaveDBOptionStr (aOptionName, aOptionValue, GlobalOrUser)
 
  if not sysUtils.IsValidObject(Application.ActiveDB) then exit sub
 
  dim scorpe
 
  if GlobalOrUser then scorpe = inupGlobal else scorpe = inupUser
 
  Application.UserProfile.Put scorpe, "", aOptionName, aOptionValue
 
end sub
 
 
sub SaveDBOptionBool (aOptionName, aOptionValue, GlobalOrUser)
 
  SaveDBOptionStr aOptionName, sysUtils.CStrB(aOptionValue), GlobalOrUser
 
end sub
 
 
function GetDBOptionStr (aOptionName, aDefValue, GlobalOrUser)
 
  if not sysUtils.IsValidObject(Application.ActiveDB) then GetDBOptionStr = "" : exit function
 
  dim scorpe
 
  if GlobalOrUser then scorpe = inupGlobal else scorpe = inupUser
 
  GetDBOptionStr = Application.UserProfile.Get(scorpe, "", aOptionName, aDefValue)
 
end function
 
 
function GetDBOptionBool (aOptionName, aDefValue, GlobalOrUser)
 
  'GetDBOptionBool = CBool(GetDBOptionStr (aOptionName, aDefValue, GlobalOrUser))
 
  GetDBOptionBool =  sysUtils.CBool_Def(GetDBOptionStr (aOptionName, sysUtils.CStrB(aDefValue), GlobalOrUser), aDefValue)
 
end function
 
 
'---------------------------------
 
'----------------------------Тематические закладки----------------
 
'---------------------------------
 
sub SaveStyleView (byref aStyleView, byref xDoc, byref xRoot)
 
  dim xElm
 
  set xElm = xDoc.createElement("StyleView")
 
   with xElm
 
      .setAttribute "ID", inUtils.Loc2Glob( aStyleView.Style.ID )
 
      .setAttribute "Name", aStyleView.Style.Name
 
      .setAttribute "Visible", sysUtils.CStrB(aStyleView.Visible)
 
   end with
 
   xRoot.appendChild  xElm
 
   set xElm = nothing
 
end sub
 
 
sub SaveLayerView (byref aLayerView, byref xDoc, byref xRoot)
 
  dim xElm, aStyleView
 
 
   set xElm = xDoc.createElement("LayerView")
 
   with xElm
 
      .setAttribute "ID", inUtils.Loc2Glob( aLayerView.Layer.ID )
 
      .setAttribute "Name", aLayerView.Layer.Name
 
      .setAttribute "Index", aLayerView.Index
 
      .setAttribute "Visible", sysUtils.CStrB(aLayerView.Visible)
 
      if supStyleView then .setAttribute "Expanded", sysUtils.CStrB(aLayerView.Expanded)
 
   end with
 
   if supStyleView then
 
      for each aStyleView in aLayerView.StyleViews
 
         SaveStyleView aStyleView, xDoc, xElm
 
      next
 
   end if
 
   xRoot.appendChild  xElm
 
   set xElm = nothing : set aStyleView = nothing
 
end sub
 
 
sub SaveMapView (byref aMapView, byref xDoc, byref xRoot)
 
  dim xElm, aLayerView
 
   set xElm = xDoc.createElement("MapView")
 
   with xElm
 
      .setAttribute "ID", inUtils.Loc2Glob( aMapView.Map.ID )
 
      .setAttribute "Name", aMapView.Map.Name
 
      .setAttribute "Index", aMapView.Index
 
      .setAttribute "Visible", sysUtils.CStrB( aMapView.Visible)
 
      .setAttribute "Expanded", sysUtils.CStrB( aMapView.Expanded)
 
   end with
 
   for each aLayerView in aMapView.LayerViews
 
       SaveLayerView aLayerView, xDoc, xElm
 
   next
 
   xRoot.appendChild  xElm
 
   set xElm = nothing : set aLayerView = nothing
 
end sub
 
 
sub SaveProjectView
 
   if not sysUtils.IsValidObject(Application.ActiveProjectView) then exit sub
 
 
  dim xmlFN
 
  if not sysUtils.PromptForFileName(xmlFN, sysUtils.dlgXMLFilter, "xml", "Сохранить тематическую закладку в файл :", true ) then exit sub
 
  if trim(xmlFN) = "" then exit sub
 
 
  dim xDoc, xRoot, xElm, APV, Navig, aMapView
 
   set APV = Application.ActiveProjectView
 
   set Navig = Application.MainWindow.MapWindow.Navigator
 
   set xDoc = sysUtils.CreateNewXMLDocRus
 
   set xRoot = xDoc.createElement("IngeoProjectViews")
 
   xRoot.setAttribute "xml-builder-skin", "IngeoProjectViewsSkin"
 
   set xDoc.documentElement = xRoot
 
   set xElm = xDoc.createElement("IngeoProjectView")
 
 
   with xElm
 
      .setAttribute "Name","Current"
 
      .setAttribute "Caption",APV.Project.Name
 
      .setAttribute "ProjectGUID", inUtils.Loc2Glob( APV.Project.ID )
 
      .setAttribute "YMirror", sysUtils.CStrB(Navig.YMirror)
 
      .setAttribute "XAngle", sysUtils.Rad2Deg (Navig.XAngle)
 
      .setAttribute "Scale", CStr(Round(1/Navig.ZoomScale))
 
      .setAttribute "XCenter", CStr( Navig.CenterX)
 
      .setAttribute "YCenter", CStr( Navig.CenterY)
 
   end with
 
   set Navig = nothing
 
 
   for each aMapView in APV.MapViews
 
    SaveMapView aMapView, xDoc, xElm
 
   next
 
   xRoot.AppendChild xElm
 
   set aMapView = nothing : set APV = nothing
 
 
   xDoc.Save xmlFN
 
   set xElm = nothing : set xRoot = nothing : set xDoc = nothing
 
   MsgBox "Тематическая закладка успешно сохранена в файл " &vbCr& xmlFN, vbInformation, "Сообщение"
 
end sub
 
 
sub LoadStyleView (byref xStyleElm, byref aLayerView)
 
  dim aID, Visible
 
  dim aStyleView
 
  with xStyleElm
 
     aID = inUtils.Glob2Loc(.getAttribute("ID"))
 
     Visible = .getAttribute("Visible")
 
  end with
 
  set aStyleView = aLayerView.FindStyleView(aID)
 
  if not sysUtils.IsValidObject(aStyleView) then exit sub
 
 
  if isNumeric(Visible) then aStyleView.Visible = Visible
 
   Set aStyleView = nothing
 
end sub
 
 
sub LoadLayerView (byref xLyrElm, byref aMapView)
 
  dim aID, Index, Visible, Expanded
 
  dim aLayerView, xSElm
 
  with xLyrElm
 
     aID = inUtils.Glob2Loc(.getAttribute("ID"))
 
     Index = .getAttribute("Index")
 
     Visible = .getAttribute("Visible")
 
      Expanded = .getAttribute("Expanded")
 
  end with
 
  set aLayerView = aMapView.FindLayerView(aID)
 
  if not sysUtils.IsValidObject(aLayerView) then exit sub
 
 
  if isNumeric(Index) then aLayerView.Index = Index
 
  if isNumeric(Visible) then aLayerView.Visible = Visible
 
  if supStyleView and isNumeric(Expanded) then aLayerView.Expanded = Expanded
 
 
  if supStyleView then
 
     for each xSElm in xLyrElm.SelectNodes("StyleView")
 
       LoadStyleView xSElm, aLayerView
 
     next
 
   end if
 
   Set aLayerView = nothing : Set xSElm = nothing
 
end sub
 
 
sub LoadMapView (byref xMapElm, byref APV)
 
  dim aID, Index, Visible, Expanded
 
  dim aMapView, xLElm
 
  with xMapElm
 
     aID = inUtils.Glob2Loc(.getAttribute("ID"))
 
     Index = .getAttribute("Index")
 
     Visible = .getAttribute("Visible")
 
      Expanded = .getAttribute("Expanded")
 
  end with
 
  set aMapView = APV.FindMapView(aID)
 
  if not sysUtils.IsValidObject(aMapView) then exit sub
 
 
  if isNumeric(Index) then aMapView.Index = Index
 
  if isNumeric(Visible) then aMapView.Visible = Visible
 
  if isNumeric(Expanded) then aMapView.Expanded = Expanded
 
 
  for each xLElm in xMapElm.SelectNodes("LayerView")
 
    LoadLayerView xLElm, aMapView
 
  next
 
 Set aMapView = nothing : Set xLElm = nothing
 
end sub
 
 
sub LoadProjectView (loadMapPosition)
 
  dim xmlFN, XCenter, YCenter, ZoomScale, a
 
  if not sysUtils.PromptForFileName(xmlFN, sysUtils.dlgXMLFilter, "xml", "Загрузить тематическую закладку из файла :", false ) then exit sub
 
  if trim(xmlFN) = "" then exit sub
 
 
  dim xDoc, xElm, xMElm, APV, Navig
 
 
   set APV = Application.ActiveProjectView
 
   set xDoc = sysUtils.OpenXML( xmlFN )
 
   If xDoc.parseError.errorCode <> 0 Then
 
      MsgBox "Не удалось загрузить [" & xmlFN & "] :"&vbCR& xDoc.parseError.reason, vbCritical, "Ошибка"
 
      exit sub
 
   End If
 
 
  set xElm = xDoc.documentElement.SelectSingleNode ("IngeoProjectView")
 
  if not sysUtils.IsValidObject(APV) then ' попытаемся загрузить проект
 
     a = inUtils.Glob2Loc( xElm.getAttribute("ProjectGUID") )
 
     if a="" then msgbox "Для загрузки закладки необходимо открыть текущий проект", vbExclamation, "Ошибка" : exit sub
 
     Application.OpenProject a
 
     set APV = Application.ActiveProjectView
 
  end if
 
 
   set Navig = Application.MainWindow.MapWindow.Navigator
 
    if loadMapPosition then
 
      ZoomScale = 1/sysUtils.CDbl_Def( xElm.getAttribute("Scale"), 1 )
 
       XCenter = sysUtils.CDbl_Def( xElm.getAttribute("XCenter"), 0 )
 
       YCenter = sysUtils.CDbl_Def( xElm.getAttribute("YCenter"), 0 )
 
      Navig.Navigate XCenter, YCenter, ZoomScale
 
    end if
 
    Navig.YMirror = sysUtils.CBool_Def( xElm.getAttribute("YMirror"), Navig.YMirror )
 
    a = xElm.getAttribute("XAngle")
 
    if isNumeric(a) then Navig.XAngle = sysUtils.Deg2Rad( a )
 
   set Navig = nothing
 
 
   for each xMElm in xElm.SelectNodes ("MapView")
 
      LoadMapView xMElm, APV
 
   next
 
 
   set xElm = nothing : set xMElm = nothing : set APV = nothing
 
   set xDoc = nothing ': set xRoot = nothing
 
   MsgBox "Тематическая закладка успешно воостановлены из файла", vbInformation, "Сообщение"
 
end sub
 
 | 	  
 
и несколько функций из подмодуля sysUtils, которые используются кодом выше
 
 	  | Код: | 	 		  
 
function IsValidObject(byref aObj)
 
  if IsObject(aObj) then IsValidObject = not(aObj is Nothing) else IsValidObject = false
 
end function
 
'---------------------------------
 
'|   Conv Ulils
 
'---------------------------------
 
dim DecSepar, WrongDecSepar 'DecimalSeparator
 
function CDblEx(byval s)
 
   'if inStr(s, WrongDecSepar) then
 
   s=replace(s, WrongDecSepar, DecSepar)
 
   CDblEx = CDbl(s)
 
end function
 
 
Function CStrF(byref aValue) 'float to str
 
  CStrF = FormatNumber(aValue, 2, -1, 0, -1)
 
End Function
 
 
Function CStrB(byref aValue) 'bool to str
 
  if aValue then CStrB = "1" else CStrB = "0"
 
End Function
 
 
Function CDbl_Def(byref aValue, aDefVal) 'something to dbl with default value
 
  On Error Resume Next
 
  CDbl_Def = CDbl(aValue)
 
  if err.number<>0 then CDbl_Def = aDefVal : err.Clear
 
  On Error goto 0
 
End Function
 
 
Function CBool_Def(byref aValue, aDefVal) 'something to bool with default value
 
  On Error Resume Next
 
  CBool_Def = CBool(aValue)
 
  if err.number<>0 then CBool_Def = aDefVal : err.Clear
 
  On Error goto 0
 
End Function
 
 
function CStrFDot(d)
 
   CStrFDot = CStr(d)
 
   CStrFDot = replace(CStrFDot, ",", ".")
 
end function
 
 
function PromptForFileName(byref aFN, aFilter, aDefExt, adlgTitle, SaveDlg )'bool
 
   dim dlgUtil
 
   set dlgUtil = createObject("GetIngeoObjectsIDs.DialogUtils") 'наш вспомогательный COM-объектик
 
'QueryFileName([in, out] VARIANT * strFileName, [in] BSTR fileFilters, [in] BSTR defExt, [in] BSTR dlgTitle, [in] BSTR startDir, [in] VARIANT_BOOL SaveOrOpen, [out, retval] VARIANT_BOOL * success );
 
   PromptForFileName = dlgUtil.QueryFileName(aFN, aFilter, aDefExt, adlgTitle, "", SaveDlg)
 
end function
 
 
public const dlgXMLFilter = "XML файлы (*.xml)|*.xml|Все Файлы (*.*)|*.*|"
 
 
function CreateNewXMLDocRus
 
  dim xDoc, xPI
 
  set xDoc = CreateObject("Msxml.DOMDocument")
 
  set xPI = xDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""windows-1251""")
 
  xDoc.appendChild xPI
 
  set xPI = nothing
 
  set CreateNewXMLDocRus = xDoc
 
end function
 
 
function OpenXML(byval aName)
 
   set OpenXML = CreateObject("MSXML.DOMDocument")
 
   OpenXML.async = False
 
   OpenXML.load aName
 
end function
 
 
sub Init
 
  on error resume next
 
  dim t : t = CDbl("7.8")
 
  if err.number=0 then DecSepar="." : WrongDecSepar="," else DecSepar="," : WrongDecSepar="."
 
  on error goto 0
 
end sub
 
 
 | 	 
  _________________ ОАО "Самара-Информспутник",
 
   инженер-программист Попов Артем | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		Сергей Попов
 
 
  Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
  | 
		
			
				 Добавлено: Вт 29 Май 2012 00:22    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Благодарю!
 
Много полезного для себя подчерпнул. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |