''
'' This code is part of Document Solutions for Word demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Collections
Imports System.Collections.Generic
Imports System.Linq
Imports GrapeCity.Documents.Word
'' This sample demonstrates the use of group shapes.
'' Group shapes allow to group several shapes,
'' and apply the same settings (such as fills)
'' to all grouped shapes at once.
Public Class GroupShapes
Function CreateDocx() As GcWordDocument
'' Layout constants:
Const N = 12
Const NCOLS = 3
Const NROWS = 4
Const SIDEX = 130
Const SIDEY = 120
Const DX = 6
Const DY = 4
Dim doc = New GcWordDocument()
'' Add a few ungrouped shapes to the document:
Dim shapes = AddGeometryTypes(doc, New SizeF(SIDEX, SIDEY), N, True, False)
'' Spread out the shapes:
For i = 0 To NROWS - 1
For j = 0 To NCOLS - 1
Dim k = i * NCOLS + j
If (k >= N) Then
Exit For
End If
shapes(k).Position.Horizontal.Offset = (SIDEX + DX) * j
shapes(k).Position.Vertical.Offset = (SIDEY + DY) * i
Next
Next
'' Add the title:
doc.Body.Paragraphs.Insert("Group shape with an image fill", doc.Styles(BuiltInStyleId.Title), InsertLocation.Start)
'' Add the group containing all added shapes:
Dim group As GroupShape
Using shapesRange = doc.Body.GetPersistentRange(shapes(0).Start, shapes.Last().End)
group = shapesRange.GroupShapes.Insert(RangeLocation.Whole)
End Using
'' Adjust the group's size:
group.Size.Width.Value = SIDEX * NCOLS + DX * (NCOLS - 1)
group.Size.Height.Value = SIDEY * NROWS + DY * (NROWS - 1)
'' Create an image fill on the group shape:
group.Fill.Type = FillType.Image
Dim bytes = File.ReadAllBytes(Path.Combine("Resources", "Images", "roofs.jpg"))
group.Fill.ImageFill.SetImage(bytes, "image/jpeg")
'' And apply it to the group:
group.ApplyGroupFill()
Return doc
End Function
''' <summary>
''' Adds a paragraph with a single empty run, and adds a shape for each available GeometryType.
''' The fill and line colors of the shapes are varied.
''' </summary>
''' <param name="doc">The target document.</param>
''' <param name="size">The size of shapes to create.</param>
''' <param name="count">The maximum number of shapes to create (-1 for no limit).</param>
''' <param name="skipUnfillable">Add only shapes that support fills.</param>
''' <param name="noNames">Do not add geometry names as shape text frames.</param>
''' <returns>The list of shapes added to the document.</returns>
Private Shared Function AddGeometryTypes(doc As GcWordDocument, size As SizeF, Optional count As Integer = -1, Optional skipUnfillable As Boolean = False, Optional noNames As Boolean = False) As List(Of Shape)
'' Line and fill colors:
Dim lines = New Color() {Color.Blue, Color.SlateBlue, Color.Navy, Color.Indigo, Color.BlueViolet, Color.CadetBlue}
Dim line = 0
Dim fills = New Color() {Color.MistyRose, Color.BurlyWood, Color.Coral, Color.Goldenrod, Color.Orchid, Color.Orange, Color.PaleVioletRed}
Dim fill = 0
'' The supported geometry types:
Dim geoms As GeometryType() = [Enum].GetValues(GetType(GeometryType))
'' Add a paragraph and a run where the shapes will live:
doc.Body.Paragraphs.Add("")
Dim run = doc.Body.Runs.Last
Dim shapes = New List(Of Shape)
For Each g In geoms
'' Line geometries do not support fills:
If skipUnfillable AndAlso g.IsLineGeometry() Then
Continue For
End If
If count = 0 Then
Exit For
End If
count -= 1
Dim w = size.Width, h = size.Height
Dim shape = run.GetRange().Shapes.Add(w, h, g)
If Not g.IsLineGeometry() Then
shape.Fill.Type = FillType.Solid
If fill < fills.Length - 1 Then
fill += 1
Else
fill = 0
End If
shape.Fill.SolidFill.RGB = fills(fill)
End If
shape.Line.Width = 3
If line < lines.Length - 1 Then
line += 1
Else
line = 0
End If
shape.Line.Fill.SolidFill.RGB = lines(line)
If Not noNames AndAlso g.TextFrameSupported() Then
shape.AddTextFrame(g.ToString())
End If
shape.AlternativeText = $"This is shape {g}"
shape.Size.EffectExtent.AllEdges = 8
shapes.Add(shape)
Next
Return shapes
End Function
End Class