antv/x6 多层嵌套下自动拓展父节点

antv/x6 官方文档上自动扩展父节点给出的示例仅适用于简单的单层嵌套结构,一旦复杂嵌套结构就会出现各种问题。如下视频:

扩展父节点

现要实现多层嵌套下的自动拓展父节点,需对其代码进行更改。

    graph.on("node:change:size", ({ node, options }) => {
      if (options.skipParentHandler) {
        return;
      }

      const children = node.getChildren();
      if (children && children.length) {
        node.prop("originSize", node.getSize());
      }
    });

    const parentPosition = (node: Node<Node.Properties>) => {
      let embedPadding = 20;

      const parent = node.getParent();
      if (
        parent &&
        parent.isNode() &&
        parent.shape == "groupNode" &&
        !(parent as NodeGroup).isCollapsed()
      ) {
        let originSize = parent.prop("originSize");
        if (originSize == null) {
          originSize = parent.getSize();
          parent.prop("originSize", originSize);
        }

        let originPosition = parent.prop("originPosition");
        if (originPosition == null) {
          originPosition = parent.getPosition();
          parent.prop("originPosition", originPosition);
        }

        let originRec = new Rectangle(
          originPosition.x,
          originPosition.y,
          originSize.width,
          originSize.height
        );

        const children = parent.getChildren();
        const bboxs = children
          ?.filter((item: any) => item.isNode())
          .map((child: any) => child.getBBox());
        if (!bboxs || bboxs.length == 0) {
          return;
        }
        let x0 =
          Math.min(...bboxs.map((bbox: any) => bbox.left)) - embedPadding;
        let y0 =
          Math.min(...bboxs.map((bbox: any) => bbox.top)) - embedPadding * 2;
        let x1 =
          Math.max(...bboxs.map((bbox: any) => bbox.right)) - x0 + embedPadding;
        let y1 =
          Math.max(...bboxs.map((bbox: any) => bbox.bottom)) -
          y0 +
          embedPadding;

        let currentRec = new Rectangle(x0, y0, x1, y1);
        if (!currentRec.equals(originRec)) {
          parent.setPosition(currentRec.topLeft, {
            skipParentHandler: true,
          });
          parent.resize(currentRec.width, currentRec.height, {
            skipParentHandler: true,
          });
        }
      }

      parent && parentPosition(parent as Node);
    };

    graph.on("node:change:position", ({ node, options }) => {
      if (options.skipParentHandler || ctrlPressed) {
        return;
      }

      const children = node.getChildren();
      if (children && children.length) {
        node.prop("originPosition", node.getPosition());
      }

      parentPosition(node);
    });

最终效果如下所示:

多层嵌套结构自动拓展父节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bigHead-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值