_gt.SuspendUpdate = False System.Threading.Thread.Sleep(300) _gt.SuspendUpdate = True
Solved! Go to Solution.
Here's a thought. Rather than use a timer, what would happen if you added code to test whether the GraphicsTracker count was divisible by 10 with a remainder of 0, then unsuspend the auto-refresh and re-suspend it? Then your display is refreshing for every 10 graphic objects you add, or you can set it to 20 or whatever.
Perhaps the threading is causing a problem.
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import com.esri.arcgis.addins.desktop.Tool;
import com.esri.arcgis.arcmapui.IMxDocument;
import com.esri.arcgis.carto.IActiveView;
import com.esri.arcgis.display.IDisplayTransformation;
import com.esri.arcgis.display.IScreenDisplay;
import com.esri.arcgis.display.ISymbol;
import com.esri.arcgis.display.RgbColor;
import com.esri.arcgis.display.SimpleMarkerSymbol;
import com.esri.arcgis.display.esriSimpleMarkerStyle;
import com.esri.arcgis.enginecore.GraphicTracker;
import com.esri.arcgis.enginecore.IGraphicTrackerSymbol;
import com.esri.arcgis.framework.IApplication;
import com.esri.arcgis.geometry.IGeoTransformation;
import com.esri.arcgis.geometry.IGeometry;
import com.esri.arcgis.geometry.IPoint;
import com.esri.arcgis.geometry.ISpatialReference;
import com.esri.arcgis.geometry.Point;
import com.esri.arcgis.geometry.SpatialReferenceEnvironment;
import com.esri.arcgis.interop.AutomationException;
public class GTTool extends Tool {
/**
* Called when the tool is activated by clicking it.
*
* @exception java.io.IOException if there are interop problems.
* @exception com.esri.arcgis.interop.AutomationException if the component throws an ArcObjects exception.
*/
@Override
public void activate() throws IOException, AutomationException {
}
@Override
public void init(IApplication app) throws IOException, AutomationException {
super.init(app);
mxDoc = (IMxDocument)app.getDocument();
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
super.mousePressed(mouseEvent);
try {
// Create a point based on the user's mouse click.
Point p1 = new Point();
p1.putCoords((double)mouseEvent.getX(), (double)mouseEvent.getY());
if(gt == null){
// Instantiate a GraphicTracker and initialize it once.
// GraphicTracker by default will refresh after each geometry add
gt = new GraphicTracker();
gt.initialize(mxDoc.getActiveView().getFocusMap());
// Tell the GraphicTracker that we want to suspend auto refresh.
gt.setSuspendUpdate(true);
// Create a timer task to toggle the automatic graphic tracker refresh for the duration in milliseconds.
// intially for 5 seconds and every 5 seconds after that.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new UnSuspendTimerTask(), 5000, 5000);
}
// Create a color object that is red
RgbColor color = new RgbColor();
color.setRed(255);
// Create a simplemarkersymbol to be used as the symbol for the graphic placed by GraphicTracker
twoDSymbol = new SimpleMarkerSymbol();
twoDSymbol.setStyle(esriSimpleMarkerStyle.esriSMSSquare);
twoDSymbol.setSize(4);
twoDSymbol.setColor(color);
// Tell the GraphicTracker to create a symbol and assign it to the GraphicTrackerSymbol object
gts = gt.createSymbol((ISymbol)twoDSymbol, null);
// Conver the user's map click point to something useful..
Point mapPoint = (Point)getMapCoordinatesFromScreenCoordinates(p1, mxDoc.getActiveView());
// Declare ESRI named constants for projecting data between WGS1984 and NAD83 HARN AZ Central
int wgs84 = com.esri.arcgis.geometry.esriSRGeoCSType.esriSRGeoCS_WGS1984;
int geotransformId = com.esri.arcgis.geometry.esriSRGeoTransformationType.esriSRGeoTransformation_NAD1983_To_WGS1984_1;
int geotransformDirection = com.esri.arcgis.geometry.esriTransformDirection.esriTransformForward;
// Create a SpatialReferenceEnvironment, ISpatialReference and IGeoTransformation
SpatialReferenceEnvironment spatialRef = new SpatialReferenceEnvironment();
ISpatialReference gcswgs84 = spatialRef.createGeographicCoordinateSystem(wgs84);
IGeoTransformation iGeoTransformation = (IGeoTransformation)spatialRef.createGeoTransformation(geotransformId);
// Set the spatial reference of the point to the spatial reference of the map window (activeView)
mapPoint.setSpatialReferenceByRef(mxDoc.getActiveView().getScreenDisplay().getDisplayTransformation().getSpatialReference());
// Project the point from whatever the activeView spatial reference is to GCS_WGS_1984 World projection - Decimal Degrees
mapPoint.projectEx(gcswgs84, geotransformDirection, iGeoTransformation, false, 0.0, 0.0);
// Add the geometry and symbol to the GraphicTracker
gt.add((IGeometry) mapPoint, gts);
} catch (AutomationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static IPoint getMapCoordinatesFromScreenCoordinates(IPoint screenPoint, IActiveView activeView)throws Exception{
if (screenPoint == null || screenPoint.isEmpty() || activeView == null)
return null;
IScreenDisplay screenDisplay = activeView.getScreenDisplay();
IDisplayTransformation displayTransformation = screenDisplay.getDisplayTransformation();
// Returns a point in whatever coordinate system the DataFrame is set to
return displayTransformation.toMapPoint((int)screenPoint.getX(), (int)
screenPoint.getY());
}
public static GraphicTracker gt = null;
private IGraphicTrackerSymbol gts;
private SimpleMarkerSymbol twoDSymbol;
public static IMxDocument mxDoc;
}
class UnSuspendTimerTask extends TimerTask{
@Override
public void run() {
try {
if(GTTool.gt.isSuspendUpdate()){
// make it auto refresh
GTTool.gt.setSuspendUpdate(false);
} else {
// don't make it auto refresh
GTTool.gt.setSuspendUpdate(true);
}
} catch (AutomationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
_gpsThread = New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(Sub() CreateGPSData(mapCenter.X, mapCenter.Y)))