www.map-info.ru :: Просмотр темы - Несколько вопросов по MapInfo
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  
На страницу 1, 2, 3  След.
 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Вс Июл 12, 2009 11:53 pm    Заголовок сообщения: Несколько вопросов по MapInfo Добавить ответ со ссылкой на данный текст

День добрый всем, пишу программу для MapInfo, возникли следущие проблемы:
1) Необходимо в заданной точке на карте нарисовать окружность. Рисую так:
Exec("Insert Into {0} (Obj) Values ( CreateCircle( {1}, {2}, {3})) ", _TableName, X, Y, R);
Рисуется круг, заполненный белым цветом. Как мне нарисовать именно окружность, без заливки внутри?
2) Сразу после рисования, круг не отображается на карте, необходимо свернуть/развернуть окно или изменить масштаб карты чтобы он отобразился. Рисую его в анимационном слое, после рисования делаю так:
Exec("Update Window FrontWindow()");
В чем может быть проблема?
3) Как получить текущий масштаб карты и установить свой? т.е. у меня есть радиус того же самого круга, например 10 км. Как мне нарисовать круг именно 10км а не 10 тысяч км? И как можно попросить пользователя ввести масштаб?

Заранее спасибо! буду очень благодарен, срочно надо...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Пн Июл 13, 2009 11:41 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

по 1) CreateCircle нарисует круг, но в оформлении объекта можно указать, что заливать его не надо, тогда круг будет прозрачным:
Alter Object obj Info OBJ_INFO_BRUSH, MakeBrush(1,0,0)
по 2) непонятно. с анимационными слоями не работала, но противопоказаний не должно быть для функции Update Window
по 3) это не масштаб, это единицы измерения в текущей системе координат. СК устанавливается предложением Set CoordSys ...
укажите свою систему координат и свои единицы измерения, например "m" -тогда 10000 - это будет 10 000 м а не 10 000 км
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пн Июл 13, 2009 12:03 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

1) Если я пишу так:
Exec("Alter Object Obj Info OBJ_INFO_BRUSH, MakeBrush(1,0,0)");
Exec("Insert Into {0} (Obj) Values ( CreateCircle( {1}, {2}, {3})) ", _TableName, X, Y, R);
То круг вообще перестает отображаться почему-то...
3) Да, при загрузке карты я прописываю Exec("Set Map Distance Units \"km\"");
Вопрос в том, каким инструментом (или мб инструмента такого стандартного нету) дать пользователю возможность явно указать масштаб - что от этой точки до этой 100 км а не 50 км...

З.Ы. У вас что-то с антиспам ботом в аське, не пропускает...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Пн Июл 13, 2009 12:49 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Сначала объект сздается (CreateCircle), потом изменяется его оформление (Alter Object). Либо сначала можно задать нужный стиль площадного объекта по-умолчанию (Set Style Brush MakeBrush(1,0,0)), чтобы в последующем создаваемые объекты имели такое оформление.

Про масштаб еще меньше стало понятно. В мапинфо объекты имеют координаты. Вы создаете объекты в определенных координатах (X,Y) - значит между точками столько метров, сколько указали при создании объекта. Круг с центром в (100,100) радиусом 10 будет иметь между диаметральными точками 20 соответствующих единиц (км).
Можно только этот круг в окне карты отобразить в масштабе, например 1:2 (в 1 "km" 2 "km"), но расстояние по карте все равно будет 20 км.
Или пользователь должен выбрать, какого размера должен нарисоваться, скажем, круг?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пн Июл 13, 2009 1:06 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

1) Разобрался Smile
Спасибо Вам огромное.
2) Тоже разобрался - сделал слой не анимированным, а обычным и все заработало.
3) задача такая - пользователь загружает карту какую-то и программа должна нарисовать круг радиусом, к примеру, 10 км. Координаты центра известны.
Когда я работал с простыми картинками, я устанавливал масштаб по умолчанию, который пользователь мог изменить. Пользователь выделял расстояние на карте и говорил сколько это расстояние занимает метров.
В MapInfo все хитрее, видимо. Масштаб указан на карте заранее. Но не на всех картах масштаб указан верно. И я пытаюсь понять как можно предоставить пользователю возможность менять масштаб карта.
Одна возможность - представлять возможность выбора единиц изменения - м, км и т.д...
Я правильно понял?

-----
И еще один вопрос, который мне не дает покоя. Разбираюсь с MapInfo недавно, делаю много по примерам. Поэтмоу такой глупый вопрос:
Как я уже говорил, мне надо рисовать круги на карте. Сейчас я делаю так:
Exec("Create Table tmp_demo (Name Char(10), Number SmallInt) File my_table");
Exec("Create Map For tmp_demo");
Exec("Add Map Window FrontWindow() Layer tmp_demo");
Exec("Set CoordSys Table tmp_demo");

Exec("Set Style Brush MakeBrush(1,0,0)");
Exec("Insert Into {0} (Obj) Values ( CreateCircle( {1}, {2}, {3})) ", _TableName, X, Y, R);

Так все работает, но не могли Бы вы рассказать, как правильно хранить информацию в таблице - какие необходимы столбцы.
Поидее мне надо создать в ней несколько объектов - столько, сколько у меня кругов будет нарисовано и для каждого из них указать цвет заливки и границы.
Как оптимально это сделать, без глобального переопределения кисти (как сейчас)?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Пн Июл 13, 2009 1:34 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

без глобального переопределения - это как в первый раз писала: сначала создать объект, потом изменить его оформление Alter Object.
Если надо каждый объект рисовать разными цветами, да еще поля данных к ним добавлять, то лучше сначала создать объект:
Create Ellipse
Into Variable circle_obj
( x1, y1) ( x2, y2)
Pen MakePen(...)
Brush MakeBrush(...)
{предварительно рассчитать эти координаты, в которые вписать круг}

Потом присоединить его к таблице, можно и значения полей для него сразу указать:
Insert Into table ( obj, поле1, поле2 ) Values ( circle_obj, значение1, значение2 )
{до этого, когда создается таблица - надо определить, имена и форматы полей, какие нужны}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пн Июл 13, 2009 1:57 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Exec("Create Table {0} (\"Номер\" SmallInt,\"Название\" Char(50)) File \"C:\\{0}.tab\"", _TableName);
Exec("Create Map For {0}", _TableName);
Exec("Add Map Window FrontWindow() Layer {0}", _TableName);
Exec("Set CoordSys Table {0}", _TableName);

Exec("Dim o_Ellipse as Object");
Exec("Create Ellipse Into Variable o_Ellipse ({0}, {1}),({2}, {3}) Brush MakeBrush(1,0,0)", X - R, Y - R, X + R, Y + R);
Exec("Insert Into {0} (Название,obj) Values (\"Круг\",o_Ellipse) ", _TableName);
Exec("UnDim oEllipse");

На строке "Create Ellipse Into Variable o_Ellipse..." Выпадает ошибка "Variable o_Ellipse already defined." Если строку с определением (Dim...) убрать, то выпадет ошибка что переменная не определена...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Пн Июл 13, 2009 2:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

dim o_ellipse - один раз выполняется? похоже, вы это в цикле пытаетесь определять.
принято определение переменных проводить в начале процедуры...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пн Июл 13, 2009 5:18 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Спасибо Вам большое!
Вроде бы разобрался Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пн Июл 13, 2009 6:12 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

При загрузке карты я устанавливаю еденицы измерения расстояния в километры вот так:
Exec("Set Map Distance Units \"km\"");
Но MapInfo продолжает передовать мне координаты в мм (глупо звучит, но смысл в том, что расстояния между точками я получаю от MapInfo в мм).
Мне нужно нарисовать эллепс с радиусом 10км.
Когда я рисую эллепс так:
Exec("Create Ellipse Into Variable o_Ellipse ({0}, {1}) ({2}, {3})", X - R, Y - R, X + R, Y + R);
Он получается радиуса 10мм... Как это обойти?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Вт Июл 14, 2009 10:50 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Если в начале программы, до операций с координатами, указать:
Set Distance Units "km"
все последующие операции, использующие расстояния будут использовать эти единицы (км) по-умолчанию.
Set Map Distance Units ... устанавливает единицы измерения, которые действуют на одно окно карты, тут можно задать, в каких единицах пользователь увидит расстояние, измеренное, например, инструментом "линейка"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Вт Июл 14, 2009 4:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Спасибо, но помогло
Set CoordSys Layout Units \"km\"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Вт Июл 14, 2009 4:14 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

о чем я и говорила в самом начале Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Вт Июл 14, 2009 5:13 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Ага, спасибо Вам большое!)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 2:25 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Всплыла еще одна проблема. Устанавливаю начальные значения так:
Set Map CoordSys Nonearth Units "km"
Set CoordSys Layout Units "km"
Set Map Distance Units "km"
Set Map XY Units "km"
Set Distance Units "km"

В тестовой карте работает отлично - по клику могу получить любые координаты. Зато при загрузке другой карты координаты всегда возвращаются как 17.64 и -17.64 куда бы я не кликнул...
Отличие карт в том, что в тестовой есть workspace и изначально СК nonEarth, а в той, что не работает, много таблиц (я загружаю одну) и СК Earth 1,0

В чем может быть проблема?(
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
На страницу 1, 2, 3  След.
Страница 1 из 3

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


Top.Mail.Ru