Fix typos and docstrings

This commit is contained in:
Rotzbua 2023-01-02 00:32:42 +01:00 committed by Florian Festi
parent d2d2d15de3
commit 5fae61bd0d
48 changed files with 165 additions and 235 deletions

View File

@ -46,16 +46,15 @@ def dist(dx, dy):
Return distance
:param dx: delta x
:param dy: delat y
:param dy: delay y
"""
return (dx * dx + dy * dy) ** 0.5
def restore(func):
"""
Wrapper: Restore coordiantes after function
Wrapper: Restore coordinates after function
:param func: function to wrap
"""
@wraps(func)
@ -73,7 +72,6 @@ def holeCol(func):
Wrapper: color holes differently
:param func: function to wrap
"""
@wraps(func)
@ -150,7 +148,6 @@ def argparseSections(s):
Parse sections parameter
:param s: string to parse
"""
result = []
@ -280,7 +277,7 @@ Values:
##############################################################################
class Boxes:
"""Main class -- Generator should sub class this """
"""Main class -- Generator should subclass this """
webinterface = True
ui_group = "Misc"
@ -405,8 +402,8 @@ class Boxes:
"""
Add commonly used arguments
:param \*l: parameter names
:param \*\*kw: parameters with new default values
:param l: parameter names
:param kw: parameters with new default values
Supported parameters are
@ -509,7 +506,6 @@ class Boxes:
Parse command line parameters
:param args: (Default value = None) parameters, None for using sys.argv
"""
if args is None:
args = sys.argv[1:]
@ -543,7 +539,6 @@ class Boxes:
:param part: Callable
:param name: (Default value = None) attribute name (__name__ as default)
"""
if name is None:
name = part.__class__.__name__
@ -559,7 +554,7 @@ class Boxes:
self.addPart(part)
def _buildObjects(self):
"""Add default edges and parts """
"""Add default edges and parts"""
self.edges = {}
self.addPart(edges.Edge(self, None))
self.addPart(edges.OutSetEdge(self, None))
@ -652,9 +647,10 @@ class Boxes:
return l - walls
def render(self):
"""Implement this method in your sub class.
"""Implement this method in your subclass.
You will typically need to call .parseArgs() before calling this one"""
You will typically need to call .parseArgs() before calling this one
"""
self.open()
# Change settings and create new Edges and part classes here
raise NotImplementedError
@ -667,7 +663,6 @@ class Boxes:
:param number: number of the callback
:param x: (Default value = 0.0) x position to be call on
:param y: (Default value = None) y position to be called on (default does burn correction)
"""
if y is None:
y = self.burn
@ -694,7 +689,6 @@ class Boxes:
:param param: list or item
:param idx: index in list
"""
if isinstance(param, list):
if len(param) > idx:
@ -740,7 +734,6 @@ class Boxes:
:param degrees: angle
:param radius: (Default value = 0)
"""
try:
@ -798,7 +791,6 @@ class Boxes:
"""
Simple line
:param length: length in mm
"""
self.ctx.move_to(0, 0)
if tabs and self.tabs:
@ -823,7 +815,7 @@ class Boxes:
def step(self, out):
"""
Create a parallel step prependicular to the current direction
Create a parallel step perpendicular to the current direction
Positive values move to the outside of the part
"""
if out > 1E-5:
@ -844,7 +836,6 @@ class Boxes:
:param y2:
:param x3:
:param y3:
"""
self.ctx.curve_to(x1, y1, x2, y2, x3, y3)
dx = x3 - x2
@ -856,7 +847,7 @@ class Boxes:
"""
Draw multiple connected lines
:param \*args: Alternating length in mm and angle in degrees.
:param args: Alternating length in mm and angle in degrees.
lengths may be a tuple (length, #tabs)
angles may be tuple (angle, radius)
@ -878,8 +869,7 @@ class Boxes:
Draw an edge with slot for a bed bolt
:param length: length of the edge in mm
:param bedBoltSettings: (Default value = None) Dimmensions of the slot
:param bedBoltSettings: (Default value = None) Dimensions of the slot
"""
d, d_nut, h_nut, l, l1 = bedBoltSettings or self.bedBoltSettings
self.edge((length - d) / 2.0, tabs=tabs//2)
@ -953,7 +943,7 @@ class Boxes:
"""Create regular polygon as a wall
:param corners: number of corners of the polygon
:param radius: distance center to one of the corners
:param r: radius distance center to one of the corners
:param h: distance center to one of the sides (height of sector)
:param side: length of one side
:param edges: (Default value = "e", may be string/list of length corners)
@ -1002,11 +992,10 @@ class Boxes:
self.move(tw, th, move)
def grip(self, length, depth):
"""Corrugated edge useful as an gipping area
"""Corrugated edge useful as a gipping area
:param length: length
:param depth: depth of the grooves
"""
grooves = max(int(length // (depth * 2.0)) + 1, 1)
depth = length / grooves / 4.0
@ -1017,9 +1006,7 @@ class Boxes:
def _latchHole(self, length):
"""
:param length:
"""
self.edge(1.1 * self.thickness)
self.corner(-90)
@ -1029,9 +1016,7 @@ class Boxes:
def _latchGrip(self, length):
"""
:param length:
"""
self.corner(90, self.thickness / 4.0)
self.grip(length / 2.0 - self.thickness / 2.0 - 0.2 * self.thickness, self.thickness / 2.0)
@ -1043,7 +1028,6 @@ class Boxes:
:param length: length in mm
:param positive: (Default value = True) False: Door side; True: Box side
:param reverse: (Default value = False) True when running away from the latch
"""
if positive:
if reverse:
@ -1075,7 +1059,6 @@ class Boxes:
:param h: height in mm
:param hl: height if th grip hole
:param r: (Default value = 30) radius of the corners
"""
d = (x - hl - 2 * r) / 2.0
@ -1108,7 +1091,6 @@ class Boxes:
:param x:
:param y: (Default value = 0.0)
:param degrees: (Default value = 0)
"""
self.ctx.move_to(0, 0)
self.ctx.translate(x, y)
@ -1137,7 +1119,6 @@ class Boxes:
Set coordinate system to current position (end point)
:param angle: (Default value = 0) heading
"""
self.ctx.translate(*self.ctx.get_current_point())
self.ctx.rotate(angle)
@ -1147,16 +1128,15 @@ class Boxes:
where can be combinations of "up" or "down", "left" or "right", "only",
"mirror" and "rotated"
when "only" is included the move is only done when before is True
"mirror" will flip the part along the y axis
"mirror" will flip the part along the y-axis
"rotated" draws the parts rotated 90 counter clockwise
The function returns whether actual drawing of the part
should be ommited.
should be omitted.
:param x: width of part
:param y: height of part
:param where: which direction to move
:param before: (Default value = False) called before or after part being drawn
"""
if not where:
where = ""
@ -1221,9 +1201,8 @@ class Boxes:
Draw a round disc
:param x: position
:param y: postion
:param y: position
:param r: radius
"""
r += self.burn
self.moveTo(x + r, y)
@ -1242,11 +1221,10 @@ class Boxes:
Draw a hole in shape of an n-edged regular polygon
:param x: position
:param y: postion
:param y: position
:param r: radius
:param n: number of edges
:param a: rotation angle
"""
if not r:
@ -1287,9 +1265,8 @@ class Boxes:
Draw a round hole
:param x: position
:param y: postion
:param y: position
:param r: radius
"""
if not r:
@ -1313,7 +1290,6 @@ class Boxes:
:param r: (Default value = 0) radius of the corners
:param center_x: (Default value = True) if True, x position is the center, else the start
:param center_y: (Default value = True) if True, y position is the center, else the start
"""
r = min(r, dx/2., dy/2.)
x_start = x if center_x else x + dx / 2.0
@ -1336,8 +1312,7 @@ class Boxes:
:param d: diameter
:param w: width measured against flat side in mm
:param rel_w: width in percent
:param angle: orentation (rotation) of the flat side
:param angle: orientation (rotation) of the flat side
"""
if r is None:
@ -1370,7 +1345,6 @@ class Boxes:
:param w: width measured against flat side in mm
:param rel_w: width in percent
:param angle: orientation (rotation) of the flat sides
"""
if r is None:
@ -1401,11 +1375,10 @@ class Boxes:
Draw a pear shaped mounting hole for sliding over a screw head. Total height = 1.5* d_shaft + d_head
:param x: position
:param y: postion
:param y: position
:param d_shaft: diameter of the screw shaft
:param d_head: diameter of the screw head
:param angle: rotation angle of the hole
"""
if d_shaft < (2 * self.burn):
@ -1438,7 +1411,6 @@ class Boxes:
:param y: (Default value = 0)
:param angle: (Default value = 0)
:param align: (Default value = "") string with combinations of (top|middle|bottom) and (left|center|right) separated by a space
"""
self.moveTo(x, y, angle)
text = text.split("\n")
@ -1537,7 +1509,7 @@ class Boxes:
:param x: (Default value = 0)
:param y: (Default value = 0)
:param angle: (Default value = 0)
:param screwholes:
"""
width, flange, holedistance, diameter = self.nema_sizes[size]
if screwholes:
@ -1558,7 +1530,7 @@ class Boxes:
draw border polygon (for debugging only)
:param border: array with coordinate [(x0,y0), (x1,y1),...] of the border polygon
:param color:
"""
self.set_source_color(color)
self.ctx.save()
@ -1591,7 +1563,6 @@ class Boxes:
:param style: defines hole style - currently one of "round", "triangle", "square", "hexagon" or "octagon"
:param bar_length: maximum bar length
:param max_random: maximum number of random holes
"""
if pattern not in ["random", "hex", "square", "hbar", "vbar"]:
return
@ -1769,7 +1740,7 @@ class Boxes:
# and process line
while not xw > x_end:
# are we in inner polygone already?
# are we in inner polygon already?
if (len(inner_line_split) > inner_line_index and
xw > inner_line_split.geoms[inner_line_index].bounds[0]):
# place inner, full size polygons
@ -1828,7 +1799,7 @@ class Boxes:
segment_max = 0
segment_toggle ^= 1
# create line from left to right and cut according to shrinked polygon
# create line from left to right and cut according to shrunk polygon
line_complete = LineString([(min_x - 1, y), (max_x + 1, y)])
line_split = split(line_complete, cutPoly)
@ -1927,8 +1898,6 @@ class Boxes:
:param settings: (Default value = None)
:param skip: (Default value = None) function to check if hole should be present
gets x, y, r, b, posx, posy
"""
if settings is None:
@ -1966,7 +1935,6 @@ class Boxes:
:param d: diameter of the circle
:param settings: (Default value = None)
"""
d2 = d / 2.0
self.hexHolesRectangle(d, d, settings=settings, skip=self.__skipcircle)
@ -1979,19 +1947,16 @@ class Boxes:
:param y: height
:param rc: radius of the corners
:param settings: (Default value = None)
"""
def skip(x, y, r, b, posx, posy):
"""
:param x:
:param y:
:param r:
:param b:
:param posx:
:param posy:
"""
posx = abs(posx - (x / 2.0))
posy = abs(posy - (y / 2.0))
@ -2012,7 +1977,6 @@ class Boxes:
:param h: height
:param settings: (Default value = None)
:param grow: (Default value = None)
"""
if settings is None:
settings = self.hexHolesSettings
@ -2027,7 +1991,7 @@ class Boxes:
if grow == 'space ':
b += leftover / (cy - 1) / 2
# recalulate with adjusted values
# recalculate with adjusted values
w = r + b / 2.0
dist = w * math.cos(math.pi / 6.0)
@ -2087,7 +2051,7 @@ class Boxes:
:param x: x position of the center
:param y: y position of the center
:param angle: angle in which the rectangle is placed
:param outside: meassure size from the outside of the walls - not the inside
:param outside: measure size from the outside of the walls - not the inside
"""
self.moveTo(x, y, angle)
d = 0.5*self.thickness
@ -2128,6 +2092,7 @@ class Boxes:
:param x: width
:param y: height
:param r: radius of the corners
:param edge:
:param callback: (Default value = None)
:param holesMargin: (Default value = None) set to get hex holes
:param holesSettings: (Default value = None)
@ -2136,7 +2101,6 @@ class Boxes:
:param wallpieces: (Default value = 1) # of separate surrounding walls
:param extend_corners: (Default value = True) have corners outset with the edges
:param move: (Default value = None)
"""
corner_holes = True
@ -2245,7 +2209,7 @@ class Boxes:
callback=None,
move=None):
"""
Wall(s) with flex fiting around a roundedPlate()
Wall(s) with flex filing around a roundedPlate()
For the callbacks the sides are counted depending on pieces
@ -2260,7 +2224,6 @@ class Boxes:
:param pieces: (Default value = 1) number of separate pieces
:param callback: (Default value = None)
:param move: (Default value = None)
"""
t = self.thickness
c4 = (r + self.burn) * math.pi * 0.5 # circumference of quarter circle
@ -2364,7 +2327,6 @@ class Boxes:
:param callback: (Default value = None)
:param move: (Default value = None)
:param label: rendered to identify parts, it is not ment to be cut or etched (Default value = "")
"""
if len(edges) != 4:
raise ValueError("four edges required")
@ -2472,7 +2434,7 @@ class Boxes:
:param x: width
:param y: height
:param edges: (Default value = "eee") bottom, right[, diagonal]
:param r: radius towards the hypothenuse
:param r: radius towards the hypotenuse
:param num: (Default value = 1) number of triangles
:param bedBolts: (Default value = None)
:param bedBoltSettings: (Default value = None)
@ -2702,12 +2664,11 @@ class Boxes:
Polygon wall for all kind of multi-edged objects
:param borders: array of distance and angles to draw
:param edge: (Default value = "f") Edges to apply. If the array of borders contains more segments that edges, the edge will wrap. Only edge types without start and end width suppported for now.
:param edge: (Default value = "f") Edges to apply. If the array of borders contains more segments that edges, the edge will wrap. Only edge types without start and end width supported for now.
:param turtle: (Default value = False)
:param callback: (Default value = None)
:param move: (Default value = None)
:param label: rendered to identify parts, it is not ment to be cut or etched (Default value = "")
"""
try:
edges = [self.edges.get(e, e) for e in edge]
@ -2836,10 +2797,10 @@ class Boxes:
:param n: number of parts
:param width: number of parts in a row (0 for same as n)
:param move: (Default value = None)
:param move: (Default value = "")
:param part: callable that draws a part and knows move param
:param \*l: params for part
:param \*\*kw: keyword params for part
:param l: params for part
:param kw: keyword params for part
"""
if n <= 0:
return

View File

@ -9,7 +9,7 @@ from boxes.extents import Extents
EPS = 1e-4
PADDING = 10
RANDOMIZE_COLORS = False # enable to ease check for continuity of pathes
RANDOMIZE_COLORS = False # enable to ease check for continuity of paths
def points_equal(x1, y1, x2, y2):
@ -989,7 +989,7 @@ def line_intersection(line1, line2):
div = det(xdiff, ydiff)
if div == 0:
# todo: deal with paralel line intersection / overlay
# todo: deal with parallel line intersection / overlay
return False, None, None
d = (det(*line1), det(*line2))

View File

@ -29,7 +29,6 @@ def argparseSections(s):
Parse sections parameter
:param s: string to parse
"""
result = []
@ -78,14 +77,12 @@ class BoltPolicy(object):
Distributes (bed) bolts on a number of segments
(fingers of a finger joint)
"""
def drawbolt(self, pos):
"""Add a bolt to this segment?
:param pos: number of the finger
"""
return False
@ -93,7 +90,6 @@ class BoltPolicy(object):
"""Return next smaller, possible number of fingers
:param numfingers: number of fingers to aim for
"""
return numfingers
@ -102,7 +98,6 @@ class BoltPolicy(object):
Return same or next smaller even number
:param numFingers:
"""
return (numFingers // 2) * 2
@ -111,7 +106,6 @@ class BoltPolicy(object):
Return same or next smaller odd number
:param numFingers:
"""
if numFingers % 2:
return numFingers
@ -138,7 +132,6 @@ class Bolts(BoltPolicy):
Return if this finger needs a bolt
:param pos: number of this finger
"""
if pos > self.fingers // 2:
pos = self.fingers - pos
@ -165,7 +158,7 @@ class Settings(object):
of the material used.
Overload the absolute_params and relative_params class attributes with
the suported keys and default values. The values are available via
the supported keys and default values. The values are available via
attribute access.
"""
absolute_params: Dict[str, Any] = {} # TODO find better typing.
@ -242,7 +235,6 @@ class Settings(object):
:param boxes: Boxes object
:param chars: sequence of chars to be used by Edge objects
:param add: add the resulting Edge objects to the Boxes object's edges
"""
edges = []
return self._edgeObjects(edges, boxes, chars, add)
@ -265,9 +257,8 @@ class Settings(object):
Set values
:param thickness: thickness of the material used
:param relative: (Default value = True) Do scale by thickness
:param \*\*kw: parameters to set
:param relative: Do scale by thickness (Default value = True)
:param kw: parameters to set
"""
factor = 1.0
if relative:
@ -349,7 +340,7 @@ class Edge(BaseEdge):
def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw):
"""Draw edge of length mm"""
if bedBolts:
# distribute the bolts aequidistantly
# distribute the bolts equidistantly
interval_length = length / bedBolts.bolts
if self.positive:
d = (bedBoltSettings or self.bedBoltSettings)[0]
@ -768,7 +759,7 @@ class CompoundEdge(BaseEdge):
#############################################################################
class Slot(BaseEdge):
"""Edge with an slot to slid another pice through """
"""Edge with a slot to slide another piece through """
description = "Slot"
@ -1043,7 +1034,6 @@ class FingerHoles(FingerJointBase):
:param angle: (Default value = 90)
:param bedBolts: (Default value = None)
:param bedBoltSettings: (Default value = None)
"""
with self.boxes.saved_context():
self.boxes.moveTo(x, y, angle)
@ -1638,8 +1628,7 @@ class ChestHinge(BaseEdge):
return self.settings.pin_height+self.settings.hinge_strength
class ChestHingeTop(ChestHinge):
"Edge above a chest hinge"
"""Edge above a chest hinge"""
char = "p"
@ -1921,7 +1910,6 @@ class CabinetHingeEdge(BaseEdge):
#############################################################################
class LidSettings(FingerJointSettings):
"""Settings for Slide-on Lids
Note that edge_width below also determines how much the sides extend above the lid.
@ -1933,8 +1921,6 @@ Values:
* second_pin : True : additional pin for better positioning
* spring : "both" : position(s) of the extra locking springs in the lid
* hole_width : 0 : width of the "finger hole" in mm
"""
__doc__ += FingerJointSettings.__doc__ or ""
@ -2342,7 +2328,7 @@ Values:
* absolute
* stretch : 1.05 : Hint of how much the flex part should be shortend
* stretch : 1.05 : Hint of how much the flex part should be shortened
* relative (in multiples of thickness)
@ -2422,7 +2408,6 @@ class FlexEdge(BaseEdge):
self.ctx.translate(*self.ctx.get_current_point())
class GearSettings(Settings):
"""Settings for rack (and pinion) edge
Values:
* absolute_params
@ -2469,7 +2454,6 @@ class RackEdge(BaseEdge):
return self.settings.dimension * 1.1
class RoundedTriangleEdgeSettings(Settings):
"""Settings for RoundedTriangleEdge
Values:
@ -2550,7 +2534,6 @@ class RoundedTriangleFingerHolesEdge(RoundedTriangleEdge):
class HandleEdgeSettings(Settings):
"""Settings for HandleEdge
Values:

View File

@ -1,44 +1,40 @@
#!/usr/bin/env python3
""
'''
Copyright (C) 2007 Aaron Spike (aaron @ ekips.org)
Copyright (C) 2007 Tavmjong Bah (tavmjong @ free.fr)
Copyright (C) http://cnc-club.ru/forum/viewtopic.php?f=33&t=434&p=2594#p2500
Copyright (C) 2014 Jürgen Weigert (juewei@fabmail.org)
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2014-03-20 jw@suse.de 0.2 Option --accuracy=0 for automatic added.
2014-03-21 sent upstream: https://bugs.launchpad.net/inkscape/+bug/1295641
2014-03-21 jw@suse.de 0.3 Fixed center of rotation for gears with odd number of teeth.
2014-04-04 juewei 0.7 Revamped calc_unit_factor().
2014-04-05 juewei 0.7a Correctly positioned rack gear.
The geometry above the meshing line is wrong.
2014-04-06 juewei 0.7b Undercut detection added. Reference:
http://nptel.ac.in/courses/IIT-MADRAS/Machine_Design_II/pdf/2_2.pdf
Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/15
2014-04-07 juewei 0.7c Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/17
2014-04-09 juewei 0.8 Fixed https://github.com/jnweiger/inkscape-gears-dev/issues/19
Ring gears are ready for production now. Thanks neon22 for driving this.
Profile shift implemented (Advanced Tab), fixing
https://github.com/jnweiger/inkscape-gears-dev/issues/9
2015-05-29 juewei 0.9 ported to inkscape 0.91
AttributeError: 'module' object inkex has no attribute 'uutounit
Fixed https://github.com/jnweiger/inkscape-gears-dev
'''
# Copyright (C) 2007 Aaron Spike (aaron @ ekips.org)
# Copyright (C) 2007 Tavmjong Bah (tavmjong @ free.fr)
# Copyright (C) http://cnc-club.ru/forum/viewtopic.php?f=33&t=434&p=2594#p2500
# Copyright (C) 2014 Jürgen Weigert (juewei@fabmail.org)
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# 2014-03-20 jw@suse.de 0.2 Option --accuracy=0 for automatic added.
# 2014-03-21 sent upstream: https://bugs.launchpad.net/inkscape/+bug/1295641
# 2014-03-21 jw@suse.de 0.3 Fixed center of rotation for gears with odd number of teeth.
# 2014-04-04 juewei 0.7 Revamped calc_unit_factor().
# 2014-04-05 juewei 0.7a Correctly positioned rack gear.
# The geometry above the meshing line is wrong.
# 2014-04-06 juewei 0.7b Undercut detection added. Reference:
# http://nptel.ac.in/courses/IIT-MADRAS/Machine_Design_II/pdf/2_2.pdf
# Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/15
# 2014-04-07 juewei 0.7c Manually merged https://github.com/jnweiger/inkscape-gears-dev/pull/17
# 2014-04-09 juewei 0.8 Fixed https://github.com/jnweiger/inkscape-gears-dev/issues/19
# Ring gears are ready for production now. Thanks neon22 for driving this.
# Profile shift implemented (Advanced Tab), fixing
# https://github.com/jnweiger/inkscape-gears-dev/issues/9
# 2015-05-29 juewei 0.9 ported to inkscape 0.91
# AttributeError: 'module' object inkex has no attribute 'uutounit
# Fixed https://github.com/jnweiger/inkscape-gears-dev
from math import pi, cos, sin, tan, radians, degrees, ceil, asin, acos, sqrt
from os import devnull # for debugging
@ -57,12 +53,11 @@ def linspace(a,b,n):
return [a+x*(b-a)/(n-1) for x in range(0,n)]
def involute_intersect_angle(Rb, R):
" "
Rb, R = float(Rb), float(R)
return (sqrt(R**2 - Rb**2) / (Rb)) - (acos(Rb / R))
def point_on_circle(radius, angle):
" return xy coord of the point at distance radius from origin at angle "
""" return xy coord of the point at distance radius from origin at angle """
x = radius * cos(angle)
y = radius * sin(angle)
return (x, y)
@ -308,7 +303,7 @@ class Gears():
self.OptionParser.add_option("-A", "--accuracy",
action="store", type="int",
dest="accuracy", default=0,
help="Accuracy of involute: automatic: 5..20 (default), best: 20(default), medium 10, low: 5; good acuracy is important with a low tooth count")
help="Accuracy of involute: automatic: 5..20 (default), best: 20(default), medium 10, low: 5; good accuracy is important with a low tooth count")
# Clearance: Radial distance between top of tooth on one gear to bottom of gap on another.
self.OptionParser.add_option("", "--clearance",
action="store", type="float",
@ -409,8 +404,7 @@ class Gears():
self.boxes.ctx.restore()
def calc_circular_pitch(self):
""" We use math based on circular pitch.
"""
"""We use math based on circular pitch."""
dimension = self.options.dimension
if self.options.system == 'CP': # circular pitch
circular_pitch = dimension * 25.4

View File

@ -51,7 +51,7 @@ class BOX(Boxes): # Change class name!
space = 10, finger=10,
width=self.thickness)
p = edges.FingerJointEdge(self, s)
p.char = "a" # 'a', 'A', 'b' and 'B' is reserved for beeing used within generators
p.char = "a" # 'a', 'A', 'b' and 'B' is reserved for being used within generators
self.addPart(p)
# render your parts here

View File

@ -654,7 +654,7 @@ protruding underneath.
def render_upper_token_trays(self, tray_inner_height, box_width):
"""
Upper level : multiple trays for each ressource
Upper level : multiple trays for each resource
(beside horses which are on the lower level)
"""
tray_height = tray_inner_height + self.thickness

View File

@ -36,7 +36,7 @@ class BirdHouse(Boxes):
lengths = (x, h, t, roof, roof, t, h)
edges = [self.edges.get(e, e) for e in edges]
edges.append(edges[0]) # wrap arround
edges.append(edges[0]) # wrap around
tw = x + edges[1].spacing() + edges[-2].spacing()
th = h + x/2 + t + edges[0].spacing() + max(edges[3].spacing(), edges[4].spacing())

View File

@ -19,7 +19,7 @@ from boxes import *
class BottleStack(Boxes):
"""Stack bottles in a fridge"""
description = """When rendered with the "double" option the parts with the double slots get connected the shorter beams in the asymetrical slots.
description = """When rendered with the "double" option the parts with the double slots get connected the shorter beams in the asymmetrical slots.
Without the "double" option the stand is a bit more narrow.
"""

View File

@ -8,7 +8,7 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERself.canHightANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# 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
@ -83,7 +83,7 @@ for AA batteries:
![CanStorage for AA batteries](static/samples/CanStorageAA.jpg)
for canned tomatos:
for canned tomatoes:
"""
@ -111,7 +111,7 @@ for canned tomatos:
help="outer diameter of the cans to be stored (in mm)")
self.argparser.add_argument(
"--canHight", action="store", type=float, default=110,
help="hight of the cans to be stored (in mm)")
help="height of the cans to be stored (in mm)")
self.argparser.add_argument(
"--canNum", action="store", type=int, default=12,
help="number of cans to be stored")

View File

@ -18,7 +18,7 @@ from boxes import *
class Castle(Boxes):
"Castle tower with two walls"
"""Castle tower with two walls"""
description = """This was done as a table decoration. May be at some point in the future someone will create a proper castle
with towers and gates and walls that can be attached in multiple configurations."""

View File

@ -27,7 +27,7 @@ class CoffeeCapsuleHolder(Boxes):
ui_group = "Misc"
description = """
You can store your coffee capsule near your expresso machine with this. It works both vertically, or upside down under a shelf.
You can store your coffee capsule near your espresso machine with this. It works both vertically, or upside down under a shelf.
"""
def __init__(self):

View File

@ -25,7 +25,7 @@ class Console2(Boxes):
This box is designed as a housing for electronic projects. It has hatches that can be re-opened with simple tools. It intentionally cannot be opened with bare hands - if build with thin enough material.
#### Caution
There is a chance that the latches of the back wall or the back wall itself interfere with the front panel or it's mounting frame/lips. The generator does not check for this. So depending on the variant choosen you might need to make the box deeper (increase y parameter) or the panel angle steeper (increase angle parameter) until there is enough room.
There is a chance that the latches of the back wall or the back wall itself interfere with the front panel or it's mounting frame/lips. The generator does not check for this. So depending on the variant chosen you might need to make the box deeper (increase y parameter) or the panel angle steeper (increase angle parameter) until there is enough room.
It's also possible that the frame of the panel interferes with the floor if the hi parameter is too small.
@ -40,7 +40,7 @@ If the panel is removable you need to add the springs with the tabs to the side
![Back wall details](static/samples/Console2-panel-detail.jpg)
If space is tight you may consider not glueing the cross pieces in place and remove them after the glue-up. This may prevent the latches of the back wall and the panel from interfereing with each other.
If space is tight you may consider not gluing the cross pieces in place and remove them after the glue-up. This may prevent the latches of the back wall and the panel from interfering with each other.
The variant using finger joints only has the two side lips without the cross bars.

View File

@ -33,7 +33,7 @@ def offset_radius_in_square(squareside, angle, outset):
10.0
>>> offset_radius_in_square(20, 0, 5)
10.0
>>> # Without offset, it's half squre length divided by cos(angle) -- at
>>> # Without offset, it's half square length divided by cos(angle) -- at
>>> # least before it hits the next wall
>>> offset_radius_in_square(20, 15, 0) # doctest:+ELLIPSIS
10.35276...
@ -206,8 +206,8 @@ class DiscRack(Boxes):
# Can the discs be removed at all?
# Does not need explicit checking, for Thales' theorem tells us that at
# the point wher there is barely support in the corner, three contact
# points on the circle form just a demicircle and the discs can be
# the point where there is barely support in the corner, three contact
# points on the circle form just a semicircle and the discs can be
# inserted/removed. When we keep the other contact points and move the
# slits away from the corner, the disc gets smaller and thus will fit
# through the opening that is as wide as the diameter of the largest

View File

@ -18,7 +18,7 @@ from boxes import *
class Display(Boxes):
"""Diplay for flyers or leaflets"""
"""Display for flyers or leaflets"""
ui_group = "Misc"

View File

@ -78,7 +78,7 @@ Adding '0:' at the start of the sy parameter adds a slot at the very back. Addin
There are 4 different sets of dividers rendered:
* With asymetric tabs so the tabs fit on top of each other
* With asymmetric tabs so the tabs fit on top of each other
* With tabs of half wall thickness that can go side by side
* With tabs of a full wall thickness
* One single divider spanning across all columns
@ -215,7 +215,7 @@ You will likely need to cut each of the dividers you want multiple times.
# Dividers
divider_height = (
# h, with angle adjustement
# h, with angle adjustment
self.h / math.cos(math.radians(self.Slot_angle))
# removing what exceeds in the width of the divider
- self.thickness * math.tan(math.radians(self.Slot_angle))
@ -495,14 +495,14 @@ class SlotDescription:
def corrected_start_depth(self):
"""
Returns the depth of the straigth part of the slot starting side
Returns the depth of the straight part of the slot starting side
"""
extra_depth = self._depth_angle_correction()
return self.depth + max(0, extra_depth) - self.round_edge_start_correction()
def corrected_end_depth(self):
"""
Returns the depth of the straigth part of the slot ending side
Returns the depth of the straight part of the slot ending side
"""
extra_depth = self._depth_angle_correction()
return self.depth + max(0, -extra_depth) - self.round_edge_end_correction()
@ -555,7 +555,7 @@ class SlotDescriptionsGenerator:
# Add this slot
descriptions.add(slot)
# Add the straigth edge after this slot
# Add the straight edge after this slot
descriptions.add(
StraightEdgeDescription(l, slot.round_edge_end_correction())
)
@ -634,7 +634,7 @@ class DividerSlotsEdge(edges.BaseEdge):
elif isinstance(description, StraightEdgeDescription):
self.do_straight_edge(description)
# rounding errors might accumulates :
# rounding errors might accumulate :
# restore context and redo the move straight
self.ctx.restore()
self.moveTo(length)
@ -656,7 +656,7 @@ class DividerSlotsEdge(edges.BaseEdge):
(90 + slot.angle, slot.end_radius),
)
# rounding errors might accumulates :
# rounding errors might accumulate :
# restore context and redo the move straight
self.ctx.restore()
self.moveTo(slot.tracing_length())

View File

@ -21,13 +21,13 @@ from boxes import *
class DrillStand(Boxes):
"""Box for drills with each compartment of a different height"""
description = """Note: `sh` gives the hight of the rows front to back. It though should have the same number of entries as `sy`. These heights are the one on the left side and increase throughout the row. To have each compartement a bit higher than the previous one the steps in `sh` should be a bit bigger than `extra_height`.
description = """Note: `sh` gives the hight of the rows front to back. It though should have the same number of entries as `sy`. These heights are the one on the left side and increase throughout the row. To have each compartment a bit higher than the previous one the steps in `sh` should be a bit bigger than `extra_height`.
Assembly:
![Parts](static/samples/DrillStand-drawing.png)
Start with putting the slots of the inner walls together. Be especially careful with adding the bottom. It is always assymetrical and flush with the right/lower side while being a little short on the left/higher side to not protrude into the side wall.
Start with putting the slots of the inner walls together. Be especially careful with adding the bottom. It is always asymmetrical and flush with the right/lower side while being a little short on the left/higher side to not protrude into the side wall.
| | |
| ---- | ---- |

View File

@ -17,7 +17,7 @@
from boxes import *
class Edges(Boxes):
"""Print all registerd Edge types"""
"""Print all registered Edge types"""
webinterface = False

View File

@ -18,7 +18,7 @@ from boxes import *
class FlexTest(Boxes):
"Piece for testing different flex settings"
"""Piece for testing different flex settings"""
ui_group = "Part"

View File

@ -18,7 +18,7 @@ from boxes import *
class FlexTest2(Boxes):
"Piece for testing 2D flex settings"
"""Piece for testing 2D flex settings"""
ui_group = "Part"

View File

@ -33,7 +33,7 @@ class GearBox(Boxes):
help="number of teeth on outgoing shaft")
self.argparser.add_argument(
"--modulus", action="store", type=float, default=3,
help="modulus of the theeth in mm")
help="modulus of the teeth in mm")
self.argparser.add_argument(
"--shaft", action="store", type=float, default=6.,
help="diameter of the shaft")

View File

@ -17,7 +17,7 @@
from boxes import *
class HeartBox(Boxes):
"""Box in the form of an heart"""
"""Box in the form of a heart"""
ui_group = "FlexBox"

View File

@ -20,7 +20,7 @@ class HingeBox(Boxes):
"""Box with lid attached by cabinet hinges"""
description = """Needs (metal) pins as hinge axles. Pieces of nails will
do fine. They need to be cut to length as they are caputured as soon as the
do fine. They need to be cut to length as they are captured as soon as the
hinges are assembled.
Assemble the box and the lid separately. Then insert the axle into the hinges.

View File

@ -18,7 +18,7 @@ from boxes import *
class Hook(Boxes):
"""A hook wit a rectangular mouth to mount at the wall"""
"""A hook with a rectangular mouth to mount at the wall"""
ui_group = "Misc" # see ./__init__.py for names
@ -40,7 +40,7 @@ class Hook(Boxes):
help="width of the hook from the side")
self.argparser.add_argument("--angle", action="store",
type=float, default=45.,
help="angle of the support underneeth")
help="angle of the support underneath")
def render(self):

View File

@ -18,7 +18,7 @@ from boxes import *
class JigsawPuzzle(Boxes): # change class name here and below
"""Fractal jigsaw puzzle. Still aplha"""
"""Fractal jigsaw puzzle. Still alpha."""
webinterface = False # Change to make visible in web interface

View File

@ -117,7 +117,6 @@ class Keyboard:
Spaces are not important.
For example '3x2 / 4@11' means we want 3 columns, the two first with
3 rows without offset, and the last with 4 rows starting at 11mm high
"""
result = []
try:
@ -245,7 +244,7 @@ class Keyboard:
A simple plate cutout, a 14mm rectangle, as specified in this reference sheet
https://cdn.sparkfun.com/datasheets/Components/Switches/MX%20Series.pdf
With_notch shoul be used for a secondary lower plate, strengthening the first one.
With_notch should be used for a secondary lower plate, strengthening the first one.
A notch is added to let the hooks grasp the main upper plate.
Current position should be switch center.

View File

@ -109,7 +109,7 @@ class Keypad(Boxes, Keyboard):
return [callback]
def hotplug(self):
"""Callback for the key stabelizers."""
"""Callback for the key stabilizers."""
self.pcb_holes(
with_pcb_mount=self.pcb_mount_enable,
with_diode=self.diode_enable,

View File

@ -20,7 +20,7 @@ class LaserClamp(Boxes):
"""A clamp to hold down material to a knife table"""
description = """You need a tension spring of the proper length to make the clamp work.
Increace extraheight to get more space for the spring and to make the
Increase extraheight to get more space for the spring and to make the
sliding mechanism less likely to bind. You may need to add some wax on the
parts sliding on each other to reduce friction.
"""

View File

@ -17,7 +17,7 @@
from boxes import *
class NemaMount(Boxes):
"""Mounting braket for a Nema motor"""
"""Mounting bracket for a Nema motor"""
ui_group = "Part"

View File

@ -48,7 +48,7 @@ class PaintStorage(Boxes):
help="Create a stackable drawer instead")
def paintholes(self):
"Place holes for the paintcans evenly"
"""Place holes for the paintcans evenly"""
if self.hexpattern:
self.moveTo(self.minspace/2, self.minspace/2)

View File

@ -30,7 +30,7 @@ class PaperBox(Boxes):
This box is made of paper.
There is marks in the "outside leftover paper" to help see where to fold
(cutting with tabs helps use them). The cut is very precise, and could be too tight if misaligned when glued. A plywood box (such as a simple TypeTray) of the same size is a great guide during folding and glueing. Just fold the box against it. Accurate quick and easy.
(cutting with tabs helps use them). The cut is very precise, and could be too tight if misaligned when glued. A plywood box (such as a simple TypeTray) of the same size is a great guide during folding and gluing. Just fold the box against it. Accurate quick and easy.
A paper creaser (or bone folder) is also useful.
"""

View File

@ -18,7 +18,6 @@ from boxes import *
class Planetary(Boxes):
"""Planetary Gear with possibly multiple identical stages"""
ui_group = "Part"

View File

@ -18,7 +18,6 @@ from boxes import *
class Planetary2(Boxes):
"""Balanced force Difference Planetary Gear (not yet working properly)"""
ui_group = "Unstable"
@ -46,7 +45,7 @@ class Planetary2(Boxes):
help="enable secondary ring with given delta to the ring gear")
self.argparser.add_argument(
"--modulus", action="store", type=float, default=1.0,
help="modulus of the theeth in mm")
help="modulus of the teeth in mm")
self.argparser.add_argument(
"--shaft", action="store", type=float, default=6.,
help="diameter of the shaft")
@ -132,7 +131,7 @@ class Planetary2(Boxes):
def planets():
self.moveTo(size3/2, size3/2)
for angle in planetpositions:
angle += 180 # compensate for 3 postion in callback
angle += 180 # compensate for 3 position in callback
self.moveTo(0, 0, angle)
self.hole((pitch1+pitch2), 0, size2/2)
self.moveTo(0, 0, -angle)

View File

@ -24,7 +24,7 @@ class SlotEdge(edges.Edge):
r, h = self.settings.radius, self.settings.h
sh = self.settings.sh # distance side to center
li = 2 * sh * math.tan(math.radians(90/n)) # side inner 2x polygone
li = 2 * sh * math.tan(math.radians(90/n)) # side inner 2x polygon
ls2 = t / math.tan(math.radians(180/n))
ls1 = t / math.cos(math.radians(90-(180/n)))

View File

@ -80,7 +80,6 @@ class RollerEdge2(edges.BaseEdge):
class Rotary(Boxes):
"""Rotary Attachment for engraving cylindrical objects in a laser cutter"""
ui_group = "Unstable"
@ -101,7 +100,7 @@ class Rotary(Boxes):
help="diameter of the axles")
self.argparser.add_argument(
"--knifethickness", action="store", type=float, default=8.,
help="thickness of the knifes in mm. Use 0 for use with honey comb table.")
help="thickness of the knives in mm. Use 0 for use with honey comb table.")
self.argparser.add_argument(
"--beamwidth", action="store", type=float, default=32.,
help="width of the (aluminium) profile connecting the parts")
@ -252,7 +251,7 @@ class Rotary(Boxes):
with self.saved_context():
self.rectangularWall(hw - 2 * t - 2, 60, edges="efef", move="right")
self.rectangularWall(hw - 4 * t - 4, 60, edges="efef", move="right")
# Spindel auxiliaries
# Spindle auxiliaries
self.parts.waivyKnob(50, callback=lambda: self.nutHole("M8"), move="right")
self.parts.waivyKnob(50, callback=lambda: self.nutHole("M8"), move="right")

View File

@ -13,7 +13,7 @@ class SlidingDrawer(Boxes):
self.argparser.add_argument(
"--play", action="store", type=float, default=0.15,
help="play between the two parts as multipleof the wall thickness")
help="play between the two parts as multiple of the wall thickness")
def render(self):

View File

@ -89,7 +89,7 @@ class TrayLayout2(TrayLayout):
description = """Edit the layout text graphics to adjust your tray.
Put in the sizes for each column and row. You can replace the hyphens and
vertial bars representing the walls with a space character to remove the walls.
vertical bars representing the walls with a space character to remove the walls.
You can replace the space characters representing the floor by a "X" to remove the floor for this compartment.
"""
@ -112,7 +112,7 @@ You can replace the space characters representing the floor by a "X" to remove t
close = Boxes.close
def vWalls(self, x, y):
"Number of vertical walls at a crossing"
"""Number of vertical walls at a crossing"""
result = 0
if y > 0 and self.vwalls[y - 1][x]:
result += 1
@ -123,7 +123,7 @@ You can replace the space characters representing the floor by a "X" to remove t
return result
def hWalls(self, x, y):
"Number of horizontal walls at a crossing"
"""Number of horizontal walls at a crossing"""
result = 0
if x > 0 and self.hwalls[y][x - 1]:
result += 1
@ -132,12 +132,12 @@ You can replace the space characters representing the floor by a "X" to remove t
return result
def vFloor(self, x, y):
"Is there floor under vertical wall"
"""Is there floor under vertical wall"""
return ((x > 0 and self.floors[y][x - 1]) or
(x < len(self.x) and self.floors[y][x]))
def hFloor(self, x, y):
"Is there foor under horizontal wall"
"""Is there foor under horizontal wall"""
return ((y > 0 and self.floors[y - 1][x]) or
(y < len(self.y) and self.floors[y][x]))

View File

@ -23,7 +23,7 @@ class TwoPiece(Boxes):
"""
description = """
Set *hi* larger than *h* to leave gap between the inner and outer shell. This can be used to make opening the box easier. Set *hi* smaller to only have a small inner ridge that will allow the content to be momre visible after opening.
Set *hi* larger than *h* to leave gap between the inner and outer shell. This can be used to make opening the box easier. Set *hi* smaller to only have a small inner ridge that will allow the content to be more visible after opening.
![Bottom view](static/samples/TwoPiece2.jpg)
"""
@ -37,7 +37,7 @@ Set *hi* larger than *h* to leave gap between the inner and outer shell. This ca
self.argparser.add_argument(
"--play", action="store", type=float, default=0.15,
help="play between the two parts as multipleof the wall thickness")
help="play between the two parts as multiple of the wall thickness")
def render(self):
# adjust to the variables you want in the local scope

View File

@ -30,7 +30,7 @@ class TypeTray(_TopEdge):
"top_edge")
self.argparser.add_argument(
"--back_height", action="store", type=float, default=0.0,
help="additional height of the back wall - e top egde only")
help="additional height of the back wall - e top edge only")
self.argparser.add_argument(
"--radius", action="store", type=float, default=0.0,
help="radius for strengthening side walls with back_height")

View File

@ -30,7 +30,7 @@ class WallCaliper(_WallMountedBox):
help="width of the long end")
self.argparser.add_argument(
"--heigth", action="store", type=float, default=6.0,
help="heigth of the body")
help="height of the body")
def side(self, move=None):
t = self.thickness

View File

@ -27,10 +27,10 @@ class WallPlaneHolder(_WallMountedBox):
help="width of the plane")
self.argparser.add_argument(
"--length", action="store", type=float, default=250,
help="legth of the plane")
help="length of the plane")
self.argparser.add_argument(
"--hold_length", action="store", type=float, default=30,
help="legth of the part hiolding the plane over the front")
help="length of the part holding the plane over the front")
self.argparser.add_argument(
"--height", action="store", type=float, default=80,
help="height of the front of plane")

View File

@ -33,7 +33,8 @@ class Parts:
:param diameter: diameter of the disc
:param hole: (Default value = 0)
:param callback: (Default value = None) called in the center
:param move: (Defaultvalue = None)
:param move: (Default value = "")
:param label: (Default value = "")
"""
size = diameter
r = diameter / 2.0
@ -59,7 +60,7 @@ class Parts:
:param angle: (Default value = 45) maximum angle of the wave
:param hole: (Default value = 0)
:param callback: (Default value = None) called in the center
:param move: (Defaultvalue = None)
:param move: (Default value = "")
"""
if n < 2:
@ -92,11 +93,11 @@ class Parts:
:param diameter: diameter of the knob
:param n: (Default value = 3) number of dents
:param rounded: (Default value = 0.2) proportion of circumferen remaining
:param rounded: (Default value = 0.2) proportion of circumference remaining
:param angle: (Default value = 70) angle the dents meet the circumference
:param hole: (Default value = 0)
:param callback: (Default value = None) called in the center
:param move: (Defaultvalue = None)
:param move: (Default value = "")
"""
size = diameter
@ -132,9 +133,9 @@ class Parts:
:param r_outside: outer radius
:param r_inside: inner radius
:param angle: anlge the segment is spanning
:param angle: angle the segment is spanning
:param n: (Default value = 1) number of segments
:param move: (Defaultvalue = None)
:param move: (Default value = "")
"""
space = 360 * r_inside / self.spacing
n = min(n, 360 / (angle+space))

View File

@ -16,7 +16,7 @@ import math
def normalize(v):
"set lenght of vector to one"
"""set length of vector to one"""
l = (v[0] ** 2 + v[1] ** 2) ** 0.5
if l == 0.0:
return (0.0, 0.0)
@ -35,35 +35,34 @@ def vclip(v, length):
def vdiff(p1, p2):
"vector from point1 to point2"
"""vector from point1 to point2"""
return (p2[0] - p1[0], p2[1] - p1[1])
def vadd(v1, v2):
"Sum of two vectors"
"""Sum of two vectors"""
return (v1[0] + v2[0], v1[1] + v2[1])
def vorthogonal(v):
"orthogonal vector"
"Orthogonal vector"
"""Orthogonal vector"""
return (-v[1], v[0])
def vscalmul(v, a):
"scale vector by a"
"""scale vector by a"""
return (a * v[0], a * v[1])
def dotproduct(v1, v2):
"Dot product"
"""Dot product"""
return v1[0] * v2[0] + v1[1] * v2[1]
def circlepoint(r, a):
return (r * math.cos(a), r * math.sin(a))
def tangent(x, y, r):
"angle and length of a tangent to a circle at x,y with raduis r"
"""angle and length of a tangent to a circle at x,y with radius r"""
l1 = vlength((x, y))
a1 = math.atan2(y, x)
a2 = math.asin(r / l1)
@ -72,7 +71,7 @@ def tangent(x, y, r):
return (a1+a2, l2)
def rotm(angle):
"Rotation matrix"
"""Rotation matrix"""
return [[math.cos(angle), -math.sin(angle), 0],
[math.sin(angle), math.cos(angle), 0]]

View File

@ -54,7 +54,7 @@ class _WallMountedBox(Boxes):
class WallEdge(BaseEdge):
_reversed = False
def lengths(self, length):
return [length]
@ -112,7 +112,7 @@ class WallHoles(WallEdge):
def _joint(self, length):
self.fingerHolesAt(0, 0, length, 0)
self.moveTo(length, 0)
def __call__(self, x, y, length, angle, **kw):
"""
Draw holes for a matching WallJoinedEdge
@ -157,9 +157,8 @@ class WallHoleEdge(WallHoles):
def margin(self):
return 0.0
class WallSettings(Settings):
class WallSettings(Settings):
"""Settings for plain WallEdges
Values:
@ -182,7 +181,7 @@ Values:
bc = self.base_class
bn = bc.__name__
wallholes = type(bn+"Hole", (WallHoles, bc), {})(boxes, self)
edges = [bc(boxes, self),
type(bn+"Reversed", (bc,), {'_reversed' : True})(boxes, self),
type(bn+"Joined", (WallJoinedEdge, bc), {})(boxes, self),
@ -262,7 +261,6 @@ class SlatWallEdge(WallEdge):
return self.settings.hook_depth + self.settings.hook_distance
class SlatWallSettings(WallSettings):
"""Settings for SlatWallEdges
Values:
@ -338,7 +336,6 @@ class DinRailEdge(WallEdge):
return self.settings.depth
class DinRailSettings(WallSettings):
"""Settings for DinRailEdges
Values:
@ -416,7 +413,6 @@ class FrenchCleatEdge(WallEdge):
return self.settings.depth
class FrenchCleatSettings(WallSettings):
"""Settings for FrenchCleatEdges
Values:

View File

@ -19,8 +19,8 @@ form. The user interfaces are located in `scripts/`. Currently there is
Generators
..........
A (box) generator is an sub class of boxes.Boxes. It generates one
drawing. The sub classes over load .__init__() to set their parameters
A (box) generator is an subclass of boxes.Boxes. It generates one
drawing. The subclasses over load .__init__() to set their parameters
and implement .render() that does the actual drawing.
Generators are found in ``boxes/generators/``. They are included into

View File

@ -54,7 +54,7 @@ A similar approach is necessary when moving to a feature drawn inside
the part without the use of callbacks. Here you typically have to
correct for the out-set at the outside of the part and again for in-set
of the hole one is about to cut. This can be done in **x** or **y**
direction depending on whether the cut ist started vertical or
direction depending on whether the cut is started vertical or
horizontally.
Replacing the inverted arcs

View File

@ -44,7 +44,7 @@ Draw Commands
-------------
These commands do not change the coordinate system but get the
coordinates passed as parameters. All of them are either som sort of
coordinates passed as parameters. All of them are either some sort of
hole or text. These artifacts are placed somewhere independently of
some continuous outline of the part their on.

View File

@ -2,11 +2,11 @@
Generators
==========
Generators are sub classes of
Generators are subclasses of
.. autoclass:: boxes.Boxes
Most code is directly in this class. Sub class are supposed to over
Most code is directly in this class. Subclass are supposed to over
write the ``.__init__()`` and ``.render()`` method.
The Boxes class keeps a canvas object (self.ctx) that all
@ -18,7 +18,7 @@ For implementing a new generator forking an existing one or using the
``boxes/generators/_template.py`` is probably easier than starting
from scratch.
Many methods and attributes are for use of the sub classes. These
Many methods and attributes are for use of the subclasses. These
methods are the interface for the user interfaces to interact with the
generators:

View File

@ -34,7 +34,7 @@ Setup.py uses the :code:`setuptools` library (package name may be
package.
pstoedit
.......
........
While not a hard requirement Boxes.py uses :code:`pstoedit` (sometimes :code:`ps2edit`) to offer formats
that are not supported by Cairo: DXF, gcode, PLT. Currently the location