From 352517495e32813d30d0080f2a0c8dd1afea794a Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Sun, 24 Jul 2022 12:35:49 +0200 Subject: 2022-07-24 12:18:00 --- metapost/context/base/mpxl/mp-lmtx.mpxl | 154 +++++++++++++------------------- metapost/context/base/mpxl/mp-luas.mpxl | 4 +- metapost/context/base/mpxl/mp-tool.mpxl | 12 ++- 3 files changed, 74 insertions(+), 96 deletions(-) (limited to 'metapost/context/base') diff --git a/metapost/context/base/mpxl/mp-lmtx.mpxl b/metapost/context/base/mpxl/mp-lmtx.mpxl index be4ae716b..acf3dcbef 100644 --- a/metapost/context/base/mpxl/mp-lmtx.mpxl +++ b/metapost/context/base/mpxl/mp-lmtx.mpxl @@ -1,5 +1,5 @@ %D \module -%D [ file=mp-luas.lmtx, +%D [ file=mp-lmtx.lmtx, %D version=2019.06.23, %D title=\CONTEXT\ \METAPOST\ graphics, %D subtitle=\LUA, @@ -1041,9 +1041,11 @@ presetparameters "chart" [ "darkyellow", "darkmagenta", "darkcyan", "darkgray" }, + linecolors = { }, colormode = "global", linewidth = .25mm, + % linegap = 0, legendcolor = "", legendstyle = "", @@ -1082,16 +1084,18 @@ def lmt_chart_bar = applyparameters "chart:bar" "lmt_do_chart_bar" def lmt_do_chart_start (expr what) = pushparameters what ; - save width, height, distance, linewidth, labelgap, labelfraction, value, nofsamples, nofsamplesets ; - save fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; - string fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; + save width, height, depth, distance, linewidth, linegap, labelgap, labelfraction, value, nofsamples, nofsamplesets ; + save fillcolor, linecolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; + string fillcolor, linecolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; if hasparameter "sampleset" : setluaparameter what "samples" (getparameter "sampleset") ; fi ; height := getparameter "height" ; + depth := max((getparameter "originsize"), (getparameter "innerradius")) ; width := getparameter "width" ; distance := getparameter "distance" ; linewidth := getparameter "linewidth" ; + linegap := getparameterdefault "linegap" linewidth ; drawcolor := getparameter "drawcolor" ; colormode := getparameter "colormode" ; labelcolor := getparameter "labelcolor" ; @@ -1168,75 +1172,28 @@ def lmt_do_chart_legend = fi ; enddef ; -% vardef lmt_do_chart_circle = -% image ( -% lmt_do_chart_start("chart:circle") ; -% if (nofsamplesets > 0) and (nofsamples > 0) : -% nofsamplesets := 1 ; -% save p, r, s, first, last, total, factor, n, percentage ; -% path p, r, s[] ; boolean percentage ; -% percentage := getparameter "percentage" ; -% total := 0 ; -% for i = 1 upto nofsamples : -% total := total + getparameter "samples" (1) i ; % () is needed else 1i -% endfor ; -% factor := 100/total ; -% first := 0 ; -% p := fullcircle ysized (height) ; -% r := origin -- (2*height,0) ; -% for i = 1 upto nofsamples : -% fillcolor := getparameter "fillcolors" i ; -% value := (getparameter "samples" (1) i) * factor ; -% last := first + (360/100) * value ; -% s[i] := ((p cutbefore (r rotated first)) cutafter (r rotated last)) ; -% % fill -% % (if innerradius > 0 : reverse (s[i] scaled innerradius) else : origin fi) -- s[i] -- cycle -% % withcolor fillcolor -% % ; -% fill origin -- s[i] -- cycle withcolor fillcolor ; -% first := last ; -% endfor ; -% if linewidth > 0 : -% if drawcolor = "" : -% drawcolor := backgroundcolor ; -% fi ; -% for i = 1 upto nofsamples : -% interim linecap := butt ; -% draw origin -- (point 0 of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; -% draw origin -- (point length(s[i]) of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; -% endfor ; -% fi ; -% if getparameter "showlabels" : -% first := 0 ; -% for i = 1 upto nofsamples : -% value := getparameter "samples" (1) i ; -% last := first + (360/100) * value * factor ; -% draw lmt_do_chart_text (s,i,value) -% shifted ((labelfraction*(height/2),0) rotated ((first+last)/2)) ; -% first := last ; -% endfor ; -% fi ; -% lmt_do_chart_legend ; -% n := getparameter "originsize" ; -% if n > 0 : -% fill fullcircle scaled n withcolor "white" ; -% fi ; -% n := getparameter "innerradius" ; -% if n > 0 : -% fill fullcircle scaled n withcolor "white" ; -% fi ; -% fi ; -% lmt_do_chart_stop ; -% ) -% enddef ; +% draw lmt_chart_circle [ +% height = 4cm, +% innerradius = 2.0cm, +% samples = { { 10, 20, 30, 40, 50 } }, +% percentage = false, +% initialangle = 90, +% linewidth = .125mm, +% originsize = 0, +% showlabels = false, +% drawcolor = "white", +% fillcolors = { "red", "green", "blue", "", "cyan" }, +% linecolors = { "magenta", "orange", "darkgray", "orange", "darkgray" } +% linecolors = { "", "orange", "", "orange", "" } +% ] ; vardef lmt_do_chart_circle = image ( lmt_do_chart_start("chart:circle") ; if (nofsamplesets > 0) and (nofsamples > 0) : nofsamplesets := 1 ; - save p, r, s, first, last, total, factor, n, percentage, initial, clockwise ; - path p, r, s[] ; boolean percentage, clockwise ; + save p, q, r, s, t, pl, ql, first, last, total, factor, n, percentage, initial, clockwise ; + path p, q, r, s[], t[] ; boolean percentage, clockwise ; clockwise := true ; percentage := getparameter "percentage" ; initial := if not clockwise : - fi getparameter "initialangle" ; % watch sign @@ -1248,54 +1205,67 @@ vardef lmt_do_chart_circle = first := initial ; if clockwise : p := (reverse fullcircle rotated first) ysized (height) ; + q := (reverse fullcircle rotated first) ysized (depth) ; else : p := fullcircle ysized (height) ; + q := fullcircle ysized (depth) ; fi ; r := origin -- (2*height,0) ; + pl := ((linewidth + linegap) / (arclength p)) * 360; + ql := ((linewidth + linegap) / (arclength q)) * 360; for i = 1 upto nofsamples : fillcolor := getparameter "fillcolors" i ; - value := (getparameter "samples" (1) i) * factor ; - if (value > -eps) and (value < eps) : - value := eps ; % otherwise weird effects with zero + linecolor := getparameterdefault "linecolors" i "" ; + if linecolor = "" : + linecolor := fillcolor ; fi ; + value := (getparameter "samples" (1) i) * factor ; +if (value > -eps) and (value < eps) : + s[i] := origin ; + t[i] := origin ; +else : +% if (value > -eps) and (value < eps) : +% value := eps ; % otherwise weird effects with zero +% fi ; last := first if clockwise : - else : + fi (360/100) * value ; - s[i] := ((p cutbefore (r rotated first)) cutafter (r rotated last)) ; - % fill - % (if innerradius > 0 : reverse (s[i] scaled innerradius) else : origin fi) -- s[i] -- cycle - % withcolor fillcolor - % ; - fill origin -- s[i] -- cycle withcolor fillcolor ; + s[i] := ((p cutbefore (r rotated first)) cutafter (r rotated (last + pl))) ; + t[i] := reverse ((q cutbefore (r rotated first)) cutafter (r rotated (last + ql))) ; + path piece ; piece := s[i] -- t[i] -- cycle ; + if fillcolor <> "" : + fill piece + withpen pencircle scaled linewidth + withcolor fillcolor + ; + fi ; + if linecolor <> "" : + if linewidth > 0 : + interim linecap := butt ; + draw piece + withpen pencircle scaled linewidth + withcolor if linecolor <> "" : linecolor else drawcolor : fi + ; + fi ; + fi ; first := last ; +fi ; endfor ; if linewidth > 0 : - if drawcolor = "" : - drawcolor := backgroundcolor ; - fi ; - for i = 1 upto nofsamples : - interim linecap := butt ; - draw origin -- (point 0 of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; - draw origin -- (point length(s[i]) of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; - endfor ; + clip currentpicture to p enlarged linewidth ; fi ; if getparameter "showlabels" : first := initial ; for i = 1 upto nofsamples : value := getparameter "samples" (1) i ; last := first if clockwise : - else : + fi (360/100) * value * factor ; +if (value > -eps) and (value < eps) : +else : draw lmt_do_chart_text (s,i,value) shifted ((labelfraction*(height/2),0) rotated ((first+last)/2)) ; first := last ; +fi ; endfor ; fi ; lmt_do_chart_legend ; - n := getparameter "originsize" ; - if n > 0 : - fill fullcircle scaled n withcolor "white" ; - fi ; - n := getparameter "innerradius" ; - if n > 0 : - fill fullcircle scaled n withcolor "white" ; - fi ; fi ; lmt_do_chart_stop ; ) diff --git a/metapost/context/base/mpxl/mp-luas.mpxl b/metapost/context/base/mpxl/mp-luas.mpxl index c5c4c77db..7e11b1c9c 100644 --- a/metapost/context/base/mpxl/mp-luas.mpxl +++ b/metapost/context/base/mpxl/mp-luas.mpxl @@ -301,6 +301,7 @@ newscriptindex mfid_getparameterpen ; mfid_getparameterpen := scriptin newscriptindex mfid_getparametertext ; mfid_getparametertext := scriptindex "getparametertext" ; % mfid_getparameteroption ; mfid_getparameteroption := scriptindex "getparameteroption" ; newscriptindex mfid_applyparameters ; mfid_applyparameters := scriptindex "applyparameters" ; +newscriptindex mfid_mergeparameters ; mfid_mergeparameters := scriptindex "mergeparameters" ; newscriptindex mfid_pushparameters ; mfid_pushparameters := scriptindex "pushparameters" ; newscriptindex mfid_popparameters ; mfid_popparameters := scriptindex "popparameters" ; newscriptindex mfid_setluaparameter ; mfid_setluaparameter := scriptindex "setluaparameter" ; @@ -318,13 +319,14 @@ def getparameterpen = runscript mfid_getparameterpen enddef ; def getparametertext = runscript mfid_getparametertext enddef ; % getparameteroption = runscript mfid_getparameteroption enddef ; def applyparameters = runscript mfid_applyparameters enddef ; +def mergeparameters = runscript mfid_mergeparameters enddef ; def pushparameters = runscript mfid_pushparameters enddef ; def popparameters = runscript mfid_popparameters enddef ; def setluaparameter = runscript mfid_setluaparameter enddef ; permanent getparameters, presetparameters, hasparameter, hasoption, getparameter, getparameterdefault, getparametercount, getmaxparametercount, getparameterpath, getparameterpen, getparametertext, % getparameteroption, - applyparameters, pushparameters, popparameters, setluaparameter ; + applyparameters, mergeparameters, pushparameters, popparameters, setluaparameter ; newscriptindex mfun_newrecord ; mfun_newrecord := scriptindex "newrecord" ; newscriptindex mfun_setrecord ; mfun_setrecord := scriptindex "setrecord" ; diff --git a/metapost/context/base/mpxl/mp-tool.mpxl b/metapost/context/base/mpxl/mp-tool.mpxl index e448ebb5a..e77314439 100644 --- a/metapost/context/base/mpxl/mp-tool.mpxl +++ b/metapost/context/base/mpxl/mp-tool.mpxl @@ -995,10 +995,16 @@ path unitdiamond, fulldiamond ; unitdiamond := (.5,0) -- (1,.5) -- (.5,1) -- (0,.5) -- cycle ; fulldiamond := unitdiamond shifted - center unitdiamond ; +path unitoctagon, fulloctagon ; + +unitoctagon := for i within (unitcircle rotated 45/2) : pathpoint -- endfor cycle ; +fulloctagon := unitoctagon shifted - center unitoctagon ; + path unithexagon, fullhexagon ; -unithexagon := for i within (unitcircle rotated 45/2) : pathpoint -- endfor cycle ; -fullhexagon := unithexagon shifted - center unithexagon ; +%%%%hexagon := for i = 0 upto 5 : .5dir (60i) -- endfor cycle ; +fullhexagon := for i = 0 step 60 until 360 : .5 dir(i) -- endfor cycle ; +unithexagon := fullhexagon shifted (.5,.5) ; permanent fullsquare, unitcircle, @@ -1006,7 +1012,7 @@ permanent tcircle, bcircle, lcircle, rcircle, urtriangle, ultriangle, lltriangle, lrtriangle, triangle, uptriangle, downtriangle, lefttriangle, righttriangle, - unitdiamond, fulldiamond, unithexagon, fullhexagon ; + unitdiamond, fulldiamond, unitoctagon, fulloctagon, unithexagon, fullhexagon ; %D More robust: -- cgit v1.2.3