У меня есть структура с данными и определения формы:Как создать формы SVG на основе данных?
var data = [
{
"id": "first",
"shapes": [
{
"shape": "polygon",
"points": [["8","64"],["8","356"],["98","356"],["98","64"]]
}
]
},
{
"id": "second",
"shapes": [
{
"shape": "ellipse",
"cx": "63", "cy": "306", "rx": "27","ry": "18"
}, {
"shape": "polygon",
"points": [["174","262"],["171","252"],["167","262"]]
}
]
}
]; // in the data may be stored any SVG shape
Я хотел бы создать SVG:
<svg width="218" height="400">
<g transform="translate(0,400) scale(1,-1)">
<g>
<polygon points="8,64 8,356 98,356 98,64"/>
</g>
<g>
<ellipse cx="63" cy="306" rx="27" ry="18"/>
<polygon points="174,262 171,252 167,262"/>
</g>
</g>
</svg>
Для каждого элемента data
Я добавляющим <g>
:
var groups = svg.selectAll("g").data(data, function (d) {
return d.id;
});
groups.enter().append("g");
сейчас Я привязываю данные для групповых фигур:
var shapes = groups.selectAll(".shape").data(function (d) {
return d.shapes;
}, function(d,i){return [d.shape,i].join('-');});
До сих пор это было так, как ожидалось. Теперь я хочу, чтобы для каждой входящей функции рисования узла DOM с правильной формой, но, видимо, shapes.enter().each()
не работает в этом контексте (не определен). Я полагаю, что это работает на каждом узле DOM, чем на каждом подлежащем привязке. И это работает:
shapes.enter().append("g").each(function(draw, i) {
var shape = draw.shape;
d3.select(this).call(drawer[shape]);
});
Но болезненный побочный эффект в том, что SVG имеет два уровня <g>
:
<svg width="218" height="400">
<g transform="translate(0,400) scale(1,-1)">
<g>
<g>
<polygon points="8,64 8,356 98,356 98,64"/>
</g>
</g>
...
</svg>
Как избавиться от этого? Как правильно строить данные?
Вы можете поместить это в jsfiddle или jsbin. Я думаю, что я бы проверял каждую функцию, чтобы увидеть, какой результат визуализируется, и, возможно, получить форму svg как строку и добавить ее в innerHtml в каждом цикле. –
Вы могли бы что-то сделать с этими строками с [superformula] (http://bl.ocks.org/mbostock/1021103) или с заранее вычисленными формами, такими как [здесь] (http://bl.ocks.org/mbostock/1062383). –