我有一个带有两种顶点的图:
- 代表图节点的主要顶点
- 作为主顶点和边的子节点的端口顶点连接到它们。
(边不能直接连接到节点,因为端口顶点正在对必须显式可视化的真实对象进行建模。)每个端口顶点的定位使其在与其连接的边的相反节点的方向上紧密地邻接其父节点。这是通过布局算法完成的。见图片:
+------+ port +------+
| +-+ +-+ |
| node | |---------------| | |
| +-+ edge +-+ |
+------+ +------+
然而,当一个节点被拖拽时,它的端口仍然有它相对于父节点的旧的相对位置。根据节点的新坐标刷新端口位置应该怎么做?至少在删除节点之后,理想情况下也是在实时预览期间(mxGraphHandler.isLivePreview() == true)。
当前错误图表:
+------+ port
| +-+
| node | |
| +-+
+------+ \
\
\ +------+
+-+ |
| | |
+-+ |
+------+
预期的正确图表:
+------+
| |
| node |
| | port
+------+-+
| |
+-+
\
\
\
+-+
| |
+-+------+
| |
| |
| |
+------+
我深入研究了实时预览过程,并有一些线索和一些未分类的不清楚:
- 似乎我将不得不实现自己的 mxMovePreview 扩展并覆盖 start/getPreviewStates 方法,因为他们当前的实现硬编码了受影响的节点集,例如不包括拖动节点的相反端口
- 似乎我将无法完全重用端口定位策略,因为在布局中它应用于单元格的几何形状,在预览中它应用于 mxCellStates 和 mxCellStatePreview
- 接收 dx,dy 的方法应用线性变换(按常数向量移动),复杂的几何重新计算将需要重建坐标?
- 端口的定位类似于更新 mxCellStatePreview.revalidateState 中的边缘端点 - 也许我应该实现自己的 mxCellStatePreview 扩展并重写此方法?
- 删除节点后如何实现刷新?似乎与实时预览不同。mxEvent.STOP 上的监听器就足够了,还是需要一些过载?
我将不胜感激设置正确方向的任何帮助。谢谢你。