<commit_before>eps=0.01;
wall=4;
h=wall+8+5;
$fn=60;

module support_()
{
  translate(-wall/2*[0, 1, 0])
  {
    dist=8+wall+(8+2)/2;
    cube([dist, wall, wall]);
    translate([dist-wall, 0, 0])
      cube([wall, wall, wall+8]);
  }
}

module screw_space_()
{
  cylinder(r=(3.5+0.4)/2, h=h+eps);
  translate(-eps*[0,0,1])
    cylinder(r1=(8+0.5)/2, r2=(3.5+0.5)/2, h=4.5+eps);
}


module element()
{
  difference()
  {
    union()
    {
      cylinder(r=(8+2)/2, h=h);
      support_();
    }
    screw_space_();
  }
}


for(i=[0:2])
  translate([0, i*12, 0])
    element();
<commit_msg>element count is now a parameter<commit_after>eps=0.01;
wall=4;
h=wall+8+5;
$fn=60;
N=4;

module support_()
{
  translate(-wall/2*[0, 1, 0])
  {
    dist=8+wall+(8+2)/2;
    cube([dist, wall, wall]);
    translate([dist-wall, 0, 0])
      cube([wall, wall, wall+8]);
  }
}

module screw_space_()
{
  cylinder(r=(3.5+0.4)/2, h=h+eps);
  translate(-eps*[0,0,1])
    cylinder(r1=(8+0.5)/2, r2=(3.5+0.5)/2, h=4.5+eps);
}


module element()
{
  difference()
  {
    union()
    {
      cylinder(r=(8+2)/2, h=h);
      support_();
    }
    screw_space_();
  }
}


for(i=[1:N])
  translate([0, i*12, 0])
    element();

{'fraction_non_alphanumeric': 0.2512479201331115, 'fraction_numerical': 0.08153078202995008, 'mean_word_length': 3.0234113712374584, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1663600', 'n_tokens_mistral': 601, 'n_tokens_neox': 588, 'n_words': 86}