{ "info": { "author": "Casey Duckering", "author_email": "", "bugtrack_url": null, "classifiers": [ "Framework :: IPython", "Framework :: Jupyter", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3" ], "description": "# drawSvg\n\nA Python 3 library for programmatically generating SVG images (vector drawings) and rendering them or displaying them in an iPython notebook.\n\nMost common SVG tags are supported and others can easily be added by writing a small subclass of `DrawableBasicElement` or `DrawableParentElement`.\n\nAn interactive [Jupyter notebook](https://jupyter.org) widget, `drawSvg.widgets.DrawingWidget`, is included that can update drawings based on mouse events.\n\n# Install\n\ndrawSvg is available on PyPI:\n\n```\n$ pip3 install drawSvg\n```\n\n## Prerequisites\n\nCairo needs to be installed separately. When Cairo is installed, drawSvg can output PNG or other image formats in addition to SVG. See platform-specific [instructions for Linux, Windows, and macOS from Cairo](https://www.cairographics.org/download/). Below are some examples for installing Cairo on Linux distributions and macOS.\n\n**Ubuntu**\n\n```\n$ sudo apt-get install libcairo2\n```\n\n**macOS**\n\nUsing [homebrew](https://brew.sh/):\n\n```\n$ brew install cairo\n```\n\n# Examples\n\n### Basic drawing elements\n```python\nimport drawSvg as draw\n\nd = draw.Drawing(200, 100, origin='center')\n\nd.append(draw.Lines(-80, -45,\n 70, -49,\n 95, 49,\n -90, 40,\n close=False,\n fill='#eeee00',\n stroke='black'))\n\nd.append(draw.Rectangle(0,0,40,50, fill='#1248ff'))\nd.append(draw.Circle(-40, -10, 30,\n fill='red', stroke_width=2, stroke='black'))\n\np = draw.Path(stroke_width=2, stroke='green',\n fill='black', fill_opacity=0.5)\np.M(-30,5) # Start path at point (-30, 5)\np.l(60,30) # Draw line to (60, 30)\np.h(-70) # Draw horizontal line to x=-70\np.Z() # Draw line to start\nd.append(p)\n\nd.append(draw.ArcLine(60,-20,20,60,270,\n stroke='red', stroke_width=5, fill='red', fill_opacity=0.2))\nd.append(draw.Arc(60,-20,20,60,270,cw=False,\n stroke='green', stroke_width=3, fill='none'))\nd.append(draw.Arc(60,-20,20,270,60,cw=True,\n stroke='blue', stroke_width=1, fill='black', fill_opacity=0.3))\n\nd.setPixelScale(2) # Set number of pixels per geometry unit\n#d.setRenderSize(400,200) # Alternative to setPixelScale\nd.saveSvg('example.svg')\nd.savePng('example.png')\n\n# Display in iPython notebook\nd.rasterize() # Display as PNG\nd # Display as SVG\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example1.png)\n\n### Gradients\n```python\nimport drawSvg as draw\n\nd = draw.Drawing(1.5, 0.8, origin='center')\n\nd.draw(draw.Rectangle(-0.75,-0.5,1.5,1, fill='#ddd'))\n\n# Create gradient\ngradient = draw.RadialGradient(0,-0.35,0.7*10)\ngradient.addStop(0.5/0.7/10, 'green', 1)\ngradient.addStop(1/10, 'red', 0)\n\n# Draw a shape to fill with the gradient\np = draw.Path(fill=gradient, stroke='black', stroke_width=0.002)\np.arc(0,-0.35,0.7,30,120)\np.arc(0,-0.35,0.5,120,30,cw=True, includeL=True)\np.Z()\nd.append(p)\n\n# Draw another shape to fill with the same gradient\np = draw.Path(fill=gradient, stroke='red', stroke_width=0.002)\np.arc(0,-0.35,0.75,130,160)\np.arc(0,-0.35,0,160,130,cw=True, includeL=True)\np.Z()\nd.append(p)\n\n# Another gradient\ngradient2 = draw.LinearGradient(0.1,-0.35,0.1+0.6,-0.35+0.2)\ngradient2.addStop(0, 'green', 1)\ngradient2.addStop(1, 'red', 0)\nd.append(draw.Rectangle(0.1,-0.35,0.6,0.2,\n stroke='black', stroke_width=0.002,\n fill=gradient2))\n\n# Display\nd.setRenderSize(w=600)\nd\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example2.png)\n\n### Duplicate geometry and clip paths\n```python\nimport drawSvg as draw\n\nd = draw.Drawing(1.4, 1.4, origin='center')\n\n# Define clip path\nclip = draw.ClipPath()\nclip.append(draw.Rectangle(-.25,.25-1,1,1))\n\n# Draw a cropped circle\nc = draw.Circle(0,0,0.5, stroke_width='0.01', stroke='black',\n fill_opacity=0.3, clip_path=clip,\n id='circle')\nd.append(c)\n\n# Make a transparent copy, cropped again\ng = draw.Group(opacity=0.5, clip_path=clip)\ng.append(draw.Use('circle', 0.25,0.1))\nd.append(g)\n\n# Display\nd.setRenderSize(400)\nd.rasterize()\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example3.png)\n\n### Implementing other SVG tags\n```python\nimport drawSvg as draw\n\n# Subclass DrawingBasicElement if it cannot have child nodes\n# Subclass DrawingParentElement otherwise\n# Subclass DrawingDef if it must go between tags in an SVG\nclass Hyperlink(draw.DrawingParentElement):\n TAG_NAME = 'a'\n def __init__(self, href, target=None, **kwargs):\n # Other init logic...\n # Keyword arguments to super().__init__() correspond to SVG node\n # arguments: stroke_width=5 -> stroke-width=\"5\"\n super().__init__(href=href, target=target, **kwargs)\n\nd = draw.Drawing(1, 1.2, origin='center')\n\n# Create hyperlink\nhlink = Hyperlink('https://www.python.org', target='_blank',\n transform='skewY(-30)')\n# Add child elements\nhlink.append(draw.Circle(0,0,0.5, fill='green'))\nhlink.append(draw.Text('Hyperlink',0.2, 0,0, center=0.6, fill='white'))\n\n# Draw and display\nd.append(hlink)\nd.setRenderSize(200)\nd\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example4.png)\n\n### Interactive Widget\n```python\nimport drawSvg as draw\nfrom drawSvg.widgets import DrawingWidget\nimport hyperbolic.poincare.shapes as hyper # pip3 install hyperbolic\n\n# Create drawing\nd = draw.Drawing(2, 2, origin='center')\nd.setRenderSize(500)\nd.append(draw.Circle(0, 0, 1, fill='orange'))\ngroup = draw.Group()\nd.append(group)\n\n# Update the drawing based on user input\nclick_list = []\ndef redraw(points):\n group.children.clear()\n for x1, y1 in points:\n for x2, y2 in points:\n if (x1, y1) == (x2, y2): continue\n p1 = hyper.Point.fromEuclid(x1, y1)\n p2 = hyper.Point.fromEuclid(x2, y2)\n if p1.distanceTo(p2) <= 2:\n line = hyper.Line.fromPoints(*p1, *p2, segment=True)\n group.draw(line, hwidth=0.2, fill='white')\n for x, y in points:\n p = hyper.Point.fromEuclid(x, y)\n group.draw(hyper.Circle.fromCenterRadius(p, 0.1),\n fill='green')\nredraw(click_list)\n\n# Create interactive widget and register mouse events\nwidget = DrawingWidget(d)\n@widget.mousedown\ndef mousedown(widget, x, y, info):\n if (x**2 + y**2) ** 0.5 + 1e-5 < 1:\n click_list.append((x, y))\n redraw(click_list)\n widget.refresh()\n@widget.mousemove\ndef mousemove(widget, x, y, info):\n if (x**2 + y**2) ** 0.5 + 1e-5 < 1:\n redraw(click_list + [(x, y)])\n widget.refresh()\nwidget\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example5.gif)\n\n### Animation\n```python\nimport drawSvg as draw\n\n# Draw a frame of the animation\ndef draw_frame(t):\n d = draw.Drawing(2, 6.05, origin=(-1,-1.05))\n d.setRenderSize(h=300)\n d.append(draw.Rectangle(-2, -2, 4, 8, fill='white'))\n d.append(draw.Rectangle(-1, -1.05, 2, 0.05, fill='brown'))\n t = (t + 1) % 2 - 1\n y = 4 - t**2 * 4\n d.append(draw.Circle(0, y, 1, fill='lime'))\n return d\n\nwith draw.animate_jupyter(draw_frame, delay=0.05) as anim:\n# Or:\n#with draw.animate_video('example6.gif', draw_frame, duration=0.05\n# ) as anim:\n # Add each frame to the animation\n for i in range(20):\n anim.draw_frame(i/10)\n for i in range(20):\n anim.draw_frame(i/10)\n for i in range(20):\n anim.draw_frame(i/10)\n```\n\n![Example output image](https://raw.githubusercontent.com/cduck/drawSvg/master/examples/example6.gif)\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/cduck/drawSvg/archive/1.3.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cduck/drawSvg", "keywords": "SVG,draw,graphics,iPython,Jupyter,widget", "license": "", "maintainer": "", "maintainer_email": "", "name": "drawSvg", "package_url": "https://pypi.org/project/drawSvg/", "platform": "", "project_url": "https://pypi.org/project/drawSvg/", "project_urls": { "Download": "https://github.com/cduck/drawSvg/archive/1.3.1.tar.gz", "Homepage": "https://github.com/cduck/drawSvg" }, "release_url": "https://pypi.org/project/drawSvg/1.3.1/", "requires_dist": [ "cairoSVG", "numpy", "imageio" ], "requires_python": "", "summary": "A Python 3 library for programmatically generating SVG images (vector drawings) and rendering them or displaying them in an iPython notebook.", "version": "1.3.1" }, "last_serial": 5973884, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "2bcc51507ca589755f4011b8165dd379", "sha256": "d8d1862670be407c6cb88b58d8c8b940c33243622b22faaa8d204fb3d237d8ef" }, "downloads": -1, "filename": "drawSvg1.0.0.tar.gz", "has_sig": false, "md5_digest": "2bcc51507ca589755f4011b8165dd379", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8465, "upload_time": "2017-12-27T04:05:51", "url": "https://files.pythonhosted.org/packages/e4/94/fb649136ae7440b7cd6633a31609439b16441dffb6df584c2af2a6e72b09/drawSvg1.0.0.tar.gz" } ], "1.0.0.1": [ { "comment_text": "", "digests": { "md5": "2907118830b574f6ae1dd9c508ce4e30", "sha256": "ded731fde426016e674782b27f7f75adcabf665ff6d9b0ca6ad20de0de78a386" }, "downloads": -1, "filename": "drawSvg-1.0.0.1.tar.gz", "has_sig": false, "md5_digest": "2907118830b574f6ae1dd9c508ce4e30", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8468, "upload_time": "2017-12-27T04:16:54", "url": "https://files.pythonhosted.org/packages/dc/1f/8086cc05bcff279a1137735b0b4a8ae7e786b1071902a37cdba046e466a8/drawSvg-1.0.0.1.tar.gz" } ], "1.0.0.2": [ { "comment_text": "", "digests": { "md5": "5c34ce42c64841a2a6138a864100d03d", "sha256": "637f6d250ae85ed9ada1dbedd5877d62aca206f077db920c34d9d24a5afca718" }, "downloads": -1, "filename": "drawSvg-1.0.0.2.tar.gz", "has_sig": false, "md5_digest": "5c34ce42c64841a2a6138a864100d03d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11719, "upload_time": "2017-12-27T08:40:37", "url": "https://files.pythonhosted.org/packages/d6/5d/8192e4ed7f98ff44ed1ad2de5b61f60d17ae7bdcea1bb6b4022a27ed1414/drawSvg-1.0.0.2.tar.gz" } ], "1.0.0.3": [ { "comment_text": "", "digests": { "md5": "480a5d547b97a017c323a267c5d74164", "sha256": "740245ea06adfde418de99273247a1e9bab6c9c81503efe20d80e29f50030d36" }, "downloads": -1, "filename": "drawSvg-1.0.0.3.tar.gz", "has_sig": false, "md5_digest": "480a5d547b97a017c323a267c5d74164", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11568, "upload_time": "2017-12-27T09:15:55", "url": "https://files.pythonhosted.org/packages/21/2c/10f7d4e03b14cb66adee39f7d330142c2aefc8fa17adaec0f5f7bfd8479d/drawSvg-1.0.0.3.tar.gz" } ], "1.0.0.4": [ { "comment_text": "", "digests": { "md5": "3189e4f61b0f94777a89e20b804aaad1", "sha256": "b9c778fabe87640550cbcee0205b2472bd791c2bffff0454bbcdb7814fbc34b1" }, "downloads": -1, "filename": "drawSvg-1.0.0.4.tar.gz", "has_sig": false, "md5_digest": "3189e4f61b0f94777a89e20b804aaad1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11563, "upload_time": "2017-12-27T09:26:33", "url": "https://files.pythonhosted.org/packages/eb/3e/d87d6df04707ff3a9eb305fcb72e9cf6c816ed6718987f9fcbb1c6a71dad/drawSvg-1.0.0.4.tar.gz" } ], "1.0.0.5": [ { "comment_text": "", "digests": { "md5": "1aea741febcb31e3d2e136c66439163b", "sha256": "275d894de7b25c04b8ad57534320aba996c15273d5192871f6d6dd3ab0378532" }, "downloads": -1, "filename": "drawSvg-1.0.0.5.tar.gz", "has_sig": false, "md5_digest": "1aea741febcb31e3d2e136c66439163b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11607, "upload_time": "2017-12-27T10:09:59", "url": "https://files.pythonhosted.org/packages/f9/aa/233488c7b16a30d1b1c94f470eb532a876c69e163c6f2d869cb438d51db2/drawSvg-1.0.0.5.tar.gz" } ], "1.0.0.6": [ { "comment_text": "", "digests": { "md5": "53af78f75251c7ca7040394ce1411c7b", "sha256": "423687da56c9a01fcc95bb124f2c94597b7996f4ca69f6d704d1ce8b5b8f4a38" }, "downloads": -1, "filename": "drawSvg-1.0.0.6.tar.gz", "has_sig": false, "md5_digest": "53af78f75251c7ca7040394ce1411c7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11615, "upload_time": "2017-12-28T13:02:29", "url": "https://files.pythonhosted.org/packages/31/7f/3ebf29d8a882cb7014a9c4cac113973b5f146ec9badd47fb23dee09a9f8f/drawSvg-1.0.0.6.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "7c67cff904ef799cbf8ad7134590c5c6", "sha256": "70db80e0c55653d592835153e7d4cce92ab197d37872c0eaa8454c319939e361" }, "downloads": -1, "filename": "drawSvg-1.0.1.0.tar.gz", "has_sig": false, "md5_digest": "7c67cff904ef799cbf8ad7134590c5c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11641, "upload_time": "2018-01-20T08:11:27", "url": "https://files.pythonhosted.org/packages/a8/ab/d20e0ccdc41e768c64eb38407939b3f9971d4055a5fbb897fc941f62bf44/drawSvg-1.0.1.0.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "f0bdfa8ffd21b1ad03b88f2c77be0853", "sha256": "9398fdbac53af3d29ca5c33487b9bffe9d94743a3fac6b76951f8b8637fa3360" }, "downloads": -1, "filename": "drawSvg-1.0.2.tar.gz", "has_sig": false, "md5_digest": "f0bdfa8ffd21b1ad03b88f2c77be0853", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11637, "upload_time": "2018-01-26T16:09:08", "url": "https://files.pythonhosted.org/packages/cb/45/5fe81a2e0f55e2be485aba70830690a76cfd8d91e583c43af09a7449b49a/drawSvg-1.0.2.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "9a70873d3dd1367735c43e3cbe80f427", "sha256": "b70f1f1f1ce74c577ec8df148b4168c4dee95dfcde7740bb5892819ea6d69e59" }, "downloads": -1, "filename": "drawSvg-1.1.0.tar.gz", "has_sig": false, "md5_digest": "9a70873d3dd1367735c43e3cbe80f427", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11685, "upload_time": "2019-02-05T21:36:22", "url": "https://files.pythonhosted.org/packages/06/33/939c518f391b709b195cdf9401172d2289412f1ddeefab6ffbea222c879e/drawSvg-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "a0676c0432decb94c3cf05d4dcf9ea52", "sha256": "7ca6a6613f3d110aa92d74fd64d7a3fbf49fbf8b9cb5e214c463a0e538cfb98f" }, "downloads": -1, "filename": "drawSvg-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a0676c0432decb94c3cf05d4dcf9ea52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17713, "upload_time": "2019-05-16T05:10:04", "url": "https://files.pythonhosted.org/packages/07/e7/2900d2e61a2e901584131a335ee228de7a63fd6cf7c2d04ae158a76046f0/drawSvg-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "e0704cf47586d6c3f1fe877fa2f2be6b", "sha256": "66d72f59a6b464ba8e5b7eaf2d251c32131848725fb611dafdd0dd2a05741b17" }, "downloads": -1, "filename": "drawSvg-1.2.1.tar.gz", "has_sig": false, "md5_digest": "e0704cf47586d6c3f1fe877fa2f2be6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17694, "upload_time": "2019-05-16T05:16:59", "url": "https://files.pythonhosted.org/packages/f5/a8/472a78ff9973058f6f8857eeaeff116acdfe2c48d7f0249b76d30bc5781e/drawSvg-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "8c0514a463d057ca78424fd28d738cbe", "sha256": "651884c78ebffe48040cd27dd999fc7b385e8aebd1cf36e7961df64b58c5232a" }, "downloads": -1, "filename": "drawSvg-1.2.2.tar.gz", "has_sig": false, "md5_digest": "8c0514a463d057ca78424fd28d738cbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17822, "upload_time": "2019-05-21T03:13:07", "url": "https://files.pythonhosted.org/packages/ee/a1/ea85ba2b4fff65055bbd7e896dbaea1a636518ececda76492eedfecc653a/drawSvg-1.2.2.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "9c0a491d27c32137a343ae95a92dff5a", "sha256": "069b15e140f7685a0ef989ae4b925a83784566c550929a478a71efe73ec21794" }, "downloads": -1, "filename": "drawSvg-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9c0a491d27c32137a343ae95a92dff5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18461, "upload_time": "2019-09-02T21:41:11", "url": "https://files.pythonhosted.org/packages/ef/30/8112f369337bd792510b8134a6769386bcc7b7a95cd0de33b39db54132c8/drawSvg-1.3.0-py3-none-any.whl" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "c97abeca04915abd81663e96616f1df9", "sha256": "896b7ca2d861c179c06141c0ddd46a32077ac698bc62eeca349975e5ca43357d" }, "downloads": -1, "filename": "drawSvg-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c97abeca04915abd81663e96616f1df9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18826, "upload_time": "2019-10-14T22:49:13", "url": "https://files.pythonhosted.org/packages/57/9c/7a7a7b49420b970f6b729f9aeda2308b4fff5ceecfa92e65b83745f55805/drawSvg-1.3.1-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c97abeca04915abd81663e96616f1df9", "sha256": "896b7ca2d861c179c06141c0ddd46a32077ac698bc62eeca349975e5ca43357d" }, "downloads": -1, "filename": "drawSvg-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c97abeca04915abd81663e96616f1df9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18826, "upload_time": "2019-10-14T22:49:13", "url": "https://files.pythonhosted.org/packages/57/9c/7a7a7b49420b970f6b729f9aeda2308b4fff5ceecfa92e65b83745f55805/drawSvg-1.3.1-py3-none-any.whl" } ] }