Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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) Разобрался
Спасибо Вам огромное.
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 Заголовок сообщения: |
|
|
Спасибо Вам большое!
Вроде бы разобрался |
|
Вернуться к началу |
|
|
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 Заголовок сообщения: |
|
|
о чем я и говорила в самом начале |
|
Вернуться к началу |
|
|
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
В чем может быть проблема?( |
|
Вернуться к началу |
|
|
|