2016-07-11 23:01:57 +02:00
#!/usr/bin/env python3
2014-03-16 18:26:12 +01:00
# Copyright (C) 2013-2014 Florian Festi
#
# 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 3 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, see <http://www.gnu.org/licenses/>.
2014-03-15 15:03:38 +01:00
from boxes import *
2016-03-23 09:11:51 +01:00
from boxes . edges import Bolts
2017-02-12 22:23:19 +01:00
from boxes . lids import _TopEdge , _ChestLid
2014-03-15 15:03:38 +01:00
2017-03-06 19:56:59 +01:00
class UniversalBox ( _TopEdge , _ChestLid ) :
""" Box with various options for different styles and lids """
2017-02-12 13:11:36 +01:00
2017-02-13 17:31:58 +01:00
ui_group = " Box "
2017-02-12 13:11:36 +01:00
def __init__ ( self ) :
Boxes . __init__ ( self )
2020-05-05 22:03:01 +02:00
self . addTopEdgeSettings ( roundedtriangle = { " outset " : 1 } ,
hinge = { " outset " : True } )
2017-02-12 13:11:36 +01:00
self . addSettingsArgs ( edges . FlexSettings )
2019-12-14 19:00:32 +01:00
self . buildArgParser ( " top_edge " , " bottom_edge " ,
" x " , " y " , " h " , " outside " )
2020-08-04 21:49:30 +02:00
self . argparser . add_argument (
" --vertical_edges " , action = " store " , type = str ,
default = " finger joints " ,
choices = ( " finger joints " , " finger holes " ) ,
help = " connections used for the vertical edges " )
2017-02-12 13:11:36 +01:00
self . argparser . add_argument (
" --lid " , action = " store " , type = str , default = " default (none) " ,
choices = ( " default (none) " , " chest " , " flat " ) ,
2019-01-11 12:19:16 +01:00
help = " additional lid (for straight top_edge only) " )
2017-02-12 13:11:36 +01:00
2018-07-02 18:58:02 +02:00
def top_hole ( self , x , y , top_edge ) :
t = self . thickness
if top_edge == " f " :
edge = self . edges [ " F " ]
self . moveTo ( 2 * t + self . burn , 2 * t , 90 )
elif top_edge == " F " :
edge = self . edges [ " f " ]
self . moveTo ( t + self . burn , 2 * t , 90 )
else :
raise ValueError ( " Only f and F supported " )
for l in ( y , x , y , x ) :
edge ( l )
if top_edge == " F " : self . edge ( t )
self . corner ( - 90 )
if top_edge == " F " : self . edge ( t )
2017-02-12 13:11:36 +01:00
def render ( self ) :
x , y , h = self . x , self . y , self . h
2018-07-02 18:58:02 +02:00
t = self . thickness
2017-02-12 13:11:36 +01:00
t1 , t2 , t3 , t4 = self . topEdges ( self . top_edge )
b = self . edges . get ( self . bottom_edge , self . edges [ " F " ] )
2016-04-19 21:02:56 +02:00
2016-03-23 09:11:51 +01:00
d2 = Bolts ( 2 )
d3 = Bolts ( 3 )
2014-03-15 15:03:38 +01:00
d2 = d3 = None
2020-08-04 21:49:30 +02:00
sideedge = " F " if self . vertical_edges == " finger joints " else " h "
2019-12-14 19:00:32 +01:00
if self . outside :
2020-08-04 21:49:30 +02:00
self . x = x = self . adjustSize ( x , sideedge , sideedge )
2019-12-14 19:00:32 +01:00
self . y = y = self . adjustSize ( y )
self . h = h = self . adjustSize ( h , b , self . top_edge )
2019-01-11 12:19:16 +01:00
2019-01-12 23:16:11 +01:00
with self . saved_context ( ) :
2020-08-04 21:49:30 +02:00
self . rectangularWall ( x , h , [ b , sideedge , t1 , sideedge ] ,
2019-12-14 14:18:38 +01:00
ignore_widths = [ 1 , 6 ] ,
2022-05-14 10:35:58 +02:00
bedBolts = [ d2 ] , move = " up " , label = " left " )
2020-08-04 21:49:30 +02:00
self . rectangularWall ( x , h , [ b , sideedge , t3 , sideedge ] ,
2019-12-14 14:18:38 +01:00
ignore_widths = [ 1 , 6 ] ,
2022-05-14 10:35:58 +02:00
bedBolts = [ d2 ] , move = " up " , label = " right " )
2019-01-12 23:16:11 +01:00
if self . bottom_edge != " e " :
2022-05-14 10:35:58 +02:00
self . rectangularWall ( x , y , " ffff " , bedBolts = [ d2 , d3 , d2 , d3 ] , move = " up " , label = " bottom " )
2019-01-12 23:16:11 +01:00
if self . top_edge in " fF " :
2022-05-14 10:35:58 +02:00
self . set_source_color ( Color . MAGENTA ) # I don't know why this part has a different color, but RED is not a good choice because RED is used for annotations
2019-01-12 23:16:11 +01:00
self . rectangularWall ( x + 4 * t , y + 4 * t , callback = [
2022-05-14 10:35:58 +02:00
lambda : self . top_hole ( x , y , self . top_edge ) ] , move = " up " , label = " top hole " )
2019-01-12 23:16:11 +01:00
self . set_source_color ( Color . BLACK )
2019-02-27 22:55:22 +01:00
self . drawLid ( x , y , self . top_edge , [ d2 , d3 ] )
2019-01-12 23:16:11 +01:00
self . drawAddOnLid ( x , y , self . lid )
2020-08-04 21:49:30 +02:00
self . rectangularWall ( x , h , [ b , sideedge , t3 , sideedge ] ,
2019-12-14 14:18:38 +01:00
ignore_widths = [ 1 , 6 ] ,
2022-05-14 10:35:58 +02:00
bedBolts = [ d2 ] , move = " right only " , label = " invisible " )
2019-01-11 12:19:16 +01:00
self . rectangularWall ( y , h , [ b , " f " , t2 , " f " ] ,
2019-12-14 14:18:38 +01:00
ignore_widths = [ 1 , 6 ] ,
2022-05-14 10:35:58 +02:00
bedBolts = [ d3 ] , move = " up " , label = " back " )
2019-01-11 12:19:16 +01:00
self . rectangularWall ( y , h , [ b , " f " , t4 , " f " ] ,
2019-12-14 14:18:38 +01:00
ignore_widths = [ 1 , 6 ] ,
2022-05-14 10:35:58 +02:00
bedBolts = [ d3 ] , move = " up " , label = " front " )
2019-01-11 12:19:16 +01:00
2014-03-15 15:03:38 +01:00