2

2 種類の頂点を持つグラフがあります。

  • グラフ ノードを表す主な頂点
  • メイン頂点とエッジの子であるポート頂点は、それらに接続されます。

(ポートの頂点は、明示的に視覚化する必要がある実オブジェクトをモデル化するため、エッジをノードに直接接続することはできません。) 各ポートの頂点は、接続されたエッジの反対側のノードの方向で親に密接に隣接するように配置されます。これは、レイアウト アルゴリズムによって実現されます。写真を参照してください:

+------+  port             +------+
|      +-+               +-+      |
| node | |---------------| |      |
|      +-+     edge      +-+      |
+------+                   +------+

ただし、ノードをドラッグすると、そのポートは親に対する古い相対位置のままです。ノードの新しい座標に従ってポートの位置を更新するにはどうすればよいですか? 少なくともノードをドロップした後、理想的にはライブ プレビュー中も (mxGraphHandler.isLivePreview() == true)。

現在の間違ったグラフ:

+------+  port
|      +-+
| node | |
|      +-+
+------+  \
           \
            \  +------+
             +-+      |
             | |      |
             +-+      |
               +------+

予想される正しいグラフ:

+------+
|      |
| node |
|      |  port
+------+-+
       | |
       +-+
          \
           \
            \
             +-+
             | |
             +-+------+
               |      |
               |      |
               |      |
               +------+

ライブ プレビュー プロセスを掘り下げたところ、いくつかの手がかりと未分類の不明点がいくつかあります。

  • mxMovePreview の独自の拡張機能を実装し、start/getPreviewStates メソッドをオーバーライドする必要があるようです。現在の実装では、影響を受けるノードのセットがハードコードされており、たとえば、ドラッグされたノードの反対側のポートが含まれていないためです。
  • レイアウトではセルのジオメトリに適用されますが、プレビューでは mxCellStates と mxCellStatePreview に適用されるため、ポート配置の戦略を完全に再利用することはできないようです。
  • dx,dy を受け取るメソッドは線形変換 (定数ベクトルによるシフト) を適用します。複雑なジオメトリの再計算には座標の再構築が必要ですか?
  • ポートの配置は、mxCellStatePreview.revalidateState のエッジ ターミナル ポイントの更新に似ています。おそらく、mxCellStatePreview の独自の拡張機能を実装して、このメソッドを書き直す必要がありますか?
  • ノードをドロップした後にリフレッシュを実装する方法は? ライブプレビューとは違うようです。mxEvent.STOP のリスナーで十分ですか、それともオーバーロードが必要ですか?

正しい方向に設定するための助けに感謝します。ありがとうございました。

4

1 に答える 1