ThinkGeo.com    |     Documentation    |     Premium Support

PrinterGeoCanvas questions

Hi,


I am working on the printing of my thinkgeo desktop application (which I am in the midst of converting to SDK 4 from 2.x). I am using the PrinterGeoCanvas but having problems with various custom layers which override DrawCore.


I have a SeamlessGrid class which inherits from GridFeatureLayer. Within this class I am overriding DrawCore and I'm drawing all the cells of the grid individually to a graphics object/bitmap, then setting the opacity of the bitmap, copying the bitmap to a GeoImage and finally drawing the GeoImage to screen using canvas.DrawScreenImageWithoutScaling


 This code works fine when the canvas is a normal map canvas, but when it's a PrinterGeoCanvas it exhibits 2 problems.



        
  1. The DrawScreenImageWithoutScaling seems to ignore the image opacity

  2.     
  3. The image draws in the wrong place and/or at the wrong scale


 



I have tried to use DrawScreenImage instead and scale the GeoImage manually but when I do this, the image isn't drawn on the printer canvas at all - I can't get DrawScreenImage to work at all with PrinterGeoCanvas.



Dim w As Integer = canvas.Width

Dim h As Integer = canvas.Height

Dim bmp As New Bitmap(w, h)

Dim gr As Graphics = Graphics.FromImage(bmp)



'draw the grid here

'blah blah



Dim mstream As New MemoryStream()

gr.Dispose()



Dim bmp2 As New Bitmap(w, h)



bmp2 = SetImgOpacity(bmp, CSng(grid_opacity / 255))

bmp2.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)



Dim img As New GeoImage(mstream)



If TypeOf (canvas) Is PrinterGeoCanvas Then

        canvas.DrawScreenImageWithoutScaling(img, cx, cy, DrawingLevel.LevelOne, 0, 0, 0)

Else

        canvas.DrawScreenImageWithoutScaling(img, cx, cy, DrawingLevel.LevelOne, 0, 0, 0)

End If

 




A similar problem occurs when drawing labels in a custom label class (that should draw a label just under a point shape) that overrides DrawCore:



If TypeOf (canvas) Is PrinterGeoCanvas Then

                        canvas.DrawTextWithWorldCoordinate(textstring, fnt, br, _

feature.GetBoundingBox.GetCenterPoint.X , _

feature.GetBoundingBox.GetCenterPoint.Y - ((fontSize + 4) _

* canvas.CurrentWorldExtent.Height / canvas.Height), _

ThinkGeo.MapSuite.Core.DrawingLevel.LabelLevel)

                    Else

                        canvas.DrawTextWithWorldCoordinate(textstring, fnt, br, _

feature.GetBoundingBox.GetCenterPoint.X, _

feature.GetBoundingBox.GetCenterPoint.Y - ((fontSize + 4) _

* canvas.CurrentWorldExtent.Height / canvas.Height), _

ThinkGeo.MapSuite.Core.DrawingLevel.LabelLevel)

                    End If



The PrinterGeoCanvas again draws in the wrong place. I have tried playing around with the printer margins etc but to no effect.


Am I using PrinterGeoCanvas wrong somehow? Are these known limitations/problems with the class?


Just as an aside, the grid drawing works fine using the PdfGeoCanvas.


Thanks,


Jeremy



Jeremy, 
  
 Thanks for your post and questions. 
  
 It would be nice if you could send me a small sample application with data attached to recreate the problem that would be very helpful to figure out and resolve the issue.  
  
 You can upload the sample in the discussion forum if you want or send us via our support email (forumsupport@thinkgeo.com) asking to forward to Yale. 
 Any more concerns please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Hi Yale,


I thought you were going to say that! It will be a few days before I can put together something standalone to demonstrate the problems. I'll be back!


Jeremy 



Jeremy, 
  
 Thanks for your feedback. 
  
 I am sure you are very well known to our product and me:), because PrinterGeoCanvas is a very new and advanced topic, it is quite complicated, it is very hard for me to get it if I cannot recreate it at first. Thanks for your understanding, I appreciate it very much. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Hi Yale,


I have attached a vb.net 2010 project that shows the offset problem I mentioned. (I had to remove the thinkgeo dll referenced files to get the zip under 500k).


The map shows random points with labels underneath - on screen the labels are correctly positioned, if you do a print of the map you will see that the labels move relative to the points.


The offset is the same when using DrawScreenImage or DrawScreenImageWithoutScaling. The offset doesn't occur when using PDFGeoCanvas.


I hope to get a sample of the other problem (DrawScreenImage not respecting image transparency) to you later today.


 


Thanks


 


Jeremy



GeoPrintCanvas_Test.zip (21.2 KB)

Further to my previous message, I am attaching an extended sample solution that demonstrates the problem I have with transparency using PrinterGeoCanvas.


If you click on "Add Grid" button then it will  load a grid and display it using the SeamlessGrid class which inherits from GridFeatureLayer. You can see on screen that the grid is drawn semi-transparently on top of the points/labels but when you then print  it, the grid is not drawn transparently (and is also drawn offset to the points, in the same way that the labels are). 


This seems to be due to a problem with DrawScreenImageWithoutScaling. If you try and use DrawScreenImage instead then the grid doesn't draw at all. 


I added a button/code to write to pdf using the PDFGeoCanvas so you can see that it works fine there.


Please let me know if you need any more information!


Cheers,


Jeremy


 


 



GeoPrintCanvas_TestGrid.zip (58.6 KB)

Jeremy, 
  
 Just let you know, we can recreate your problem. And we are working on that, if we find solution will let you know. 
  
 Thanks 
  
 James

OK thanks - look forward to further work on this, as it would be a great addition to the SDK :)

Jeremy,


Sorry for the delay and thanks for your post.


Could you also provide the version of the map control, following API shows how to get the version:



string version = WinformsMap.GetVersion();

Thanks.


Yale

 



Thinkgeo Version = MapSuiteCore:4.0.125.0;DesktopEdition:4.0.125.0 
  
 Jeremy

Jeremy, 
  
 Sorry for the delay for the response. This is very wield, for now, I cannot connect to a real printer, but I can get this issue recreated when I use the printer view, and I need more time to do investigations on it, I promise to get you some feedbacks on this in this week. Sorry for the inconvenience for now. 
  
 Thanks. 
  
 Yale 


Hi there - back from a week off and eager to move on with this... any news?


I am scheduled to work on the printing of my application over the next 2 weeks and will have to develop my own printer code if there is no news soon.


Regards,


Jeremy 



Jeremy, 
  
 I am sorry I forget to let you know that we have solved the first issue while for the second issue, currently we have no ideal solution for it, we may need to take more time to investigate it. 
  
 Thanks. 
  
 Yale 


Hi Yale, 
  
 sounds promising - can I get the code to try? I downloaded the latest daily build (4.0.161.0) and it was no different. 
  
 Regards, 
  
 Jeremy

Jeremy,


Thanks for your post and feedback.
I attached a sample for you. To make it run, please copy the files Countries02.shp
from your installer path to the data folder under it. In this sample, it shows a raster image was drawn in the PrinterCanvas.
Any more questions please feel free to let me know.
Thanks.
Yang

ImageSample.zip (199 KB)

Yale,


thanks for the reply and the sample app - I ran the sample and discovered it still exhibits the same offset problem as has been previously demonstrated/discussed.


If you look at the attached screenshot you will see the view shown in the application (which is correct) and the view shown in a printout made from the application, which clearly shows the raster image offset to the SE from the coastline shapefile. I have highlighted with a red ellipse on each image just to be totally clear!


 


This offset is present on various printers I have tried, both physical and virtual.


Regards,


Jeremy 



offset.jpg (38.4 KB)

Jeremy, 
  
 Thanks for your post and feedback. 
  
 I agree the offset issue is still there as I already addressed before, I am not exactly sure what the root reason is for this. Now we are busy in preparing a new public release and I will try to do more investigations on this issue after it to get it fixed, sorry for the inconvenience for now. 
  
 Any more questions please feel free to let me know. 
 Thanks. 
 Yale 


Hi Yale, 
  
 thanks for the info - I think I misunderstood your earlier message about what was fixed (read it too fast!). The support for printing transparent layers is much improved and I will wait for you to work on the offset of certain layer types. Good luck with release. 
  
 Jeremy

Jeremy, 
  
 Thanks for your post and patience, I appreciate it very much. 
  
 Thanks. 
  
 Yale