如何将两种不同的类型应用于 sigma.js 中的边缘

How to apply two different type to an edge in sigma.js

我正在尝试在 sigma.js 图形 DOTTEDCURVED 中绘制边。 我正在使用 customEdgeShapescurve 插件,但我无法在同一条边上组合两种不同的样式。 事实上,我只能将单一样式应用于 type 属性:

edge.type = 'curvedArrow';

edge.type = 'dotted';

如何将两种样式应用到一条边上?

我已经使用 Sigma.js 一两个星期了,我认为有几种方法可以满足您的需求。我已经使用这种方法根据属性区分节点颜色。下面的代码写在我的(困惑)头顶上,因此未经测试,可能是错误的。

第一种方法是当你推动边缘开始构建图形时(在我的例子中,推动是通过采用包含所有节点和边缘的 JSON-argument 并开始解析它们来制作我的 sigma 实例).这是通过创建一个函数来实现的,该函数接受一个条件,您可以用它来确定它是一条线还是虚线。

function determinetype(determinator){
  if (determinator === "parent"){return "dotted"}
  else if (determinator === "grandparent"){return "line"}
};

for (var i = 0; i<graph.edges.length; i++){
  var edgetype = determinetype(graph.edges[i]["conditional_markup"]);
  g.edges.push({
    id:graph.edges[i]["id],
    source: graph.edges[i]["source"],
    target: graph.edges[i]["target"],
    type: edgetype,
  })
}

第二种方法是在绘制完所有边后对其进行迭代。你会再次想要创建一个函数,它接受一个参数(决定符)和 return 你想要的线条样式。

function get_type(determinator){
  if (determinator === "parent"){return "dotted"}
  else if (determinator === "grandparent"){return "line"}
};
  s.graph.edges().forEach(function(edge){
    edge.type = get_type(edge.conditional_markup);
  });

希望对您有所帮助。

“谢谢你的回答,但我想要一个既弯曲又点缀的边缘。也许唯一的方法是重写插件...... – rvandoni”

我需要类似的东西,是的,这似乎是唯一的方法。

为了缓解问题:

添加:

context.setLineDash([6,6]); // numbers describe length of drawn line then blank, so you may want different values.

在文件中:“sigma.canvas.edges.curvedArrow.js”

就在代码之前:

context.setLineDash([6,6]); // <---
context.strokeStyle = color;
context.lineWidth = size;
context.beginPath();
context.moveTo(sX, sY);
if (source.id === target.id) {
  context.bezierCurveTo(cp.x2, cp.y2, cp.x1, cp.y1, aX, aY);
} else {
  context.quadraticCurveTo(cp.x, cp.y, aX, aY);
}
context.stroke();

您可能需要两个版本,所以只需 copy/create 它的新功能或参数。