| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		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);
 
            }
 
 
 | 	 
  | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |