What is vsketch?
vsketch is a Python generative art toolkit for plotters with the following focuses:
- Accessibility: vsketch is easy to learn and feels familiar thanks to its API strongly inspired from Processing.
- Minimized friction: vsketch automates every part of the creation process
(project initialisation, friction-less iteration, export to plotter-ready files) through a CLI tool called
and a tight integration with vpype.
- Plotter-centric: vsketch is made for plotter users, by plotter users. It’s feature set is focused on the
peculiarities of this medium and doesn’t aim to solve other problems.
- Interoperability: vsketch plays nice with popular packages such as Numpy and
Shapely, which are true enabler for plotter generative art.
vsketch is the sum of two things:
- A CLI tool named
vskto automate every part of a sketch project lifecycle::
- Sketch creation based on a customizable template.
- Interactive rendering of your sketch with live-reload and custom parameters.
- Batch export to SVG with random seed and configuration management as well as multiprocessing support.
- An easy-to-learn API similar to Processing to implement your sketches.
This project is at an early the stage and needs contributions.
You can help by providing feedback and improving the documentation.
Installing and Running the examples
The easiest way to get started is to obtain a local copy of vsketch‘s repository and run the examples:
$ git clone https://github.com/abey79/vsketch $ cd vsketch
Create a virtual environment and activate it:
$ python3 -m venv venv $ source venv/bin/activate
$ pip install .
You are read to run the examples:
$ vsk run examples/quick_draw
Additional examples may be found in the author’s personal collection of sketches.
This section is meant as a quick introduction of the workflow supported by vsketch. Check the
documentation for a more complete overview.
Open a terminal and create a new project:
$ vsk init my_project
This will create a new project structure that includes everything you need to get started:
$ ls my_project config output sketch_my_project.py
sketch_my_project.py file contains a skeleton for your sketch. The
output sub-directories are used
vsk to store configurations and output SVGs.
sketch_my_project.py in your favourite editor and modify it as follows:
import vsketch class SchotterSketch(vsketch.SketchClass): def draw(self, vsk: vsketch.SketchClass) -> None: vsk.size("a4", landscape=False) vsk.scale("cm") for j in range(22): with vsk.pushMatrix(): for i in range(12): with vsk.pushMatrix(): vsk.rotate(0.03 * vsk.random(-j, j)) vsk.translate( 0.01 * vsk.randomGaussian() * j, 0.01 * vsk.randomGaussian() * j, ) vsk.rect(0, 0, 1, 1) vsk.translate(1, 0) vsk.translate(0, 1) def finalize(self, vsk: vsketch.Vsketch) -> None: vsk.vpype("linemerge linesimplify reloop linesort") if __name__ == "__main__": SchotterSketch.display()
Your sketch is now ready to be run with the following command:
$ vsk run my_project
You should see this:
Congratulation, you just reproduced Georg Nees’ famous artwork!
Wouldn’t be nice if you could interactively interact with the script’s parameters? Let’s make this happen.
Add the following declaration at the top of the class:
class SchotterSketch(vsketch.SketchClass): columns = vsketch.Param(12) rows = vsketch.Param(22) fuzziness = vsketch.Param(1.0) # ...
draw() method as follows:
def draw(self, vsk: vsketch.Vsketch) -> None: vsk.size("a4", landscape=False) vsk.scale("cm") for j in range(self.rows): with vsk.pushMatrix(): for i in range(self.columns): with vsk.pushMatrix(): vsk.rotate(self.fuzziness * 0.03 * vsk.random(-j, j)) vsk.translate( self.fuzziness * 0.01 * vsk.randomGaussian() * j, self.fuzziness * 0.01 * vsk.randomGaussian() * j, ) vsk.rect(0, 0, 1, 1) vsk.translate(1, 0) vsk.translate(0, 1)
cmd-S to save and, lo and behold, corresponding buttons just appeared in the viewer without even needing to restart it! Here is how it looks with some more fuzziness:
Let’s play a bit with the parameters until we find a combination we like, then hit the Save button and enter a “Best config” as name.
We just saved a configuration that we can load at any time.
Finally, being extremely picky, it would be nice to be able to generate ONE HUNDRED versions of this sketch with various random seeds, in hope to find the most perfect version for plotting and framing.
vsk will do this for you, using all CPU cores available:
$ vsk save --config "Best config" --seed 0..99 my_project
You’ll find all the SVG file in the project’s
vskintegrated help to learn about the all the possibilities (
- Learn the vsketch API on the documentation’s overview and reference pages.
Part of this project’s documentation is inspired by or copied from the Processing project.