Improvements for MarlinMesh.scad
This commit is contained in:
		@@ -10,17 +10,13 @@
 | 
			
		||||
 *                                      *
 | 
			
		||||
 \**************************************/
 | 
			
		||||
 | 
			
		||||
//$t = 0.15; // comment out during animation
 | 
			
		||||
$t = 0.15; // comment out during animation!
 | 
			
		||||
X = 0; Y = 1;
 | 
			
		||||
L = 0; R = 1; F = 2; B = 3;
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Mesh info and points
 | 
			
		||||
// Sample Mesh - Replace with your own
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
mesh_width    = 200;   // X Size in mm of the probed area
 | 
			
		||||
mesh_height   = 200;   // Y Size...
 | 
			
		||||
zprobe_offset = 0;     // Added to the points
 | 
			
		||||
NAN           = 0;     // Z to use for un-measured points
 | 
			
		||||
 | 
			
		||||
measured_z = [
 | 
			
		||||
  [ -1.20, -1.13, -1.09, -1.03, -1.19 ],
 | 
			
		||||
  [ -1.16, -1.25, -1.27, -1.25, -1.08 ],
 | 
			
		||||
@@ -29,6 +25,28 @@ measured_z = [
 | 
			
		||||
  [ -1.13, -0.99, -1.03, -1.06, -1.32 ]
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// An offset to add to all points in the mesh
 | 
			
		||||
//
 | 
			
		||||
zadjust     = 0;
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Mesh characteristics
 | 
			
		||||
//
 | 
			
		||||
bed_size = [ 200, 200 ];
 | 
			
		||||
 | 
			
		||||
mesh_inset  = [ 10, 10, 10, 10 ]; // L, F, R, B
 | 
			
		||||
 | 
			
		||||
mesh_bounds = [
 | 
			
		||||
  [ mesh_inset[L], mesh_inset[F] ],
 | 
			
		||||
  [ bed_size[X] - mesh_inset[R], bed_size[Y] - mesh_inset[B] ]
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
mesh_size = mesh_bounds[1] - mesh_bounds[0];
 | 
			
		||||
 | 
			
		||||
                      // NOTE: Marlin meshes already subtract the probe offset
 | 
			
		||||
NAN         = 0;      // Z to use for un-measured points
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Geometry
 | 
			
		||||
//
 | 
			
		||||
@@ -45,6 +63,7 @@ alternation   = 2;     // direction change modulus (try it)
 | 
			
		||||
 | 
			
		||||
show_plane    = true;
 | 
			
		||||
show_labels   = true;
 | 
			
		||||
show_coords   = true;
 | 
			
		||||
arrow_length  = 5;
 | 
			
		||||
 | 
			
		||||
label_font_lg = "Arial";
 | 
			
		||||
@@ -62,8 +81,8 @@ mean_value = (big_z + lil_z) / 2.0;
 | 
			
		||||
mesh_points_y = len(measured_z);
 | 
			
		||||
mesh_points_x = len(measured_z[0]);
 | 
			
		||||
 | 
			
		||||
xspace = mesh_width / (mesh_points_x - 1);
 | 
			
		||||
yspace = mesh_height / (mesh_points_y - 1);
 | 
			
		||||
xspace = mesh_size[X] / (mesh_points_x - 1);
 | 
			
		||||
yspace = mesh_size[Y] / (mesh_points_y - 1);
 | 
			
		||||
 | 
			
		||||
// At $t=0 and $t=1 scale will be 100%
 | 
			
		||||
z_scale_factor = min_z_scale + (($t > 0.5) ? 1.0 - $t : $t) * (max_z_scale - min_z_scale) * 2;
 | 
			
		||||
@@ -72,6 +91,8 @@ z_scale_factor = min_z_scale + (($t > 0.5) ? 1.0 - $t : $t) * (max_z_scale - min
 | 
			
		||||
// Min and max recursive functions for 1D and 2D arrays
 | 
			
		||||
// Return the smallest or largest value in the array
 | 
			
		||||
//
 | 
			
		||||
function some_1D(b,i) = (i<len(b)-1) ? (b[i] && some_1D(b,i+1)) : b[i] != 0;
 | 
			
		||||
function some_2D(a,j) = (j<len(a)-1) ? some_2D(a,j+1) : some_1D(a[j], 0);
 | 
			
		||||
function min_1D(b,i) = (i<len(b)-1) ? min(b[i], min_1D(b,i+1)) : b[i];
 | 
			
		||||
function min_2D(a,j) = (j<len(a)-1) ? min_2D(a,j+1) : min_1D(a[j], 0);
 | 
			
		||||
function max_1D(b,i) = (i<len(b)-1) ? max(b[i], max_1D(b,i+1)) : b[i];
 | 
			
		||||
@@ -98,36 +119,59 @@ function pos(x,y,z) = [x * xspace, y * yspace, z_scale_factor * (z - mean_value)
 | 
			
		||||
//
 | 
			
		||||
module point_markers(show_home=true) {
 | 
			
		||||
  // Mark the home position 0,0
 | 
			
		||||
  color([0,0,0,0.25]) translate([1,1]) cylinder(r=1, h=z_scale_factor, center=true);
 | 
			
		||||
  if (show_home)
 | 
			
		||||
    translate([1,1]) color([0,0,0,0.25])
 | 
			
		||||
      cylinder(r=1, h=z_scale_factor, center=true);
 | 
			
		||||
 | 
			
		||||
  for (x=[0:mesh_points_x-1], y=[0:mesh_points_y-1]) {
 | 
			
		||||
    z = measured_z[y][x];
 | 
			
		||||
    z = measured_z[y][x] - zadjust;
 | 
			
		||||
    down = z < mean_value;
 | 
			
		||||
    translate(pos(x, y, z)) {
 | 
			
		||||
 | 
			
		||||
      // Label each point with the Z
 | 
			
		||||
      if (show_labels) {
 | 
			
		||||
        v = z - mean_value;
 | 
			
		||||
 | 
			
		||||
        color(abs(v) < 0.1 ? [0,0.5,0] : [0.25,0,0])
 | 
			
		||||
        translate([0,0,down?-10:10]) {
 | 
			
		||||
    xyz = pos(x, y, z);
 | 
			
		||||
    translate([ xyz[0], xyz[1] ]) {
 | 
			
		||||
 | 
			
		||||
      // Show the XY as well as the Z!
 | 
			
		||||
      if (show_coords) {
 | 
			
		||||
        color("black")
 | 
			
		||||
        translate([0,0,0.5]) {
 | 
			
		||||
          $fn=8;
 | 
			
		||||
          rotate([90,0])
 | 
			
		||||
            text(str(z), 6, label_font_lg, halign="center", valign="center");
 | 
			
		||||
 | 
			
		||||
          translate([0,0,down?-6:6]) rotate([90,0])
 | 
			
		||||
            text(str(down ? "" : "+", v), 3, label_font_sm, halign="center", valign="center");
 | 
			
		||||
          rotate([0,0]) {
 | 
			
		||||
            posx = floor(mesh_bounds[0][X] + x * xspace);
 | 
			
		||||
            posy = floor(mesh_bounds[0][Y] + y * yspace);
 | 
			
		||||
            text(str(posx, ",", posy), 2, label_font_sm, halign="center", valign="center");
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Show an arrow pointing up or down
 | 
			
		||||
      rotate([0, down ? 180 : 0]) translate([0,0,-1])
 | 
			
		||||
        cylinder(
 | 
			
		||||
          r1=0.5,
 | 
			
		||||
          r2=0.1,
 | 
			
		||||
          h=arrow_length, $fn=12, center=1
 | 
			
		||||
        );
 | 
			
		||||
      translate([ 0, 0, xyz[2] ]) {
 | 
			
		||||
        // Label each point with the Z
 | 
			
		||||
        v = z - mean_value;
 | 
			
		||||
        if (show_labels) {
 | 
			
		||||
 | 
			
		||||
          color(abs(v) < 0.1 ? [0,0.5,0] : [0.25,0,0])
 | 
			
		||||
          translate([0,0,down?-10:10]) {
 | 
			
		||||
 | 
			
		||||
            $fn=8;
 | 
			
		||||
            rotate([90,0])
 | 
			
		||||
              text(str(z), 6, label_font_lg, halign="center", valign="center");
 | 
			
		||||
 | 
			
		||||
            if (v)
 | 
			
		||||
              translate([0,0,down?-6:6]) rotate([90,0])
 | 
			
		||||
                text(str(down || !v ? "" : "+", v), 3, label_font_sm, halign="center", valign="center");
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Show an arrow pointing up or down
 | 
			
		||||
        if (v) {
 | 
			
		||||
          rotate([0, down ? 180 : 0]) translate([0,0,-1])
 | 
			
		||||
            cylinder(
 | 
			
		||||
              r1=0.5,
 | 
			
		||||
              r2=0.1,
 | 
			
		||||
              h=arrow_length, $fn=12, center=1
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
          color([1,0,1,0.4]) sphere(r=1.0, $fn=20, center=1);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -161,7 +205,7 @@ module tesselated_square(s, alt=false) {
 | 
			
		||||
 * The simplest mesh display
 | 
			
		||||
 */
 | 
			
		||||
module simple_mesh(show_plane=show_plane) {
 | 
			
		||||
  if (show_plane) color(plane_color) cube([mesh_width, mesh_height, thickness]);
 | 
			
		||||
  if (show_plane) color(plane_color) cube([mesh_size[X], mesh_size[Y], thickness]);
 | 
			
		||||
  color(mesh_color)
 | 
			
		||||
    for (x=[0:mesh_points_x-2], y=[0:mesh_points_y-2])
 | 
			
		||||
      tesselated_square(grid_square(x, y));
 | 
			
		||||
@@ -171,30 +215,34 @@ module simple_mesh(show_plane=show_plane) {
 | 
			
		||||
 * Subdivide the mesh into smaller squares.
 | 
			
		||||
 */
 | 
			
		||||
module bilinear_mesh(show_plane=show_plane,tesselation=tesselation) {
 | 
			
		||||
  if (show_plane) color(plane_color) translate([-5,-5]) cube([mesh_width+10, mesh_height+10, thickness]);
 | 
			
		||||
  tesselation = tesselation % 4;
 | 
			
		||||
  color(mesh_color)
 | 
			
		||||
  for (x=[0:mesh_points_x-2], y=[0:mesh_points_y-2]) {
 | 
			
		||||
    square = grid_square(x, y);
 | 
			
		||||
    if (tesselation < 1) {
 | 
			
		||||
      tesselated_square(square,(x%alternation)-(y%alternation));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      subdiv_4 = subdivided_square(square);
 | 
			
		||||
      if (tesselation < 2) {
 | 
			
		||||
        for (i=[0:3]) tesselated_square(subdiv_4[i],i%alternation);
 | 
			
		||||
  if (show_plane) color(plane_color) translate([-5,-5]) cube([mesh_size[X]+10, mesh_size[Y]+10, thickness]);
 | 
			
		||||
 | 
			
		||||
  if (some_2D(measured_z, 0)) {
 | 
			
		||||
 | 
			
		||||
    tesselation = tesselation % 4;
 | 
			
		||||
    color(mesh_color)
 | 
			
		||||
    for (x=[0:mesh_points_x-2], y=[0:mesh_points_y-2]) {
 | 
			
		||||
      square = grid_square(x, y);
 | 
			
		||||
      if (tesselation < 1) {
 | 
			
		||||
        tesselated_square(square,(x%alternation)-(y%alternation));
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        for (i=[0:3]) {
 | 
			
		||||
          subdiv_16 = subdivided_square(subdiv_4[i]);
 | 
			
		||||
          if (tesselation < 3) {
 | 
			
		||||
            for (j=[0:3]) tesselated_square(subdiv_16[j],j%alternation);
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
            for (j=[0:3]) {
 | 
			
		||||
              subdiv_64 = subdivided_square(subdiv_16[j]);
 | 
			
		||||
              if (tesselation < 4) {
 | 
			
		||||
                for (k=[0:3]) tesselated_square(subdiv_64[k]);
 | 
			
		||||
        subdiv_4 = subdivided_square(square);
 | 
			
		||||
        if (tesselation < 2) {
 | 
			
		||||
          for (i=[0:3]) tesselated_square(subdiv_4[i],i%alternation);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          for (i=[0:3]) {
 | 
			
		||||
            subdiv_16 = subdivided_square(subdiv_4[i]);
 | 
			
		||||
            if (tesselation < 3) {
 | 
			
		||||
              for (j=[0:3]) tesselated_square(subdiv_16[j],j%alternation);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
              for (j=[0:3]) {
 | 
			
		||||
                subdiv_64 = subdivided_square(subdiv_16[j]);
 | 
			
		||||
                if (tesselation < 4) {
 | 
			
		||||
                  for (k=[0:3]) tesselated_square(subdiv_64[k]);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
@@ -249,7 +297,7 @@ function subdivided_square(a) = [
 | 
			
		||||
 | 
			
		||||
//================================================ Run the plan
 | 
			
		||||
 | 
			
		||||
translate([-mesh_width / 2, -mesh_height / 2]) {
 | 
			
		||||
translate([-mesh_size[X] / 2, -mesh_size[Y] / 2]) {
 | 
			
		||||
  $fn = 12;
 | 
			
		||||
  point_markers();
 | 
			
		||||
  bilinear_mesh();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user