Difference between revisions of "Pain Scale"
Jump to navigation
Jump to search
Line 96: | Line 96: | ||
echo "generating pain icon for $pain" | echo "generating pain icon for $pain" | ||
onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | ||
+ | pain=$(($pain+1)) | ||
+ | done | ||
+ | </source> | ||
+ | = Script with RGB Conversion (for Wikimedia Commons = | ||
+ | <source lang='bash'> | ||
+ | #!/bin/bash | ||
+ | # WF 2021-08-04 | ||
+ | # | ||
+ | # create 0-10 painscale svg images | ||
+ | # | ||
+ | # (c) Copyright 2021 Wolfgang Fahl | ||
+ | # see http://wiki.bitplan.com/index.php/Pain_Scale | ||
+ | # | ||
+ | |||
+ | # | ||
+ | # convert hsl to rgb | ||
+ | # | ||
+ | hsl2grb() { | ||
+ | local l_hue="$1" | ||
+ | local l_sat="$2" | ||
+ | local l_lum="$3" | ||
+ | # https://stackoverflow.com/a/2353265/1497139 | ||
+ | python -c "import sys;import colorsys;argv=sys.argv[1:];hs=argv[0];ss=argv[1];ls=argv[2];h=float(hs)/360;s=float(ss)/100;l=float(ls)/100;r,g,b=colorsys.hls_to_rgb(h, l, s);rgbStr=f'rgb({(r*256):3.0f},{(g*256):3.0f},{(b*256):3.0f})';print (rgbStr)" "$l_hue" "$l_sat" "$l_lum" | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # generate a single pain icon | ||
+ | # | ||
+ | onepain() { | ||
+ | # pain level on a scale from 0 to 11 | ||
+ | local l_pain="$1" | ||
+ | # (hue degree in HSL color space) | ||
+ | local l_hue="$2" | ||
+ | # mouth y position | ||
+ | local l_mouthy="$3" | ||
+ | # mouth expression x and y arc | ||
+ | local l_mouthrx="$4" | ||
+ | local l_mouthry="$5" | ||
+ | # which route to sweep | ||
+ | local l_sweepflag="$6" | ||
+ | local sat="80" | ||
+ | # get eyecolor | ||
+ | local l_eyecolor=$(hsl2grb $l_hue $sat 30) | ||
+ | |||
+ | # get mouth color | ||
+ | local l_mouthcolor="$l_eyecolor" | ||
+ | |||
+ | # start/stop colors | ||
+ | local startcolor1=$(hsl2grb $hue $sat 70) | ||
+ | local stopcolor1=$(hsl2grb $hue $sat 60) | ||
+ | local stopcolor2=$(hsl2grb $hue $sat 50) | ||
+ | local stopcolor3=$(hsl2grb $hue $sat 40) | ||
+ | cat << EOF | ||
+ | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
+ | <!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale --> | ||
+ | <svg | ||
+ | xmlns:svg="http://www.w3.org/2000/svg" | ||
+ | xmlns="http://www.w3.org/2000/svg" | ||
+ | width="210mm" | ||
+ | height="210mm" | ||
+ | id="pain${l_pain}" | ||
+ | version="1.1" | ||
+ | viewBox="0 0 220 220"> | ||
+ | <defs> | ||
+ | <!-- radial Gradient --> | ||
+ | <radialGradient | ||
+ | id="grad1" gradientUnits="userSpaceOnUse"> | ||
+ | <stop offset="0%" style="start-color:$startcolor1;stop-color:$stopcolor1; "/> | ||
+ | <stop offset="70%" style="stop-color:$stopcolor2; "/> | ||
+ | <stop offset="100%" style="stop-color:$stopcolor3; "/> | ||
+ | </radialGradient> | ||
+ | |||
+ | </defs> | ||
+ | <!-- face --> | ||
+ | <circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black" | ||
+ | stroke-width="2" ></circle> | ||
+ | |||
+ | <!-- eyes --> | ||
+ | <circle id="lefteye" cx= "65" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle> | ||
+ | <circle id="righteye" cx="145" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle> | ||
+ | |||
+ | <!-- mouth --> | ||
+ | <path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="$l_mouthcolor" fill="none" stroke-width="5"/> | ||
+ | |||
+ | </svg> | ||
+ | EOF | ||
+ | } | ||
+ | # for test should give rgb 158,233,53 | ||
+ | #hsl2grb 85 80 56 | ||
+ | pain=0 | ||
+ | while [ $pain -lt 11 ] | ||
+ | do | ||
+ | hue=$((100-pain*10)) | ||
+ | mouthy=$((105+pain*6)) | ||
+ | sweepflag=0 | ||
+ | factor=$((5-pain)) | ||
+ | if [ $pain -ge 5 ] | ||
+ | then | ||
+ | factor=$((pain-5)) | ||
+ | sweepflag=1 | ||
+ | fi | ||
+ | mouthrx=$((205-factor*10)) | ||
+ | mouthry=$((factor*90)) | ||
+ | |||
+ | echo "generating pain icon for $pain" | ||
+ | onepain $pain "$hue" $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | ||
pain=$(($pain+1)) | pain=$(($pain+1)) | ||
done | done | ||
</source> | </source> |
Revision as of 17:14, 4 August 2021
see https://en.wikipedia.org/wiki/Pain_scale
You may use the painscale icons below under Creative Commons CC BY 4.0
The idea of the above pain scale icons is to generate them programmatically to give a proportional expression in terms of color and mouth expression. The following script creates the above icons:
generate pain scale icons
#!/bin/bash
# WF 2021-08-04
#
# create 0-10 painscale svg images
#
# (c) Copyright 2021 Wolfgang Fahl
# see http://wiki.bitplan.com/index.php/Pain_Scale
#
#
# generate a single pain icon
#
onepain() {
# pain level on a scale from 0 to 11
local l_pain="$1"
# color (hue in HSL space)
local l_color="$2"
# mouth y position
local l_mouthy="$3"
# mouth expression x and y arc
local l_mouthrx="$4"
local l_mouthry="$5"
# which route to sweep
local l_sweepflag="$6"
local l_sat="80%"
cat << EOF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="210mm"
height="210mm"
id="pain${l_pain}"
version="1.1"
viewBox="0 0 220 220">
<defs>
<!-- radial Gradient -->
<radialGradient
id="grad1" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="start-color:hsl($l_color,$l_sat,70%);stop-color:hsl($l_color,$l_sat,60%); "/>
<stop offset="70%" style="stop-color:hsl($l_color,$l_sat,50%); "/>
<stop offset="100%" style="stop-color:hsl($l_color,$l_sat,40%); "/>
</radialGradient>
</defs>
<!-- face -->
<circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black"
stroke-width="2" ></circle>
<!-- eyes -->
<circle id="lefteye" cx= "65" cy="65" r="12" style="fill:hsl($l_color,$l_sat,30%)" ></circle>
<circle id="righteye" cx="145" cy="65" r="12" style="fill:hsl($l_color,$l_sat,30%)" ></circle>
<!-- mouth -->
<path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="hsl($l_color,$l_sat,30%)" fill="none" stroke-width="5"/>
</svg>
EOF
}
pain=0
while [ $pain -lt 11 ]
do
color=$((100-pain*10))
mouthy=$((105+pain*6))
sweepflag=0
factor=$((5-pain))
if [ $pain -ge 5 ]
then
factor=$((pain-5))
sweepflag=1
fi
mouthrx=$((205-factor*10))
mouthry=$((factor*90))
echo "generating pain icon for $pain"
onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg
pain=$(($pain+1))
done
Script with RGB Conversion (for Wikimedia Commons
#!/bin/bash
# WF 2021-08-04
#
# create 0-10 painscale svg images
#
# (c) Copyright 2021 Wolfgang Fahl
# see http://wiki.bitplan.com/index.php/Pain_Scale
#
#
# convert hsl to rgb
#
hsl2grb() {
local l_hue="$1"
local l_sat="$2"
local l_lum="$3"
# https://stackoverflow.com/a/2353265/1497139
python -c "import sys;import colorsys;argv=sys.argv[1:];hs=argv[0];ss=argv[1];ls=argv[2];h=float(hs)/360;s=float(ss)/100;l=float(ls)/100;r,g,b=colorsys.hls_to_rgb(h, l, s);rgbStr=f'rgb({(r*256):3.0f},{(g*256):3.0f},{(b*256):3.0f})';print (rgbStr)" "$l_hue" "$l_sat" "$l_lum"
}
#
# generate a single pain icon
#
onepain() {
# pain level on a scale from 0 to 11
local l_pain="$1"
# (hue degree in HSL color space)
local l_hue="$2"
# mouth y position
local l_mouthy="$3"
# mouth expression x and y arc
local l_mouthrx="$4"
local l_mouthry="$5"
# which route to sweep
local l_sweepflag="$6"
local sat="80"
# get eyecolor
local l_eyecolor=$(hsl2grb $l_hue $sat 30)
# get mouth color
local l_mouthcolor="$l_eyecolor"
# start/stop colors
local startcolor1=$(hsl2grb $hue $sat 70)
local stopcolor1=$(hsl2grb $hue $sat 60)
local stopcolor2=$(hsl2grb $hue $sat 50)
local stopcolor3=$(hsl2grb $hue $sat 40)
cat << EOF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="210mm"
height="210mm"
id="pain${l_pain}"
version="1.1"
viewBox="0 0 220 220">
<defs>
<!-- radial Gradient -->
<radialGradient
id="grad1" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="start-color:$startcolor1;stop-color:$stopcolor1; "/>
<stop offset="70%" style="stop-color:$stopcolor2; "/>
<stop offset="100%" style="stop-color:$stopcolor3; "/>
</radialGradient>
</defs>
<!-- face -->
<circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black"
stroke-width="2" ></circle>
<!-- eyes -->
<circle id="lefteye" cx= "65" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle>
<circle id="righteye" cx="145" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle>
<!-- mouth -->
<path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="$l_mouthcolor" fill="none" stroke-width="5"/>
</svg>
EOF
}
# for test should give rgb 158,233,53
#hsl2grb 85 80 56
pain=0
while [ $pain -lt 11 ]
do
hue=$((100-pain*10))
mouthy=$((105+pain*6))
sweepflag=0
factor=$((5-pain))
if [ $pain -ge 5 ]
then
factor=$((pain-5))
sweepflag=1
fi
mouthrx=$((205-factor*10))
mouthry=$((factor*90))
echo "generating pain icon for $pain"
onepain $pain "$hue" $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg
pain=$(($pain+1))
done