$graph = Create-Graph | Add-Edge -edge (Create-Edge A B 1 ) | Add-Edge -edge (Create-Edge A C 5) | Add-Edge -edge (Create-Edge A D 3) | Add-Edge -edge (Create-Edge A E 11) | Add-Edge -edge (Create-Edge B C 9) | Add-Edge -edge (Create-Edge B D 1) | Add-Edge -edge (Create-Edge B E 2) | Add-Edge -edge (Create-Edge C D 6) | Add-Edge -edge (Create-Edge C E 4) | Add-Edge -edge (Create-Edge D E 3)
Rozdzielimy to zadanie na 2 części. Pierwsza część będzie translacja grafu do języka dot używanego w GraphVizie (w praktyce jest to zapis danych w podobnej postaci co przykład z galerii GraphViz).
function ConvertTo-GraphViz { param( [Parameter(Mandatory=$true, Position=1,ValueFromPipeline=$true)] [ValidateNotNull()] $graph, [ValidateNotNullOrEmpty()] [string]$name='G', [ValidateRange(8, 52)] [int]$fontSize =12, [ValidateNotNullOrEmpty()] [string]$label='Graph from PowerShell', [ValidateNotNullOrEmpty()] [string]$arrowSign = '->', [ValidateNotNullOrEmpty()] [ValidateSet('LR','RL')] [string]$rankdir='LR' ) begin{ #region Strings $templateBegin ="digraph $name { rankdir=$rankdir; " $templateEnd = " fontsize=$fontSize; }" $templateBody= '' $format = "{0} $arrowSign {1} [label = {2} ]; " #endregion } process{ $graph.Edges | %{ $templateBody += $format -f $_.From, $_.To, $_.Weight } } end{ return $templateBegin + $templateBody + $templateEnd } }
Drugą częścią zadania będzie zapisanie kodu dot do pliku i uruchomienie aplikacji, która przekonwertuje do obrazu przedstawiającego ten graf:
function Out-GraphViz { param( [Parameter(Mandatory=$true, Position=1,ValueFromPipeline=$true)] [ValidateNotNullOrEmpty()] $graphVizDot, [ValidateNotNullOrEmpty()] [string]$fiepath='PsGraphViz.png', [ValidateNotNullOrEmpty()] [stinrg]$dotFilePath ='PsGraphViz.dot', [ValidateNotNullOrEmpty()] [ValidateSet('bmp', 'canon', 'cmap', 'cmapx', 'cmapx_np', 'dot', 'emf', 'emfplus', 'eps', 'fig', 'gd', 'gd2', 'gif', 'gv', 'imap', 'imap_np', 'ismap', 'jpe', 'jpeg', 'jpg', 'metafile', 'pdf', 'pic', 'plain', 'plain-ext', 'png', ' pov', 'ps', 'ps2', 'svg', 'svgz', 'tif', 'tiff', 'tk', 'vml', 'vmlz', 'vrml', 'wbmp', 'xdot', 'xdot1.2', 'xdot1.4')] [string]$format='png' ) process{ $graphVizDot| Out-File -FilePath $dotFilePath -Encoding ascii $cmdpath ="~\Programs\graphviz\bin\dot.exe" Write-Verbose "Running app from $cmdpath" Invoke-Expression "& `"$cmdpath`" -T$format -o $fiepath $dotFilePath" } }
Wywołanie wygląda następująco:
$graph | ConvertTo-GraphViz | Out-GraphViz
A po tej komendzie zostaną wygenerowane 2 pliki (dot plik oraz obraz grafu):
Brak komentarzy:
Prześlij komentarz