Source

boxer / boxer

Trammell Hudson 6c95181 











Trammell Hudson 5c43118 
Trammell Hudson 6c95181 

Trammell Hudson 5c43118 
Trammell Hudson 6c95181 




Trammell Hudson d4f777a 

Trammell Hudson 6c95181 




Trammell Hudson 5c43118 
Trammell Hudson 6c95181 











Trammell Hudson d4f777a 




Trammell Hudson 6c95181 


Trammell Hudson d4f777a 
Trammell Hudson 6c95181 

Trammell Hudson 5c43118 

Trammell Hudson 6c95181 



Trammell Hudson d4f777a 




Trammell Hudson 6c95181 








Trammell Hudson d4f777a 

























Trammell Hudson 5c43118 

Trammell Hudson d4f777a 














Trammell Hudson 5c43118 

Trammell Hudson d4f777a 














Trammell Hudson 5c43118 

Trammell Hudson d4f777a 














Trammell Hudson 5c43118 

Trammell Hudson d4f777a 
















Trammell Hudson 6c95181 


Trammell Hudson 5c43118 
Trammell Hudson 6c95181 

#!/usr/bin/perl
# Generate SVG files with a specified number of sides and tabs
# to make a self-locking acrylic or wooden laser cut box.
#
# (c) 2012 Trammell Hudson <hudson@osresearch.net>
#
use warnings;
use strict;
use Math::Trig;

my $units = "mm"; # mm = 1, inches = 1000 / 25.4
my $thickness = 3;
my $sides = 5;
my $edge = 30;
my $height = 20;
my $tab_width = 8;

my $deg2rad = 

# Compute the height of the interior triangle
my $interior_angle = 360.0 / $sides;
my $interior_len = $edge - $thickness/2;
my $interior_radius = ($interior_len/2) / tan(deg2rad($interior_angle/2));


print <<"";
<!-- Created with boxer (http://trmm.net/) -->
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="scale(3.543307)">


#
# Draw the top (and bottom piece)
#
#<g transform="translate($edge $edge)">
print <<"";
<g transform="translate(100 100)">

for my $side (0..$sides-1)
{
	my $angle = (360 / $sides) * $side;
	my $hx = $interior_len / 2;

	# Put one tab in the middle
	my $tab_x1 = $hx - $tab_width/2;
	my $tab_x2 = $hx + $tab_width/2;

	print <<"";
	<g
		transform="rotate(-$angle) translate(-$hx $interior_radius)"
	><path
		stroke="#ff0000"
		fill="none"
		stroke-width="1px"
		d="M

	print <<"";
		0 0
		$tab_x1 0
		$tab_x1 $thickness
		$tab_x2 $thickness
		$tab_x2 0
		$interior_len 0

	print <<"";
	"/><text>$side</text></g>

}

print <<"";
</g>

#
# Draw the edge pieces
#
print <<"";
<g transform="translate(200 200)">

for my $side (0..$sides-1)
{
	my $origin_x = $side * ($edge + $thickness + 2);

	# Put one tab in the middle of the top and bottom edges
	my $tab_x1 = $edge/2 - $tab_width/2;
	my $tab_x2 = $edge/2 + $tab_width/2;

	# Put one tab in the middle of the left and right edges
	my $side_tab_x1 = $height/2 - $tab_width/2;
	my $side_tab_x2 = $height/2 + $tab_width/2;

	print <<"";
	<g transform="translate($origin_x 0)">

	print <<"";
	<!-- bottom edge -->
	<path
		transform="translate(0 0) rotate(0 0 0)"
		stroke="#ff0000"
		fill="none"
		stroke-width="1px"
		d="M
			$thickness 0
			$tab_x1 0
			$tab_x1 -$thickness
			$tab_x2 -$thickness
			$tab_x2 0
			$edge 0
		"
	/>

	print <<"";
	<!-- right side edge; tab goes out-->
	<path
		transform="translate($edge 0) rotate(-90 0 0)"
		stroke="#ff0000"
		stroke-width="1px"
		fill="none"
		d="M
			0 0
			$side_tab_x1 0
			$side_tab_x1 $thickness
			$side_tab_x2 $thickness
			$side_tab_x2 0
			$height 0
		"
	/>

	print <<"";
	<!-- top edge -->
	<path
		transform="translate($edge -$height) rotate(-180 0 0)"
		stroke="#ff0000"
		stroke-width="1px"
		fill="none"
		d="M
			0 0
			$tab_x1 0
			$tab_x1 -$thickness
			$tab_x2 -$thickness
			$tab_x2 0
			@{[$edge - $thickness]} 0
		"
	/>

	print <<"";
	<!-- left side edge; tab goes out-->
	<path
		transform="translate($thickness -$height) rotate(-270 0 0)"
		stroke="#ff0000"
		stroke-width="1px"
		fill="none"
		d="M
			0 0
			$side_tab_x1 0
			$side_tab_x1 -$thickness
			$side_tab_x2 -$thickness
			$side_tab_x2 0
			$height 0
		"
	/>

	print <<"";
	</g>

}

print <<"";
</g>


print <<"";
</g>
</svg>

__END__