[udig-devel] Problem with my MapGraphic implementation. Please
Help
Ingmar Eveslage
eveslage at gmail.com
Thu Oct 11 14:51:45 PDT 2007
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.runApplication(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.
More information about the udig-devel
mailing list