Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Алексей В. Бастриков
Зарегистрирован: 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 |
|
Вернуться к началу |
|
 |
|