private drawLabels()

in src/services/dataRenderService.ts [493:579]


    private drawLabels(data: ArcDescriptor<AsterDataPoint>[],
        context: Selection<AsterArcDescriptor>,
        layout: ILabelLayout,
        viewport: IViewport,
        outlineArc: any,
        labelArc: any): void {
        // Hide and reposition labels that overlap
        let dataLabelManager: DataLabelManager = new DataLabelManager();
        let filteredData: any = dataLabelManager.hideCollidedLabels(viewport, data, layout, true /* addTransform */);

        if (filteredData.length === 0) {
            dataLabelUtils.cleanDataLabels(context, true);
            return;
        }

        // Draw labels
        if (context.select(DataRenderService.labelGraphicsContextClass.selectorName).empty()) {
            context.append("g").classed(DataRenderService.labelGraphicsContextClass.className, true);
        }

        let labels: Selection<any> = context
            .select(DataRenderService.labelGraphicsContextClass.selectorName)
            .selectAll(".data-labels")
            .data<LabelEnabledDataPoint>(
                filteredData,
                (d: AsterArcDescriptor) => (<ISelectionId>d.data.identity).getKey());

        labels
            .exit()
            .remove();

        labels = labels.merge(
            labels
                .enter()
                .append("text")
                .classed("data-labels", true));

        if (!labels) {
            return;
        }

        labels
            .attrs({ x: (d: LabelEnabledDataPoint) => d.labelX, y: (d: LabelEnabledDataPoint) => d.labelY, dy: ".35em" })
            .text((d: LabelEnabledDataPoint) => d.labeltext)
            .styles(layout.style);

        // Draw lines
        if (context.select(DataRenderService.linesGraphicsContextClass.selectorName).empty())
            context.append("g").classed(DataRenderService.linesGraphicsContextClass.className, true);

        // Remove lines for null and zero values
        filteredData = filter(filteredData, (d: AsterArcDescriptor) => d.data.sliceHeight !== null && d.data.sliceHeight !== 0);

        let lines = context
            .select(DataRenderService.linesGraphicsContextClass.selectorName)
            .selectAll("polyline")
            .data<LabelEnabledDataPoint>(
                filteredData,
                (d: AsterArcDescriptor) => (<ISelectionId>d.data.identity).getKey());

        let midAngle = (d: any) => { return d.startAngle + (d.endAngle - d.startAngle) / 2; };

        lines
            .exit()
            .remove();

        lines = lines.merge(
            lines.enter()
                .append("polyline")
                .classed("line-label", true));

        lines
            .attr("points", (d) => {
                let textPoint = [d.labelX, d.labelY];
                textPoint[0] = textPoint[0] + ((midAngle(<any>d) < Math.PI ? -1 : 1) * DataRenderService.LabelLinePadding);
                let chartPoint = outlineArc.centroid(<any>d);
                chartPoint[0] *= DataRenderService.ChartLinePadding;
                chartPoint[1] *= DataRenderService.ChartLinePadding;

                return <any>[chartPoint, textPoint];
            })
            .style("opacity", 0.5)
            .style("fill-opacity", 0)
            .style("stroke", () => this.settings.labels.color);


    }