?? elements.mp
字號:
save y; y.h = ypart(urcorner pic_$ - llcorner pic_$); y.hh = y.h + 2ypart(element_offset); if $.down: y := y.hh; else: y.maxport = max($.nin, $.nout); y.len = y.maxport*port_length + (y.maxport-1)*port_sep + 2port_offset; y := max(y.hh, y.len); fi; y'' := min_element_height; forever: exitif y'' >= y; y'' := y'' + element_height_increment; endfor; $.dy = (y'' - y.h)/2;enddef;def sizeelement_(suffix $) = if unknown $.dx: set_element_dx($); fi if unknown $.dy: set_element_dy($); fienddef;vardef fixelementsizeleft(text t) = forsuffixes $=t: fixsize($); if $.dx > xpart element_offset: $.off := $.off - ($.dx - xpart element_offset, 0); fi; endfor;enddef;vardef fixelement(text elements) = fixsize(elements); fixpos(elements);enddef;vardef elementleftjustify(text elements) = fixsize(elements); forsuffixes $=elements: if $.dx > xpart element_offset: $.off := $.off - ($.dx - xpart element_offset, 0); fi; endfor;enddef;vardef fixrelations(suffix efirst)(text elements) = forsuffixes $=elements: if unknown xpart(efirst.off - $.off): xpart $.off = xpart efirst.off fi; if unknown ypart(efirst.off - $.off): ypart $.off = ypart efirst.off fi; endfor;enddef;vardef elementbbox(suffix efirst)(text elements) = fixsize(efirst,elements); fixrelations(efirst,elements); save __t,__l,__r,__b,__p; picture __p; __t = ypart(efirst.n - efirst.off); __l = xpart(efirst.w - efirst.off); __r = xpart(efirst.e - efirst.off); __b = ypart(efirst.s - efirst.off); forsuffixes $=elements: if ypart($.n - efirst.off) > __t: __t := ypart($.n - efirst.off) fi; if xpart($.w - efirst.off) < __l: __l := xpart($.w - efirst.off) fi; if xpart($.e - efirst.off) > __r: __r := xpart($.e - efirst.off) fi; if ypart($.s - efirst.off) < __b: __b := ypart($.s - efirst.off) fi; endfor; __p = nullpicture; setbounds __p to ((__l,__t) -- (__r,__t) -- (__r,__b) -- (__l,__b) -- cycle) if known efirst.off: shifted efirst.off fi; __penddef;vardef compoundelementlink@#(suffix efirst)(text elements) = fixsize(efirst,elements); fixrelations(efirst,elements); save __t,__l,__r,__b,__p; picture __p; __t = ypart(efirst.n - efirst.off); __l = xpart(efirst.w - efirst.off); __r = xpart(efirst.e - efirst.off); __b = ypart(efirst.s - efirst.off); forsuffixes $=elements: if ypart($.n - efirst.off) > __t: __t := ypart($.n - efirst.off) fi; if xpart($.w - efirst.off) < __l: __l := xpart($.w - efirst.off) fi; if xpart($.e - efirst.off) > __r: __r := xpart($.e - efirst.off) fi; if ypart($.s - efirst.off) < __b: __b := ypart($.s - efirst.off) fi; endfor; @#.c = efirst.off + .5[(__l,__t), (__r,__b)]enddef;%% drawvardef draw_element_inputs(suffix $) = path _p_, _ag_; _p_ := _normal_input scaled $.portscale; _ag_ := _agnostic_input scaled $.portscale; if $.down: _p_ := _p_ rotated -90; _ag_ := _ag_ rotated -90; fi; if $.rev: _p_ := _p_ rotated 180; _ag_ := _ag_ rotated 180; fi; for _i_ = 0 upto $.nin - 1: if $.inpers[_i_] >= 0: fill _p_ shifted $.in[_i_] withcolor personalitycolor[$.inpers[_i_]]; draw _p_ shifted $.in[_i_]; if $.inpers[_i_] >= agnostic: fill _ag_ shifted $.in[_i_] withcolor agnosticcolor[$.inpers[_i_]]; draw _ag_ shifted $.in[_i_]; fi fi; endforenddef;vardef draw_element_outputs(suffix $) = path _p_, _ag_; _p_ := _normal_output scaled $.portscale; _ag_ := _agnostic_output scaled $.portscale; if $.down: _p_ := _p_ rotated -90; _ag_ := _ag_ rotated -90; fi; if $.rev: _p_ := _p_ rotated 180; _ag_ := _ag_ rotated 180; fi; for _i_ = 0 upto $.nout - 1: if $.outpers[_i_] >= 0: fill _p_ shifted $.out[_i_] withcolor personalitycolor[$.outpers[_i_]]; draw _p_ shifted $.out[_i_]; if $.outpers[_i_] >= agnostic: fill _ag_ shifted $.out[_i_] withcolor agnosticcolor[$.outpers[_i_]]; draw _ag_ shifted $.out[_i_]; fi fi; endforenddef;vardef drawelement(text elements) text rest = drawelementbox(elements) rest; drawunboxed(elements);enddef;vardef drawelementbox(text elements) text rest = save $, oldpen; oldpen := savepen; interim linejoin := mitered; fixsize(elements); fixpos(elements); forsuffixes $ = elements: if $.drawports: pickup elementpen.port scaled $.portscale; if $.nin > 0: draw_element_inputs($); fi; if $.nout > 0: draw_element_outputs($); fi; fi; if $.borderscale > 0: pickup elementpen.border scaled $.borderscale; scantokens elemdraw_$($) rest; fi; endfor; pickup oldpen;enddef;vardef fillelement(text elements)(text color) = fixsize(elements); fixpos(elements); forsuffixes $=elements: fill bpath.$ withcolor color; endfor;enddef;%% queuesvardef _drawqueued(expr p,delta,rot,lim,pp) text rest = save i; interim linecap := squared; i := delta; forever: draw (p) shifted ((i,0) rotated rot) withpen currentpen scaled 0.25 rest; i := i + delta; exitunless i < lim; endfor; draw (pp) rest;enddef;def drawqueued(suffix $) = _drawqueued($.ne -- $.se, 6, 180, .9*$.width, $.nw -- $.ne -- $.se -- $.sw)enddef;def drawrqueued(suffix $) = _drawqueued($.nw -- $.sw, 6, 0, .9*$.width, $.ne -- $.nw -- $.sw -- $.se)enddef;def drawvqueued(suffix $) = _drawqueued($.se -- $.sw, 5, 90, .9*$.height, $.nw -- $.sw -- $.se -- $.ne)enddef;def drawrvqueued(suffix $) = _drawqueued($.ne -- $.nw, 5, 270, .9*$.height, $.sw -- $.nw -- $.ne -- $.se)enddef;vardef queueit@#(expr s) = _elementit.@#(s, 1, 1, push_to_pull, false, false); elemdraw_@# := "drawqueued";enddef;vardef rqueueit@#(expr s) = _elementit.@#(s, 1, 1, push_to_pull, false, true); elemdraw_@# := "drawrqueued";enddef;vardef vqueueit@#(expr s) = _elementit.@#(s, 1, 1, push_to_pull, true, false); elemdraw_@# := "drawvqueued";enddef;vardef rvqueueit@#(expr s) = _elementit.@#(s, 1, 1, push_to_pull, true, true); elemdraw_@# := "drawrvqueued";enddef;%% connectionspicture _cutarrpic;vardef arrowhead expr p = save q,h,e,f; path q,h; pair e,f; e = point length p of p; q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) cuttings; h = gobble(p shifted -e cutafter makepath(pencircle scaled 1.5ahlength)) cuttings; f = point 0 of h; (q rotated .5ahangle & reverse q rotated -.5ahangle -- f -- cycle) shifted eenddef;def _cutarr(expr b,e) text t = _cutarrpic := image(draw (0,0) -- (1,0) -- cycle t); _cutarramt := (2ypart urcorner _cutarrpic / sind .5ahangle) - 0.75; if _cutarramt > 0: _apth := subpath (xpart(_apth intersectiontimes makepath(pencircle scaled (b*_cutarramt)) shifted (point 0 of _apth)), xpart(_apth intersectiontimes makepath(pencircle scaled (e*_cutarramt)) shifted (point length _apth of _apth))) of _apth; fienddef;def _finarr text t = _cutarr(0,1) t; draw (subpath (0, xpart(_apth intersectiontimes makepath(pencircle scaled 1.2ahlength) shifted (point length _apth of _apth))) of _apth) t; fill arrowhead _apth tenddef;def _findarr text t = _cutarr(1,1) t; draw (subpath (xpart(_apth intersectiontimes makepath(pencircle scaled 1.2ahlength) shifted (point 0 of _apth)), xpart(_apth intersectiontimes makepath(pencircle scaled 1.2ahlength) shifted (point length _apth of _apth))) of _apth) t; fill arrowhead _apth t; fill arrowhead reverse _apth tenddef;def connectpath(suffix $,#,##,$$) = $.out[#]{$.flowvector} .. {$$.flowvector}$$.in[##]enddef;vardef drawconnectj(suffix $,#,##,$$)(text t) text rest = interim linejoin := mitered; drawarrow $.out[#]{$.flowvector} t {$$.flowvector}$$.in[##] withpen connectionpen restenddef;def drawconnect(suffix $,#,##,$$) = drawconnectj($,#,##,$$)(..)enddef;vardef drawconnectna(suffix $,#,##,$$) text rest = interim linejoin := mitered; draw $.out[#]{$.flowvector} .. {$$.flowvector}$$.in[##] withpen connectionpen restenddef;def drawconnarrow expr p = _apth:=p; _finarr withpen connectionpenenddef;def drawconnarrowna expr p = draw p withpen connectionpenenddef;def drawdblconnarrow expr p = _apth:=p; _findarr withpen connectionpenenddef;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -