MapBasic и все что с ним связаноМожет я не один такой?!
#281
Отправлено 20.06.2011, 13:58:19
Задача состоит в следующем:
На карте размешены точечные объекты, которые берутся из заранее созданных табличек. Так же в каждой табличке существует информация об его координатах и другая инфа, с которой в дальнейшем нужно работать.
После размещения всех обектов, необходимо у всех обектов кокретной таблицы применить инструмент выбор в круге, после чего создаётся временная табличка, которая содержит инфу про все попавшие в выделения объекты. По конкретному полу нужно сосчитать их сумму и сохранить в переменной для далейшей работы. Так проделать с каждоым нужным слоем.
Далее у некотрых обектов нужно применить инструмент Элипса, задать кокретный радиус, а далее также подсчитать какие элипсы попадают в выделенный круг и так же подсчитать и схоранить в отдельной переменной.
Делее если в отдельности какой либо элемент попадает в буферную зону дорог, радиусом 50 метров, то для отдельной переменной указать показатель в иде 1 если попаадает, если не = 0.
После всех проделанных задач, совершить подсчёт по простой формуле (X1+X2+X3..Xn) и вывести в виде отчёта либо сохранить в табличку, с новым полем К, где будут внесены все сосчитанные показатели.
Вроде задачка не сложная, но реализовать её никак не получается, кто может, ПОМОГИТЕ. Зарание спасибо.
#286
Отправлено 22.06.2011, 22:16:49
Если бы Вы прочитали руководство пользователя хотя бы первые 8 глав, то у Вас не возникло бы такого вопроса ), мой совет Вам просто прочтите эти главы.
Теперь ближе к делу, что Вы уже написали покажите кусок кода, где у Вас возникла проблемка, а после уже будем разбирать что к чему.
#287
Отправлено 25.06.2011, 03:37:13
#289
Отправлено 05.10.2011, 11:54:26
Хочу поднять вопрос об использовании в MapBasic внешних функций (лежащих в DLL)
Цель в том, чтоб значения некоторых переменных в MapBasic можно было бы изменять во внешней функции, передавая туда только ссылки на переменные MapBasic.
Исходные данные:
- MapBasic 9.5 release 35
- MapInfo v.9.5.1
- Visual Studio 2010 (C#)
На C# сделана dll содержащая 2 функции:
int GetParam_1(int id) int GetParam_2(int* id)Заметим, что:
- первая функция принимает значение
- вторая функция принимает ссылку на значение
В теле функций вызывается стандартное уведомительное окошко (MessageBox, чтоб было явно видно, что функция отработала )
В программе на MapBasic продекларированны обе функции:
declare method GetParam_1 Class "Class1" Lib "Test_lib.dll" (byVal id as integer) as integer declare method GetParam_2 Class "Class1" Lib "Test_lib.dll" (id as integer) as integerЗаметим, что:
- первая функция передаёт параметр "как значение" (byval)
- вторая функция передаёт параметр "как ссылку" (БЕЗ byval)
Проблема:
Вызов из MapBasic первой внешней функции происходит замечательно.
Вызов из MapBasic ВТОРОЙ внешней функции НЕ происходит: MapInfo сообщает что не может найти в библиотеке запрашиваемую функцию.
Данная ситуация противоречит документации (считается, что MapBasic может вызывать из dll-библиотек функции, передавая им параметры "как ссылки").
Архив исходников прикреплён к сообщению Test_lib.rar 10,29К Количество загрузок: 131.
В архиве Test_lib.rar находятся:
- файлы проекта для Visual Studio 2010 (Test_lib.sln, Test_lib.suo, Test_lib\Test_lib.csproj, Properties\*.*)
- файл с исходным кодом библиотеки (Test_lib\Class1.cs)
- файл готовой dll-библиотеки (Test_lib.dll)
- файл с исходным кодом на MapBasic (Test_lib.MB)
- файл запускаемого кода на MapBasic (Test_lib.MBX)
Надеюсь, что коллективный разум (и Jismo в первую очередь) из научного, профессионального и спортивного интереса сможет выяснить, как сделать "вызываемой" функцию из dll-библиотеки (написанной на C#), передавая её параметр "как ссылку".
Заранее благодарен, готов активно участвовать в дискуссии.
Сообщение отредактировал vlad_sher: 05.10.2011, 12:16:38
#290
Отправлено 05.10.2011, 13:10:24
По поводу невозможности вызвать из MapBasic функцию из DLL написанной на C#, передавая ей параметр "как ссылку":
Похоже решение найдено!
Для передачи из MapBasic в dll параметров по ссылке надо на стороне dll всего лишь перед описанием типа принимаемой переменной добавить ключевое слово ref, что будет символизировать, что эта переменная принимается как ссылка.
При этом на C# описание функции в dll будет выглядеть так:
public static int GetParam_2(ref int id) { ... }На C# запись
ref int idэквивалентна записи
int* idв хорошо известном С++.
Наводку на правильный ответ нашёл тут: http://www.gotdotnet...347/#post237347
Документ от 2008 года
Сообщение отредактировал vlad_sher: 05.10.2011, 14:01:28
#292
Отправлено 06.10.2011, 17:36:59
Из MapBasic вызываю внешнюю (dll) процедуру, передавая ей МАССИВ как ССЫЛКУ.
Код MapBasic-а
Declare method FillArray Class "Class1" Lib "Test.dll" (MyArray() as integer) sub main dim MyArray() as integer redim MyArray(10) call FillArray(MyArray) ' или надо "call FillArray(MyArray())" ? end sub
Вопрос в том, как корректно работать с таким массивом на стороне C# ?
Полагаю, что принимающая процедура должна выглядеть примерно так:
public void FillArray(ref int Array) { ... }Хотя я не уверен.
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел
Сообщение отредактировал vlad_sher: 06.10.2011, 18:17:44
#293
Отправлено 07.10.2011, 11:46:06
Первое условие которое необходимо для вызова .NET библиотеки из MB: метод должен быть статичным!!!
Это пример когда метод ничего не возвращает:Declare Method ShowMsg Class "Sample.Msg" Lib "Sample.dll" (ByVal str As String)
и внутри любого метода пишешь вызов:Call ShowMsg("Привет")
результат: вылазиет окошко стандартное для .Net - MessageBox с текстом что ты написал в мапбэйсике.
А это когда возвращает значение:Declare Method ShowMsg Class "Sample.Msg" Lib "Sample.dll" (ByVal str As String) As Logical
и внутри метода пишешь вызов:Dim mybool As Logical mybool = ShowMsg("Привет")
результат: вылазиет окошко стандартное для .Net - MessageBox с текстом что ты написал в мапбэйсике и в переменную заносится True.
ЗЫ: Примеры образные, но рабочие. Да и еще кое что при объявлении класса в Мапбэйсике указывается и пространство имен и класс в данных примерах, пространство имен это Sample, а класс это Msg
#294
Отправлено 07.10.2011, 12:03:22
Спасибо за ответ, но на самом деле я вызывал именно статичные методы (описанные на C# как public static).
Просто когда набирал сообщение, почему -то упустил это, а потом не нашёл как подправить своё сообщение.
Мой неработающий код на C# таков:
public static void FillArray(ref int[] MyArray) { // как-то изменяю массив }
Вроде все по правилам - ref говорит, что переменная ссылка, а далее говорится что переменная - массив.
Не пойму, почему MapInfo/MapBasic не признаёт такое объявление...
#296
Отправлено 07.10.2011, 12:54:57
В C# ссылка на массив целых чисел передается в функцию так:Вопрос в том, как корректно работать с таким массивом на стороне C# ?
Полагаю, что принимающая процедура должна выглядеть примерно так:public void FillArray(ref int Array) { ... }Хотя я не уверен.
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел
public void FillArray(int[] myArray) { .... }Ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.
#297
Отправлено 07.10.2011, 15:28:57
Большое спасибо, Visual1.В C# ссылка на массив целых чисел передается в функцию так:
public void FillArray(int[] myArray) { .... }Ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.
Ваши пояснения очень помогли. Код заработал.
Сообщение отредактировал vlad_sher: 07.10.2011, 16:09:26
#298
Отправлено 07.10.2011, 16:16:36
Рад быть полезным.Большое спасибо, Visual1.
Ваши пояснения очень помогли. Код заработал.
А массивы строк в C# как передаются?
public void FillArray(string[] myArray) { .... }так?
Вообще-то да, синтаксис такой же. Только надо иметь в виду, хотя строки в C# - это ссылочный тип, но изменить уже созданные строки невозможно. Если присвоить существующей ссылке на строку новое значение, то будет создана новая строка, и эта ссылка будет указывать уже на это новое значение (а память, занятая старым значением, будет оставаться занятой до тех пор, пока не будет вызван сборщик мусора). Хотя с виду поведение будет такое же, как и в предыдущем случае с int'ами. Вот пример:
public class myClass { public static void myReplace(string[] strs) { strs[0] = "Путин"; strs[1] = "Медведев"; } } class Program { static void Main(string[] args) { string[] presidents = {"Буш", "Обама"}; Console.WriteLine("До замены:"); foreach (string p in presidents) Console.WriteLine(p); myClass.myReplace(presidents); Console.WriteLine("После замены:"); foreach (string p in presidents) Console.WriteLine(p); Console.ReadLine(); } } }
Сообщение отредактировал Visual1: 07.10.2011, 16:48:44
#299
Отправлено 15.11.2011, 01:11:26
Помогите, пожалуйста, в следующей проблеме.
Есть точка на карте и надо от нее построить линию (азимут и длина известны).
Можно конечно построить через "Create Line by Lengh", но это ручками, а линий надо настроить много.
Можно через функцию CreateLine, но как рассчитать конечные координаты?
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0