Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
vpype is the Swiss-Army-knife command-line tool for plotter vector graphics.
vpype is the Swiss-Army-knife command-line tool for plotter vector graphics. Here is what it can do:
vpype is highly extensible through plug-ins that can greatly extend its capabilities. For example, plug-ins already exists for plotting pixel art, half-toning with hatches, and much more. See below for a list of existing plug-ins.
vpype is also a well documented Python library useful to create generative art and tools for plotters. It includes data structures, utility and I/O functions, as well as a hardware-accelerated flexible viewer for vector graphics. For example, the plotter generative art environment vsketch is built upon vpype.
Check the documentation for a more thorough introduction to vpype.
vpype works by building so-called pipelines of commands, where each command's output is fed to the next command's input.
Some commands load geometries into the pipeline (e.g. the read
command which loads geometries from a SVG file). Other commands modify these geometries, e.g. by cropping
them (crop
) or reordering them to minimize pen-up
travels (linesort
). Finally, some other commands
just read the geometries in the pipeline for display purposes (show
)
or output to file (write
).
Pipeline are defined using the vpype's CLI (command-line interface) in a terminal by typing vpype
followed by the
list of commands, each with their optional parameters and their arguments:
This pipeline uses five commands (in bold):
read
loads geometries from a SVG file.linemerge
merges paths whose extremities are close to each other (within the provided tolerance).linesort
reorder paths such as to minimise the pen-up travel.crop
, well, crops.write
export the resulting geometries to a SVG file.There are many more commands available in vpype, see the overview below.
Some commands have arguments, which are always required (in italic). For example, a file path must be provided to the
read
command and dimensions must be provided to the crop
commands. A command may also have options which are, well,
optional. In this example, --page-size a4
means that the write
command will generate a A4-sized SVG (otherwise it
would have the same size as in.svg). Likewise, because --center
is used, the write
command will center geometries
on the page before saving the SVG (otherwise the geometries would have been left at their original location).
Note: The following examples are laid out over multiple lines using end-of-line escaping (\
). This is done to highlight the various commands of which the pipeline is made and would typically not be done in real-world use.
Load an SVG file, scale it to a specific size, and export it centered on an A4-sized, ready-to-plot SVG file:
$ vpype \
read input.svg \
layout --fit-to-margins 2cm a4 \
write output.svg
Optimize paths to reduce plotting time (merge connected lines, sort them to minimize pen-up distance, randomize closed paths' seam, and reduce the number of nodes):
$ vpype \
read input.svg \
linemerge --tolerance 0.1mm \
linesort \
reloop \
linesimplify \
write output.svg
Load a SVG and display it in vpype's viewer, which enable close inspection of the layer and path structure):
$ vpype \
read input.svg \
show
Load several SVG files and save them as a single, multi-layer SVG file (e.g. for multicolored drawings):
$ vpype \
forfile "*.svg" \
read --layer %_i% %_path% \
end \
write output.svg
Export a SVG to HPGL for vintage plotters:
$ vpype \
read input.svg \
layout --fit-to-margins 2cm --landscape a4 \
write --device hp7475a output.hpgl
Draw the layer name on a SVG (this example uses property substitution):
$ vpype \
read input.svg \
text --layer 1 "{vp_name}" \
write output.svg
Merge multiple SVG files in a grid layout (this example uses expression substitution):
$ vpype \
eval "files=glob('*.svg')" \
eval "cols=3; rows=ceil(len(files)/cols)" \
grid -o 10cm 10cm "%cols%" "%rows%" \
read --no-fail "%files[_i] if _i < len(files) else ''%" \
layout -m 0.5cm 10x10cm \
end \
write combined_on_a_grid.svg
An interactive version of the previous example is available in examples/grid.vpy
. It makes use of input()
expressions to ask parameters from the user:
$ vpype -I examples/grid.vpy
Files [*.svg]?
Number of columns [3]? 4
Column width [10cm]?
Row height [10cm]? 15cm
Margin [0.5cm]?
Output path [output.svg]?
Split a SVG into one file per layer:
$ vpype \
read input.svg \
forlayer \
write "output_%_name or _lid%.svg" \
end
More examples and recipes are available in the cookbook.
vpype caters to plotter generative art and does not aim to be a general purpose (think Illustrator/InkScape) vector graphic tools. One of the main reason for this is the fact vpype converts everything curvy (circles, bezier curves, etc.) to lines made of small segments. vpype does import metadata such stroke and fill color, stroke width, etc., it only makes partial use of them and does not aim to maintain a full consistency with the SVG specification. These design choices make vpype's rich feature set possible, but limits its use for, e.g., printed media.
Detailed installation instructions are available in the latest documentation.
TL;DR:
pipx install "vpype[all]"
pipx install vpype
This version does not include the show
command but does not require some of the dependencies which are more difficult or impossible to install on some platforms (such as matplotlib, PySide6, and ModernGL).The vpype CLI includes its own, detailed documentation:
vpype --help # general help and command list
vpype COMMAND --help # help for a specific command
In addition, the online documentation provides extensive background information on the fundamentals behind vpype, a cookbook covering most common tasks, the vpype API documentation, and much more.
vpype --help
and vpype COMMAND --help
) and support for arbitrary units (e.g. vpype read input.svg translate 3cm 2in
).vpype COMMANDNAME --layer 1,3
) and optionally-probabilistic layer edition commands (lmove
, lcopy
, ldelete
, lswap
, lreverse
).perlayer
).show
).stat
).vpype -H [...]
)vpype -s 37 [...]
).read
).write
).forfile
).layout
).pagerotate
).scale
, translate
, skew
, rotate
).scaleto
, crop
).trim
).pagesize
).color
, alpha
, penwidth
, name
).pens
).propset
, propget
, proplist
, propdel
, propclear
).linemerge
).linesort
).linesimplify
).reloop
).multipass
).filter
).squiggles
)splitall
).reverse
).splitdist
)line
, rect
, circle
, ellipse
, arc
).text
)grid
).frame
).random
)First-class support for plug-in extensions (e.g vpype-text, hatched, occult).
Support for script-based generation (script
).
Powerful and well-documented API for plug-ins and other plotter generative art projects.
Here is a list of known vpype plug-ins (please make a pull request if yours is missing):
vsketch: vsketch is complete framework for plotter generative artists implemented using vpype's API
vpype-perspective: put your art in perspective
vpype-pixelart: plot pixel art
hatched: half-toning with hatches
vpype-flow-imager: convert images to flow-line-based designs
occult: perform hidden line removal
deduplicate: remove duplicate lines
vpype-explorations: my personal grab bag of experiments and utilities
vpype-gcode: flexible export command for gcode and other text-based format
vpype-dxf: read dxf files
vpype-embroidery: various embroidery-related utilities, including read from/write to most embroidery formats
vpype-vectrace: create outlines from images with vector tracing
vpype-ttf: create text outlines using TTF fonts
Contributions to this project are welcome and do not necessarily require software development skills! Check the Contributing section of the documentation for more information.
This project is licensed under the MIT License - see the LICENSE file for details.
FAQs
The Swiss Army knife of vector graphics for pen plotters
We found that vpype demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.