Created
November 5, 2023 14:46
-
-
Save aschmidt75/c67270224e88f74be1c6121c87af6822 to your computer and use it in GitHub Desktop.
drawio
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [CmdletBinding()] | |
| class DrawIOStyle { | |
| [Hashtable]$elems | |
| [bool]$IsImage | |
| DrawIOStyle() { | |
| $this.elems = New-Object -TypeName Hashtable | |
| } | |
| [void]Set([string]$key, [string]$value) { | |
| $this.elems.Add($key, $value) | |
| if ($key -eq "image") { | |
| $this.IsImage = $true | |
| } | |
| } | |
| [string]Render() { | |
| $res = "" | |
| if ($this.IsImage) { | |
| $res += "image;" | |
| } | |
| $this.elems.GetEnumerator() | foreach { | |
| $res += "{0}={1};" -f $_.key, $_.value | |
| } | |
| return $res | |
| } | |
| } | |
| function New-DrawIOStyle { | |
| [CmdletBinding()] | |
| $res = (New-Object -TypeName DrawIOStyle) | |
| $res | |
| } | |
| function Update-DrawIOStyle { | |
| [CmdletBinding()] | |
| param ( | |
| [Parameter(ValueFromPipeline, Mandatory=$True)] | |
| [DrawIOStyle]$Style, | |
| [string]$width, | |
| [string]$html, | |
| [string]$whitespace, | |
| [string]$rounded, | |
| [string]$fillColor, | |
| [string]$strokeColor, | |
| [string]$dashed, | |
| [string]$dashPattern, | |
| [string]$align, | |
| [string]$verticalAlign, | |
| [string]$image, | |
| [string]$fontSize, | |
| [string]$aspect | |
| ) | |
| begin { | |
| $validParams = @( | |
| "width", | |
| "html", | |
| "whitespace", | |
| "rounded", | |
| "fillColor", | |
| "strokeColor", | |
| "dashed", | |
| "dashPattern", | |
| "align", | |
| "verticalAlign", | |
| "image", | |
| "fontSize", | |
| "aspect" | |
| ) | |
| } | |
| process { | |
| foreach ($v in $validParams) { | |
| if ($PSBoundParameters[$v]) { | |
| $Style.Set($v, $PSBoundParameters[$v]) | |
| } | |
| } | |
| } | |
| end { | |
| $Style | |
| } | |
| } | |
| function Format-DrawIOStyle { | |
| [CmdletBinding()] | |
| param ( | |
| [Parameter(ValueFromPipeline,Mandatory=$True)] | |
| [DrawIOStyle]$Style | |
| ) | |
| $Style.Render() | |
| } | |
| function Get-DrawIORandomID { | |
| return [Convert]::ToBase64String((1..9| % {Get-Random -Minimum 0 -Maximum 256})) | |
| } | |
| class MXCell { | |
| [string]$Id | |
| [string]$ParentId | |
| [string]$Value | |
| [string]$Vertex | |
| [string]$Style | |
| [MXGeometry]$Geometry | |
| MXCell($Id) { | |
| $this.Id = $Id | |
| $this.ParentId = "1" | |
| $this.Geometry = $Null | |
| $this.Vertex = "1" | |
| } | |
| MXCell($Id, $ParentId) { | |
| $this.Id = $Id | |
| $this.ParentId = $ParentId | |
| $this.Geometry = $Null | |
| $this.Vertex = "1" | |
| } | |
| [void]Write($xmlWriter) { | |
| $xmlWriter.WriteStartElement('mxCell') | |
| $xmlWriter.WriteAttributeString('id', $this.Id) | |
| $xmlWriter.WriteAttributeString('parent', $this.ParentId) | |
| if ($this.Value) { | |
| $xmlWriter.WriteAttributeString('value', $this.Value) | |
| } | |
| if ($this.Vertex) { | |
| $xmlWriter.WriteAttributeString('vertex', $this.Vertex) | |
| } | |
| if ($this.Style) { | |
| $xmlWriter.WriteAttributeString('style', $this.Style) | |
| } | |
| if ($this.Geometry) { | |
| $this.Geometry.Write($xmlWriter) | |
| } | |
| $xmlWriter.WriteEndElement() | |
| } | |
| } | |
| class MXGeometry { | |
| [string]$As | |
| [string]$X | |
| [string]$Y | |
| [string]$Width | |
| [string]$Height | |
| MXGeometry() { | |
| $this.As = "Geometry" | |
| } | |
| MXGeometry($x, $y, $w, $h) { | |
| $this.As = "geometry" | |
| $this.X = $x | |
| $this.Y = $y | |
| $this.Width = $w | |
| $this.Height = $h | |
| } | |
| [void]Write($xmlWriter) { | |
| $xmlWriter.WriteStartElement('mxGeometry') | |
| $xmlWriter.WriteAttributeString('as', $this.As) | |
| if ($this.X) { | |
| $xmlWriter.WriteAttributeString('x', $this.X) | |
| } | |
| if ($this.Y) { | |
| $xmlWriter.WriteAttributeString('y', $this.Y) | |
| } | |
| if ($this.Width) { | |
| $xmlWriter.WriteAttributeString('width', $this.Width) | |
| } | |
| if ($this.Height) { | |
| $xmlWriter.WriteAttributeString('height', $this.Height) | |
| } | |
| $xmlWriter.WriteEndElement() | |
| } | |
| } | |
| function Write-DrawIODocument { | |
| <# | |
| .SYNOPSIS | |
| Takes MXCells from a pipeline and writes them to an xml document suitable for DrawIO to read. | |
| .DESCRIPTION | |
| This function creates an XMLWriter, writes a DrawIO conformant XML Document with headers | |
| and embeds all MXCells from a pipeline into it. | |
| #> | |
| [CmdletBinding()] | |
| param( | |
| [string]$Path, | |
| [Parameter(ValueFromPipeline=$true, Mandatory=$true)] | |
| [MXCell]$cell, | |
| [System.Xml.XmlWriterSettings]$Settings | |
| ) | |
| begin { | |
| if (-not $Settings) { | |
| $Settings = [System.Xml.XmlWriterSettings]::new() | |
| $Settings.Indent = $true | |
| $Settings.OmitXmlDeclaration = $true | |
| $Settings.NewLineOnAttributes = $false | |
| } | |
| $sb = [System.Text.StringBuilder]::new() | |
| $writer = [System.Xml.XmlWriter]::Create($sb, $settings) | |
| if ($Path) { | |
| $writer = [System.Xml.XmlWriter]::Create($Path, $settings) | |
| } | |
| $writer.WriteStartDocument() | |
| $writer.WriteStartElement('mxfile') | |
| $writer.WriteAttributeString('host', 'app.diagrams.net') | |
| $writer.WriteStartElement('diagram') | |
| $writer.WriteAttributeString('name', 'ZoneNetworking') | |
| $id = Get-DrawIORandomID | |
| $writer.WriteAttributeString('id', $id) | |
| $writer.WriteStartElement('mxGraphModel') | |
| $graphDefaults = @{ | |
| dx="1114" | |
| dy="797" | |
| grid="1" | |
| gridSize="10" | |
| guides="1" | |
| tooltips="1" | |
| connect="1" | |
| arrows="1" | |
| fold="1" | |
| page="1" | |
| pageScale="1" | |
| pageWidth="827" | |
| pageHeight="1169" | |
| math="0" | |
| shadow="0" | |
| } | |
| foreach ($gd in $graphDefaults.GetEnumerator()) { | |
| $writer.WriteAttributeString($gd.Name, $gd.Value) | |
| } | |
| $writer.WriteStartElement('root') | |
| # write the 0 and 1 cells | |
| $writer.WriteStartElement('mxCell') | |
| $writer.WriteAttributeString('id', '0') | |
| $writer.WriteEndElement() | |
| $writer.WriteStartElement('mxCell') | |
| $writer.WriteAttributeString('id', '1') | |
| $writer.WriteAttributeString('parent', '0') | |
| $writer.WriteEndElement() | |
| } | |
| process { | |
| $cell.Write($writer) | |
| } | |
| end { | |
| $writer.WriteEndElement() | |
| $writer.WriteEndElement() | |
| $writer.WriteEndElement() | |
| $writer.WriteEndElement() | |
| $writer.Flush() | |
| $writer.Close() | |
| if (-not $Path) { | |
| return $sb.ToString() | |
| } | |
| } | |
| } | |
| $DrawIODefaultStyle_Vnet_Details = @{ | |
| html = 1 | |
| rounded = 0 | |
| whitespace = "wrap" | |
| fillColor = "none" | |
| strokeColor = "#101010" | |
| dashed = "1" | |
| align = "left" | |
| verticalAlign = "top" | |
| } | |
| $DrawIODefaultStyle_Vnet = New-DrawIOStyle | Update-DrawIOStyle @DrawIODefaultStyle_Vnet_Details | |
| $DrawIODefaultStyle_Vnet_Icon_Details = @{ | |
| fontSize = "12" | |
| image ="img/lib/azure2/networking/Virtual_Networks.svg" | |
| align = "right" | |
| aspect = "fixed" | |
| } | |
| $DrawIODefaultStyle_Vnet_Icon = New-DrawIOStyle | Update-DrawIOStyle @DrawIODefaultStyle_Vnet_Icon_Details | |
| function Create-DrawIOVirtualNetwork { | |
| [CmdletBinding()] | |
| param ( | |
| [Parameter(Mandatory=$true)] | |
| [string]$Name, | |
| [Parameter(Mandatory=$true)] | |
| [string]$NetworkAddress, | |
| [string]$cellId, | |
| [int]$x, | |
| [int]$y, | |
| [int]$width = 400, | |
| [int]$height = 100 | |
| ) | |
| if (-not $cellId) { | |
| $cellId = Get-DrawIORandomID | |
| } | |
| $cell = [MXCell]::New(("{0}-box" -f $cellId)) | |
| $cell.Value = "<b>{0}</b> {1}<br/>[Virtual Network]" -f $Name, $NetworkAddress | |
| $cell.Vertex = "1" | |
| $cell.Style = $DrawIODefaultStyle_Vnet | Format-DrawIOStyle | |
| $cell.Geometry = [MXGeometry]::New($x, $y, $width, $height) | |
| $icon = [MXCell]::New(("{0}-icon" -f $cellId)) | |
| $icon.Value = "" | |
| $icon.Vertex = "1" | |
| $icon.ParentId = $cell.Id | |
| $icon.Style = $DrawIODefaultStyle_Vnet_Icon | Format-DrawIOStyle | |
| $icon.Geometry = [MXGeometry]::New($width-32, 0, 32, 32) | |
| @( | |
| $cell | |
| $icon | |
| ) | |
| } | |
| $s = New-DrawIOStyle | Update-DrawIOStyle -html 1 -rounded 0 -whitespace Wrap -fillColor "#765454" | |
| $id = Get-DrawIORandomID | |
| $cell = [MXCell]::New(("{0}-1" -f $id),'1') | |
| $cell.Value = "abc" | |
| $cell.Vertex = "1" | |
| $cell.Style = $s | Format-DrawIOStyle | |
| $cell.Geometry = [MXGeometry]::New(50,50,400,100) | |
| $n1 = Create-DrawIOVirtualNetwork -Name "myvnet1" -NetworkAddress "10.28.0.0/16" -X 100 -Y 300 | |
| $n2 = Create-DrawIOVirtualNetwork -Name "myvnet2" -NetworkAddress "10.42.0.0/16" -X 100 -Y 500 | |
| @( | |
| $cell | |
| $n1 | |
| $n2 | |
| ) | Write-DrawIODocument #-Path "/tmp/t1.drawio" | |
| # styles | |
| # | |
| # html=1;whitespace=wrap;rounded=0 | |
| # fillColor=none oder #rrggbb | |
| # strokeColor | |
| # dashed=1;dashPattern=8 4; | |
| # align=left;verticalAlign=top |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment