• AntV的g6库纵向的紧凑树形节点之间箭头被覆盖


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 屿晚 2024-04-08 16:23 采纳率: 0% 浏览 14 首页/ 前端 / AntV的g6库纵向的紧凑树形节点之间箭头被覆盖 前端react.js 我设计的是基于AntV的g6库一个纵向的紧凑树形,数据是后端请求的,子节点比较多,节点之间自定义的箭头,但是箭头要么被覆盖,要么指向是相反的怎么解决呀#AntVg6库#g6库 draw(cfg, group) { const targetNodeModel = cfg.targetNode.getModel(); // 从目标节点获取模型 const edgeLabel = targetNodeModel.edgeLabel; const lineWidth = widthByPercent(edgeLabel); // 动态计算箭头的大小 const arrowWidth = lineWidth * 2; // 让箭头宽度是线宽的两倍 const arrowLength = 10; // 设置箭头长度 const midPoint = { x: (cfg.startPoint.x + cfg.endPoint.x) / 2, y: (cfg.startPoint.y + cfg.endPoint.y) / 2, }; const endArrow = { path: G6.Arrow.triangle(arrowWidth, arrowLength, 0), d:20, fill: cfg.color || '#000', }; // 添加边路径 const edge = group.addShape('path', { attrs: { path: [ ['M', cfg.startPoint.x, cfg.startPoint.y], ['L', cfg.endPoint.x, cfg.endPoint.y] ], stroke:'#000', lineWidth: widthByPercent(edgeLabel), endArrow, }, name: 'edge-path', }); if (edgeLabel) { // 绘制边上的标签 group.addShape('text', { attrs: { text: edgeLabel, fill: '#595959', // 标签字体颜色 textAlign: 'center', textBaseline: 'middle', x: midPoint.x-25, // 标签的 x 坐标 y: midPoint.y, // 标签的 y 坐标稍微向上偏移避免与线重叠 }, name: 'edge-label', }); } return edge; }, }); 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 屿晚 2024-04-08 16:26
      关注

      尝试调换“L”“M”的语句,箭头跑到了父节点跟前

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-08 18:19
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-08 16:23
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      针对AntV的g6库纵向的紧凑树形节点之间箭头被覆盖的问题,可以采取以下解决方案:

      1. 调整箭头大小和位置,使其不被节点或其他元素覆盖。

      2. 利用G6提供的属性adjust和offset,在绘制边时对箭头进行微调,从而避免箭头与节点重叠或相反指向。

      修改后的代码如下:

      G6.registerEdge('compact-vertical-tree', {
        draw(cfg, group) {
          const targetNodeModel = cfg.targetNode.getModel(); // 从目标节点获取模型  
          const edgeLabel = targetNodeModel.edgeLabel;
          const lineWidth = widthByPercent(edgeLabel);
      
          // 动态计算箭头的大小
          const arrowWidth = lineWidth * 2; // 让箭头宽度是线宽的两倍
          const arrowLength = 10; // 设置箭头长度
      
          const midPoint = {
            x: (cfg.startPoint.x + cfg.endPoint.x) / 2,
            y: (cfg.startPoint.y + cfg.endPoint.y) / 2,
          };
      
          const endArrow = {
            path: G6.Arrow.triangle(arrowWidth, arrowLength, 0),
            d: 20,
            fill: cfg.color || '#000',
            adjust: true, // 开启箭头位置自动调整
            offset: 5, // 调整箭头位置
          };
          // 添加边路径
          const edge = group.addShape('path', {
            attrs: {
              path: [
                ['M', cfg.startPoint.x, cfg.startPoint.y],
                ['L', cfg.endPoint.x, cfg.endPoint.y]
              ],
              stroke: '#000',
              lineWidth: widthByPercent(edgeLabel),
              endArrow,
            },
            name: 'edge-path',
          });
      
          if (edgeLabel) {
            // 绘制边上的标签
            group.addShape('text', {
              attrs: {
                text: edgeLabel,
                fill: '#595959', // 标签字体颜色
                textAlign: 'center',
                textBaseline: 'middle',
                x: midPoint.x - 25, // 标签的 x 坐标
                y: midPoint.y, // 标签的 y 坐标稍微向上偏移避免与线重叠
              },
              name: 'edge-label',
            });
          }
      
          return edge;
        },
      });
      

      同时,需要注意在箭头的path属性中设置箭头的偏移量(offset),以及开启箭头位置自动调整(adjust),可以有效避免箭头与节点重叠或相反指向的情况发生。

      展开全部

      评论 编辑记录
    • GISer Liu 2024-04-08 16:48
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对您描述的问题,您想要解决的主要问题有两个:箭头被覆盖和箭头指向相反。以下是我对问题的分析和解决方案:

      问题分析:

      1. 箭头被覆盖: 当节点之间距离较近或有其他元素挡住箭头时,箭头可能会被覆盖,导致不可见。
      2. 箭头指向相反: 在纵向紧凑树形布局中,箭头应该从父节点指向子节点,但可能出现指向相反的情况。

        解决方案:

        1. 箭头被覆盖:

        您可以尝试调整箭头的位置,确保它们不会被节点或其他元素覆盖。这可能需要一些调整和试验来找到最佳的位置。以下是一些可能的调整方法:
      • 调整箭头的偏移量: 尝试增加箭头的偏移量,使其稍微远离节点。您可以在箭头绘制时增加一个固定的偏移量。
      • 使用 zIndex: 设置箭头的 zIndex 属性,确保它们位于其他元素的上方。

        2. 箭头指向相反:

        确保箭头的起点和终点设置正确,从父节点指向子节点。如果箭头指向相反,可能是由于起点和终点的设置不正确导致的。您可以通过以下方式修复:
      • 确保 cfg.startPoint 是父节点的位置,而 cfg.endPoint 是子节点的位置。
      • 检查起点和终点的计算方法是否正确,可能需要根据布局的方向做出调整。

        修改代码:

        在您提供的代码中,可以尝试做出如下修改:
        javascriptCopy code
        const midPoint = {
        x: (cfg.startPoint.x + cfg.endPoint.x) / 2,
        y: (cfg.startPoint.y + cfg.endPoint.y) / 2,
        };
        const edge = group.addShape('path', {
        attrs: {
        path: [
        ['M', cfg.startPoint.x, cfg.startPoint.y],
        ['L', cfg.endPoint.x, cfg.endPoint.y]
        ],
        stroke: '#000',
        lineWidth: widthByPercent(edgeLabel),
        endArrow,
        zIndex: 1, // 确保箭头位于其他元素上方
        },
        name: 'edge-path',
        });
        
        请注意,这只是示例代码,具体的调整可能需要根据您的实际情况进行调整和修改。

        总结:

        通过调整箭头的位置和方向,并确保起点和终点设置正确,您应该能够解决箭头被覆盖和箭头指向相反的问题。记得在修改代码后进行测试,确保修复了问题并且没有引入新的问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    自定义注解
    C++线程同步
    linux常用命令
    干货 | 携程火车票iOS项目开发体验优化实践
    【TS】class类和接口
    抖音SEO源码
    为什么进程切换比线程切换代价大,效率低?【TLB:页表缓存/快表】
    集合的进阶
    题目0149-优选核酸检测点
    EasyCVR视频汇聚平台显示有视频流但无法播放是什么原因?该如何解决?
  • 原文地址:https://ask.csdn.net/questions/8085146