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

ИнГео<=>Мониторинг

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



Зарегистрирован: 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? То есть он используется, а откуда берется?? Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 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 Razz Теперь можно полноценные модули писать на .NET
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

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


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