我正在尝试使用 InfoVis / JIT 来呈现可视化网络的力导向图。我是 java 脚本和 JIT 的新手。我在我的 js 文件中使用以下代码创建了我自己的自定义节点类型,这让我可以在节点上显示我的图像。
$jit.ForceDirected.Plot.NodeTypes.implement({
'icon1': {
'render': function(node, canvas){
var ctx = canvas.getCtx();
var img = new Image();
img.src='magnify.png';
var pos = node.pos.getc(true);
img.onload = function() {
ctx.drawImage(img, pos.x, pos.y);
};
},
'contains': function(node,pos){
var npos = node.pos.getc(true);
dim = node.getData('dim');
return this.nodeHelper.circle.contains(npos, pos, dim);
//return this.nodeHelper.square.contains(npos, pos, dim);
}
}
我在 json 数据对象中使用 "$type": "icon1" 将此自定义节点类型分配给节点。我确实在节点上获得了图像,但问题是我无法在需要时隐藏它。我可以使用以下代码隐藏内置节点类型,如圆形、方形等。
node.setData('alpha', 0);
node.eachAdjacency(function(adj) {
adj.setData('alpha', 0);
});
fd.fx.animate({
modes: ['node-property:alpha',
'edge-property:alpha'],
duration: 2000
});
但是相同的代码不适用于自定义节点。因此,我尝试将节点类型临时更改为内置的“圆形”类型,将其隐藏,然后将节点类型重新设置为其原始类型,即我的自定义节点 icon1。
function hideNode( ){
var typeOfNode = node.getData('type');
node.setData( 'type','circle');
node.setData('alpha', 0);
node.eachAdjacency(function(adj) {
adj.setData('alpha', 0);
});
fd.fx.animate({
modes: ['node-property:alpha',
'edge-property:alpha'],
duration: 2000
});
node.setData('type',typeOfNode );
}
我认为这应该可行,但自定义图像会在一段时间后在画布上返回。如果我没有将节点的类型重置为其原始类型,即在上面的代码中并注释掉以下语句并调用隐藏函数,那么该节点将被隐藏。
node.setData('type',typeOfNode );
我无法弄清楚如何仅通过将节点的类型设置为某种自定义类型来呈现节点。对此问题的任何帮助将不胜感激。
我需要将节点的类型重新设置为其原始类型,因为我希望在需要时通过调用取消隐藏函数来恢复节点。如果我不将节点的类型重置为原始类型,那么在恢复时它将呈现为一个圆圈。
我已经浏览了 JIT 的 API 和 google 组,但找不到答案。任何人都可以帮忙吗?