Created
October 10, 2024 02:48
-
-
Save steveroush/84c11f6a8989a3f5f3d02aefcc3a1968 to your computer and use it in GitHub Desktop.
Graphviz - create layout variations
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
# set -x | |
T=svg | |
usage() { # Function: Print a help message. | |
echo "Usage: $0 [ -G|N|E GraphvizOption ] [ -L layoutEngine ] [ -T outputFormat ] myFile.gv" 1>&2 | |
} | |
exit_abnormal() { # Function: Exit with error. | |
usage | |
exit 1 | |
} | |
ADD="" | |
while getopts ":E:G:L:N:T:W:" options; do | |
case "${options}" in | |
G|N|E) | |
ADD="$ADD"'*|'"${options}|${OPTARG/=/|}\n" | |
;; | |
L) # layout | |
Engines="$Engines ${OPTARG}" | |
;; | |
T) | |
T=${OPTARG} | |
;; | |
*) # If unknown (any other) option: | |
exit_abnormal # Exit abnormally. | |
;; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
files=$@ | |
#File=${file%.*} | |
if [[ "$Engines" == "" ]];then | |
Engines="neato fdp sfdp dot circo twopi osage" | |
fi | |
#set -x | |
# dot - ??? | |
dotOPTS="# dot | |
" | |
# osage - ??? | |
osageOPTS="# osage | |
" | |
# neato - dropped the hier | |
# len added to support models | |
neatoOPTS=" | |
neato|E|len|1. | |
neato|G|mode|major|KK|sgd|ipsep | |
neato|G|model|shortpath|mds|circuit|subset | |
neato|G|overlap|false|vpsc | |
neato|G|sep|+5|+10" | |
# neato - see also K, weight, len, start, epsilon, Damping, diredgeconstraints, ... | |
neatoOPTS=" | |
neato|E|len|1. | |
neato|G|mode|major|KK|sgd|hier|ipsep | |
neato|G|model|shortpath|mds|circuit|subset | |
neato|G|overlap|false | |
neato|G|sep|+5|+10" | |
# fdp - see also weight, start & maxiter | |
fdpOPTS=" | |
fdp|G|overlap|false | |
fdp|G|sep|+5|+10 | |
fdp|G|K|.4|.8|1" | |
# twopi - see also root & weight | |
twopiOPTS=" | |
twopi|G|ranksep|.5|.75|1.2 | |
twopi|G|sep|+5|+10" | |
# circo - see also root | |
circoOPTS=" | |
circo|G|sep|+5|+10 | |
circo|G|mindist|.75|1.3" | |
allOPTS=" | |
$dotOPTS | |
$neatoOPTS | |
$fdpOPTS | |
$sfdpOPTS | |
$twopiOPTS | |
$circoOPTS | |
$osageOPTS | |
" | |
( | |
echo "$allOPTS" | |
echo -e "$ADD" | |
) | | |
gawk -F'|' -v "runEngines=$Engines" -v "files=$files" -vfmt="$T" ' | |
BEGIN{ | |
bar="|" | |
sub(/^[ \t]*/, "", runEngines) | |
split(runEngines, runEngine, "[ \t]") | |
#File=file | |
#sub(/\.[^.]*$/,"",File) | |
split(files,file, "[ \t]") | |
} | |
/^#/ || NF<4{ | |
#print "NF:",NF,">" $0 "<" | |
next | |
} | |
{ | |
++Indx | |
Inpt[Indx]=$0 | |
Eng[Indx]=$1 | |
Type[Indx]=$2 | |
Att[Indx]=$3 | |
#print "##", Eng[Indx], $0 | |
for (i=4;i<=NF;i++){ | |
cnt=i-3 | |
Val[$3,cnt]=$i | |
} | |
Vcnt[Indx]=cnt | |
} | |
END{ | |
for (x in file){ | |
File=file[x] | |
sub(/\.[^.]*$/,"",File) | |
for (R in runEngine){ | |
delete Combo | |
delete Part | |
for (I in Eng){ | |
if (Eng[I] == "*" || Eng[I] == runEngine[R]){ | |
for (J=1;J<=Vcnt[I];J++){ | |
this=" " Type[I] bar Att[I] bar Val[Att[I],J] | |
# print"## this:",this | |
if (1 in Part){ | |
for (p in Part){ | |
Combo[++cIndx]=Part[p] this | |
} | |
}else{ // first chunk | |
Combo[++cIndx]=this | |
} | |
} | |
delete Part | |
#print"## combo:",combo | |
for (i in Combo){ | |
Part[i]=Combo[i] | |
delete Combo[i] | |
cIndx=0 | |
} | |
} | |
} | |
for (p in Part){ | |
cmd=runEngine[R] " -T" fmt " " file[x] | |
lbl=file[x] " - " runEngine[R] "\\n" | |
fName=File "." runEngine[R] | |
cnt=split(Part[p], Chunk, " ") | |
for (iX=1;iX<=cnt;iX++){ | |
c2=split(Chunk[iX], tok, "|") | |
cmd=cmd " -" tok[1] tok[2] "=\"" tok[3] "\"" | |
lbl=lbl tok[2] "=" tok[3] " " | |
fName=fName "." tok[2] "=" tok[3] | |
} | |
oFile=fName "." fmt | |
Err=fName ".errs" | |
print cmd " -Glabel=\"" lbl "\" -o \"" oFile "\"" | |
print "" | |
} | |
} | |
} | |
}' | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment