ArcGIS Engineを使用したカスタムパン


8

いくつかの制約のため、ここでは説明しませんが、アプリケーションにカスタムパンを実装する必要があることに気づきました。

ArcGIS APIリファレンスでは、次のメソッドの使用を推奨しています。

IScreenDisplay2.PanStart(IPoint start)    // Starts a pan
IScreenDisplay2.PanMoveTo(IPoint moveTo)  // Moves to a point
IScreenDisplay2.PanEnd()                  // Ends the pan

これらの各メソッドは、次のイベントハンドラーで(それぞれ)呼び出されます。

IMapControl4.OnMouseDown     // Call PanStart()
IMapControl4.OnMouseMove     // Call PanMoveTo()
IMapControl4.OnMouseUp       // Call PanEnd()

つまり、すべてがうまく機能し、イベントが処理され、パンが始まり、みんなが幸せです。

-だが-

画面が実際にパンする場所は、カーソルをドラッグした場所ではありません。マップはやや確定的なパターンで動き回りますが、APIが何をしているかを補正する方法がわかりません。私は啓発的なドキュメントを見つけることができませんでした。

誰かがAPIのこの部分の経験がありますか?サンプルコードやドキュメントは素晴らしいです!


1
マップが各パンを完了するときに、IDisplayTransformation.DeviceFrameを出力するようにデバッグステートメントを設定してみましたか?以前、特定の条件下でデバイスのフレームサイズが不適切な値に変更されることに気付きました。
カークカイケンダル2011年

@Kirk- DeviceFrameパンしてもまったく変わりません。それは予想されることですが、正しいですか?デバイスフレームは、デバイス座標(ピクセル)でのフレームのサイズです
tbridge

正解です。変更しないでください。displaytransformationインスタンスでITransformEvents.VisibleBoundsUpdatedをリッスンしてましたか?多分それは2回呼ばれていますか?また、代わりにTrackPanを呼び出してましたか?
Kirk Kuykendall

@カークVisibleBoundsUpdated2回呼び出しても運がありません。私は使用しますTrackPan()が、パン中にマウスイベントを引き続き処理する必要があり、それらはaの間TrackPan
抑制さ

イベントハンドラーにコードを投稿できますか?パンはOnMouseUpを終了し、予期しない場所で終了しますか?OnMouseDownとOnMouseUpのX、Yからポイントを作成してみましたか?パンの開始位置と終了位置に対応していますか。
Jakub Sisak GeoGraphics

回答:


2

私はこれをバージョン10 SP 1で試しましたが、どのバージョンでも動作するはずです。

public class PanTool extends BaseCommand implements ITool {
private HookHelper hookHelper = null;
private IScreenDisplay display;

public PanTool()    {
    this.category = "Text";
    this.caption = "Text";
    this.message = "Text";
    this.toolTip = "Text";
    this.name = "Text";
    this.bitmapPath = System.getProperty("user.dir") + "/cmdbitmaps/your_icon.bmp";
    this.enabled = true;
}

@Override
public void onCreate(Object hook)   {
    if (hook == null)
        return;
    try {
        hookHelper = new HookHelper();
        hookHelper.setHookByRef(hook);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onClick()   {
    try {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        map.setCurrentToolByRef(this);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onMouseDown(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1) {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        display = map.getActiveView().getScreenDisplay();

        display.panStart(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public void onMouseUp(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panStop();
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();

        map.getActiveView().refresh();
    }
}

@Override
public void onMouseMove(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panMoveTo(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public boolean onContextMenu(int x, int y) throws IOException, AutomationException {
    return false;
}


@Override
public boolean deactivate() throws IOException, AutomationException {
    return true;
}

@Override
public int getCursor() throws IOException, AutomationException {
    return esriSystemMouseCursor.esriSystemMouseCursorHand;
}

@Override
public void onDblClick() throws IOException, AutomationException {

}

@Override
public void onKeyDown(int keyCode, int shift) throws IOException, AutomationException {

}

@Override
public void onKeyUp(int arg0, int arg1) throws IOException, AutomationException {

}

@Override
public void refresh(int arg0) throws IOException, AutomationException {

}

}}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.