include include A4_LANDSCAPE= [297,210]; title_block_debugging = false; experimental = true; module titleBlock( project, title = undef, description = "", textSize=6, date="2025-01-01", scale=1, revision="1a", rect=[90,30], inset=10, anchor=CENTER, spin=0, orient=UP, color="Black", strokeWidth = 0.5, page="A4", landscape = true, //anchor=CENTER,spin=0,orient=LEFT ) { w = rect[0]; h = rect[1]; interline = 7; _inset = inset> 0 ? inset : h/20; //path = rect([w,h], chamfer=0 /*, anchor=FRONT*/); attachable(anchor,spin,orient, size=[w,h,50]) { projection( cut = false ) recolor(color) union() { // ************ Frame *************** rect_tube(size=[w,h], wall=0.5, h=0.1); l1 = h/2 - _inset; l2 = l1 - interline- 2*_inset ; // ************ Project *************** translate([-w /2+_inset, l1 ]) linear_extrude(0.1) text(project, size=textSize,halign="left",anchor=TOP,font="Saira Stencil One"); // ************ Scale *************** translate([w/2-_inset, l1]) linear_extrude(0.1) text(str("Scale: 1/",scale), size=textSize*2/5,halign="right",anchor=TOP); // ************ Title *************** //metrics = textmetrics(project, size=textSize, font="Saira Stencil One"); //l2 = l1 - metrics.size[1]- 2*_inset ; if ( title ) translate([-w /2+_inset, l2 ]) linear_extrude(0.1) text( title, size=textSize*2/3,halign="left",anchor=TOP,font="Arial Black"); // ************ Description *************** if ( description ) { translate([ -8, l2 - _inset/2 ]) linear_extrude(0.1) smartText( description, size=textSize*1/4, halign="left", font="Arial", style="italic", max_width = 51 ); } h1 = h/2-2*_inset - interline; translate([-w/2+_inset,h1,0]) cube([w-2*_inset,0.1,0.1]); // ************ Vertical sep *************** translate([10,interline-1*_inset/2,0]) cube([0.1,interline,0.1]); // ************ Revision *************** translate([-w /2+_inset+14, -h/2 + 2*_inset]) { linear_extrude(0.1) text("Revision:", size=textSize*2/5, anchor = RIGHT, font = "Arial:style=Italic"); linear_extrude(0.1) text(str(revision), size=textSize*2/5, anchor = LEFT,font = "Arial:style=Bold"); } // ************ Date *************** translate([w/2-_inset-16, -h/2 + 2*_inset]) { linear_extrude(0.1) text("Date:", size=textSize*2/5,halign="right", anchor = RIGHT, font = "Arial:style=Italic"); linear_extrude(0.1) text(str(date), size=textSize*2/5, anchor = LEFT,font = "Arial:style=Bold"); } }; children(); }; } module A4( margin = 10, landscape = true, onlyMargin = true, anchor=CENTER, spin=0, orient=UP, scale=1, strokeWidth=0.2 ){ w = A4_LANDSCAPE[0]; h = A4_LANDSCAPE[1]; marginW = w-2*margin; marginH = h-2*margin; attachable(anchor,spin, orient, size=[marginW,marginH,50]) { projection( cut = false ) union(){ if (!onlyMargin) color("Orange") rect_tube(size=[w,h], wall=0.1, h=0.1); color("Red") rect_tube(size=[marginW,marginH], wall=0.1, h=0.1); }; children(); } } module plan( project, title = undef, description = "", textSize = 6, date = "2025-01-01", scale = 1, revision = "1a", page = "A4" ) { A4( onlyMargin = false, anchor=LEFT+FWD, scale=2 ) { //align(align=TOP+LEFT+FWD,spin=[0, 0, 0],inside=true) //attach(LEFT+FWD,/*RIGHT,inside=true*/) //align(LEFT,inside=true) if (true) align( FWD+RIGHT,inside=true ) { titleBlock( project, title = title, description = description, //textSize = 7, rect = [90,30], inset = 2 ); }; align(BACK+LEFT,inside=true) { children(); } } } if ( title_block_debugging ) { //titleBlock("My First Project"); lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam at rutrum magna. Donec auctor euismod nulla ut congue."; plan( "Title Block", title="Sub title", description=lorem, ) { //projection( cut = false ) cube([100,100,100]); } }