{ "info": { "author": "Ken Kundert", "author_email": "quantiphy@nurdletech.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.6", "Topic :: Scientific/Engineering", "Topic :: Utilities" ], "description": "SVG Schematic\n=============\n\n| Version: 0.3.0\n| Released: 2018-02-21\n|\n\nThis package allows you to create simple SVG schematics. It was created with \ndesire to be able to include simple schematics into Latex Beamer presenations. \nLatex has a similar package called `Circuitikz \n<`http://texdoc.net/texmf-dist/doc/latex/circuitikz/circuitikzmanual.pdf>`_, and \nwhile it is powerful and flexible and creates beautiful schematics, I found it \nto also be confusing and poorly documented and somewhat buggy. I gave up on \ncircuititk when I could not flip a polarized capacitor (there is no builtin \ncapability to do this basic operation, and instead you are expected to scale the \nX or Y dimension by -1, but that would also flip the component into the negative \nquadrant). The other issue is that I could not draw schematics that contained \nthree terminal components using purely vertical or horizontal lines.\n\n\nInstallation\n------------\n\nRequires Python3. Works best with Python3.6 or newer.\n\nTo download the source and install, do the following::\n\n git clone https://github.com/KenKundert/svg_schematic.git\n cd svg_schematic\n pip3 install --user --upgrade .\n\nIf you just wish to install without download the source code, do this::\n\n pip3 install --user --upgrade svg_schematic\n\n\nIntroduction\n------------\n\nWith *schematic* you simply place components at specific coordinates, and then \nplace wires to connect them together. For example:\n\n.. code-block:: python\n\n from schematic import Schematic, Resistor, Capacitor, Inductor, Wire\n\n # x coordinates\n r_x = 0\n c_x = r_x + 75\n l_x = c_x + 75\n\n # y coordinates\n top = 0\n mid = 50\n bot = 100\n\n # open schematic\n schematic = Schematic(filename = \"rlc.svg\")\n\n # add wires (these should be first)\n Wire([(r_x, top), (l_x, top), (l_x, bot), (r_x, bot)])\n Wire([(c_x, top), (c_x, bot)])\n\n # add components\n Resistor((r_x, mid), name='R', orientation='v')\n Capacitor((c_x, mid), name='C', orientation='v')\n Inductor((l_x, mid), name='L', orientation='v')\n\n # close schematic and write the SVG file\n schematic.close()\n\nIt would create the following schematic:\n\n.. image:: rlc.png\n\nYou can also use *schematic* with the Python *with* statement, which will \nautomatically close and save the schematic. Thus the second half the above \nexample becomes:\n\n.. code-block:: python\n\n with Schematic(filename = \"rlc.svg\"):\n Wire([(r_x, top), (l_x, top), (l_x, bot), (r_x, bot)])\n Wire([(c_x, top), (c_x, bot)])\n Resistor((r_x, mid), name='R', orientation='v')\n Capacitor((c_x, mid), name='C', orientation='v')\n Inductor((l_x, mid), name='L', orientation='v')\n\nThere are a few things to note.\n\n#. SVG coordinates are used, which inverts the y axis (more southern \n coordinates are more positive the more northern coordinates).\n#. Components are placed in invisible tiles. When you specify the position of \n the component you are specifying the center of the tile.\n#. Wires and components stack in layers, with the first that is placed going on \n the lowest layer. Most components contain concealers, which are small rectangles that are designed \n to conceal any wires that run underneath the components. This allows you to \n simply run a wire underneath the component rather than explicitly wire to \n each terminal, which can simply the description of the schematics. For this \n to work, the wire must be specified before the component as done in the \n above example. Also, the color of the concealers matches that of the \n background, so if you use no background, then you also lose the concealers.\n#. The unit size of a tile is 50. You have limited ability to specify the size \n of some components, and specifying the size as 1 implies the tile will be \n 50x50. Most components have a size of 2 and so sit within a 100x100 tile.\n#. You need not specify the size as an integer.\n#. It is generally better to specify the important feature location coordinates \n in variables, and use the variable to control the location of the component, \n rather than specifying the coordinates directly on the components and wires. \n Further, it generally good to specify the coordinates in terms of the \n previous coordinates. In this way, you can adjust the placement of many \n features by changing one or two variable values.\n#. You can flip and rotate the components using the *orientation* argument.\n Specifying 'v' implies a vertical placement, and 'h' a horizontal placement \n (a component is converted from vertical to horizontal with a -90 degree \n rotation. Specifying `|` implies the component should be flipped along \n a vertical axis (left to right) and specifying '-' implies the component \n should be flipped along a horizontal axis (up to down).\n#. With most components you can specify a name, and with many components you \n can also specify a value. The text orientation will always be horizontal \n regardless of the component orientation.\n#. When the schematic is used with Latex, you can use Latex formatting in the \n name and value. For example, you can specify: `name='$L_1$'`. You should use \n raw strings if your string contains backslashes: `value=r'$10 \\\\mu H$'`.\n#. Components provide the *t* attribute, which is a list of the locations of \n its terminals. Many component also provide individual attributes for each \n terminal. For example, the resistor, capacitor, and inductor components \n provide the *p* and *n* terminal attributes. The MOS component provides the \n *d*, *g*, and *s* terminal attributes. The diode component provides the *a* \n and *c* terminal attributes.\n#. Components contain attributes for each of the 9 principal coordinates (c, n, \n ne, e, se, s, sw, w, nw). For most components, these are the principal \n coordinates for the component's tile. However, the source places its \n principal coordinates on the circle used to depict the source.\n\n\nPlacement Strategies\n~~~~~~~~~~~~~~~~~~~~\n\nThere are two basic approaches to placing components. First, you may specify the \ncoordinate in absolute terms. For example::\n\n with Schematic(filename = \"rlc.svg\"):\n Wire([(-75, -50), (75, -50), (75, 50), (-75, 50)])\n Wire([(0, -50), (0, 50)])\n Resistor((-75, 0), name='R', orientation='v')\n Capacitor((0, 0), name='C', orientation='v')\n Inductor((75, 0), name='L', orientation='v')\n\nThis turns out to be rather cumbersome if you need to move things around. In \nthat case you likely have to adjust a large number coordinates. Since \nschematics of any complexity are often adjusted repeatedly before they are \ncorrect and aesthetically appealing, this approach can lead to a lot of tedious \nwork.\n\nA variation on this approach that is considerably better is to place the \ncoordinates in variables and then use the variables when specifying component \nlocations and wire vertices. That approach was used in the first example. It \ncan results in the up-front specification of a large number of coordinates. \nA refinement is to just specify the primary coordinates up-front, and calculate \nthe rest as needed::\n\n r_x, r_y = 0, 0\n c_x, c_y = r_x + 75, r_y\n l_x, l_y = c_x + 75, c_y\n\n with Schematic(filename = \"rlc.svg\"):\n Wire([(r_x, c_y-50), (l_x, c_y-50), (l_x, c_y+50), (r_x, c_y+50)])\n Wire([(c_x, c_y-50), (c_x, c_y+50)])\n Resistor((r_x, 0), name='R', orientation='v')\n Capacitor((c_x, 0), name='C', orientation='v')\n Inductor((l_x, 0), name='L', orientation='v')\n\n*Schematic* provides a way for you to generated these coordinates relatively \nefficiently by using offsets::\n\n # create coordinates\n x_offsets = dict(\n r = 0,\n c = 75,\n l = 75,\n )\n y_offsets = dict(\n top = 0,\n mid = 50,\n bot = 50,\n )\n offsets_to_coordinates(locals(), x_offsets, y_offsets)\n\n*offsets_to_coordinates* creates a collection of local variables whose names \nderive from the keys used in the dictionary. This example creates the following \nlocal variables::\n\n r_x = 0\n c_x = 75\n l_x = 150\n top_y = 0\n mid_y = 50\n bot_y = 100\n\nThe *x_offsets* are handled as follows. The process starts at 0. The first \noffset, *r*, is 0, meaning that *r_x* will be 0 units east of 0, which of course \nis 0. Then *c_x* will be 75 units east of *r_x* and *l_x* is 75 units east of \n*c_x*. *y_offsets* is processed in a similar way, except the direction of travel \nis south. This function assumes that the dictionary is ordered, as such it \nrequires Python3.6 or greater. If you are not using such a recent version of \nPython, the you should import *OrderedDict* from *collections* and use it to \nbuild the dictionary.\n\nThe second basic approach to placing component is to place them relative to each \nother. To do so, you would generally take advantage of the fact that components \nhave attributes that contains useful coordinate locations on the component. For \nexample::\n\n r = Resistor((0, 0), name='R', orientation='v')\n\nNow, *r.c*, *r.n*, *r.ne*, *r.e*, *r.se*, *r.s*, *r.sw*, *r.w*, and *r.nw* \ncontain the coordinates of the center, north, northeast, east, southeast, south, \nsouthwest, west, and northwest corners. In addition, *r.p* and *r.n* hold the \ncoordinates of the positive and negative terminals, as do *r.t[0]* and *r.t[1]*.\nFinally, wires provide the *b* and *e* attributes, which contain the coordinates \nof their beginning and ending.\n\nThe *shift*, *shift_x*, and *shift_y* utility functions are provided to shift \nthe position of a coordinate pair. Examples::\n\n shift((x,y), dx, dy) --> (x+dx, y+dy)\n shift_x((x,y), dx) --> (x+dx, y)\n shift_y((x,y), dy) --> (x, y+dy)\n\nYou can also use *with_x* and *with_y* to replace the *x* or *y* portion of \na coordinate pair. They take two arguments, the first is returned with the \nappropriate coordinate component replaced by the second. The second argument may \nbe a simple number or it may be a coordinate pair, in which case the appropriate \ncoordinate component is used to replace the corresponding component in the first \nargument::\n\n with_x((x1,y1), x2) --> (x2, y1)\n with_y((x1,y1), y2) --> (x1, y2)\n with_x((x1,y1), (x2,y2)) --> (x2, y1)\n with_y((x1,y1), (x2,y2)) --> (x1, y2)\n\nNow the RLC schematic can be rewritten as follows::\n\n with Schematic(filename = \"rlc.svg\"):\n r = Resistor((0, 0), name='R', orientation='v')\n c = Capacitor(shift_x(r.c, 75), name='C', orientation='v')\n l = Inductor(shift_x(c.c, 75), name='L', orientation='v')\n Wire([r.p, c.p, l.p])\n Wire([r.n, c.n, l.n])\n\nIn this case the only coordinate that was explicitly specified with that of *r* \nwhich was placed at the origin. All other components and wires were placed \nrelative to the center of *r*.\n\nYou are free to mix these various styles of component placement as you desire.\n\n\nSVGwrite\n~~~~~~~~\n\n*Schematic* subclasses the Python `svgwrite \n`_ *Drawing* class. So you can call any \n*Drawing* method from a schematic. In this case you must keep the schematic \ninstance to access the methods::\n\n with Schematic(filename = \"rlc.svg\") as schematic:\n schematic.circle(\n center=(0,0), r=100, fill='none', stroke_width=1, stroke='black'\n )\n schematic.text(\n 'Hello', insert=(0,0), font_family='sans', font_size=16, fill='black'\n )\n\nOne thing to note is that *Schematic* normally keeps track of the location and \nextent of the schematic objects and sizes the drawing accordingly. It will be \nunaware of anything added directly to the drawing though the *svgwrite* methods.\nAs a result, these objects may fall partially or completely outside the bounds \nof the drawing. You can add padding when you first instantiate *Schematic* or \nyou can use the *svgwrite* *viewbox* method to extend the bounds.\n\n*Schematic* offers an alternative to the *text* method of *svgwrite*. *add_text* \ntakes only the text, the placement, and the alignment and uses *Schematic* \ndefaults for everything else. The alignment consists of two letters. The first \nletter specifies the vertical alignment and is either *u*, *l*, and *m\" \nsignifying upper, lower and middle. The second specifies the horizontal \nalignment, and is either *l*, *r*, or *m*, signifying left, right, or middle. \nThus, another way of adding text to the above drawing would be with::\n\n schematic.add_text('Hello', (0,0), 'mm')\n\n\nLatex\n~~~~~\n\nTo include these schematics into Latex documents, you need to run `Inkscape \n`_ with the --export-latex command line option to \ngenerate the files that you can include in Latex. Here is a Makefile that you \ncan use to keep all these files up to date::\n\n DRAWINGS = \\\n flash-adc \\\n pipeline-adc \\\n delta-sigma-adc\n\n SVG_FILES=$(DRAWINGS:=.svg)\n PDF_FILES=$(DRAWINGS:=.pdf)\n PDFTEX_FILES=$(DRAWINGS:=.pdf_tex)\n\n .PHONY: clean\n .PRECIOUS: %.svg\n\n %.svg: %.py\n python3 $<\n\n %.pdf: %.svg\n inkscape -z -D --file=$< --export-pdf=$@ --export-latex\n\n clean:\n rm -rf $(PDF_FILES) $(PDFTEX_FILES) __pycache__\n\nTo include the files into your Latex document, use::\n\n \\def\\svgwidth{0.5\\columnwidth}\n \\input{delta-sigma.pdf_tex}\n\nFinally, to convert your Latex file to PDF, use::\n\n pdflatex --shell-escape converters.tex\n\n\nOther Image Formats\n~~~~~~~~~~~~~~~~~~~\n\nYou can use Image Magick package to convert SVG files to other image formats. \nFor example::\n\n convert receiver.svg receiver.png\n\n\nSchematic\n---------\n\nWhen creating a schematic you may specify the following arguments: filename, \nfont_size, font_family (ex. 'serif' or 'sans-serif'), line_width, and \ndot_radius. The dot radius is the radius of solder-dots and pins.\n\nYou can also specify background and outline, both of which are colors. The \ndefault background is 'white' and the default outline is 'none'. If you set \nbackground to 'none' be aware that this makes the concealers transparent, \nmeaning that you cannot wire under components, instead you must wire to the \npins. It is common to start by setting outline to allow you to see the SVG \ndrawing area, and then later remove it when your schematic is complete.\npad arguments are used to adjust the size of the SVG \n\nThe size of the SVG canvas is automatically sized to fit tightly around the \nspecified schematic objects. You might find that the text associated with input \nand output pins has a tendency to extend beyond the canvas. This is because no \nattempt is made to estimate the width of text. Instead, you can increase the \nwidth of the pin's tile using its *w* parameter. In addition, you can also add \npadding when creating the schematic. There are five padding arguments. The most \ncommonly used is *pad*, which simply adds the same padding to all four edges. In \naddtion, you can control the individual edges using left_pad, right_pad, \ntop_pad, and bottom_pad. These simply add to pad to create the final padding for \neach edge.\n\n\nWire\n----\n\nDraw a wire between two or more points given in sequence. Each point should be \nspecified as a x,y pair. Wires are often specified before components, which \nplaces them on the lowest level, allowing the component to obscure the wires \nwhen needed. Example:\n\n.. code-block:: python\n\n Wire([(x0,y0), (x1,y1), (x2,y2), (x3,y3)])\n\n*Wire* supports the *kind* argument, which may be either `plain`, `|-`, `-|`, \n`|-|`, or `-|-`. With plain, any-angle line segments are added between each of \nthe points. With `|-`, `-|`, `|-|`, and `-|-` the wires are constrained to \nfollow a Manhattan geometry (between each point there may be one, two, or three \nline segments that are constrained to be either purely vertical or purely \nhorizontal. With `|-` there are two segments, with the first being vertical. \nWith `-|`, there are also two segments, but the first is horizontal. With `|-|`, \nand `-|-` there there are three segments with the middle segment being half way \nbetween the two points. With `|-|`, the segments are vertical, horizontal, and \nvertical. With `-|-`, the segments are horizontal, vertical, and horizontal.\n\n*Wire* also supports the *line_width* and *color* arguments.\n\n*Wire* provides the *b* and *e* attributes, that contain the coordinates of the \nbeginning and end of the wire.\n\n\nComponents\n----------\n\nThis section documents the available components. Components include an invisible \ntile in which the component should fit. The tile extent is used when determining \nthe size of the overall schematic. Each component requires that you specify \nlocation by giving the coordinates of the center point of its tile. You can also \ngenerally specify the *orientation*, the *name*, the *value*, and a *nudge*.\n\nThe *orientation* generally consists of either 'v' or 'h', indicating that \na vertical or horizontal orientation is desired, but may include '|' and '-', \nindicating that the component should be flipped around either the vertical or \nhorizontal axis. The *name* and *value* are strings that are added to the \ncomponent as labels, though not all components will display the *value*. The \n*nudge* is a number that adjusts the placement of labels to avoid wires.\n\nIn addition, some components support other arguments, such as *kind* or *loc*.\n\nYou may pass wires directly under most components. The component will conceal \nthe wire in those places where it should not be shown. This makes it simpler to \nwire up a schematic as you don't need separate wires between a string of \ncomponents that all fall in a line. Rather, you would just specify the wire \nfirst, and then it will run underneath the components. This trick works as lone \nas long as you do not specify the schematic background as 'none'.\n\nComponents have a *t* attribute that contains the coordinates of the terminals. \nIt is an array that tends to follow several conventions, the SPICE order and \noutputs first. If there is a pair of terminals, the top or right would be given \nfirst. In addition, select components place their terminal locations into named \nattributes.\n\n\nResistor\n~~~~~~~~\n\nDraw a resistor.\n\n.. code-block:: python\n\n Resistor((x,y), orientation='v', name=R1, value='50\u03a9')\n\nYou may pass a wire directly under the resistor and the wire will be concealed \nby the resistor.\n\nThe *p* and *n* attributes contain the coordinates of the positive and negative \nterminals.\n\n\nCapacitor\n~~~~~~~~~\n\nDraw a capacitor. You must specify the location of the center as an x,y pair. \nYou may also specify the orientation, the name, and the value.\n\n.. code-block:: python\n\n Capacitor((x,y), orientation='h', name=C1, value='1.2pF')\n\nYou may pass a wire directly under the capacitor and the wire will be concealed \nby the capacitor. The capacitor is polarized with reference end being terminal \n1.\n\nThe *p* and *n* attributes contain the coordinates of the positive and negative \nterminals.\n\n\nInductor\n~~~~~~~~\n\nDraw an inductor. You must specify the location of the center as an x,y pair. \nYou may also specify the orientation, the name, the value, and the nudge.\n\n.. code-block:: python\n\n Inductor((x,y), orientation='h', name=L1, value='1\u03bcH')\n\nYou may pass a wire directly under the inductor and the wire will be concealed \nby the inductor.\n\nThe *p* and *n* attributes contain the coordinates of the positive and negative \nterminals.\n\n\nDiode\n~~~~~\n\nDraw a diode. You must specify the location of the center as an x,y pair. You \nYou may also specify the orientation, the name, the value, and the nudge.\n\n.. code-block:: python\n\n Inductor((x,y), orientation='h', name=L1, value='1\u03bcH')\n\nYou may pass a wire directly under the inductor and the wire will be concealed \nby the inductor. The anode is terminal 0 and the cathode is terminal 1.\n\nThe *a* and *c* attributes contain the coordinates of the anode and cathode \nterminals.\n\n\nMOS\n~~~\n\nDraw a MOSFET. You must specify the location of the center as an x,y pair. You \nmay also specify the kind, the orientation, the name, and the value. The kind \ncan either be 'n' or 'p'.\n\n.. code-block:: python\n\n MOS((x,y), kind='n', orientation='v|', name=M2, value='10')\n\nYou may pass a wire directly under the FET and the wire will be concealed by the \nFET.\n\nThe *d*, *g* and *s* attributes contain the coordinates of the drain, gate and \nsource terminals.\n\n\nAMP\n~~~\n\nDraw an amplifier. You must specify the location of the center as an x,y pair. \nYou may also specify the kind, the orientation, the name, and the value. The \nkind can either be 'se', 'oa' or 'de': 'se' is short for single-ended and has no \nlabel on the input pin, 'oa' is short for operational amplifier and has markings \nfor the positive and negative inputs, and 'da' is short for differential \namplifier and has markings for positive and negative inputs and outputs.\n\n.. code-block:: python\n\n Amp((x,y), kind='da', orientation='h-')\n\nYou may pass a wire or wires directly under the amplifier and the wire will be \nconcealed by the amplifier.\n\n\nGate\n~~~~\n\nDraw a gate. You must specify the location of the center as an x,y pair. You \nmay also specify the kind, the orientation, the name, and the value. Currently \nthe only supported kind of gate is 'inv', an inverter.\n\n.. code-block:: python\n\n Gate((x,y), kind='inv')\n\nYou may pass a wire or wires directly under the amplifier and the wire will be \nconcealed by the gate.\n\n\nSource\n~~~~~~\n\nDraw a source. You must specify the location of the center as an x,y pair. You \nmay also specify the kind, the orientation, the name, and the value. The kind \ncan either be 'empty', 'vdc', 'idc', 'sine', 'sum', or 'mult'.\n\n.. code-block:: python\n\n Source((x,y), kind='sine', name='Vin')\n\nYou may pass a wire or wires directly under the source and the wire will be \nconcealed by the source.\n\nThe component also includes the nine principal coordinates for the source: c, n, \nne, e, se, s, sw, w, and nw. Except for c, they are evenly distributed around \nthe circle.\n\nSwitch\n~~~~~~\n\nDraw an switch. You must specify the location of the center as an x,y pair. You \nmay also specify the kind, the orientation, the name, and the value. The kind \ncan either be 'spst' or 'spdt'.\n\n.. code-block:: python\n\n Switch((x,y), kind='spst', name='\u03c6\u2081')\n\nYou may pass a wire or wires directly under the switch and the wire will be \nconcealed by the switch.\n\n\nBox\n~~~\n\nDraw a box. You must specify the location of the center as an x,y pair. You may \nalso specify the orientation, the name, the value, the width (w), the height \n(h), and background, an override for the color used of the interior of the box. \nThe default width is 2 and the default height is 1.5.\n\n.. code-block:: python\n\n Box((x,y), name='$z^{-1}$', w=1, h=1)\n\nYou may pass a wire or wires directly under the box and the wire will be \nconcealed by the box.\n\n*Box* also supports the *line_width* and *background* arguments.\n\nThe component also includes the nine principal coordinates for the box: c, n, \nne, e, se, s, sw, w, and nw. Except for c, they are evenly distributed around \nthe box.\n\n\nGround\n~~~~~~\n\nDraw a ground. You must specify the location of the center as an x,y pair. The \ncenter of the tile corresponds to the top of the ground symbol. You may also \nspecify the kind, the orientation, the name, and the value, but the value is \ncurrently unused.\n\n.. code-block:: python\n\n Ground((x,y))\n\n\nPin\n~~~\n\nDraw a pin (a small hollow circle). You must specify the location of the center \nas an x,y pair. You may also specify the kind, the orientation, the name, the \nvalue, and the size. The kind can either be 'in', 'out', 'dot', or 'none'. \nWith 'in' pins, the labels go on the left, with 'out' pins they go on the right.\nBy default the size of the pin is 1, meaning that a unit sized tile is used. \nThis is significant if the label is at the edge of the schematic. If the labels \nextend beyond the tile, they may extend beyond the computed viewbox for the \nschematic. You can fix this by specifying a larger size.\n\n.. code-block:: python\n\n Pin((x,y), kind='out', name='Vout', size=2)\n\nYou may pass a wire or wires directly under the pin and the wire will be \nconcealed by the pin.\n\n\nDot\n~~~\n\nDraw a solder dot (a small filled circle). You must specify the location of the \ncenter as an x,y pair. You may also specify the kind, the orientation, the \nname, the value, and the size. The kind can either be 'in' or 'out'. With 'in' \npins, the labels go on the left, with 'out' pins they go on the right. By \ndefault the size of the pin is 1, meaning that a unit sized tile is used. This \nis significant if the label is at the edge of the schematic. If the labels \nextend beyond the tile, they may extend beyond the computed viewbox for the \nschematic. You can fix this by specifying a larger size.\n\n.. code-block:: python\n\n Pin((x,y), kind='out', name='Vout', size=2)\n\nYou may pass a wire or wires directly under the pin and the wire will be \nconcealed by the pin.\n\n\nLabel\n~~~~~\n\nPlace a label. You must specify the location of the text anchor as an x,y pair. \nYou may also specify the location (loc), the name (the label), the width (w) and \nthe height (h). The location can be 'c', 'n', 'ne', 'e', 'se', 's', 'sw', 'w', \nand 'nw'. The default width and height is 1.\n\n.. code-block:: python\n\n Label((x,y), name='$z^{-1}$', w=1, h=1)\n\nYou can also specify the kind and orientation arguments. The kind may be \n'plain', 'arrow', 'slash' or 'dot'. If 'plain' is specified, no symbol is added, \nonly the name is displayed. If 'arrow' is specified, an arrow is added. If \n'slash' is specified, a small slash is added through the center. It is \ngenerally used with buses to indicate the bus width. Finally, 'dot' adds \na solder dot.\n\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/kenkundert/svg_schematic/tarball/master", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kenkundert/svg_schematic", "keywords": "svg", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "svg_schematic", "package_url": "https://pypi.org/project/svg_schematic/", "platform": "", "project_url": "https://pypi.org/project/svg_schematic/", "project_urls": { "Download": "https://github.com/kenkundert/svg_schematic/tarball/master", "Homepage": "https://github.com/kenkundert/svg_schematic" }, "release_url": "https://pypi.org/project/svg_schematic/0.3.0/", "requires_dist": null, "requires_python": "", "summary": "svg schematics", "version": "0.3.0" }, "last_serial": 3603844, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b864104310a63490012690d351b3d24b", "sha256": "eb6557f260043254deeba7120dac7cc9a85ef9e9f451e860c4c9f15ad485f9fb" }, "downloads": -1, "filename": "svg_schematic-0.1.0.tar.gz", "has_sig": true, "md5_digest": "b864104310a63490012690d351b3d24b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19041, "upload_time": "2018-02-22T00:04:22", "url": "https://files.pythonhosted.org/packages/03/7f/ffeca069e52abcae0df54724ea25456184aa3c4351491e1ba974bade087c/svg_schematic-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "187c29136b304106f3754a2854302196", "sha256": "5f2971674cda1e1610e253a13750936ba4ada0dc80b32101d7aac6172764b31f" }, "downloads": -1, "filename": "svg_schematic-0.2.0.tar.gz", "has_sig": true, "md5_digest": "187c29136b304106f3754a2854302196", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35951, "upload_time": "2018-02-22T00:20:54", "url": "https://files.pythonhosted.org/packages/85/7f/1e47387df10194d178e9a56ca5b5829a180b796303737a65e8ca339c06b0/svg_schematic-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "e2e79193d64a86f7325a3c886d446a96", "sha256": "c479a4a8585cb9201f6756e46fb89d729e6cbb56c27a08ae35a0ab71e7ebd93a" }, "downloads": -1, "filename": "svg_schematic-0.3.0.tar.gz", "has_sig": true, "md5_digest": "e2e79193d64a86f7325a3c886d446a96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35966, "upload_time": "2018-02-22T00:28:47", "url": "https://files.pythonhosted.org/packages/ff/c2/6b283a34a1ad35b0e0cb1810c8de725272f41f170c658de1c1e1bd2aac6a/svg_schematic-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e2e79193d64a86f7325a3c886d446a96", "sha256": "c479a4a8585cb9201f6756e46fb89d729e6cbb56c27a08ae35a0ab71e7ebd93a" }, "downloads": -1, "filename": "svg_schematic-0.3.0.tar.gz", "has_sig": true, "md5_digest": "e2e79193d64a86f7325a3c886d446a96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35966, "upload_time": "2018-02-22T00:28:47", "url": "https://files.pythonhosted.org/packages/ff/c2/6b283a34a1ad35b0e0cb1810c8de725272f41f170c658de1c1e1bd2aac6a/svg_schematic-0.3.0.tar.gz" } ] }