JavaScript is required

线条端点在节点上的位置

带顶点选择的交互式线条创建

具有节点选择工具栏的交互式线条创建界面,用于精确的连接点控制。

带顶点选择的交互式线条创建

功能概述

此示例演示了一个交互式线条创建界面,用户可以在其中选择节点并选择特定的连接点(顶点)来创建新关系。它包括一个自定义节点工具栏,用于精确的连接控制。

核心特性实现

1. 编辑节点控制器

使用编辑节点控制器显示自定义工具栏:

<RelationGraph options={graphOptions}>
    <RGSlotOnView>
        <RGEditingNodeController>
            <MyNodeToolbar onStartCreateLine={onStartCreateLine} />
        </RGEditingNodeController>
        <RGEditingConnectController />
    </RGSlotOnView>
</RelationGraph>

2. 自定义节点工具栏

在选定节点周围创建按钮以进行连接创建:

// MyNodeToolbar.tsx
<div className="my-near-nodes">
    <button onClick={() => createLine('top')}>↑</button>
    <button onClick={() => createLine('left')}>←</button>
    <button onClick={() => createLine('right')}>→</button>
    <button onClick={() => createLine('bottom')}>↓</button>
</div>

3. 线条创建处理

实现线条创建逻辑:

const onStartCreateLine = (fromNode: RGNode, lineTemplate: JsonLineLike, e: React.MouseEvent) => {
    graphInstance.startCreatingLinePlot(e.nativeEvent, {
        template: lineTemplate,
        fromNode: fromNode,
        onCreateLine: (fromNode, toNode, newLineJson?: JsonLine) => {
            if (toNode.id) {
                const newLineId = graphInstance.generateNewUUID(8);
                const newLineJsonData = Object.assign({}, newLineJson, {
                    from: fromNode.id,
                    to: toNode.id,
                    text: 'New Line ' + newLineId
                });
                graphInstance.addLines([newLineJsonData]);
            }
        }
    });
};

4. 画布选择结束处理

处理框选多个节点:

const onCanvasSelectionEnd = (selectionView: RGSelectionView) => {
    const willSelectedNodes = graphInstance.getNodesInSelectionView(selectionView) || [];
    graphInstance.setEditingNodes(willSelectedNodes);
};

5. 单击交互模式

支持不同的交互模式:

const onNodeClick = (nodeObject: RGNode, $event: RGUserEvent) => {
    if ($event.shiftKey || $event.ctrlKey || ($event.metaKey && !$event.altKey)) {
        // 切换选择
        graphInstance.toggleEditingNode(nodeObject);
    } else {
        // 单选
        graphInstance.setEditingNodes([nodeObject]);
    }
    graphInstance.setEditingLine(null);
};

创意使用场景

  • 交互式图表构建器:创建图表编辑工具
  • 工作流设计器:构建工作流创作界面
  • 网络规划工具:交互式设计网络拓扑
  • 教育游戏:创建基于连接的学习游戏
  • 架构设计器:可视化数据库架构设计工具
  • 思维导图应用:交互式思维导图创建器