FAQ
エディター (Editor) のイベントの利用

ナレッジ番号:5325 | 登録日:2023/07/26 | 更新日:2024/11/21

概要

Editor オブジェクトは ArcMap に対する Editor エクステンションで、新規に作成することはできないオブジェクトです。このオブジェクトは中心的な編集コンポーネントで、Editor オブジェクトモデルにおける他のすべてのオブジェクトに対して中核となるものです。Editor オブジェクトは新規に作成することはできませんが、Editor オブジェクトは新規に ArcMap のセッションが開始する時には 自動的にいつでも作成されています。実際のところ、すべての ArcMap エクステンションオブジェクトは ArcMap が最初に開始される時に自動的にイ ンスタンス化されます。Editor オブジェクトは、ジオデータベース、カバレッジ、シェープファイル等の Esri ベクトル型ジオグラフィック データセットに保存されたフィーチャに対して一般的な編集環境を提供するために使用されます。Editor オブジェクトの用途は以下の通りです。

  • 編集オペレーションの作成
  • 編集スケッチを作成し管理する カレントタスクの設定
  • ターゲット レイヤーの設定
  • スナッピング環境の構築
  • 編集イベントの操作

Editor エクステンションへの参照を取得するには、Application::FindExtensionByCLSID かIApplication::FindExtensionByName を使用します。Editorはスナップエージェント、編集タスク、Editor エクステンションを含む関連するオブジェクトのコレクションを管理します。これらのオブジェクトへの参照はさまざまな Editor メンバによって提供されます。例えば、IEditor::Task はインデックスによって指定された特定のタスクへの参照を提供します。

コード

Editor の取得

private IEditor3 m_editor;
UID editorUid = new UID();
editorUid.Value = "esriEditor.Editor";
m_editor = app.FindExtensionByCLSID(editorUid) as IEditor;
//m_editor = app.FindExtensionByName("ESRI Object Editor") as IEditor;
//名前で取得する場合
Private m_editor As IEditor3
Dim editorUid As New UID editor
Uid.Value = "esriEditor.Editor" m_editor = My.ArcMap.Application.FindExtensionByCLSID(editorUid)
m_editor = TryCast(app.FindExtensionByCLSID(editorUid), IEditor)
'm_editor = app.FindExtensionByName("ESRI Object Editor") '名前で取得する場合

Editor のイベントの定義

以下はイベントを利用した処理を記述するためのサンプル コードです。 この例では OnSketchFinished イベントを利用し、編集スケッチが完了するタイミングでメッセージを表示しています。
 ((IEditEvents_Event)m_editor).OnSketchFinished += new IEditEvents_OnSketchFinishedEventHandler(OnSketchFinished);
void OnSketchFinished(IPolygon polygon)
{
  System.Windows.Forms.MessageBox.Show("編集スケッチが完了しました。");
}
AddHandler (CType(m_editor, IEditEvents_Event).OnSketchFinished), AddressOf  OnSketchFinished
Private Sub OnSketchFinished()
    System.Windows.Forms.MessageBox.Show("編集スケッチが完了しました。")
End Sub

フィーチャ編集の制御

フィーチャを編集する際に特定の属性値は変更不可としたい場合、例えば Shape フィールドの変更は許可しない制御が必要となる場合等、 OnChangeFeature イベントで制御することができます。以下は Shapeフィールドが変更されていたら OnChangeFeature イベントのタイミングで編集オペレーションを破棄するサンプルコードです。

((IEditEvents_Event)m_editor).OnChangeFeature += new IEngineEditEvents_OnChangeFeatureEventHandler(OnChaneFeatureMethod);
private void OnChaneFeatureMethod(IObject obj)
{
    IFeatureChanges featurechg = (IFeatureChanges)obj;
    IGeometry pOldgeo  = featurechg.OriginalShape;
    IGeometry pNewgeo = ((IFeature)obj).Shape;
    IRelationalOperator prel  = (IRelationalOperator)pOldgeo;
    if (!prel.Equals(pNewgeo)) m_editor.AbortOperation();
    //'編集前と編集後の Geometry の形状が異なっていたら、編集オペレーションを破棄する。
}
AddHandler (CType(m_editor, IEditEvents_Event).OnChangeFeature), AddressOf OnChangeFeatureMethod
Private Sub OnChangeFeatureMethod(obj As IObject)
        Dim featurechg As IFeatureChanges = CType(obj, IFeatureChanges)
        Dim pOldgeo As IGeometry = featurechg.OriginalShape
        Dim pNewgeo As IGeometry = CType(obj, IFeature).Shape
        Dim prel As IRelationalOperator = CType(pOldgeo, IRelationalOperator)
        If Not prel.Equals(pNewgeo) Then m_editor.AbortOperation()
        '編集前と編集後の Geometry の形状が異なっていたら、編集オペレーションを破棄する。
End Sub

参考情報

Editor Class

メタデータ

機能

種類

製品