| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Вт 03 Июн 2008 09:09    Заголовок сообщения: ИнГео<=>Мониторинг | 
				     | 
			 
			
				
  | 
			 
			
				Уважаемые разработчики!
 
Есть ли возможность из встроенных программных модулей ГИС "ИнГео" получать доступ к объектам "Мониторинга"? Связь между системами настроена через spatial-config. В распоряжении имеется ID пространственного объекта.
 
Если это возможно, напишите ответ как можно подробнее. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Лазарев Евгений
 
 
  Зарегистрирован: 12.06.2008 Сообщения: 48 Откуда: УралГеоИнформ
  | 
		
			
				 Добавлено: Сб 14 Июн 2008 15:45    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				я работаю в VS2005 и там я решил эту проблему вот так.
 
 	  | Код: | 	 		  
 
 
using InMetaSR;
 
using Ingeo;
 
 
        public InMetaCR.InMetaDataServiceClient MyInMetaDataService;
 
        public InMetaSR.InMetaApplicationClass MyInMetaApp;
 
        public InMetaSR.InMetaSession MyInMetaSession;
 
        public IngeoApplication MyInGeo;
 
 
        private String ServerURL;
 
        private String SpatialConfigURL;
 
        private String SpatialListForm;
 
 
    private void GetServerURLs()
 
        {
 
            ServerURL = MyInGeo.UserProfile.Get(TIngeoUserProfileScope.inupGlobal, "", "InMetaURL", "");
 
            SpatialConfigURL = ServerURL + "/spatial-config.xml";
 
            SpatialListForm = ServerURL + "/forms/RS/MainForm.htm";
 
        }
 
 
        private void CheckDataService()
 
        {
 
            GetServerURLs();
 
            if (MyInMetaDataService == null)
 
            {
 
                MyInMetaDataService = new InMetaCR.InMetaDataServiceClientClass();
 
                MyInMetaDataService.set_ServerURL(ServerURL);
 
                MyInMetaDataService.set_SpatialConfigURL(SpatialConfigURL);
 
                MyInMetaDataService.set_Ingeo(MyInGeo);
 
            }
 
        }
 
 
 
        /// <summary>
 
        /// MyInMetaApp.Init(AppID[@[Host][:Port]]);
 
        /// </summary>
 
        public void CheckInMetaApplication()
 
        {
 
            GetServerURLs();
 
            CheckDataService();
 
            if (MyInMetaApp == null)
 
            {
 
                MyInMetaApp = new InMetaApplicationClass();
 
                MyInMetaApp.Init(
 
                    MyInMetaDataService.get_ServerURL().Split('/')[MyInMetaDataService.get_ServerURL().Split('/').Length - 1] +
 
                    "@" + MyInMetaDataService.get_ServerURL().Split('/')[MyInMetaDataService.get_ServerURL().Split('/').Length - 2]);
 
                MyInMetaSession = MyInMetaApp.CreateSession(new System.Net.NetworkCredential().UserName);
 
                //MyInMetaApp.Done(); // закрывает соединение
 
            }
 
        }
 
 | 	  
 
 
Данный код берет из настроек связи ИнГео с мониторингом адрес сервера инметы и к нему подключается.
 
создает 3 объекта для работы с ИнМетой.
 
 
есть еще способ подключения к бизнес-версии инметы но это я еще не пробывал там более расширенные возможности работы и создания приложений.
 
сборка называется:
 
InMeta.Business.dll | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Вт 01 Июл 2008 11:39    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Каким образом из ИнГео можно обратиться к приложению, чтобы передать в нее объект InGeoApplication? То есть он используется, а откуда берется??   | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Вт 01 Июл 2008 12:44    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Вы напишите поподробнее, какие задачи вам надо решить.
 
А мы посоветуем - как это лучше сделать. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Вт 01 Июл 2008 13:25    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Задача:
 
 
Создание модуля для ИнГео, который может работать с  InMeta.ServerRuntime.dll.
 
Например, есть пространственный объект в гис(A), которому соответствует некоторый объект в мониторинге(B). Выделяем A, запускаем модуль, в результате работы модуля вносятся изменения в реестровые данные B(создаются агрегаты,заполняются поля...). При этом мы должны оставаться в гис.
 
 
Проблемы:
 
 
Всегда писал модули на C++Builder делал COM-объекты, а там возможностей для работы с .NET нет. 
 
Пишу на C# в VS2005, с InMeta.ServerRuntime работать могу, а как модуль для гис свое приложения использовать не получается. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Лазарев Евгений
 
 
  Зарегистрирован: 12.06.2008 Сообщения: 48 Откуда: УралГеоИнформ
  | 
		
			
				 Добавлено: Чт 03 Июл 2008 08:02    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				в дополнение к предыдущему коду....
 
 
 	  | Код: | 	 		  
 
 
        public MyClass(Ingeo.IngeoApplication f_InGeo)
 
        {
 
            InitializeComponent();
 
            MyInGeo = f_InGeo;
 
        }
 
 
 | 	  
 
 
также необходимо описать класс который будет вызываться при подключении в ИнГео как это делается аналогично в Delphi
 
 
 	  | Код: | 	 		  
 
 
using Ingeo;
 
using InScripting;
 
using System;
 
using System.Collections.Generic;
 
using System.Text;
 
using System.Windows.Forms;
 
using System.Runtime.InteropServices;
 
 
namespace InClient
 
{
 
    [GuidAttribute("E1DFF234-F5E2-4a6d-9133-3653EAF8DF43")]
 
    [ClassInterface(ClassInterfaceType.AutoDual)]
 
 
    public class Client
 
    {
 
        private IngeoApplication f_Ingeo;
 
        private IInContextCard f_cc_MenuMain;
 
        private const String APPLICATION_NAME_link = "InMeta_feat_InGeo_link";
 
        private const String APPLICATION_DESC_link = "хххххххххх";
 
        private const String APP_ACTION_link = "InMeta_feat_InGeo_Action_Main_link";
 
 
        private const String MENU_NAME_MAIN = "InMeta_feat_InGeo";
 
 
        private InClient.ClassForm MyClassForm;
 
 
 
        private IInUIMenuItem l_UIMenuItem_link;
 
 
        protected void CreateMenuItems()
 
        {
 
            IInUIAction l_acn_MenuMain_link;
 
 
            f_cc_MenuMain = (IInContextCard)f_Ingeo.CreateObject(TIngeoObjectClass.inocContextCard, null);
 
            // adds the actions
 
            l_acn_MenuMain_link = f_Ingeo.MainWindow.Actions.Add(
 
                f_cc_MenuMain,
 
                APPLICATION_NAME_link,
 
                APP_ACTION_link,
 
                APPLICATION_DESC_link,
 
                this,
 
                "OpenWindow_link");
 
            // adds the menu item with selected action
 
            l_UIMenuItem_link = f_Ingeo.MainWindow.Menu.Items["RSM_MainData"].Items["RSM_MainData_Config"].Items.Insert(
 
                f_cc_MenuMain,
 
                MENU_NAME_MAIN,
 
                APPLICATION_DESC_link,
 
                l_acn_MenuMain_link,
 
                "");
 
        }
 
 
        public void Connect(IngeoApplication a_Ingeo)
 
        {
 
            f_Ingeo = a_Ingeo;
 
            CreateMenuItems();
 
        }
 
 
        public void Disconnect()
 
        {
 
            if (MyClassForm != null)
 
                MyClassForm.Dispose();
 
 
            f_Ingeo.MainWindow.Menu.Items.Remove(l_UIMenuItem_link);
 
        }
 
 
        public void OpenWindow_link()
 
        {
 
            MyClassForm = new MyClass(f_Ingeo);
 
            MyClassForm.Show();
 
        }
 
    }
 
}
 
 
 | 	  
 
 
в ИнГео создаем следующий код 
 
 
 	  | Код: | 	 		  
 
 
dim Client
 
 
sub Application_OpenProjectComplete()
 
   call Client.Connect(Application)
 
end sub
 
 
sub Application_ProjectWillClose()
 
   call Client.Disconnect()
 
end sub
 
 
sub Module_StartComplete()
 
   set Client = CreateObject("InClient.Client")
 
end sub
 
 
 | 	  
 
 
как создавать модули которые подключаются через пункт "Модули расширения" еще не полностью разобрался... так что пока так.
 
 
если получиться то можно сделать dll в которой описаны все пункты меню "данные" и тогда ею можно будет просто пользоваться. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Чт 03 Июл 2008 10:24    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Алексей В. Бастриков писал(а): | 	 		  Задача:
 
 
Создание модуля для ИнГео, который может работать с  InMeta.ServerRuntime.dll.
 
Например, есть пространственный объект в гис(A), которому соответствует некоторый объект в мониторинге(B). Выделяем A, запускаем модуль, в результате работы модуля вносятся изменения в реестровые данные B(создаются агрегаты,заполняются поля...). При этом мы должны оставаться в гис.
 
 
Проблемы:
 
 
Всегда писал модули на C++Builder делал COM-объекты, а там возможностей для работы с .NET нет. 
 
Пишу на C# в VS2005, с InMeta.ServerRuntime работать могу, а как модуль для гис свое приложения использовать не получается. | 	  
 
 
Можно что-то подобное приведенному на схеме:
 
  _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Пн 07 Июл 2008 10:02    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Спасибо за информацию!
 
Попробую реализовать, только "переварю" сначала) | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Пн 07 Июл 2008 14:34    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Если я правильно понимаю CreateObject создает экземпляр внешнего ActiveX объекта. А каким образом превратить класс, написанный на .NET в такой объект? | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пн 07 Июл 2008 14:55    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Алексей В. Бастриков писал(а): | 	 		  | Если я правильно понимаю CreateObject создает экземпляр внешнего ActiveX объекта. А каким образом превратить класс, написанный на .NET в такой объект? | 	  
 
Читаем первоисточник:
 
http://msdn.microsoft.com/ru-ru/library/aa720072.aspx
 
 
А вкратце:
 
1. В свойствах сборки в разделе "Build" ставим галочку "Register for COM interop".
 
2. Классы, которые не нужно делать видимыми для COM-а, помечаем атрибутом [ComVisible(false)] - чтобы лишнего не мусорить в реестре.
 
3. Для регистрации dll на целевом компьютере выполняем команду "regasm.exe /codebase имя-файла-сборки.dll". Утилита "regasm.exe" лежит в каталоге Microsoft.Net, например, для .Net 2.0 она лежит в "c:\Windows\Microsoft.NET\Framework\v2.0.50727".
 
 
После этого можно использовать классы .Net подобно классам COM. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Алексей В. Бастриков
 
 
  Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
  | 
		
			
				 Добавлено: Пн 07 Июл 2008 15:07    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Вот оно что...
 
То есть написанный класс не является com, но имеет типа com-оболочку...
 
Ясно, спасибо большое.
 
PS    Теперь можно полноценные модули писать на .NET | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |