PowerPoint Freeform Shape

PowerPoint Shape Secrets: Manipulating Freeform Shapes with VBA & Add-ins

Dive deep into the world of PowerPoint shapes with “The Teacher,” as we reveal the secrets to manipulating freeform shapes far beyond the usual capabilities. In this in-depth post, you’ll learn how to access the underlying vertex and node information of these shapes, unlocking a realm of custom animation, precise control, and advanced add-in development.

Whether you’re a PowerPoint power user looking to push the limits, a developer building innovative add-ins, or someone interested in real-time visual effects, this guide will provide you with actionable techniques and insights. We’ll walk you through using VBA for shape data extraction, implementing custom manipulation through VSTO PowerPoint add-ins, and leveraging the PowerPoint JavaScript API for more advanced control.

What You’ll Learn:

  • Shape Data Extraction: Master the techniques to access the vertices and node data of PowerPoint freeform shapes using VBA.
  • Advanced Manipulation: Discover how to manipulate shape nodes and vertices directly, beyond PowerPoint’s native tools.
  • VSTO Add-in Development: Learn to build custom VSTO PowerPoint add-ins to create unique shape effects.
  • Real-Time Interactions: Understand how to use WPF application overlays for real-time shape adjustments and feedback.
  • Dynamic Animations: Create complex animations by manipulating shape nodes and vertices, including partial group selections.
  • Coordinate Systems: Grasp the intricacies of PowerPoint points and WPF pixels for seamless integration between PowerPoint and external applications.
  • Custom UI Overlays: Learn how to overlay custom WPF user interfaces to manipulate PowerPoint shapes dynamically.
  • Log Analysis: See how we use log files for detailed debugging and analysis of position and movement data.

This isn’t just about showing you code; it’s about empowering you with a deep understanding of the underlying architecture of PowerPoint shapes and providing you with the tools to take your presentations and projects to the next level. Below, we’ll showcase an example VBA script for freeform shape data extraction, complete with tips for advanced use.

Sub DisplayFreeformShapeDetails_Refined()
    Dim shp As Shape
    Dim vertices As Variant
    Dim i As Long
    Dim result As String

    ' Ensure a shape is selected
    If Application.ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Please select a shape.", vbExclamation
        Exit Sub
    End If

    ' Get the selected shape
    Set shp = Application.ActiveWindow.Selection.ShapeRange(1)

    ' Check if the shape is a freeform
    If shp.Type = msoFreeform Then
        ' Gather shape details
        result = "Shape Details:" & vbNewLine
        result = result & "Shape Name: " & shp.Name & vbNewLine
        result = result & "Shape ID: " & shp.Id & vbNewLine
        result = result & "Size (Width x Height): " & shp.Width & " x " & shp.Height & vbNewLine
        result = result & "Position (Left, Top): " & shp.Left & ", " & shp.Top & vbNewLine
        result = result & vbNewLine

        ' Gather vertices
        result = result & "Vertices (X, Y):" & vbNewLine
        vertices = shp.Vertices
        For i = LBound(vertices, 2) To UBound(vertices, 2)
            result = result & "  (" & Round(vertices(1, i), 2) & ", " & Round(vertices(2, i), 2) & ")" & vbNewLine
        Next i
        result = result & vbNewLine

        ' Gather node details and segment type
        If shp.Nodes.Count > 0 Then
            result = result & "Nodes and Segments Details:" & vbNewLine
            Dim nodeKeys As Collection
            Set nodeKeys = New Collection
            On Error Resume Next
            
            ' Capture unique node keys to avoid duplicates with rounded precision
            For i = 1 To shp.Nodes.Count
                Dim nodeKey As String
                nodeKey = CStr(Round(shp.Nodes(i).Points(1, 1), 2)) & "," & CStr(Round(shp.Nodes(i).Points(1, 2), 2))
                If IsDuplicate(nodeKeys, nodeKey) = False Then
                    nodeKeys.Add nodeKey
                    With shp.Nodes(i)
                        result = result & "  Node " & i & " - Position: (" & Round(.Points(1, 1), 2) & ", " & Round(.Points(1, 2), 2) & ")"
                        result = result & ", Editing Type: " & NodeEditingTypeToString(.EditingType)
                        result = result & vbNewLine
                    End With
                End If

                ' Determine segment type between nodes
                If i < shp.Nodes.Count Then
                    ' Add segment type details
                    If shp.Nodes(i).SegmentType = msoSegmentCurve Then
                        result = result & "  Segment " & i & " to " & i + 1 & ": Type = Curve" & vbNewLine
                    ElseIf shp.Nodes(i).SegmentType = msoSegmentLine Then
                        result = result & "  Segment " & i & " to " & i + 1 & ": Type = Line" & vbNewLine
                    End If
                End If
            Next i
            On Error GoTo 0
        Else
            result = result & "No nodes available for this shape." & vbNewLine
        End If

        ' Display the details in the UserForm
        frmShapeDetails.DisplayDetails result

    Else
        ' Notify if the shape is not a freeform
        MsgBox "The selected shape is not a Freeform shape. This script only works with Freeform shapes.", vbExclamation
    End If
End Sub

Function IsDuplicate(collection As Collection, key As String) As Boolean
    Dim item As Variant
    IsDuplicate = False
    On Error Resume Next
    For Each item In collection
        If item = key Then
            IsDuplicate = True
            Exit Function
        End If
    Next item
    On Error GoTo 0
End Function

Function NodeEditingTypeToString(editingType As MsoEditingType) As String
    ' Convert the EditingType constant to a human-readable string
    Select Case editingType
        Case msoEditingCorner
            NodeEditingTypeToString = "Corner"
        Case msoEditingSmooth
            NodeEditingTypeToString = "Smooth"
        Case msoEditingSymmetric
            NodeEditingTypeToString = "Symmetric"
        Case Else
            NodeEditingTypeToString = "Unknown (Possibly Auto-adjusted or Undefined)"
    End Select
End Function

Key Takeaways:

This VBA script enables you to:

  • Extract detailed information about freeform shapes.
  • Analyze node editing types (corner, smooth, symmetric).
  • Identify segment types (curve or line).

Downloadable Resources:

Don’t just read—create! Dive into the world of advanced PowerPoint shape manipulation and take your presentations to the next level. Like, share, comment, and subscribe to “The Teacher” for more in-depth tutorials and innovative techniques. Your journey to mastering PowerPoint starts now!

Watch PowerPoint FreeForm Shape Decoded : Vertices and Nodes Video

Leave a Reply