Source

boxer / boxer

#!/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__
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.