💙

PowerShellでPowerPointのスライドに部分円の図形を加える。

2022/08/09に公開

この記事は何?

  • 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