Skip to content

Commit 7018fd8

Browse files
Added setFirstSliceAngle to Doughnut Chart (#872)
* add rotation * remove .idea * set view3D conditionally to enable angle offset * make pie-direction conditional * remove comment * remove direction * fix tests * remove comment * update changelog * update changelog * update gitignore * remove int type * fix cs-fixer * fix cs-fixer * Update src/PhpPresentation/Shape/Chart/Type/Doughnut.php Co-authored-by: Progi1984 <progi1984@gmail.com> * add unit test * update var name --------- Co-authored-by: Progi1984 <progi1984@gmail.com>
1 parent b9cdcd4 commit 7018fd8

File tree

6 files changed

+99
-34
lines changed

6 files changed

+99
-34
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
.Trashes
66
Thumbs.db
77
Desktop.ini
8+
.idea/
89

910
### Continuous Integration
1011
build/

docs/changes/1.2.0.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- PowerPoint2007 Reader : Support for BarChart by [@Progi1984](https://github.com/Progi1984) fixing [#824](https://github.com/PHPOffice/PHPPresentation/pull/824) in [#856](https://github.com/PHPOffice/PHPPresentation/pull/856)
1717
- `phpoffice/phpspreadsheet`: Allow version 4.0 by [@nreynis](https://github.com/nreynis) in [#861](https://github.com/PHPOffice/PHPPresentation/pull/861)
1818
- Smaller package size by [@nreynis](https://github.com/nreynis) in [#862](https://github.com/PHPOffice/PHPPresentation/pull/862)
19+
- Added setFirstSliceAngle to Doughnut Chart by [@seanlynchwv](http://github.com/seanlynchwv) in [#872](https://github.com/PHPOffice/PHPPresentation/pull/872)
1920

2021
## Bug fixes
2122

src/PhpPresentation/Shape/Chart/Type/Doughnut.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ class Doughnut extends AbstractTypePie implements ComparableInterface
3434
*/
3535
protected $holeSize = 50;
3636

37+
/**
38+
* Starting angle of the first slice.
39+
*
40+
* @var int
41+
*/
42+
private $firstSliceAngle = 0;
43+
3744
/**
3845
* @return int
3946
*/
@@ -71,4 +78,16 @@ public function getHashCode(): string
7178
{
7279
return md5(parent::getHashCode() . __CLASS__);
7380
}
81+
82+
public function setFirstSliceAngle(int $angle): self
83+
{
84+
$this->firstSliceAngle = (($angle % 360) + 360) % 360;
85+
86+
return $this;
87+
}
88+
89+
public function getFirstSliceAngle(): int
90+
{
91+
return $this->firstSliceAngle;
92+
}
7493
}

src/PhpPresentation/Writer/PowerPoint2007/PptCharts.php

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -115,38 +115,40 @@ protected function writeChart(Chart $chart): string
115115
$objWriter->endElement();
116116

117117
// c:view3D
118-
$objWriter->startElement('c:view3D');
118+
if ($chart->getPlotArea()->getType() instanceof Bar3D || $chart->getPlotArea()->getType() instanceof Pie3D) {
119+
$objWriter->startElement('c:view3D');
119120

120-
// c:rotX
121-
$objWriter->startElement('c:rotX');
122-
$objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
123-
$objWriter->endElement();
121+
// c:rotX
122+
$objWriter->startElement('c:rotX');
123+
$objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
124+
$objWriter->endElement();
124125

125-
// c:hPercent
126-
$hPercent = $chart->getView3D()->getHeightPercent();
127-
$objWriter->writeElementIf(null != $hPercent, 'c:hPercent', 'val', $hPercent);
126+
// c:hPercent
127+
$hPercent = $chart->getView3D()->getHeightPercent();
128+
$objWriter->writeElementIf(null != $hPercent, 'c:hPercent', 'val', $hPercent);
128129

129-
// c:rotY
130-
$objWriter->startElement('c:rotY');
131-
$objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
132-
$objWriter->endElement();
130+
// c:rotY
131+
$objWriter->startElement('c:rotY');
132+
$objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
133+
$objWriter->endElement();
133134

134-
// c:depthPercent
135-
$objWriter->startElement('c:depthPercent');
136-
$objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
137-
$objWriter->endElement();
135+
// c:depthPercent
136+
$objWriter->startElement('c:depthPercent');
137+
$objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
138+
$objWriter->endElement();
138139

139-
// c:rAngAx
140-
$objWriter->startElement('c:rAngAx');
141-
$objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
142-
$objWriter->endElement();
140+
// c:rAngAx
141+
$objWriter->startElement('c:rAngAx');
142+
$objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
143+
$objWriter->endElement();
143144

144-
// c:perspective
145-
$objWriter->startElement('c:perspective');
146-
$objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
147-
$objWriter->endElement();
145+
// c:perspective
146+
$objWriter->startElement('c:perspective');
147+
$objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
148+
$objWriter->endElement();
148149

149-
$objWriter->endElement();
150+
$objWriter->endElement();
151+
}
150152

151153
// Write plot area
152154
$this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
@@ -1352,7 +1354,10 @@ protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, bo
13521354
$objWriter->endElement();
13531355
}
13541356

1355-
$this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0');
1357+
if (($angle = $subject->getFirstSliceAngle()) !== null) {
1358+
$this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', (string) $angle);
1359+
}
1360+
13561361
$this->writeElementWithValAttribute($objWriter, 'c:holeSize', (string) $subject->getHoleSize());
13571362

13581363
$objWriter->endElement();

tests/PhpPresentation/Tests/Shape/Chart/Type/DoughnutTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,25 @@ public function testHashCode(): void
8282

8383
self::assertEquals(md5($oSeries->getHashCode() . get_class($object)), $object->getHashCode());
8484
}
85+
86+
public function testFirstSliceAngle(): void
87+
{
88+
$doughnut = new Doughnut();
89+
90+
// 1) default
91+
self::assertSame(0, $doughnut->getFirstSliceAngle());
92+
93+
// 2) fluent + simple set/get
94+
$angle = $doughnut->setFirstSliceAngle(90);
95+
self::assertInstanceOf(Doughnut::class, $angle);
96+
self::assertSame(90, $doughnut->getFirstSliceAngle());
97+
98+
// 3) normalization (overflow wraps)
99+
$doughnut->setFirstSliceAngle(450); // 450 % 360 = 90
100+
self::assertSame(90, $doughnut->getFirstSliceAngle());
101+
102+
// 3) normalization (negative wraps)
103+
$doughnut->setFirstSliceAngle(-45); // -> 315
104+
self::assertSame(315, $doughnut->getFirstSliceAngle());
105+
}
85106
}

tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptChartsTest.php

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,20 +1809,38 @@ public function testTypeScatterSuperScript(): void
18091809
public function testView3D(): void
18101810
{
18111811
$oSlide = $this->oPresentation->getActiveSlide();
1812-
$oLine = new Line();
1813-
$oLine->addSeries(new Series('Downloads', $this->seriesData));
1814-
$oShape = $oSlide->createChartShape();
1815-
$oShape->getPlotArea()->setType($oLine);
1812+
$shape3d = $oSlide->createChartShape();
1813+
$shape3d->getPlotArea()->setType(new Bar3D());
18161814

18171815
$element = '/c:chartSpace/c:chart/c:view3D/c:hPercent';
1818-
$this->assertZipXmlElementExists('ppt/charts/' . $oShape->getIndexedFilename(), $element);
1819-
$this->assertZipXmlAttributeEquals('ppt/charts/' . $oShape->getIndexedFilename(), $element, 'val', '100');
1816+
$this->assertZipXmlElementExists('ppt/charts/' . $shape3d->getIndexedFilename(), $element);
1817+
$this->assertZipXmlAttributeEquals('ppt/charts/' . $shape3d->getIndexedFilename(), $element, 'val', '100');
18201818
$this->assertIsSchemaECMA376Valid();
18211819

1822-
$oShape->getView3D()->setHeightPercent(null);
1820+
$shape3d->getView3D()->setHeightPercent(null);
18231821
$this->resetPresentationFile();
18241822

1825-
$this->assertZipXmlElementNotExists('ppt/charts/' . $oShape->getIndexedFilename(), $element);
1823+
$this->assertZipXmlElementNotExists('ppt/charts/' . $shape3d->getIndexedFilename(), $element);
1824+
$this->assertIsSchemaECMA376Valid();
1825+
}
1826+
1827+
public function testDoughnutFirstSliceAngle(): void
1828+
{
1829+
$slide = $this->oPresentation->getActiveSlide();
1830+
$shape = $slide->createChartShape();
1831+
1832+
$doughnut = new Doughnut();
1833+
$doughnut->setFirstSliceAngle(90);
1834+
$doughnut->addSeries(new Series('Downloads', $this->seriesData));
1835+
1836+
$shape->getPlotArea()->setType($doughnut);
1837+
1838+
$path = 'ppt/charts/' . $shape->getIndexedFilename();
1839+
$elt = '/c:chartSpace/c:chart/c:plotArea/c:doughnutChart/c:firstSliceAng';
1840+
1841+
$this->assertZipXmlElementExists($path, $elt);
1842+
$this->assertZipXmlAttributeEquals($path, $elt, 'val', '90');
1843+
18261844
$this->assertIsSchemaECMA376Valid();
18271845
}
18281846

0 commit comments

Comments
 (0)