# KicadModTree 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 3 of the License, or
# (at your option) any later version.
#
# KicadModTree 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 kicad-footprint-generator. If not, see < http://www.gnu.org/licenses/ >.
#
# (C) 2016 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
from KicadModTree.Vector import *
from KicadModTree.nodes.Node import Node
from .PolygoneLine import PolygoneLine
[docs]class RectLine(PolygoneLine):
r"""Add a Rect to the render tree
:param \**kwargs:
See below
:Keyword Arguments:
* *start* (``Vector2D``) --
start edge of the rect
* *end* (``Vector2D``) --
end edge of the rect
* *layer* (``str``) --
layer on which the rect is drawn
* *width* (``float``) --
width of the outer line (default: None, which means auto detection)
* *offset* (``Vector2D``, ``float``) --
offset of the rect line to the specified one
:Example:
>>> from KicadModTree import *
>>> RectLine(start=[-3, -2], end=[3, 2], layer='F.SilkS')
"""
def __init__(self, **kwargs):
self.start_pos = Vector2D(kwargs['start'])
self.end_pos = Vector2D(kwargs['end'])
# If specifed, an 'offset' can be applied to the RectLine.
# For example, creating a border around a given Rect of a specified size
if kwargs.get('offset'):
# offset for the rect line
# e.g. for creating a rectLine 0.5mm LARGER than the given rect, or similar
offset = [0, 0]
# Has an offset / inset been specified?
if type(kwargs['offset']) in [int, float]:
offset[0] = offset[1] = kwargs['offset']
elif type(kwargs['offset']) in [list, tuple] and len(kwargs['offset']) == 2:
# Ensure that all offset params are numerical
if all([type(i) in [int, float] for i in kwargs['offset']]):
offset = kwargs['offset']
# For the offset to work properly, start-pos must be top-left, and end-pos must be bottom-right
x1 = min(self.start_pos.x, self.end_pos.x)
x2 = max(self.start_pos.x, self.end_pos.x)
y1 = min(self.start_pos.y, self.end_pos.y)
y2 = max(self.start_pos.y, self.end_pos.y)
# Put the offset back in
self.start_pos.x = x1 - offset[0]
self.start_pos.y = y1 - offset[1]
self.end_pos.x = x2 + offset[0]
self.end_pos.y = y2 + offset[1]
polygone_line = [{'x': self.start_pos.x, 'y': self.start_pos.y},
{'x': self.start_pos.x, 'y': self.end_pos.y},
{'x': self.end_pos.x, 'y': self.end_pos.y},
{'x': self.end_pos.x, 'y': self.start_pos.y},
{'x': self.start_pos.x, 'y': self.start_pos.y}]
PolygoneLine.__init__(self, polygone=polygone_line, layer=kwargs['layer'], width=kwargs.get('width'))
def _getRenderTreeText(self):
render_text = Node._getRenderTreeText(self)
render_text += " [start: [x: {sx}, y: {sy}] end: [x: {ex}, y: {ey}]]".format(sx=self.start_pos.x,
sy=self.start_pos.y,
ex=self.end_pos.x,
ey=self.end_pos.y)
return render_text