Files
brother_ql/brother_ql/labels.py
T

110 lines
5.5 KiB
Python

from attr import attrs, attrib
from typing import List, Tuple
from enum import IntEnum
import copy
from brother_ql.helpers import ElementsManager
class FormFactor(IntEnum):
"""
Enumeration representing the form factor of a label.
The labels for the Brother QL series are supplied either as die-cut (pre-sized), or for more flexibility the
continuous label tapes offer the ability to vary the label length.
"""
#: rectangular die-cut labels
DIE_CUT = 1
#: endless (continouse) labels
ENDLESS = 2
#: round die-cut labels
ROUND_DIE_CUT = 3
class Color(IntEnum):
"""
Enumeration representing the colors to be printed on a label. Most labels only support printing black on white.
Some newer ones can also print in black and red on white.
"""
#: The label can be printed in black & white.
BLACK_WHITE = 0
#: The label can be printed in black, white & red.
BLACK_RED_WHITE = 1
@attrs
class Label(object):
"""
This class represents a label. All specifics of a certain label
and what the rasterizer needs to take care of depending on the
label choosen, should be contained in this class.
"""
#: A string identifier given to each label that can be selected. Eg. '29'.
identifier = attrib(type=str)
#: The tape size of a single label (width, lenght) in mm. For endless labels, the length is 0 by definition.
tape_size = attrib(type=Tuple[int, int])
#: The type of label
form_factor = attrib(type=FormFactor)
#: The total area (width, length) of the label in dots (@300dpi).
dots_total = attrib(type=Tuple[int, int])
#: The printable area (width, length) of the label in dots (@300dpi).
dots_printable = attrib(type=Tuple[int, int])
#: The required offset from the right side of the label in dots to obtain a centered printout.
offset_r = attrib(type=int)
#: An additional amount of feeding when printing the label.
#: This is non-zero for some smaller label sizes and for endless labels.
feed_margin = attrib(type=int, default=0)
#: If a label can only be printed with certain label printers, this member variable lists the allowed ones.
#: Otherwise it's an empty list.
restricted_to_models = attrib(type=List[str], factory=list)
#: Some labels allow printing in red, most don't.
color = attrib(type=Color, default=Color.BLACK_WHITE)
def works_with_model(self, model): # type: bool
"""
Method to determine if certain label can be printed by the specified printer model.
"""
if self.restricted_to_models and model not in models: return False
else: return True
@property
def name(self): # type: str
out = ""
if 'x' in self.identifier:
out = '{0}mm x {1}mm die-cut'.format(*self.tape_size)
elif self.identifier.startswith('d'):
out = '{0}mm round die-cut'.format(self.tape_size[0])
else:
out = '{0}mm endless'.format(self.tape_size[0])
if self.color == Color.BLACK_RED_WHITE:
out += ' (black/red/white)'
return out
ALL_LABELS = (
Label("12", ( 12, 0), FormFactor.ENDLESS, ( 142, 0), ( 106, 0), 29 , feed_margin=35),
Label("29", ( 29, 0), FormFactor.ENDLESS, ( 342, 0), ( 306, 0), 6 , feed_margin=35),
Label("38", ( 38, 0), FormFactor.ENDLESS, ( 449, 0), ( 413, 0), 12 , feed_margin=35),
Label("50", ( 50, 0), FormFactor.ENDLESS, ( 590, 0), ( 554, 0), 12 , feed_margin=35),
Label("54", ( 54, 0), FormFactor.ENDLESS, ( 636, 0), ( 590, 0), 0 , feed_margin=35),
Label("62", ( 62, 0), FormFactor.ENDLESS, ( 732, 0), ( 696, 0), 12 , feed_margin=35),
Label("62red", ( 62, 0), FormFactor.ENDLESS, ( 732, 0), ( 696, 0), 12 , feed_margin=35, color=Color.BLACK_RED_WHITE),
Label("102", (102, 0), FormFactor.ENDLESS, (1200, 0), (1164, 0), 12 , feed_margin=35, restricted_to_models=['QL-1050', 'QL-1060N']),
Label("17x54", ( 17, 54), FormFactor.DIE_CUT, ( 201, 636), ( 165, 566), 0 ),
Label("17x87", ( 17, 87), FormFactor.DIE_CUT, ( 201, 1026), ( 165, 956), 0 ),
Label("23x23", ( 23, 23), FormFactor.DIE_CUT, ( 272, 272), ( 202, 202), 42 ),
Label("29x42", ( 29, 42), FormFactor.DIE_CUT, ( 342, 495), ( 306, 425), 6 ),
Label("29x90", ( 29, 90), FormFactor.DIE_CUT, ( 342, 1061), ( 306, 991), 6 ),
Label("39x90", ( 38, 90), FormFactor.DIE_CUT, ( 449, 1061), ( 413, 991), 12 ),
Label("39x48", ( 39, 48), FormFactor.DIE_CUT, ( 461, 565), ( 425, 495), 6 ),
Label("52x29", ( 52, 29), FormFactor.DIE_CUT, ( 614, 341), ( 578, 271), 0 ),
Label("62x29", ( 62, 29), FormFactor.DIE_CUT, ( 732, 341), ( 696, 271), 12 ),
Label("62x100", ( 62, 100), FormFactor.DIE_CUT, ( 732, 1179), ( 696, 1109), 12 ),
Label("102x51", (102, 51), FormFactor.DIE_CUT, (1200, 596), (1164, 526), 12 , restricted_to_models=['QL-1050', 'QL-1060N']),
Label("102x152",(102, 153), FormFactor.DIE_CUT, (1200, 1804), (1164, 1660), 12 , restricted_to_models=['QL-1050', 'QL-1060N']),
Label("d12", ( 12, 12), FormFactor.ROUND_DIE_CUT, ( 142, 142), ( 94, 94), 113 , feed_margin=35),
Label("d24", ( 24, 24), FormFactor.ROUND_DIE_CUT, ( 284, 284), ( 236, 236), 42 ),
Label("d58", ( 58, 58), FormFactor.ROUND_DIE_CUT, ( 688, 688), ( 618, 618), 51 ),
)
class LabelsManager(ElementsManager):
DEFAULT_ELEMENTS = copy.copy(ALL_LABELS)
ELEMENT_NAME = "label"