ThinkGeo.com    |     Documentation    |     Premium Support

Object reference not set to an instance of an object when zooming while drawing

See my
earlier post related to zooming issues: thinkgeo.com/forums/tabid/14...fault.aspx


Now that
I'm using DLL 7.0.313.0, I can zoom in and out on the map by scrolling without
exceptions occurring, unless I'm drawing. By drawing I mean that the trackmode is
for example set to Trackmode.Line (or something else other than .None) and I've
already added one or more vertices by clicking somewhere, but I haven't ended
the track yet (for which I would have to double click). 


The Exception: "Object reference not set
to an instance of an object."


Stacktrace:


at 3RM=.KzQ=.LjQ=(Byte[] LzQ=)

   at
ThinkGeo.MapSuite.Core.Feature.GetBoundingBoxCore()

   at
ThinkGeo.MapSuite.Core.Feature.GetBoundingBox()

   at
ThinkGeo.MapSuite.Core.InMemoryFeatureSource.HzQ=(RectangleShape IDQ=,
IEnumerable`1 ITQ=)

   at
ThinkGeo.MapSuite.Core.InMemoryFeatureSource.GetFeaturesInsideBoundingBoxCore(RectangleShape
boundingBox, IEnumerable`1 returningColumnNames)

   at
ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawingCore(RectangleShape
boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1
returningColumnNames)

   at
ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawing(RectangleShape
boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1
returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureLayer.DrawCore(GeoCanvas
canvas, Collection`1 labelsInAllLayers)

   at
ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1
labelsInAllLayers)

   at
ThinkGeo.MapSuite.DesktopEdition.TrackInteractiveOverlay.DrawCore(GeoCanvas canvas)

   at
ThinkGeo.MapSuite.DesktopEdition.Overlay.qhM=(GeoCanvas qxM=)

   at
ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)

   at
ThinkGeo.MapSuite.DesktopEdition.WinformsMap.bxU=(IEnumerable`1 cBU=,
RectangleShape cRU=)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.bBU=(RectangleShape
bRU=, RectangleShape bhU=)

   at
ThinkGeo.MapSuite.DesktopEdition.WinformsMap.vBU=(RectangleShape vRU=)

   at
ThinkGeo.MapSuite.DesktopEdition.WinformsMap.thU=(Int32 txU=, RectangleShape
uBU=)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.rxU=(InteractionArguments
sBU=)

   at
ThinkGeo.MapSuite.DesktopEdition.WinformsMap.kBU=(Object kRU=, Phc= khU=)

   at
ThinkGeo.MapSuite.DesktopEdition.MouseEventAnalyzer.OnMouseEvent(Phc= e)

   at ThinkGeo.MapSuite.DesktopEdition.MouseEventAnalyzer.TRU=(Double
ThU=, Double TxU=, Double UBU=, Double URU=, Int32 UhU=)

   at
ThinkGeo.MapSuite.DesktopEdition.WinformsMap.rBU=(Object rRU=, MouseEventArgs
rhU=)

   at
System.Windows.Forms.Control.OnMouseWheel(MouseEventArgs e)

   at
System.Windows.Forms.Control.WmMouseWheel(Message& m)

   at
System.Windows.Forms.Control.WndProc(Message& m)

   at
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

   at
System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

   at
System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)

   at
System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)

   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr
dwComponentID, Int32 reason, Int32 pvLoopData)

   at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)

   at
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)

   at System.Windows.Forms.Application.Run(Form
mainForm)

   at MyProgram.Program.Main() in C:\...\Program.cs:line
18

   at
System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

   at System.AppDomain.ExecuteAssembly(String
assemblyFile, Evidence assemblySecurity, String[] args)

   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

   at
System.Threading.ThreadHelper.ThreadStart_Context(Object state)

   at
System.Threading.ExecutionContext.RunInternal(ExecutionContext
executionContext, ContextCallback callback, Object state, Boolean 

reserveSyncCtx)

   at System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state, Boolean
preserveSyncCtx)

   at
System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state)

   at
System.Threading.ThreadHelper.ThreadStart()



Hi F5k,



Sorry to say we still can’t recreate the issue, here is our test video and sample, I am not sure if there is anything we missed, so please try  the test sample to see if it can be recreated the issue on your end.

screencast.com/t/VEw0sX2vs3u



Thanks,

Troy

11934.zip (11.2 KB)

I changed your example in such a way that it was more like mine. By doing so I found out that the drawing itself was not the problem.  
  
 In my program, there is an ‘add feature’ button. If clicked on, the user will be asked to set some parameters of this feature (type, name, etc) and depending on the given parameters, map.TrackOverlay.TrackMode will be set to for example Trackmode.Line. 
  
 The thing is, after the parameters have been filled in by the user, but before the user has started drawing, I’ve created a feature based on the chosen parameters and add it to one of the map’s overlays. This feature doesn’t have a shape yet! Instead, the user drawn shape is added to the feature in the TrackEnded event. 
  
 I guess the zooming function runs some sort of refresh, which then fails because one of the overlays contains a shapeless feature. If so, it’s too bad that this exception isn’t caught somewhere where the problem would be easier to identify. 
  
 The obvious solution would be to store the shapeless feature somewhere else, but quite a bit of logic is already written based on the feature being in that overlay. Is there some way by which a shapeless feature in a visible map overlay could work? Can I somehow make the refresh function ignore this one feature, while everything else remains untouched? 


Hi f5k, 



Thanks for the details, I am kinda get your case. The reason I think is just like you guess, caused by the shapeless feature which is only allowed during the overlay drawing. 



Since those features can be treated as  the temporary, I think we can create a temporary InMemoryFeatureLayer to contain them but we set the Isvisible property as false. Then after the TrackEnded event is triggered, we clear the features in the layer. 



If there is anything i misunderstand, please feel free to correct me. 

Regards, 


OK, so that sounds as if it’s not possible to have them invisibly available in a layer together with other features that are visible. I’m going to alter my code so that the feature will be stored in an invisible layer as you suggest, or if that doesn’t work I’ll just throw it into a GeoCollection or something.  
  
 Thank you for your assistance.

Hi F5k, 
  
 Yes, it does. If those features are visible in the layer, when they are drawing, the exception will be thrown out. 
  
 If any other queries, don’t hesitate to let us know. 
 Regards, 
 Troy