Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
nawakster
Зарегистрирован: 17.06.2008 Сообщения: 59
|
Добавлено: Пт 12 Июл 2013 15:29 Заголовок сообщения: IIngeoPaintSurface - перерисовка |
|
|
Добрый день.
Набросал модуль на c#
.....
style.PaintContour(surface, tempContour, null);
Не могу понять:
1. Как сделать, чтобы нарисованное не пропадало при перерисовке карты, масштабировании и т.д.
2. Интересно, как реализованно в модуле подключения dxf, возможность выделять временные объекты. |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пн 15 Июл 2013 10:01 Заголовок сообщения: |
|
|
Надо процедуру рисования поместить в один из обработчиков рисования.
Если ваше изображение по смыслу относится к изображению карты и должно присутствовать в макете печати, то помещать следует в цепочку обработчиков "Рисование БД", например DbPaint_PaintComplete(aSurface).
Если ваше изображение относится к оформлению процесса редактирования, например рисование вспомогательных линий, то помещать следует в цепочку обработчиков "Окно карты" или "Редакторы карты", например MapWindow_PaintComplete(aSurface). _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
nawakster
Зарегистрирован: 17.06.2008 Сообщения: 59
|
Добавлено: Чт 18 Июл 2013 10:53 Заголовок сообщения: |
|
|
Михаил, спасибо за ответ.
Можно Вас попросить в трех словах рассказать о способах взаимодействия программы на c# и ингео?
Нет глубокого понимания. Я сделал просто:
Код: |
System.Reflection.Assembly IngeoAssembly = System.Reflection.Assembly.LoadFile(IngeoAssemblyPath);
System.Type IngeoAppClass = IngeoAssembly.GetType("Ingeo.IngeoApplicationClass");
System.Guid GUID = IngeoAppClass.GUID;
object ingeo;
GetActiveObject(ref GUID, IntPtr.Zero, out ingeo);
ingeoApp = ingeo as Ingeo.IIngeoApplication;
|
Далее просто работаю с ingeoApp.
Как в этом случае добраться до обработчиков событий? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Чт 18 Июл 2013 14:14 Заголовок сообщения: |
|
|
nawakster писал(а): | Михаил, спасибо за ответ.
Можно Вас попросить в трех словах рассказать о способах взаимодействия программы на c# и ингео?
Нет глубокого понимания. Я сделал просто:
Код: |
System.Reflection.Assembly IngeoAssembly = System.Reflection.Assembly.LoadFile(IngeoAssemblyPath);
System.Type IngeoAppClass = IngeoAssembly.GetType("Ingeo.IngeoApplicationClass");
System.Guid GUID = IngeoAppClass.GUID;
object ingeo;
GetActiveObject(ref GUID, IntPtr.Zero, out ingeo);
ingeoApp = ingeo as Ingeo.IIngeoApplication;
|
Далее просто работаю с ingeoApp.
Как в этом случае добраться до обработчиков событий? |
В трех словах:
- Сделать COM-объект на .Net.
- В ИнГео сделать программный модуль, который создает и дергает методы COM-объекта.
- В программном модуле добавить скриптовые обработчики событий и из них дерагать реализацию из COM-объекта.
По-моему где-то на форуме даже были детальные примеры такого подхода. Поищите "C#", ".Net".
Вот ссылка для загрузки примера на C#: http://integro.ru/dl/ingeo/examples/sampledotnetmodule.rar _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
nawakster
Зарегистрирован: 17.06.2008 Сообщения: 59
|
Добавлено: Пт 02 Авг 2013 13:24 Заголовок сообщения: |
|
|
Подсобите, товарищи.
Не могу понять логику surfac`а.
Задача простая:
выделить объект -
получить координаты -
нарисовать каждую координату значком -
при выделении в таблице координат поменть эту вершину другим значком.
Код: | private void DrawPoints(IIngeoPaintSurface aSurface)
{
IIngeoStyle style = ingeoApp.ActiveDb.StyleFromID("001300064530");
IIngeoStyle styleVertex = ingeoApp.ActiveDb.StyleFromID("001300064532");
if (currentContour != null)
{
style.PaintContour(aSurface, currentContour, null);
}
if (currentVertex != null)
{
styleVertex.PaintContour(aSurface, currentVertex, null);
}
surface = aSurface;
}
|
Если я передвигаю карту мышкой на пару экранов, то при выделении объекта точки уже не появляются. Но если нажать f5 - то сразу все появляется. Почему?
При выделнии точки в таблице делаю:
Код: |
if (surface != null)
{
DrawPoints(surface);
} |
Закрашенная точка пояляется только после того как нажму f5. Хотя вызываю тот же DrawPoints, но с сохраненным surface. Почему? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пт 02 Авг 2013 14:38 Заголовок сообщения: |
|
|
Не следует запоминать ссылку на surface - часто это временный объект, который теряет актуальность после завершения рисования.
Выполняйте рисование в обработчике событий:
Если надо рисовать и в окне карты и в макете печати, то это события "Рисование БД".
Если надо рисовать только в окне карты, то это событие "Окно карты/после отрисовки".
Чтобы заставить ИнГео перерисовать окно карты, используйте MainWindow.MapWindow.Invalidate, или MainWindow.MapWindow.InvalidateRect для перерисовки части окна. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
nawakster
Зарегистрирован: 17.06.2008 Сообщения: 59
|
Добавлено: Пт 02 Авг 2013 15:32 Заголовок сообщения: |
|
|
Михаил Власов писал(а): |
Чтобы заставить ИнГео перерисовать окно карты, используйте MainWindow.MapWindow.Invalidate, или MainWindow.MapWindow.InvalidateRect для перерисовки части окна. |
Тогда баг в 4.6 - MainWindow.MapWindow.Invalidate - вообще не перерисовывает.
в 4.4 все ок. |
|
Вернуться к началу |
|
 |
Foton
Зарегистрирован: 09.10.2006 Сообщения: 158 Откуда: Ярославль
|
Добавлено: Пн 15 Июн 2015 19:15 Заголовок сообщения: |
|
|
nawakster писал(а): |
Тогда баг в 4.6 - MainWindow.MapWindow.Invalidate - вообще не перерисовывает.
|
Как перерисовать в 4.6? зум дергать? |
|
Вернуться к началу |
|
 |
Foton
Зарегистрирован: 09.10.2006 Сообщения: 158 Откуда: Ярославль
|
Добавлено: Пн 22 Июн 2015 19:55 Заголовок сообщения: |
|
|
а подскажите как отобразить текст на поверхности? есть свойство Font. а как его использовать? |
|
Вернуться к началу |
|
 |
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Вт 23 Июн 2015 17:12 Заголовок сообщения: |
|
|
Foton писал(а): | а подскажите как отобразить текст на поверхности? есть свойство Font. а как его использовать? |
вот так рисуется круглая точка и подпись с номером к ней
Код: |
IIngeoSymbolPainter pntr=maker.app.CreateObject(TIngeoObjectClass.inocPainter,
TIngeoPainterType.inptSymbol) as IIngeoSymbolPainter;
IInPictureEllipseFigure ell= pntr.Picture.Figures.Add(InScripting.TInPictureFigureType.inftEllipse)
as IInPictureEllipseFigure;
double pointsize = 0.0015;
ell.Bottom = -pointsize/2;
ell.Left = -pointsize/2;
ell.Width = pointsize;
ell.Height = pointsize;
ell.Brush.Style = TInBrushStyle.inbsSolid;
ell.Brush.BackColor = 0;
ell.Pen.Color = 0;
ell.Pen.Style = TInPenStyle.inpsSolid;
IInPictureTextFigure txt = pntr.Picture.Figures.Add(TInPictureFigureType.inftText) as IInPictureTextFigure ;
txt.Left = pointsize * 1;
txt.Bottom = pointsize * 1;
txt.Width = pointsize * 10;
txt.Height = pointsize * 2;
txt.Text = "{Text}";
txt.Font.Name = "Arial";
txt.Font.Size = 8;
txt.Font.ForZoomScale = 0;
txt.Pen.Style = TInPenStyle.inpsClear;
txt.Brush.Style = TInBrushStyle.inbsClear;
pntr.Picture.X1 = -pointsize;
pntr.Picture.X2 = pointsize * 4;
pntr.Picture.Y1 = -pointsize;
pntr.Picture.Y2 = pointsize * 4;
pntr.PictureZoomScale = 0;
IIngeoContour cntr = maker.app.CreateObject(TIngeoObjectClass.inocContour, "") as IIngeoContour;
IIngeoContourPart cntp = cntr.Insert(-1);
foreach (DMPoint pnt in maker.points)
{
cntp.Clear();
cntp.InsertVertex(-1, pnt.x, pnt.y, 0);
pntr.PaintContour(image.Surface, cntr, "Text=" + pnt.number);
}
|
|
|
Вернуться к началу |
|
 |
|