Перейти к содержимому

Фотография

MapBasic и все что с ним связаноМожет я не один такой?!


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 388

#281
Ananeli

Ananeli
  • Случайный прохожий
  • 2 сообщений
Доброго всем дня!!! Образовалась проблемка с програмированием на MapBasic. Есть ли у кого возможность помочь разобраться и реализовать задачу.
Задача состоит в следующем:
На карте размешены точечные объекты, которые берутся из заранее созданных табличек. Так же в каждой табличке существует информация об его координатах и другая инфа, с которой в дальнейшем нужно работать.
После размещения всех обектов, необходимо у всех обектов кокретной таблицы применить инструмент выбор в круге, после чего создаётся временная табличка, которая содержит инфу про все попавшие в выделения объекты. По конкретному полу нужно сосчитать их сумму и сохранить в переменной для далейшей работы. Так проделать с каждоым нужным слоем.
Далее у некотрых обектов нужно применить инструмент Элипса, задать кокретный радиус, а далее также подсчитать какие элипсы попадают в выделенный круг и так же подсчитать и схоранить в отдельной переменной.
Делее если в отдельности какой либо элемент попадает в буферную зону дорог, радиусом 50 метров, то для отдельной переменной указать показатель в иде 1 если попаадает, если не = 0.
После всех проделанных задач, совершить подсчёт по простой формуле (X1+X2+X3..Xn) и вывести в виде отчёта либо сохранить в табличку, с новым полем К, где будут внесены все сосчитанные показатели.
Вроде задачка не сложная, но реализовать её никак не получается, кто может, ПОМОГИТЕ. Зарание спасибо.
  • 0

#282
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Приветствую!
Код того что сделано в студию.
Самое главное для чего сделан этот топик - это помощь с MapBasic'ом, но за Вас это никто делать не будет, Вы укажите в чем конкретно сложность, укажите то, что не можете сделать и тогда мы Вам поможем )
  • 0

#283
Ananeli

Ananeli
  • Случайный прохожий
  • 2 сообщений
По большей части я не могу применить инструмент выделение в круге, потомуч то в учебнике как таковых функций ненашёл. Кроме как использвать стандартно т.е. добавить на собственную панель инструментов, а мне нужно чтобы это автоматезировано совершало..
  • 0

#284
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Насколько мне помнится без создания собственного инструмента в собственной панели этого сделать нельзя, кроме как была еще возможность встроить свой инструмент в уже готовую панельку.
  • 0

#285
mafka

mafka
  • Случайный прохожий
  • 2 сообщений
Добрый день! Помогите, пожалуйста, с написанием простой программы на MapBasic, которая считает процент попадания кривой в область полигона и заносит результат в таблицу.
  • 0

#286
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Здравствуйте.

Если бы Вы прочитали руководство пользователя хотя бы первые 8 глав, то у Вас не возникло бы такого вопроса ), мой совет Вам просто прочтите эти главы.

Теперь ближе к делу, что Вы уже написали покажите кусок кода, где у Вас возникла проблемка, а после уже будем разбирать что к чему.
  • 0

#287
mafka

mafka
  • Случайный прохожий
  • 2 сообщений
Я не программист, поэтому мне сложновато сформулировть проблему. Я пока нашла только функцию ProportionOverlap(object1, object2), которая вычисляет процент перкрытия одного объекта другим. С синтаксисом языка разобралась в общих чертах. Непонятно, каким образом указать параметры функции, которые находятся на слоях карты.
  • 0

#288
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Ну что ж mafka, я помог тебе как мог, теперь все от тебя зависит, удачи на защите диплома!
  • 0

#289
vlad_sher

vlad_sher
  • Гость
  • 5 сообщений
Добрый день!

Хочу поднять вопрос об использовании в 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

  • 0

#290
vlad_sher

vlad_sher
  • Гость
  • 5 сообщений
Добрый день всем!
По поводу невозможности вызвать из 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

  • 0

#291
Jismo

Jismo
  • Свой человек
  • 975 сообщений
не успел )
  • 0

#292
vlad_sher

vlad_sher
  • Гость
  • 5 сообщений
Вот еще один вопрос по поводу C# + MapBasic:

Из 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

  • 0

#293
Jismo

Jismo
  • Свой человек
  • 975 сообщений
2vlad_sher: в самом начале этого топика на 2 странице

Первое условие которое необходимо для вызова .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


  • 0

#294
vlad_sher

vlad_sher
  • Гость
  • 5 сообщений
2Jismo:

Спасибо за ответ, но на самом деле я вызывал именно статичные методы (описанные на C# как public static).
Просто когда набирал сообщение, почему -то упустил это, а потом не нашёл как подправить своё сообщение.

Мой неработающий код на C# таков:
public static void FillArray(ref int[] MyArray) 
{
// как-то изменяю массив
}

Вроде все по правилам - ref говорит, что переменная ссылка, а далее говорится что переменная - массив.
Не пойму, почему MapInfo/MapBasic не признаёт такое объявление... :(
  • 0

#295
Jismo

Jismo
  • Свой человек
  • 975 сообщений
я сейчас не могу никак проверить код, так как у меня нет МИ и МБ. Я Вам в лс еще кое-что накалякал по памяти можете глянуть

Да и я забыл написать что версия МИ и МБ должна быть 9.5 и выше.

Сообщение отредактировал Jismo: 07.10.2011, 12:08:18

  • 0

#296
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Вопрос в том, как корректно работать с таким массивом на стороне C# ?
Полагаю, что принимающая процедура должна выглядеть примерно так:

public void FillArray(ref int Array)
{
...
}
Хотя я не уверен.
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел

В C# ссылка на массив целых чисел передается в функцию так:
public void FillArray(int[] myArray)
{
   ....
}
Ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.
  • 0

#297
vlad_sher

vlad_sher
  • Гость
  • 5 сообщений

В C# ссылка на массив целых чисел передается в функцию так:

public void FillArray(int[] myArray)
{
   ....
}
Ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.

Большое спасибо, Visual1.
Ваши пояснения очень помогли. Код заработал.

Сообщение отредактировал vlad_sher: 07.10.2011, 16:09:26

  • 0

#298
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Большое спасибо, Visual1.
Ваши пояснения очень помогли. Код заработал.

Рад быть полезным. :beer:

А массивы строк в 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

  • 0

#299
orcinus_orca

orcinus_orca
  • Случайный прохожий
  • 1 сообщений
Здравствуйте,
Помогите, пожалуйста, в следующей проблеме.
Есть точка на карте и надо от нее построить линию (азимут и длина известны).
Можно конечно построить через "Create Line by Lengh", но это ручками, а линий надо настроить много.
Можно через функцию CreateLine, но как рассчитать конечные координаты?
  • 0

#300
Ramon119

Ramon119
  • Случайный прохожий
  • 2 сообщений
Привет всем!
Сможете написать задачу в Mapbasic, а звучит она так: Создать Базу данных в которой есть месторождение с названием номер куста и 2 скважены в нем с известными координатами, уклоном и другими хар-ми.
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.