?? elements.mp
字號(hào):
% elements.mp -- MetaPost macros for drawing Click configuration graphs% Eddie Kohler%% Copyright (c) 1999-2001 Massachusetts Institute of Technology% Copyright (c) 2001-2003 International Computer Science Institute% Copyright (c) 2006 Regents of the University of California%% Permission is hereby granted, free of charge, to any person obtaining a% copy of this software and associated documentation files (the "Software"),% to deal in the Software without restriction, subject to the conditions% listed in the Click LICENSE file. These conditions include: you must% preserve this copyright notice, and you cannot mention the copyright% holders in advertising related to the Software without their permission.% The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This% notice is a summary of the Click LICENSE file; the license in that file is% legally binding.input rboxes;prologues := 1;string defaultelementfont;defaultscale := 1;linejoin := mitered;pair element_offset;element_offset = (7.5, 4.5);min_element_height = 19;element_height_increment = 4;defaultelementborderscale = 1;defaultelementportscale = 1;port_length = 6;port_sep = 3;port_offset = 4;input_length = 7;input_width = 4.5;output_length = 6;output_width = 3.8;agnostic_sep = 1;push = 0;pull = 1;agnostic = 2;agnostic_push = 3;agnostic_pull = 4;push_to_pull = 5;pull_to_push = 6;pen elementpen.border, elementpen.port, connectionpen;elementpen.border = pencircle scaled 0.9;elementpen.port = pencircle scaled 0.35;connectionpen = pencircle scaled 0.45;color personalitycolor[], agnosticcolor[];personalitycolor[push] = black;personalitycolor[agnostic_push] = personalitycolor[agnostic] = white;personalitycolor[pull] = personalitycolor[agnostic_pull] = white;agnosticcolor[agnostic_push] = black;agnosticcolor[agnostic_pull] = white;agnosticcolor[agnostic] = 0.6white;path _agnostic_output, _agnostic_input, _normal_output, _normal_input;_agnostic_output := ((-.5,0.5output_length-agnostic_sep) -- (-output_width+agnostic_sep,0.5output_length-agnostic_sep) -- (-output_width+agnostic_sep,-0.5output_length+agnostic_sep) -- (-.5,-0.5output_length+agnostic_sep) -- cycle);_agnostic_input := ((.5,0.5input_length-1.414agnostic_sep) -- (input_width-1.414agnostic_sep,0) -- (.5,-0.5input_length+1.414agnostic_sep) -- cycle);_normal_input := ((.5,0.5input_length) -- (input_width,0) -- (.5,-0.5input_length) -- cycle);_normal_output := ((-.5,0.5output_length) -- (-output_width,0.5output_length) -- (-output_width,-0.5output_length) -- (-.5,-0.5output_length) -- cycle);%% redefine 'drawboxes' to allow extra textvardef drawboxes(text t) text rest = % Draw boundary path for each box forsuffixes s=t: draw bpath.s rest; endforenddef;%%vardef _make_element_ports(suffix $, port, side)(expr n, length, isout) = save _i_, _sc; pair _sc.adj; _sc.sep = (length - 2*port_offset - n*port_length + port_sep) / n; _sc.delta = port_length + _sc.sep; _sc = length/2 - port_offset - (_sc.sep - port_sep)/2 - 0.5port_length; _sc.adj = if isout: 1/2$.flowvector else: -1/2$.flowvector fi; for _i_ = 0 upto n-1: $.port[_i_] = $.side + $.sidevector * (_sc - _sc.delta*_i_) + _sc.adj; endfor;enddef;vardef make_element_inputs(suffix $)(expr xlen, ylen) = if $.down: _make_element_ports($, in, if $.rev: s else: n fi, $.nin, xlen-6, false); else: _make_element_ports($, in, if $.rev: e else: w fi, $.nin, ylen, false); fi;enddef;vardef make_element_outputs(suffix $)(expr xlen, ylen) = if $.down: _make_element_ports($, out, if $.rev: n else: s fi, $.nout, xlen-6, true); else: _make_element_ports($, out, if $.rev: w else: e fi, $.nout, ylen, true); fi;enddef;vardef clearelement_(suffix $) = _n_ := str $; generic_redeclare(numeric) _n.down, _n.rev, _n.sidevector, _n.flowvector, _n.width, _n.height, _n.nin, _n.nout, _n.borderscale, _n.portscale, _n.drawports; _n_ := str $ & ".in0"; generic_redeclare(numeric) _n; _n_ := str $ & ".out0"; generic_redeclare(numeric) _n; _n_ := str $ & ".inpers0"; generic_redeclare(numeric) _n; _n_ := str $ & ".outpers0"; generic_redeclare(numeric) _n; _n_ := "elemdraw_." & str $; generic_redeclare(numeric) _n;enddef;vardef _elementit@#(expr label_str, ninputs, noutputs, personality, down_var, rev_var) = picture _label_; numeric _x_, _y_; if picture label_str: _label_ = label_str elseif label_str = "": _label_ = nullpicture else: _label_ = label_str infont defaultelementfont scaled defaultscale fi; boxit.@#(_label_); _n_ := str @#; generic_declare(boolean) _n.down, _n.rev, _n.drawports; generic_declare(pair) _n.sidevector, _n.flowvector; generic_declare(numeric) _n.width, _n.height, _n.nin, _n.nout, _n.borderscale, _n.portscale; _n_ := str @# & ".in0"; generic_declare(pair) _n; _n_ := str @# & ".out0"; generic_declare(pair) _n; _n_ := "elemdraw_." & str @#; generic_declare(string) _n; @#.down = down_var; if down_var: @#.sidevector = (-1, 0); else: @#.sidevector = (0, 1); fi; if down_var: @#.flowvector = (0, -1); else: @#.flowvector = (1, 0); fi; @#.rev = rev_var; if rev_var: @#.flowvector := -@#.flowvector; @#.sidevector := -@#.sidevector; fi; @#.drawports = true; @#.width = xpart(@#.e - @#.w); @#.height = ypart(@#.n - @#.s); @#.nin = ninputs; @#.nout = noutputs; if ninputs > 0: make_element_inputs(@#, @#.width, @#.height); fi; if noutputs > 0: make_element_outputs(@#, @#.width, @#.height); fi; _x_ := personality; if _x_ = push_to_pull: _x_ := push; elseif _x_ = pull_to_push: _x_ := pull; fi; for _y_ = 0 upto ninputs-1: @#.inpers[_y_] = _x_; endfor; _x_ := personality; if _x_ = push_to_pull: _x_ := pull; elseif _x_ = pull_to_push: _x_ := push; fi; for _y_ = 0 upto noutputs-1: @#.outpers[_y_] = _x_; endfor; @#.borderscale = defaultelementborderscale; @#.portscale = defaultelementportscale; elemdraw_@# = "drawboxes"; sproc_@# := "sizeelement_"; expandafter def expandafter clearboxes expandafter = clearboxes clearelement_(@#); enddefenddef;vardef elementit@#(expr s, ninputs, noutputs, personality_var) = _elementit.@#(s, ninputs, noutputs, personality_var, false, false);enddef;vardef relementit@#(expr s, ninputs, noutputs, personality_var) = _elementit.@#(s, ninputs, noutputs, personality_var, false, true);enddef;vardef velementit@#(expr s, ninputs, noutputs, personality_var) = _elementit.@#(s, ninputs, noutputs, personality_var, true, false);enddef;vardef rvelementit@#(expr s, ninputs, noutputs, personality_var) = _elementit.@#(s, ninputs, noutputs, personality_var, true, true);enddef;%% changevardef killinput(suffix $)(expr p) = if (p >= 0) and (p < $.nin): save _i_; for _i_ = p upto $.nin-2: $.in[_i_] := $.in[_i_+1]; $.inpers[_i_] := $.inpers[_i_+1]; endfor; $.nin := $.nin - 1 fienddef;vardef killoutput(suffix $)(expr p) = if (p >= 0) and (p < $.nout): save _i_; for _i_ = p upto $.nout-2: $.out[_i_] := $.out[_i_+1]; $.outpers[_i_] := $.outpers[_i_+1]; endfor; $.nout := $.nout - 1 fienddef;vardef portinteriorin(suffix $)(expr i) = path _p_; _p_ := if $.inpers[i] >= agnostic: _agnostic_input else: _normal_input fi scaled $.portscale; if $.down: _p_ := _p_ rotated -90 fi; if $.rev: _p_ := _p_ rotated 180 fi; _p_ := _p_ shifted $.in[i]; if $.down and $.rev: .5[ulcorner _p_,urcorner _p_] elseif $.down: .5[llcorner _p_,lrcorner _p_] elseif $.rev: .5[ulcorner _p_,llcorner _p_] else: .5[urcorner _p_,lrcorner _p_] fienddef;vardef portinteriorout(suffix $)(expr i) = path _p_; _p_ := if $.outpers[i] >= agnostic: _agnostic_output else: _normal_output fi scaled $.portscale; if $.down: _p_ := _p_ rotated -90 fi; if $.rev: _p_ := _p_ rotated 180 fi; _p_ := _p_ shifted $.out[i]; if $.down and $.rev: .5[llcorner _p_,lrcorner _p_] elseif $.down: .5[ulcorner _p_,urcorner _p_] elseif $.rev: .5[urcorner _p_,lrcorner _p_] else: .5[ulcorner _p_,llcorner _p_] fienddef;%% fixvardef set_element_dx(suffix $) = if $.down: save x; x.maxport = max($.nin, $.nout); x.len = x.maxport*port_length + (x.maxport-1)*port_sep + 2port_offset; x.w = xpart(urcorner pic_$ - llcorner pic_$); x.ww = x.w + 2xpart(element_offset); if x.len > x.ww: $.dx = (x.len - x.w) / 2; else: $.dx = xpart element_offset; fi; else: $.dx = xpart element_offset; fi;enddef;vardef set_element_dy(suffix $) =
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -