A Node.js library to communicate with HPGL-compatible devices such as plotters and printers.
npm install hpgl


The hpgl library makes it possible to interact with plotters that support the *Hewlett-Packard
Graphics Language (a.k.a. hpgl). This language is the de facto* standard for most plotters.
**Warning: This library is still in early stages of development. It should not be used in
production.**
This library relies on external modules for serial communication. To use it in a pure Node.js,
environment, you will need to install and use the
serialport module. If you want to use this library
inside Chrome Apps or NW.js
applications, you will need to install the browser-serialport
module instead (version 2.1.0 or greater).
> *Note: it is possible to use node-serialport within NW.js and Electron projects but it needs to
> be specifically recompiled for those environment.*
So far, the library has only beed tested with HP 7475A
and HP 7440A plotters. If you have success with other
makes or models, let me know. Beware that some HP plotters are only
equipped with a proprietary HPIB or GPIB interface. To use this library, your plotter must have a
serial interface (RS-232-C).
The plotting coordinate system is anchored in the top-left corner, just like a computer screen.
This means positive x goes right and positive y goes down. By default, plotters usually work
differently, but I find it easier to stick with the computer screen standard.
To get started, you will need a few pieces of hardware:
- HPGL-compatible plotter with a serial interface;
- USB-to-Serial adapter (unless your computer has a serial port);
- Male DB-25 to female DB-9 cable (a.k.a. null modem cable);
- Pens that fit your plotter;
- Paper.
Your plotter needs to be set to a line speed of 9600 baud with
8-N-1 settings. Chances are high this is already the case. If
not, you may need to adjust some dip switches on your device. Refer to the manufacturers's
documentation.
The first thing you need to do to get plotting is instantiate the object used for serial
communication. If you are working on a Node.js project using the serialport module, this is how
you would do it:
``javascript
// Import the 'serialport' module and instantiate it. Do not forget to set 'autoOpen' to false in
// the options.
const SerialPort = require("serialport");
var transport = new SerialPort("/dev/tty.usbserial", {autoOpen: false});
`
If you are working on a Chrome or NW.js application, the procedure is slightly different:
`javascript`
// Import the 'browser-serialport' module and instantiate it. Pass 'false' as the third parameter of
// the SerialPort constructor so no automatic connection attempt is made.
const SerialPort = require("browser-serialport").SerialPort;
var transport = new SerialPort("/dev/tty.usbserial", {}, false);
Once the transport variable is ready, the remainining of the code is exactly the same no matter
which transport you use. For example, here is the code necessary to draw "Hello, World!".
`javascript
// Import the 'Plotter' class and instantiate it
const Plotter = require("hpgl").Plotter;
var plotter = new Plotter();
// Connect the device and add a callback to draw some text.
plotter.connect(transport, {}, function(error) {
if (error) {
console.log(error);
return;
}
this
.moveTo(1, 1)
.drawText("Hello, World!");
});
`
As you can see above, you first need to create a Plotter object and call its connect() method transport
passing in the variable, some optionnal settings and a function to trigger once the this
device is ready. Note that is bound to the Plotter` object and that plotting methods are
chainable.
This library can be used to connect several plotters to the same host. However, not all
USB-to-Serial chipsets support this.
For example, the Prolific 2303 driver crashes my computer when I try use more than one adapter. On
the other hand, the Texas Instrument/TI driver works beautifully with multiple devices.
I will try to maintain an up-to-date API documentation. A good
place to start is the Plotter class. If you find
errors, please file an issue on GitHub.
If you find this library useful, you can buy me a drink as a
token of your appreciation. This would automatically make you even more awesome than you already
are!

Cheers!