[udig-devel] Problem with my MapGraphic implementation. Please
Help
Jesse Eichar
jeichar at refractions.net
Thu Oct 11 19:10:57 PDT 2007
Ok I have an example for you. It is online at:
http://svn.geotools.org/udig/branches/1.1.x/udig/tutorials/
net.refractions.udig.code.examples/src/net/refractions/udig/code/
examples/AnimationMapGraphic.java
Hope this helps,
Jesse
On Oct 11, 2007, at 2:51 PM, Ingmar Eveslage wrote:
>
> Thank you for your hint. But i have some problems with using the
> IAnimation
> interface.
>
> I implemented the interface with a simple implementation
>
> package es.visualizer;
> import org.eclipse.core.runtime.IProgressMonitor;
>
> import net.refractions.udig.project.IMap;
> import net.refractions.udig.project.command.Command;
> import net.refractions.udig.project.internal.Map;
> import net.refractions.udig.project.render.displayAdapter.IMapDisplay;
> import net.refractions.udig.project.ui.IAnimation;
> import net.refractions.udig.ui.graphics.ViewportGraphics;
>
> public class AnimationImpl implements IAnimation {
>
> int counter = 1;
> Map map = null;
> boolean valid = true;
> MapGraphic myMapGrahpic = null;
>
> void setMapGraphic(MapGraphic myMapGrahpic) {
> this.myMapGraphic = myMapGraphic;
> }
>
> @Override
> public short getFrameInterval() {
> return 100;
> }
>
> @Override
> public boolean hasNext() {
> if (counter < 1000) {
> counter++;
> return true;
> }
> return false;
> }
>
> @Override
> public void nextFrame() {
> // here i update the data for the mapgraphic layer on the map
>
> }
>
> @Override
> public void run(IProgressMonitor monitor) throws Exception {
> // dont know what i have to do here
>
> }
>
> @Override
> public void dispose() {
> // TODO Auto-generated method stub
>
> }
>
> @Override
> public Rectangle getValidArea() {
> return null;
> }
>
> @Override
> public boolean isValid() {
> return valid;
> }
>
> @Override
> public void setGraphics(ViewportGraphics graphics, IMapDisplay
> display) {
> // dont know what i have to do here
>
> }
>
> @Override
> public void setValid(boolean valid) {
> this.valid = valid;
> }
>
> @Override
> public Map getMap() {
> return map;
> }
>
> @Override
> public void setMap(IMap map) {
> this.map = (Map) map;
> }
>
> @Override
> public Command copy() {
> // TODO Auto-generated method stub
> return null;
> }
>
> @Override
> public String getName() {
> // TODO Auto-generated method stub
> return null;
> }
> }
>
>
> ---------
>
> when i push a button in my view (i already implemented) i start the
> AnimationUpdater:
>
> AnimationImpl ai = new AnimationImpl();
> ai.setMapGraphic(myMapGraphic);
> AnimationUpdater au = new AnimationUpdater((ViewportPane)
> ApplicationGIS.getActiveMap().getRenderManager().getMapDisplay(),
> (short)
> 100);
> au.getAnimations().add(ai);
> au.run();
>
> I think this could work, but i get an exception:
>
> java.lang.NullPointerException
> at
> net.refractions.udig.project.ui.AnimationUpdater$RunUpdaters.run
> (AnimationUpdater.java:130)
> at org.eclipse.swt.widgets.Display.runTimers(Display.java:3436)
> at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2932)
> at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:
> 2389)
> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353)
> at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219)
> at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
> at
> org.eclipse.core.databinding.observable.Realm.runWithDefault
> (Realm.java:289)
> at
> org.eclipse.ui.internal.Workbench.createAndRunWorkbench
> (Workbench.java:461)
> at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:
> 149)
> at
> net.refractions.udig.internal.ui.UDIGApplication.run
> (UDIGApplication.java:41)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:589)
> at
> org.eclipse.equinox.internal.app.EclipseAppContainer.callMethod
> (EclipseAppContainer.java:572)
> at
> org.eclipse.equinox.internal.app.EclipseAppHandle.run
> (EclipseAppHandle.java:171)
> at
> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplic
> ation(EclipseAppLauncher.java:106)
> at
> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start
> (EclipseAppLauncher.java:76)
> at
> org.eclipse.core.runtime.adaptor.EclipseStarter.run
> (EclipseStarter.java:363)
> at
> org.eclipse.core.runtime.adaptor.EclipseStarter.run
> (EclipseStarter.java:176)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:589)
> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
> at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
> at org.eclipse.equinox.launcher.Main.main(Main.java:1148)
>
> what did i wrong? perhaps you can provide me a little working
> example for
> me.
>
> Thanks forward.
>
> Ingmar
>
> Jesse Eichar wrote:
>>
>> Hi.
>>
>> It sounds to me like since you want actual animation you may want to
>> use an animation instead. For now the API is rather poor. I plan on
>> integrating the timing framework later on. But for now look into
>> IAnimation and AnimationUpdater to run the animation.
>>
>> The problem with using an animation is that it something must start
>> it. I'd suggest that when your map graphic is called to render it
>> starts the animation (if it is not already running). Draw commands
>> (and IAnimations) are drawn on the Acetate layer and are removed
>> during certain rendering actions, such as a zoom in. Because of this
>> you may find that you have to put a timestamp on you animation to
>> make sure that it keeps running and isn't disposed of.
>>
>> I'm not sure this email completely makes sense. Please let me know
>> if you have a question.
>>
>> Jesse
>>
>> On Oct 8, 2007, at 8:57 AM, Ingmar Eveslage wrote:
>>
>>>
>>> Hello,
>>>
>>> I have a problem with the plugin I developed. I implemented a
>>> MapGraphic
>>> Extension which draw rectangles on a given position on the map.
>>> I also implemented a thread which modifies the data that is drawn
>>> and then
>>> calls the Layer.refresh(Envelope) function to draw the MapGraphic
>>> again with
>>> the updated data. Then the thread takes a short break, modifies the
>>> data
>>> again and refreshes the layer again, and so on.
>>>
>>> The MapGrahpics implementation uses double buffering and draws the
>>> hidden
>>> painted picture (a java.awt.image.BufferedImage) in the last line
>>> of the
>>> override draw(MapGraphicContext context) function.
>>>
>>> All works fine, but because the MapGraphic.draw function takes some
>>> time (i
>>> paint many rectangles, and sometime circles) it has not finished
>>> before the
>>> "updating-thread" calls Layer.refresh again. if this happens the
>>> MapGraphics
>>> layer gets totally blank. As i said: only if the Layer.refresh
>>> call is
>>> before the MapGrahics.draw function finishes its last redraw.
>>>
>>> This is very distracting, because the MapGraphic layer with all my
>>> rectangles and circles begin to flicker and sometimes when there
>>> are many
>>> updates the MapGraphic layer gets deleted short after its ready with
>>> painting.
>>>
>>> I hope someone can help me. I tried to find a way to suspend the
>>> updating
>>> thread until the MapGraphic layer completed the draw method, but i
>>> didn't
>>> find the right api call. after hours of debugging i could not even
>>> find the
>>> place where the layer gets blank.
>>>
>>> So please help me.
>>>
>>> Thanks forward
>>> Ingmar
>>>
>>> For info:
>>>
>>> I use Eclipse 3.2 and the uDig SDK 1.1RC11 on a Intel Mac.
>>> --
>>> View this message in context: http://www.nabble.com/Problem-with-my-
>>> MapGraphic-implementation.-Please-Help-tf4588290.html#a13096935
>>> Sent from the udig-devel mailing list archive at Nabble.com.
>>>
>>> _______________________________________________
>>> User-friendly Desktop Internet GIS (uDig)
>>> http://udig.refractions.net
>>> http://lists.refractions.net/mailman/listinfo/udig-devel
>>
>> _______________________________________________
>> User-friendly Desktop Internet GIS (uDig)
>> http://udig.refractions.net
>> http://lists.refractions.net/mailman/listinfo/udig-devel
>>
>>
>
> --
> View this message in context: http://www.nabble.com/Problem-with-my-
> MapGraphic-implementation.-Please-Help-tf4588290.html#a13165456
> Sent from the udig-devel mailing list archive at Nabble.com.
>
> _______________________________________________
> User-friendly Desktop Internet GIS (uDig)
> http://udig.refractions.net
> http://lists.refractions.net/mailman/listinfo/udig-devel
More information about the udig-devel
mailing list