=========
Dataclass
=========
If you have Python 3.6 or newer take advantage of dataclasses, it
reduces the number of attributes that need to be applied from a top
level function down to those within the module. The dataclass is accessible
to all those modules within its own directory without any module linking
necessary. 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** is **typing.Any** in the earlier versions.
Use the module DimLinesDC as opposed to the module DimLinesAA. The
testing programs are suffixed by **_dc**, so test_aa_dim.py becomes
test_aa_dim_dc.py. Even the PIL image and drawing handles can be created and
stored in the dataclass.
.. note:: **Changing Variables**
The variables in the dataclass dc are easily changed just by using a
construct like the following::
im = Image.new('RGB', (80, 80), back)
dc.image = im
The main problem is when an immediate check on variables is
required, ``def __post_init__(self)`` checks the dataclass only when
all the variables are updated together and not for each individual entry.
The results for drawing using DimLinesDC as opposed to DimLinesAA are
exactly the same, the names of the functions 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_dc(ptA, ptB, text=text)
which in turn called up::
dimension_dc(ptA, ptB)
....
angled_text(dc.image, at, text, angle, font=dc.font, fill=dc.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 module DimLinesPIL, not yet tied into the dataclass.
When there is an attribute that changes occassionally the parent function
changes the dataclass, calls the child function then resets the dataclass,
as done in the leader_dc function::
....
dc.arrow = 'first'
dimension_dc(at, ptB)
dc.arrow = 'both'
....
Normally PIL programs
require to know the handle for PIL.Image and the handle for PIL.ImageDraw.
The handle for PIL.Image (image) which needs the image size (height and
width) and the background colour (back). In turn the handle for PIL.ImageDraw
(image) needs the handle for PIL.Image. When initialising an instance of the
dataclass provide the image size and the rest happens automatically. If one
or more default values is unsuitable change it here by adding the data name
equal to its new default value. The instance ``d`` is only used for
initialisation, otherwise work directly with the the dataclass as shown above.
In the module DimLinesDC find the
dataclass **dc**, just after its definition find the lines::
######################################
# Change dc initialisation values here
wi = 200 # image width
hi = 200 # image height
d = dc(wi, hi)
######################################
alter the values 200 to those required, add any changes to the defaults as
needed::
######################################
# Change dc initialisation values here
wi = 160 # image width
hi = 100 # image height
d = dc(wi, hi, back=(0,0,0)
######################################
remember to save, then in the calling program ensure
that the DimLinesDC module imports ``dc``::
from DimLinesDC import ..., dc, ...
Dimension Scripts used in DimLinesDC
=====================================
.. raw:: html
Show/Hide Dataclass Attributes similar to antialias
dimension_dc
------------
* ptA
Start coordinates
* ptB
Finishing line coordinates, default None
* angle
Angle in degrees, default None
dims_dc
-------
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_dc
------------
* ptA
Start coordinates
* ptB
Finishing line coordinates
* text
Dimension text
thickness_dim_dc
----------------
* ptA
Start coordinates
* thick
Thickness of item
* angle
Slope of Dimension, changes text position, default horizontal 0°
* text
Dimension text
arc_dim_dc
----------
* 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_dc
------------
* 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_dc
------------
* 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_dc
---------
* 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
.. raw:: html
|
Auxiliary DC Functions
======================
These will be similar to the functions found in the antialiased dimensions
except that the number of attributes have been reduced. The naming is also
similar, just that the suffix is changed.
.. raw:: html
Show/Hide Dataclass Auxiliary Functions similar to antialias
DashedLineDC
------------
* pta
Starting point of line
* ptb
Finishing point of line
* dash
Size of dash and gaps, default (5,5)
* adjust
Alter dash and gap size relative to slope, default False
WideLineDC
----------
* pta
Starting point of line
* ptb
Finishing point of line
* width
width in pixels, default 1
LineDC
------
Always 1 pixel wide
* pta
Starting point of line
* ptb
Finishing point of line
polyDC
------
Filled antialiased polygon default
* xy
List of point tuples
* outline
rgb tuple if an unfilled polygon is required
make_arc_dc
-----------
* centre
Arc circle centre
* radius
Arc circle radius
* start
Arc starting angle, degrees
* finish
Arc finishing angle, degrees
.. raw:: html