function draw(id, data, x , y,
rx, ry, h, ir,partial){
var slices = d3.select("#"+id).append("g").attr("transform", "translate(" + x + "," + y + ")")
.attr("class", "slices");
const cornerSliceElements = slices.selectAll(".cornerSlices")
.data(_data.map(d=>Object.assign({},d)))
.enter().append("path").attr("class", "cornerSlices")
.style("fill", function(d) { return d3.hsl(d.data.color).darker(0.7); })
.attr("d",function(d){ return pieCorner(d, rx-.5,ry-.5, h);})
.each(function(d){this._current=d;})
.attr('opacity',(d,i)=>i||!partial?1:0)
.classed('slice-sort',true)
.style("stroke",function(d) { return d3.hsl(d.data.color).darker(0.7); })
const cornerSliceSurfaceElements = slices.selectAll(".cornerSlicesSurface")
.data(_data.map(d=>Object.assign({},d)))
.enter().append("path").attr("class", "cornerSlicesSurface")
.style("fill", function(d) { return d3.hsl(d.data.color).darker(0.7); })
.attr("d",function(d){ return pieCornerSurface(d, rx-.5,ry-.5, h);})
.each(function(d){this._current=d;})
.attr('opacity',(d,i)=>i||!partial?1:0)
.classed('slice-sort',true)
.style("stroke",function(d) { return d3.hsl(d.data.color).darker(0.7); })
slices.selectAll(".innerSlice")
.data(_data.map(d=>Object.assign({},d)))
.enter().append("path").attr("class", "innerSlice")
.style("fill", function(d) { return d3.hsl(d.data.color).darker(2); })
.attr("d",function(d){ return pieInner(d, rx+0.5,ry+0.5, h, ir);})
.each(function(d){this._current=d;})
.attr('opacity',(d,i)=>i||!partial?1:0)
.classed('slice-sort',true)
.style("stroke",function(d) { return d3.hsl(d.data.color).darker(2); })
cornerSliceElements.sort(function(a,b){
const angleA = a.endAngle;
const angleB = b.endAngle;
return Math.sin(angleA)<=Math.sin(angleB)?-1:1;
})
cornerSliceSurfaceElements.sort(function(a,b){
const angleA = a.startAngle;
const angleB = b.startAngle;
return Math.sin(angleA)<=Math.sin(angleB)?-1:1;
})
slices.selectAll('.slice-sort')
.sort(function(a,b){
const first = slices.selectAll('.slice-sort').filter(d=>d==a).node();
const second = slices.selectAll('.slice-sort').filter(d=>d==b).node();
return first.getBoundingClientRect().top<second.getBoundingClientRect().top?-1:1
})
slices.selectAll(".outerSlice").data(_data).enter().append("path").attr("class", "outerSlice")
.style("fill", function(d) { return d3.hsl(d.data.color).darker(0.7); })
.attr("d",function(d){ return pieOuter(d, rx-.5,ry-.5, h);})
.each(function(d){this._current=d;})
.attr('opacity',(d,i)=>i||!partial?1:0)
slices.selectAll(".topSlice").data(_data).enter().append("path").attr("class", "topSlice")
.style("fill", function(d) { return d.data.color; })
.style("stroke", function(d) { return d.data.color; })
.attr("d",function(d){ return pieTop(d, rx, ry, ir);})
.each(function(d){this._current=d;})
.attr('opacity',(d,i)=>i||!partial?1:0)
}