antvis/G6

能否实现Edge拖动后变更位置 #5567

Shen120 posted onGitHub

问题描述

效果链接 就像链接中的效果一样

重现链接

https://x6.antv.vision/zh/docs/api/registry/edge-tool/#segments

重现步骤

.

预期行为

.

平台

  • 操作系统: [macOS, Windows, Linux, React Native ...]Windows10
  • 网页浏览器: [Google Chrome, Safari, Firefox]Chrome最新
  • G6 版本: 最新

屏幕截图或视频(可选)

No response

补充说明(可选)

No response


不需要那个拖动锚点,只想要那个功能

posted by Shen120 about 1 year ago
posted by zzjjbbaa about 1 year ago

我这个还有点问题,主要是相邻节点间横纵坐标距离太近时,会有path变形的问题,所以暂时不能分享出来。不过你可以,考虑用自定义交互实现,g6的自定义交互还是很强大灵活的

posted by zzjjbbaa about 1 year ago

https://github.com/antvis/G6/assets/33613409/45c79fd6-bd11-44f9-b14b-8aff0fc34214

2024-03-19.090234.mp4 你可能是想要这个

我想要的是这种效果,我主要是没搞懂路径中path的内容

posted by Shen120 about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

posted by zzjjbbaa about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

感谢,我了解下

posted by Shen120 about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

请教一下你是怎么实现在拖动节点时还能保留边手动调整后的位置,我这边实现出来的结果是拖动节点后边就还原了

posted by Shen120 about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

请教一下你是怎么实现在拖动节点时还能保留边手动调整后的位置,我这边实现出来的结果是拖动节点后边就还原了

拖动时,动态修改edge的controlPoints里对应点坐标,比如你拖动的是controlPoints里第二个点的坐标,就需要动态更新这个点的坐标;如果是增加或减少controlPoints中的点,需要先计算你操作的点介于controlePoints中哪两个点间,然后再增减或更新。

posted by zzjjbbaa about 1 year ago

这个还是有点麻烦的,要考虑的问题比较多;后面v5稳定后,基于v5中正交路由的polyline做,可能要方便点

posted by zzjjbbaa about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

请教一下你是怎么实现在拖动节点时还能保留边手动调整后的位置,我这边实现出来的结果是拖动节点后边就还原了

拖动时,动态修改edge的controlPoints里对应点坐标,比如你拖动的是controlPoints里第二个点的坐标,就需要动态更新这个点的坐标;如果是增加或减少controlPoints中的点,需要先计算你操作的点介于controlePoints中哪两个点间,然后再增减或更新。

我现在已经作出这样的效果了,但是就是拖动节点就还原了 https://github.com/antvis/G6/issues/5592

posted by Shen120 about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

请教一下你是怎么实现在拖动节点时还能保留边手动调整后的位置,我这边实现出来的结果是拖动节点后边就还原了

拖动时,动态修改edge的controlPoints里对应点坐标,比如你拖动的是controlPoints里第二个点的坐标,就需要动态更新这个点的坐标;如果是增加或减少controlPoints中的点,需要先计算你操作的点介于controlePoints中哪两个点间,然后再增减或更新。

我现在已经作出这样的效果了,但是就是拖动节点就还原了 #5592

你要更新graph里edge data中的数据,你可以把你代码贴出来看下

posted by zzjjbbaa about 1 year ago

查一下svg path各种指令,然后计算下折线的顶点位置就可以了;我现在采用的是[['M',x,y],['l',x,y],['l',x,y]...['L',x,y]]

请教一下你是怎么实现在拖动节点时还能保留边手动调整后的位置,我这边实现出来的结果是拖动节点后边就还原了

拖动时,动态修改edge的controlPoints里对应点坐标,比如你拖动的是controlPoints里第二个点的坐标,就需要动态更新这个点的坐标;如果是增加或减少controlPoints中的点,需要先计算你操作的点介于controlePoints中哪两个点间,然后再增减或更新。

我现在已经作出这样的效果了,但是就是拖动节点就还原了 #5592

你要更新graph里edge data中的数据,你可以把你代码贴出来看下

// 更新线段位置
  updateSegment(index: number, dx: number, dy: number) {
    const pathData = this.pathData, segments = this.segments;
    if (index < 0 || index >= segments.length) return;
    const {graph} = this as any;

    const segment = segments[index];
    if (segment.start.x === segment.end.x) { // 垂直线段
      segment.start.x += dx;
      segment.end.x += dx;
      if (index > 0) { // 伸缩前一个水平线段
        segments[index - 1].end.x += dx;
      }
      if (index < segments.length - 1) { // 伸缩后一个水平线段
        segments[index + 1].start.x += dx;
      }
    } else if (segment.start.y === segment.end.y) { // 水平线段
      segment.start.y += dy;
      segment.end.y += dy;
      if (index > 0) { // 伸缩前一个垂直线段
        segments[index - 1].end.y += dy;
      }
      if (index < segments.length - 1) { // 伸缩后一个垂直线段
        segments[index + 1].start.y += dy;
      }
    }
    // 更新pathData
    pathData[index + 1] = ['L', segment.end.x, segment.end.y];
    if (index > 0) {
      pathData[index] = ['L', segment.start.x, segment.start.y];
    }
    this.pathData = pathData;
    console.log(cloneDeep(pathData), cloneDeep(segments))
    // this.dragItem?.toFront();
    const attr = this.dragItem?.getKeyShape().attr();
    // this.dragItem?.getKeyShape().attr({
    //   ...attr,
    //   path: pathData,
    // })
    const group = this.dragItem.getContainer();
    const shape = group.find((element) => element.get('name') === 'edge-shape');
    shape.attr('path', pathData)

    // graph.paint();
    // graph.refreshItem(this.dragItem)
    // graph.updateItem(this.dragItem, {attrs: {path: pathData}})
  },

自定义边

G6.registerEdge('CONDITION_LINK', {
  afterDraw: function (model: any, group: any) {
    const shape = group.get("children")[0];
    shape.attr({
      lineAppendWidth: 8
    })
  },
}, 'polyline');
posted by Shen120 about 1 year ago

你方式错了,不应该写在自定义边里;自定义边里的数据是渲染数据,渲染数据在画布更新时,会丢失

posted by zzjjbbaa about 1 year ago

两种方式:1、你在自定义边里,将每个边的controlpoints保存到一个全局变量里,就不会受画布更新的影响了,但是这样会带来很多问题,比如画布数据持久化,历史操作等;2、建议用g6的自定义交互实现。

posted by zzjjbbaa about 1 year ago

两种方式:1、你在自定义边里,将每个边的controlpoints保存到一个全局变量里,就不会受画布更新的影响了,但是这样会带来很多问题,比如画布数据持久化,历史操作等;2、建议用g6的自定义交互实现。

updateSegment是属于自定义事件,我那个自定义边只是改了个响应宽度,我在想是不是不能继承内置边polyline

posted by Shen120 about 1 year ago

Fund this Issue

$0.00
Funded

Pull requests