1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#!/usr/bin/env python
# coding=utf-8
#
# Copyright (C) 2013 <Public Domain>
# 2018 Martin Owens <doctormo@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
import inkex
from inkex.ports import Serial
from inkex.localization import inkex_gettext as _
import hpgl_encoder
class Plot(inkex.EffectExtension):
"""Generate a plot in HPGL output"""
def add_arguments(self, pars):
pars.add_argument("--tab")
pars.add_argument(
"--parallelPort", default="/dev/usb/lp2", help="Parallel port"
)
pars.add_argument("--serialPort", default="COM1", help="Serial port")
pars.add_argument("--serialBaudRate", default="9600", help="Serial Baud rate")
pars.add_argument("--serialByteSize", default="eight", help="Serial byte size")
pars.add_argument("--serialStopBits", default="one", help="Serial stop bits")
pars.add_argument("--serialParity", default="none", help="Serial parity")
pars.add_argument("--serialFlowControl", default="xonxoff", help="Flow control")
pars.add_argument(
"--resolutionX", type=float, default=1016.0, help="Resolution X (dpi)"
)
pars.add_argument(
"--resolutionY", type=float, default=1016.0, help="Resolution Y (dpi)"
)
pars.add_argument("--pen", type=int, default=1, help="Pen number")
pars.add_argument("--force", type=int, default=0, help="Pen force (g)")
pars.add_argument("--speed", type=int, default=0, help="Pen speed (cm/s)")
pars.add_argument("--orientation", default="0", help="Rotation (Clockwise)")
pars.add_argument(
"--mirrorX", type=inkex.Boolean, default=False, help="Mirror X axis"
)
pars.add_argument(
"--mirrorY", type=inkex.Boolean, default=False, help="Mirror Y axis"
)
pars.add_argument(
"--center", type=inkex.Boolean, default=False, help="Center zero point"
)
pars.add_argument("--overcut", type=float, default=1.0, help="Overcut (mm)")
pars.add_argument(
"--precut", type=inkex.Boolean, default=True, help="Use precut"
)
pars.add_argument("--flat", type=float, default=1.2, help="Curve flatness")
pars.add_argument(
"--autoAlign", type=inkex.Boolean, default=True, help="Auto align"
)
pars.add_argument(
"--toolOffset",
type=float,
default=0.25,
help="Tool (Knife) offset correction (mm)",
)
pars.add_argument(
"--portType",
type=self.arg_method("to"),
default=self.to_serial,
dest="to_port",
help="Port type",
)
pars.add_argument(
"--commandLanguage",
type=self.arg_method("convert"),
default=self.convert_hpgl,
dest="to_language",
help="Command Language Filter",
)
def effect(self):
# get hpgl data
encoder = hpgl_encoder.hpglEncoder(self)
try:
self.options.to_port(self.options.to_language(encoder.getHpgl()))
except hpgl_encoder.NoPathError:
raise inkex.AbortExtension(
_("No paths where found. Please convert objects to paths.")
)
def convert_hpgl(self, hpgl):
"""Convert raw HPGL to HPGL"""
init = "IN"
# if self.options.force > 0:
# init += ';FS%d' % self.options.force
# if self.options.speed > 0:
# init += ';VS%d' % self.options.speed
return init + hpgl + ";PU0,0;SP0;IN; "
def convert_dmpl(self, hpgl):
"""Convert HPGL to DMPL"""
# ;: = Initialise plotter
# H = Home position
# A = Absolute pen positioning
# Ln = Line type
# Pn = Pen select
# Vn = velocity
# ECn = Coordinate addressing, 1: 0.001 inch, 5: 0.005 inch, M: 0.1 mm
# D = Pen down
# U = Pen up
# Z = Reset plotter
# n,n, = Coordinate pair
hpgl = hpgl.replace(";", ",")
hpgl = hpgl.replace("SP", "P")
hpgl = hpgl.replace("PU", "U")
hpgl = hpgl.replace("PD", "D")
init = ";:HAL0"
if self.options.speed > 0:
init += "V%d" % self.options.speed
init += "EC1"
return init + hpgl[1:] + ",P0,U0,0,Z "
def convert_knk(self, hpgl):
"""Convert HPGL to KNK Plotter Language"""
init = "ZG"
# if self.options.force > 0:
# init += ';FS%d' % self.options.force
# if self.options.speed > 0:
# init += ';VS%d' % self.options.speed
return init + hpgl + ";SP0;PU0,0;@ "
def to_parallel(self, hpgl):
"""Output to hgpl to a parallel port"""
port = open(self.options.parallelPort, "wb")
port.write(hpgl.encode("utf8"))
port.close()
def to_serial(self, hpgl):
"""Output to hgpl to a serial port"""
with Serial(
self.options.serialPort,
baud=self.options.serialBaudRate,
stop=self.options.serialStopBits,
size=self.options.serialByteSize,
flow=self.options.serialFlowControl,
parity=self.options.serialParity,
) as comx:
comx.write(hpgl.encode("utf8"))
if __name__ == "__main__":
Plot().run()
|