На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Добавление точки к маршруту через определенное расстояние

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 След.
RSS
Добавление точки к маршруту через определенное расстояние, Маршрут движения
 
Спасибо, это я понял.
Я не знаю как и что сделать чтобы подключить функцию поиска координат точки. ((
 
Цитата
Александр Махин написал:
Спасибо, это я понял.
Я не знаю как и что сделать чтобы подключить функцию поиска координат точки. ((
Как с помощью дериктивы [DllImport] использовать функцию mapSeekVirtualPointByDistanceInMap, в частности проблема с передаваемыми параметрами и их типами данных.
Если Вас не затруднит помочь именно кодом на С#.

Если я буду использоать директиву [DllImport], то это будет не контролируемый код, т.е. я не смогу отследить где ошибка.
Заранее спасибо!!
 
Я испробывал еще пару попыток. Результат на скринах.
Но происходит ошибка!
2.PNG (41 КБ)
1.PNG (72.79 КБ)
 
В моем примере при описании функции была директива EntryPoint (важно это или нет - не знаю).
Зачем вы используете одновременно вызовы из двух разных библиотек dll, в которых есть одни и те же функции?
 
Цитата
Александр Махин написал:
Я испробывал еще пару попыток. Результат на скринах.
Но происходит ошибка!

Судя по скриншоту ошибок сразу несколько.

1. HMAP, HSITE, HOBJ - это указатели. К int их преобразовать получиться только в 32-разрядных приложениях, в x64 будет Access Violation.
2. Нельзя использовать библиотеки из разных сборок. У Вас и gisaccess.dll (11 версия GTK) и gisuaccess.dll (12 версия GTK).
3. Неправильно записан путь к dll. Во-первых, символы слэша надо экранировать. Во-вторых, не стоит зашивать путь к dll жёстко в программе. Используйте просто имя DLL. Причём только тех DLL, которые использует OCX Вашего GTK Active. Для 12-ой версии это gisuaccess.dll (в случае x32-приложения) и gisu64access.dll (в случае x64-приложения). Если карта у Вам будет открыта одной библиотекой и полученный HMAP или HOBJ Вы будете пытаться передать в библиотеку из другой сборки ГИС-ядра, в лучшем случае ничего не произойдет, а вообще должна быть ошибка по памяти. Такой же результат может быть в случае если Вы будете загружать DLL по полному пути, а OCX библиотека GTK Active будет использовать DLL из другого места, так как загружает её без полного пути по правилам, определяемым операционной системой (пусть даже из той версии сборки ГИС-ядра).
4. Параметр distance - это double (8 байт), у Вас int (4 байта).

Цитата
_MAPIMP long int _MAPAPI mapSeekVirtualPointByDistanceInMap(HOBJ info,
                                                          long int number,
                                                          double distance,
                                                          DOUBLEPOINT *point,
                                                          long int subject);
 
_MAPIMP long int _MAPAPI mapSeekVirtualPointByDistanceInMap(HOBJ info,
                                                          long int number,
                                                          double distance,
                                                          DOUBLEPOINT *point,
                                                          long int subject);

В этой функции я не знаю что за тип данных DOUBLEPOINT *point в C# нет такого типа. :(


Как прописать в директорию [DllImport] эту функцию правильно на языке C#???

// point - координаты выходной точки (в прямоугольной системе в метрах на местности) ЕСЛИ ТАК ТО ЭТО ЗНАЧИТ ЧТО ДОЛЖЕН БЫТЬ Х и У

Вообщем одни вопросы)) Подскажите кодом пожалуйста!
 
Практически все типы данных объявлены в maptype.h

DOUBLEPOINT - структура из двух стандартных типов  double

typedef struct DOUBLEPOINT   // КООРДИНАТЫ ТОЧКИ (ПЛАВАЮЩАЯ МЕТРИКА)
{
 union { double X; double x; };
 union { double Y; double y; };

 void operator  = (double value)  {         x  = value;   y  = value;  }
  int operator != (double value)  { return (x != value || y != value); }
  int operator == (double value)  { return (x == value && y == value); }
}
 DOUBLEPOINT;
 
Я попробывал создать структуру DOUBLEPOINT и передал в функцию mapSeekVirtualPointByDistanceInMap как параметр.
Не получилось - опять ошибка!

Вы можете написать кодом как подключить эту функцию в директории [DLLImport]??
 
Цитата
Александр Махин написал:
Я попробывал создать структуру DOUBLEPOINT и передал в функцию mapSeekVirtualPointByDistanceInMap как параметр.
Не получилось - опять ошибка!

Вы можете написать кодом как подключить эту функцию в директории [DLLImport]??
Добрый день, господа разработчики!
Вчера попробывал еще прописать данную функцию следующим образом:

[DllImport("gisacces.dll", EntryPoint = "mapSeekVirtualPointByDistanceInMap")]
public static extern int mapSeekVirtualPointByDistanceInMap(int info, long number, double distance, TxDoublePoint point, long subject);

На выполнение данной функции прописал так:
int T = Program.mapSeekVirtualPointByDistanceInMap(MapObj.ObjHendle, 1, 100.0, new TxDoublePoint{X=start.x, Y=start.y}, 0);

При выполнении данной функции возникает ошибка ("Разбалансировка стека").
 
Вам есть смысл посмотреть код приложения на C#, которое работает с ГИС-ядром. Там есть уже готовое описание разных функций и типов, в том числе и DOUBLEPOINT, и примеры их вызовов -
http://gisinfo.ru/download?id=80.

Например в вашем описании вы передаете структуру DOUBLEPOINT, а не адрес на нее!
Пример из выше указанного приложения:


   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
   public struct DOUBLEPOINT                     // КООРДИНАТЫ ТОЧКИ
   {
       public double X;
       public double Y;
       public void Point(double x, double y)
       {
           X = x; Y = y;
       }
   }
       [DllImport(GisLibrary, CharSet = CharSet.Ansi)]
       public static extern void mapView(int hMap, int handle,
                                         int erase, ref DOUBLEPOINT point, int place);

Не совсем понятно с какой версией библиотек вы работаете. В начале темы было указано что с 12-й, а вызов описываете указав 11-ю версии библиотеки.
MapObj - это класс написан вами?
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности