====== Laserbox paramétrique ====== * Porteur du projet : [[participants:resonance:accueil|Reso-nance numérique]] * Date : 21/08/2015 * Licence : libre ! * Contexte : recherche pour brutbox * Fichiers : {{:projets:laserbox-parametrique:flexbox_v.1.4.ps|}} * Lien : Depuis http://www.thingiverse.com/thing:619365/#files ===== Description ===== {{ :projets:laserbox-parametrique:2015-08-23-112247.jpg |}} De passage au [[http://www.8fablab.fr/|8Fablab]] de Crest ou nos acolytes de [[http://brutpop.blogspot.fr/|BrutPop]] sont en vadrouille... \\ Essai de boite laser en CP pour les capteurs de la brutbox avec de jolies arrondies.\\ {{:projets:laserbox-parametrique:flexbox_v.1.4.ps|Le fichier .ps}} est paramétrique, en l'ouvrant avec un éditeur de texte on peut changer la taille de la boite et des arrondis... * [[http://www.thingiverse.com/thing:619365/#files]] {{ :projets:laserbox-parametrique:capture_du_2015-08-23_11_35_50.png |}} ==== Le Code ==== %!PS % % flexbox.ps % A 3 piece flexible box that can be laser cut from semi-rigid materials % % Edited my Tom Speller (@Seithing) % % V1.3 by Tom % change log and updates on thingiverse - http://www.thingiverse.com/thing:619365 % % Originaly % by Brian Dahlem - http://www.thingiverse.com/thing:17240 % based on the simple box - type 2 by FdS - http://www.thingiverse.com/thing:14018 % using the sninge technique from snijlab - http://www.thingiverse.com/thing:12707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following lines define basic information about your box, change as necessary % Define basic measurement units -- don't change put the desiered unit in the unit var below /inch 72 def /cm 28.3465 def /mm 2.83465 def /unit mm def %selects what unit is used in the following vars + the text (selection about) % Define box parameters -- This is the size of the box you want /boxlength 60 unit mul def % long dimension of flat side of the box /boxwidth 60 unit mul def % dimension across the hinge /boxheight 60 unit mul def % short dimension across flat side of the box /cornerradius 15 unit mul def % radius of the hinge. Suggested min 15mm /materialthickness 3 unit mul def % thickness of the material which will become the box walls /tabwidth materialthickness 2 mul def % suggested width of tabs in the joints /fingerTab 0 unit mul def %finger hole for opening box, set to 0 for none. 12 is a good size for a finger /fingerinset 5 unit mul def %offset to move the center of the circle. 5 is a good offset for a finger % Define the laser cutter page size A3 420x290mm /pagewidth 420 unit mul def /pageheight 290 unit mul def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Here down is the code that makes your pretty little box, change only if you dare. % % Warning... it gets ugly ahead % setup the page << /PageSize [pagewidth pageheight] >> setpagedevice % Set the pagesize, only sometimes works? Good enough for gov't /border materialthickness def % Move away from the edge of the material, for that nice scorched edges goodness 0 pageheight translate 1 -1 scale border border translate % 0 - 1 for colour % outside cut colour /outR 0 def /outG 0 def /outB 0 def % hinge cut colour due to the way my laser software works it tries to cut the outside before the inside. % making it different colours mean I can set the cut manauly /hingeR 1 def /hingeG 0 def /hingeB 0 def 0.01 setlinewidth % Setup to make vector cuts with hairline thickness (just enough to see) outR outG outB setrgbcolor % Use black for cutouts, because that makes the most sense % draw a rectangle /box { % Draw a box with a given width and height from the current location /height exch def /width exch def 0 height rlineto width 0 rlineto 0 height neg rlineto width neg 0 rlineto } def % Some basics... /min { 2 copy gt { exch } if pop } bind def /max { 2 copy lt { exch } if pop } bind def /pi 3.14159 def % Define some features of the box /innerradius cornerradius materialthickness sub def % The radius of the corners minus the thickness of the material /tablen materialthickness def % How tall to make tabs /toplen boxlength cornerradius 2 mul sub def % How long is the top / bottom side /frontheight boxheight tablen 2 mul sub def % How tall is the front face, minus tabs /frontwidth boxlength tablen 2 mul sub def % How wide is the front face, minus tabs /sideheight boxheight cornerradius 2 mul sub def % How tall are the sides, not counting hinges /hingelen innerradius 2 div pi mul def % How long is a flattened out hinge (the circumference of 1/4 inner radius) /breaklen materialthickness 2 div def % How long should breaks in the hinge lines be /numhingelines boxwidth 96 div ceiling def % How many segments should there be in a hinge line /winglen toplen 2 div hingelen 2 mul sideheight add add def % How long a wing of the drawing is when drawn out flat %for the tabs at the base (between the wings). /numtabsbase toplen tabwidth div 2 div floor 2 mul 1 add def % How many tabs (odd number) connect the bottom to the front /tabsizebase toplen numtabsbase div def % How big are those tabs %finger tab maths %see if fingerTab is greater then 0. if so add hole fingerTab 0 gt { /x fingerTab fingerinset sub def %work out how far form the edge of the circle the sagitta is /y 2 2 fingerTab mul x mul x 2 exp sub sqrt mul def % the maths that calulates the offset, some how works. /changeangle fingerinset y 2 div atan def %angle to +/- from arc to move the hole /lineloss fingerTab y 2 div sub def % add a little more to the line to compensate for what was lost in moving the circle } { %if finger tab set to 0 set all to 0. don't add hole /x 0 def /y 0 def /changeangle 0 def /lineloss 0 def /fingerinset 0 def } ifelse % Draw 1/2 of the top, one "flap" of the lid /drawflap { newpath toplen 2 div 0 moveto % Start at the end of the flap closest to the body tabwidth 2 mul 0 lineto % draw the edge up to the tab 0 tablen rlineto % cut in a tab tabwidth neg 0 rlineto 0 tablen neg rlineto % and back out to lock it tabwidth neg 0 rlineto fingerinset neg boxwidth 2 div fingerTab 270 changeangle add 90 changeangle sub arc % draw arc for finger hole 0 boxwidth 2 div fingerTab sub lineloss add rlineto % draw the end of the top flap tabwidth 0 rlineto % and draw the locking tabs 0 tablen neg rlineto tabwidth 0 rlineto 0 tablen rlineto toplen 2 div boxwidth lineto % finish by returning to the body end of the flap stroke } def % Draw a hinge line going all the way across the hinge /longline { /linelen boxwidth numhingelines breaklen 2 mul sub numhingelines div def % How long is a segment in a long line? % Draw 1/2 a line to start 0 linelen 2 div rlineto % Fill in the space with full lines 2 1 numhingelines { 0 breaklen 2 mul rmoveto 0 linelen rlineto } for % Draw the last half line to even it out 0 breaklen 2 mul rmoveto 0 linelen 2 div rlineto } def % Draw a hinge line with end caps /shortline { /linelen boxwidth numhingelines 1 sub breaklen 2 mul mul breaklen 2 mul add sub numhingelines div def % Skip a break then fill the space with evenly spaced lines 0 breaklen neg rmoveto 1 1 numhingelines { 0 linelen neg rlineto 0 breaklen 2 mul neg rmoveto } for } def % Draw a flattened out hinge - alternating short and long lines /drawhinge { /minwidth materialthickness def % the minimum width for a hinge section (2 lines) /numbars hingelen minwidth div floor def % the number of hinge sections per hinge /barwidth hingelen numbars div def % the actual width of a hinge section hingeR hingeG hingeB setrgbcolor % Set colour to hinge colour newpath 0 boxwidth moveto % start at the bottom of the hinge and draw a short line shortline 1 1 numbars { % for each of the sections in the hinge /i exch def i barwidth mul barwidth 2 div sub 0 moveto % move to the middle of the section and draw longline % a long line to split the section in half i barwidth mul boxwidth moveto % move to the end of the section and shortline % draw a shortline to connect to the next section } for stroke outR outG outB setrgbcolor % back to black for the outside lines newpath 0 0 moveto % draw the sides of the hinge hingelen 0 rlineto 0 boxwidth rmoveto hingelen neg 0 rlineto stroke } def %draw tabs for bottom of the sides of box (ones between the wings) /drawbasetabs { newpath 0 0 moveto tabsizebase 0 rlineto % draw tabs and slots along the bottom line of the front 1 1 numtabsbase 2 div { 0 tablen rlineto tabsizebase 0 rlineto 0 tablen neg rlineto tabsizebase 0 rlineto } for stroke } def % Draw an edge of the box, using tabs to connect to the front/back if the side is large enough /drawendedge { /numtabs sideheight tabwidth div 2 div ceiling 2 mul 1 add def % how many tabs to connect to front /tabsize sideheight numtabs div def % how big should the tabs be newpath 0 0 moveto % Move to the top of the side tabsize 0 rlineto % draw the first tab 1 1 numtabs 2 div { % if there are more tabs 0 tablen rlineto % draw the tab tabsize 0 rlineto 0 tablen neg rlineto % then return to the side tabsize 0 rlineto % for the slot } for stroke } def % Draw an end of the box horizontally /drawend { gsave drawendedge % Only draw the 2 edges of the end not connected to the hinges sideheight boxwidth translate -1 -1 scale drawendedge grestore } def % Draw a "wing" of the box, consisting of 1/2 the top, 2 hinges and a side /drawwing { % Draw the two hinges before drawing the outline of the wing - use this order for laser cutting betterment gsave toplen 2 div 0 translate % Skip over the flap drawhinge % Draw a hinge hingelen sideheight add 0 translate % Skip over the end/side drawhinge % Draw a hinge grestore gsave % Go back to the beginning of the wing drawflap % Draw the top flap toplen 2 div hingelen add 0 translate % skip over the hinge gsave %draw only the bottom edge as the box sides do the other side sideheight boxwidth translate -1 -1 scale drawendedge grestore grestore } def % Draw the front/back side of the box /drawfront { gsave tablen tablen translate % Connect the front side to the bottom with tabs newpath innerradius frontheight moveto % Start at the bottom, inside of the curved corner tabsizebase 0 rlineto % draw tabs and slots along the bottom line of the front 1 1 numtabsbase 2 div { 0 tablen rlineto tabsizebase 0 rlineto 0 tablen neg rlineto tabsizebase 0 rlineto } for frontwidth innerradius sub frontheight moveto % draw the corner at the bottom right of the front frontwidth innerradius sub frontheight innerradius sub innerradius 90 0 arcn stroke % draw a corner radius then the side connecting one end to the front gsave frontwidth frontheight innerradius sub translate % move to the bottom of the right edge 270 rotate drawendedge % draw the edge connecting the front and an end grestore % draw another corner radius, the side connecting the top flaps to the front, and another corner newpath frontwidth innerradius sub innerradius innerradius 0 270 arcn % draw the top right corner toplen 2 div neg tabwidth 2 mul add 0 rlineto % draw the right half of the top 0 tablen neg rlineto % stick out a tab to grab the top flap tabwidth neg 0 rlineto 0 tablen rlineto % Make a slot to hold both flaps' tabs tabwidth 2 mul neg 0 rlineto 0 tablen neg rlineto % make a tab to grab the other flap tabwidth neg 0 rlineto 0 tablen rlineto innerradius 0 lineto % then finish off the top of this side innerradius innerradius innerradius 270 180 arcn % with a top left corner stroke % draw the last side of the front, connecting the front to another end gsave 0 innerradius translate % below the corner 90 rotate drawendedge % draw the edge connecting with the left end grestore % finish off the front with the last corner radius newpath innerradius frontheight innerradius sub innerradius 180 90 arcn % draw the bottom left corner to finish this side stroke grestore } def % Go ahead and actually draw the box % Draw the two wings - the top flaps and ends gsave 0 boxlength tablen sub translate % line up the wing with the bottom of the box's front side drawwing % draw the wing gsave winglen 0 translate %move to wing middle drawbasetabs %draw tabs between wings 0 boxwidth translate 1 -1 scale %mirror horisontal drawbasetabs %draw bottom tabs fo wings grestore 2 toplen mul sideheight 2 mul add hingelen 4 mul add 0 translate % skip over to the other side of the box -1 1 scale drawwing % and draw the other wing grestore % Draw the front and back of the box, connected up to the wings this also makes the bottom gsave toplen 2 div hingelen add cornerradius sub boxlength translate % line up the front so it will mesh with the wings -90 rotate %rotate it so it sits ontop drawfront % and draw it 0 boxheight hingelen 2 mul add sideheight add toplen add translate % line up the front so it will mesh with the wings 1 -1 scale %scale (mirror) to save having to work with vertical offset drawfront % and draw it grestore % We're done here, lets go home. showpage %%EOF ===== Matériaux ===== * CP 3mmm * Machine Laser ( ici : Gravograph LS900 au 8fablab a Crest) {{tag>[laser brutbox boite]}}