Ответ, данный Pratik, не совсем сработал для моего гипердерева - было несколько небольших изменений, которые мне нужно было сделать, чтобы изображения узлов отображались и масштабировались соответствующим образом в представлении гипердерева.Надеемся, что этот ответ поможет другим пользователям с аналогичными проблемами реализации. Disclaimer Я начинающий программист Javascript, и, вероятно, я упустил что-то существенное в ответе Пратика, что заставило бы его работать.Кроме того, я бы никогда не подошел близко без его ответа, за что я благодарен.
Без изменений в определении данных в json - работает как положено.Ключевым моментом для меня было убедиться, что вы установили overridable: true
, например,
var ht = new $jit.Hypertree({
Node: {
overridable: true,
dim: 9,
color: "#ffffff",
type: "square"
},
. Мне понадобилась высота / ширина изображения, чтобы масштабировать их позже.Я реализовал это в функции loadImages, предоставленной Pratik, поэтому он будет запускаться только один раз:
function loadImages(){
ht.graph.eachNode( function(node){
if( node.getData('type') == 'image' ){
var img = new Image();
img.addEventListener('load', function(){
node.setData('image',img); // store this image object in node
node.setData('imageheight',this.height);
node.setData('imagewidth',this.width);
}, false);
img.src=node.getData('url');
}
});
}
Никаких изменений во времени вызова функции loadImages () сразу после loadJSON.
Мой пользовательский узел выглядел так:
$jit.Hypertree.Plot.NodeTypes.implement({
'image': {
'render': function(node, canvas){
var ctx = canvas.getCtx();
var pos = node.pos.getc().$scale(node.scale);
var nconfig = this.node;
if( node.getData('image') != 0 ){
var img = node.getData('image');
var dim = node.getData('dim');
var w = node.getData('imagewidth');
var h = node.getData('imageheight');
var r = 50/h; // Scaling factor to scale images to 50px height
w = r * w;
h = r * h;
var dist = Math.sqrt( (pos.x*pos.x)+(pos.y*pos.y)); //dist to origin
var scale = 1 - (dist/node.scale);
// scale nodes based on distance to origin
var sw = nconfig.transform ? w * scale : w/dim/2;
var sh = nconfig.transform ? h * scale : h/dim/2;
if (node._depth < 2) {
ctx.drawImage(img,
pos.x - sh/2, //center images on nodes
pos.y - sw/2,
sw,
sh);
}
}
},
'contains': function(node,pos){
var npos = node.pos.getc().$scale(node.scale);
var h = node.getData('imageheight');
var w = node.getData('imagewidth');
return this.nodeHelper.rectangle.contains(npos, pos, w, h);
}
}
});
Единственная нерешенная проблема заключается в том, что изображения не появляются до тех пор, пока я не нажму на график.Я думаю, что это связано с img.addEventListener('load', function(){
, но я не смог выяснить, что является причиной проблемы.Любые мысли приветствуются.