Получите высоту области графика меньше высоты оси категории - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь настроить объект по отношению к точке данных на графике на слайде точки питания.

В настоящее время у меня есть

IEnumerable<P.GraphicFrame> graphicFrames = slidePart.Slide.CommonSlideData.ShapeTree.Elements<P.GraphicFrame>();
P.GraphicFrame chartFrame = null;
foreach (P.GraphicFrame graphicFrame in graphicFrames)
{
    try
    {
        D.GraphicData graphicData = graphicFrame.Elements<D.Graphic>().FirstOrDefault().GraphicData;
        D.Charts.ChartReference chartReference = graphicFrame.Elements<D.Graphic>().FirstOrDefault()
                .GraphicData.Elements<D.Charts.ChartReference>().FirstOrDefault();

        if (chartReference == null) continue;

        string Id = chartReference.Id;
        if (Id == RelationshipId)
        {
            chartFrame = graphicFrame;
            break;
        }
    }
    catch { }
}

if (chartFrame == null){
    throw new Exception("Couldn't Find Chart Frame");
}

D.Offset chartOffset = chartFrame.Transform.Offset;
D.Extents chartExtent = chartFrame.Transform.Extents;

// Chart itself
ChartPart chartPart = slidePart.GetChartPartById(RelationshipId);

D.Charts.ManualLayout layout = chartPart.ChartSpace.Elements<D.Charts.Chart>()
                                                           .FirstOrDefault()
                                                           .PlotArea
                                                           .Layout
                                                           .ManualLayout;
double maxVal = (double) chartPart.ChartSpace.Elements<D.Charts.Chart>().FirstOrDefault().PlotArea.Descendants<DocumentFormat.OpenXml.Drawing.Charts.MaxAxisValue>().FirstOrDefault().Val;
double plotAreaTop = layout.Top.Val;
double plotAreaHeight = layout.Height.Val;

long newCanadaLabelY = (long)(chartOffset.Y.Value +
                              chartExtent.Cy.Value * (plotAreaHeight + plotAreaTop )
                              );

canadaLabel.MoveShape(canadaLabelOffset.X.Value, newCanadaLabelY);

Моя проблема chartOffset.Y.Value + chartExtent.Cy.Value *(plotAreaHeight + plotAreaTop ) равна оси графика и категории. Мое уравнение для определения относительной высоты моей максимальной точки данных chartExtent.Cy.Value * ((plotAreaHeight + plotAreaTop) * ((maxVal - currentNationalRate) / maxVal)) только смотрит на границы оси значений, чтобы определить, где должна располагаться метка. К сожалению, высота, которую я использую - это значение оси высоты + высота оси категории (область построения). Как рассчитать только высоту оси значений?

...