I want to create a graph (Risk Matrix, Risk Waterfall in PowerPoint) for a PM tool I am developing.
In the waterfall I have created on the Y axis, rotated labels. But those labels do not respond to thickness change in the code. The rectangles look strange and do not have uniform thickness, rather they have strange edges.
How do I match the thickness to that of the first graph (left side)?
Sample PowerPoint Exported Graphic
Risk Waterfall Label Measurements
/*
-+- -+- -+- -+-
| | | |
| offsetRiskY (High) | |
| | | |
---+--- -+- | offsetRiskY(Med) = offsetRiskY(High) + heightRiskHigh
| | | |
centerRiskY --------- + heightRisk (High) | |
| | | |
---+--- -+- | -+-
| | |
centerRiskY --------- + heightRisk (Med) offsetRiskYLow = offsetRiskYHigh + heightRiskHigh + heightRiskMed + waterfallHeight = heightHigh + heightMed + heightLow
| | |
---+--- -+- -+-
| |
centerRiskY --------- + heightRisk (Low)
| |
---+--- -+-
*
/ \
|
|
|
|
halfLabelWidth ------+
|------heightRisk/2-----+------heightRisk/2------|
+------------------------------------------------+
halfLabelWidth | |
+ Risk Label +
halfLabelWidth | |
+------------------------------------------------+
*/
Code
public function generateRiskWaterfallLabelYAxis($heightRisk, $offsetRiskY, $labelText)
{
$halfRiskHeight = $heightRisk/2;
$centerRiskY = $offsetRiskY + $halfRiskHeight;
$labelWidth = self::$waterfallHeight - $centerRiskY;
$halfLabelWidth = self::$waterfallLabelWidth/2;
$currentSlide = $this->riskPPT->getActiveSlide();
$shape = $currentSlide->createRichTextShape()->setHeight($halfLabelWidth)->setWidth($heightRisk); //swap width, height for rotation (90 degrees)
$shape->setOffsetX(-$halfRiskHeight);
$shape->setOffsetY($centerRiskY + self::$offsetWaterfallY);
$shape->setRotation(-90);
$offsetX = $shape->getOffsetX() + self::$offsetWaterfallX - $halfLabelWidth/2;
$offsetY = $shape->getOffsetY() - $halfLabelWidth/2;
$shape->setOffsetX($offsetX);
$shape->setOffsetY($offsetY);
$textRun = $shape->createTextRun($labelText); $shape->getActiveParagraph()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); $shape->getActiveParagraph()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
$shape->getBorder()->setColor(new Color('FF'. self::$borderColor))->setLineStyle(Border::LINE_SINGLE)->setLineWidth(1);
}
public function generateRiskWaterfallLabelsYAxis()
{
$maxRisk = 1.0;
//High
$heightHigh = self::$waterfallHeight*($maxRisk-$this->minHigh);
$offsetRiskHigh = 0;
$riskTextHigh = 'High';
$this->generateRiskWaterfallLabelYAxis($heightHigh, $offsetRiskHigh, $riskTextHigh);
//Med
$heightMed = self::$waterfallHeight*($this->minHigh-$this->maxLow);
$offsetRiskMed = $heightHigh;
$riskTextMed = 'Med';
$this->generateRiskWaterfallLabelYAxis($heightMed, $offsetRiskMed, $riskTextMed);
//Low
$heightLow = self::$waterfallHeight*$this->maxLow;
$offsetRiskLow = $heightHigh + $heightMed;
$riskTextLow = 'Low';
$this->generateRiskWaterfallLabelYAxis($heightLow, $offsetRiskLow, $riskTextLow);
}
The problem was solved by drawing another rectangle above the text box (with no border).
$shape = $currentSlide->createRichTextShape()->setHeight($heightRisk)->setWidth($halfLabelWidth);
$offsetX = self::$offsetWaterfallX - $halfLabelWidth;
$offsetY = self::$offsetWaterfallY + $offsetRiskY;
$shape->setOffsetX($offsetX);
$shape->setOffsetY($offsetY);
$shape->getBorder()->setColor(new Color('FF000000'))->setLineStyle(Border::LINE_SINGLE);