💙
PowerShellでPowerPointのスライドに部分円の図形を加える。
この記事は何?
- PowerPoint のスライドに部分円の図形を加えるのって億劫ですよね。
- PowerShell で片づけましょう。
構成
OS, PowerShell, PowerPoint のバージョンは次の通りです。
なお、PowerPoint は M365 です。
PS > (Get-WmiObject -Class Win32_OperatingSystem).Caption
Microsoft Windows 11 Home
PS > [string]$PSVersionTable.PSVersion
5.1.22000.653
PS > (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration').ClientVersionToReport
16.0.15330.20260
コード
既存のプレゼンテーションを編集するのも難しくないですが、
ここではプレゼンテーションを新規で作って、スライドのテキストを編集することにします。
# PowerShell のセッションに .NET クラスを定義する。
$SearchPath = 'C:\WINDOWS\assembly\GAC_MSIL\office'
$SearchFilter = 'office.dll'
$PathToAssembly = Get-ChildItem -LiteralPath $SearchPath -Filter $SearchFilter -Recurse |
Select-Object -ExpandProperty FullName -Last 1
Add-Type -LiteralPath $PathToAssembly
# PowerPoint で新規プレゼンテーションを作る。
$Application = New-Object -ComObject PowerPoint.Application
$Application.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue
$Presentation = $Application.Presentations.Add()
# プレゼンテーションにスライドを作る。
$CustomLayout = $Presentation.SlideMaster.CustomLayouts |
Where-Object { $_.Name -eq '白紙' } |
Select-Object -First 1
$Slide = $Presentation.Slides.AddSlide(1, $CustomLayout)
#
# スライドに部分円の図形を加える。
#
class IllegalArgumentException : Exception {
IllegalArgumentException([String]$Message) : base([String]$Message) {}
}
# 座標
class PointInPx {
hidden [int32]$LeftInPx
hidden [int32]$TopInPx
PointInPx([int32]$LeftInPx, [int32]$TopInPx) {
$this.LeftInPx = $LeftInPx
$this.TopInPx = $TopInPx
}
[int32]GetLeftInPx() { return $this.LeftInPx }
[int32]GetTopInPx() { return $this.TopInPx }
}
# 半径
class RadiusInPx {
hidden [int32]$RadiusInPx
RadiusInPx([int32]$RadiusInPx) {
if ($RadiusInPx -lt 0) {
throw [IllegalArgumentException]
}
$this.RadiusInPx = $RadiusInPx
}
[int32]GetRadiusInPx() { return $this.RadiusInPx }
}
# 角度
class AngleInDegree {
hidden [int32]$AngleInDegree
AngleInDegree([int32]$AngleInDegree) {
$this.AngleInDegree = $AngleInDegree
}
[int32]GetAngleInDegree() { return $this.AngleInDegree }
}
function drawShapePie($Shapes, [PointInPx]$Center, [RadiusInPx]$Radius, [AngleInDegree]$Angle1, [AngleInDegree]$Angle2) {
<#
.SYNOPSIS
部分円を描く。
#>
$msoShapePie = 142
$Left = $Center.GetLeftInPx() - $Radius.GetRadiusInPx()
$Top = $Center.GetTopInPx() - $Radius.GetRadiusInPx()
$Width = $Height = $Radius.GetRadiusInPx() * 2
$Shape = $Shapes.AddShape($msoShapePie, $Left, $Top, $Width, $Height)
$Shape.Adjustments(1) = $Angle1.GetAngleInDegree()
$Shape.Adjustments(2) = $Angle2.GetAngleInDegree()
return $Shape
}
function drawShapePies($Shapes, [PointInPx]$Center, [RadiusInPx]$Radius, [int32]$n) {
<#
.SYNOPSIS
指定数の部分円を描く。
#>
$PieAngle = [AngleInDegree]::new(360 / $n)
foreach ($Index in 0..($n-1)) {
$Angle1 = [AngleInDegree]::new($PieAngle.GetAngleInDegree() * $Index)
$Angle2 = [AngleInDegree]::new($PieAngle.GetAngleInDegree() * ($index + 1))
$Shape = drawShapePie $Slide.Shapes $Center $Radius $Angle1 $Angle2
$Shape.Line.Weight = 3
}
}
# スライドの中央を得る。
$PageSetup = $Presentation.PageSetup
$Center = [PointInPx]::new($PageSetup.SlideWidth / 2, $PageSetup.SlideHeight / 2)
# 円の半径を得る。
$Radius = [RadiusInPx]::new(200)
# 指定数の部分円を描く。
# せっかくなので、たくさん描いてみる。
drawShapePies $Slide.Shapes $Center $Radius 24
こんな感じになりました。
簡単ですね!
まとめ
- 意外と簡単に部分円の図形を追加できることがわかりました。
- もうちょっといろいろ遊べそうですね!
現場からは以上です。
Discussion