attrs#
attrs produces similar results to a dataclass, the methods are slightly
different and it enforces the class integrity more strongly than when using
a dataclass, nevertheless a lot of attribute duplication is
avoided. With Python 3.9, or newer, all the variable types are directly
accessible, otherwise import the types from typing and use a capital letter,
so any becomes typing.Any in the earlier versions.
Use the module DimLinesattr as opposed to the modules DimLinesAA or DimLinesDC. The testing programs are suffixed by _attr, so test_aa_dim.py becomes test_aa_dim_attr.py. The PIL image and drawing handles can be stored in the dataclass. Checks are made as the variables are changed, without too much additional work.
Note
Changing Variables The variables in the dataclass dc are changed just by using a construct like the following, which is like a simple class(no __init__):
im = Image.new('RGB', (80, 80), back)
dc.image = im
print(dc.back)
>>> (255,255,255)
attrs enforces the original class structure more strictly than in the dataclass, therefore any new data has to be loaded into an instance of the decorated class:
aq = atr(100,100)
print(atr.back)
>>> <member 'back' of 'atr' objects>
print(aq.back)
>>> (255,255,255)
The results for drawing using DimLinesattr are exactly the same as for DimLinesAA, the function names are similar. The major change is in the number of attributes used for each function, so taking the inner dimension as an example, call up the function with:
inner_dim_attr(ptA, ptB, text=text, arrow='both')
which in turn calls up:
dimension_attr(ptA, ptB)
....
angled_text(aq.image, at, text, angle, font=aq.font, fill=aq.fill)
as opposed to:
inner_dim(im, ptA, ptB, text=text, font=None, width=1, fill=(0,0,0),
arrowhead=(8, 10, 3), arrow='both')
which calls up:
dimension(im, ptA, ptB, width=width, fill=fill, arrowhead=arrowhead,
arrow='both')
....
angled_text(im, at, text, angle, font=font, fill=fill)
angled text is in the DimLinesPIL module, independant of attrs.
Changing data after initialisation is not easy, as any changed data has to be included with the changing data, so to change the data one must instantiate again, which means that previously changed data within the attr class reverts back to its default value, unless this is re-entered, which is not really practicable inside the DimLinesattr module.
This means that arrow is best left as a normal function attribute.
The data aall changes less frequently within the module, but stays constant within a function, it is possible therefore to have the opposite value from its own default, aall need only be called if we wish to change the angled_text behaviour. Other data will depend on the value at initialisation.
Taking advantage of attrs properties note that data input can be deferred
until after initialisation. Set the PIL handles image and draw inside
the attrs class, this means that the image width and height are
part of the class with no default values, so these are set when the class is
initialised. Once set image and draw are created from PIL Image and ImageDraw.
When initialised the data can be validated, using attr's built in validation.
attr Attributes#
Show/Hide attr Attributes similar to dataclass
dimension_attr#
- ptA
Start coordinates
- ptB
Finishing line coordinates, default None
- angle
Angle in degrees, default None
- arrow
position of the arrow on the line, which influences the direction it points, 'first', 'last' or 'both'
dims_attr#
External dimension
- ptA
Start coordinates
- ptB
Finishing line coordinates
- extA
Two integer tuple, giving the extension line size and gap next to start
- extB
Two integer tuple, giving the extension line size and gap next to end, optional if the same as extA
- text
Dimension text
- textorient
Change text orientation, “h”, “horizontal”, “v”, “vertical”
- dimsorient
confirm dimension orientation when extA and extB are unequal, “h”, “horizontal”, “v”, “vertical”
- tail
Show tails or arrows, default True
inner_dim_attr#
- ptA
Start coordinates
- ptB
Finishing line coordinates
- text
Dimension text
thickness_dim_attr#
- ptA
Start coordinates
- thick
Thickness of item
- angle
Slope of Dimension, changes text position, default horizontal 0°
- text
Dimension text
arc_dim_attr#
- centre
Arc’s circle centre
- radius
Arc’s circle radius
- begin
Starting angle, in degrees or enclosing line coordinates
- end
Ending angle, in degrees or enclosing line coordinates
- text
Dimension text
slant_dim_attr#
- ptA
Start coordinates
- ptB
Finishing coordinates, optional
- extA
Two integer tuple, giving the extension line size and gap next to start
- angle
Slope of dimension, optional
- length
Dimension length, optional
- text
Dimension text
- tail
Show tails or arrows, default True
dim_level_attr#
- at
Coordinates at left tank wall level
- diam
Tank diameter, pixels
- ldr
Inclined leader length, default 20
- dash
Tuple giving dash pattern, dash length then gap default (10, 4)
- text
Dimension text
leader_attr#
- at
Coordinates on object
- angle
Angle of first extension line, changes leader orientation, default 315°
- extA
Length inclined extension line, default 20
- extB
Length inclined extension line, default 20
- text
Dimension text