{"slice":{"locale":"en","from":20000,"to":30077,"total_chars":30077,"html":"<p>rotate([90, 0, 0])<br>\ncylinder(h = backThickness + 0.1, r = 7, $fn = 256);<br>\n}<br>\n}<br>\n// Remove back plate cut outs for screw heads<br>\nfor (slotNum = [0:1:slotCount-1]) {<br>\ntranslate(v = [distanceBetweenSlots/2+(backWidth/distanceBetweenSlots-slotCount)<em>distanceBetweenSlots/2+slotNum</em>distanceBetweenSlots, -4, backHeight + 0.46 - GOEWS_Cleat_custom_height_from_top_of_back + 11.24]) {<br>\nrotate([-90, 0, 0])<br>\ncylinder(h = 4.1, r = 10, $fn = 256);<br>\n}<br>\n}<br>\n}<br>\n}<br>\n}<br>\n}</p>\n<p>//Create GOEWS cleats<br>\nmodule GOEWSCleatTool(totalHeight) {<br>\ndifference() {<br>\n// main profile<br>\nrotate(a = [180,0,0])<br>\nlinear_extrude(height = 13.15)<br>\nlet (cleatProfile = [[0,0],[15.1,0],[17.6,2.5],[15.1,5],[0,5]])<br>\nunion(){<br>\npolygon(points = cleatProfile);<br>\nmirror([1,0,0])<br>\npolygon(points = cleatProfile);<br>\n};<br>\n// angled slice off bottom<br>\ntranslate([-17.6, -8, -26.3])<br>\nrotate([45, 0, 0])<br>\ntranslate([0, 5, 0])<br>\ncube([35.2, 10, 15]);<br>\n// cutout<br>\ntranslate([0, -0.005, 2.964])<br>\nrotate([90, 0, 0])<br>\ncylinder(h = 6, r = 9.5, $fn = 256);<br>\n}<br>\n}</p>\n<p>//Create Slot Tool<br>\nmodule multiConnectSlotTool(totalHeight) {<br>\n//In slotTool, added a new variable distanceOffset which is set by the option:<br>\ndistanceOffset = onRampHalfOffset ? distanceBetweenSlots / 2 : 0;<br>\nscale(v = slotTolerance)<br>\n//slot minus optional dimple with optional on-ramp<br>\nlet (slotProfile = [[0,0],[10.15,0],[10.15,1.2121],[7.65,3.712],[7.65,5],[0,5]])<br>\ndifference() {<br>\nunion() {<br>\n//round top<br>\nrotate(a = [90,0,0,])<br>\nrotate_extrude($fn=50)<br>\npolygon(points = slotProfile);<br>\n//long slot<br>\ntranslate(v = [0,0,0])<br>\nrotate(a = [180,0,0])<br>\nunion(){<br>\ndifference() {<br>\n// Main half slot<br>\nlinear_extrude(height = totalHeight+1)<br>\npolygon(points = slotProfile);</p>\n<p>// Snap cutout<br>\nif (slotQuickRelease == false &amp;&amp; multiConnectVersion == &quot;v2&quot;)<br>\ntranslate(v= [10.15,0,0])<br>\nrotate(a= [-90,0,0])<br>\nlinear_extrude(height = 5)  // match slot height (5mm)<br>\npolygon(points = [[0,0],[-0.4,0],[0,-8]]);  // triangle polygon with multiconnect v2 specs<br>\n}</p>\n<p>mirror([1,0,0])<br>\ndifference() {<br>\n// Main half slot<br>\nlinear_extrude(height = totalHeight+1)<br>\npolygon(points = slotProfile);</p>\n<p>// Snap cutout<br>\nif (slotQuickRelease == false &amp;&amp; multiConnectVersion == &quot;v2&quot;)<br>\ntranslate(v= [10.15,0,0])<br>\nrotate(a= [-90,0,0])<br>\nlinear_extrude(height = 5)  // match slot height (5mm)<br>\npolygon(points = [[0,0],[-0.4,0],[0,-8]]);  // triangle polygon with multiconnect v2 spec<br>\n}<br>\n}<br>\n//on-ramp<br>\nif(onRampEnabled)<br>\nfor(y = [1:onRampEveryXSlots:totalHeight/distanceBetweenSlots])<br>\n//then modify the translate within the on-ramp code to include the offset<br>\ntranslate(v = [0,-5,(-y*distanceBetweenSlots)+distanceOffset])<br>\nrotate(a = [-90,0,0])<br>\ncylinder(h = 5, r1 = 12, r2 = 10.15);<br>\n}<br>\n//dimple<br>\nif (slotQuickRelease == false &amp;&amp; multiConnectVersion == &quot;v1&quot;)<br>\nscale(v = dimpleScale)<br>\nrotate(a = [90,0,0,])<br>\nrotate_extrude($fn=50)<br>\npolygon(points = [[0,0],[0,1.5],[1.5,0]]);<br>\n}<br>\n}</p>\n<p>module multiPointSlotTool(totalHeight) {<br>\nslotBaseRadius = 17.0 / 2.0;  // wider width of the inner part of the channel<br>\nslotSkinRadius = 13.75 / 2.0;  // narrower part of the channel near the skin of the model<br>\nslotBaseCatchDepth = .2;  // innermost before the chamfer, base to chamfer height<br>\nslotBaseToSkinChamferDepth = 2.2;  // middle part of the chamfer<br>\nslotSkinDepth = .1;  // top or skinmost part of the channel<br>\ndistanceOffset = onRampHalfOffset ? distanceBetweenSlots / 2 : 0;<br>\noctogonScale = 1/sin(67.5);  // math convenience function to convert an octogon hypotenuse to the short length<br>\nlet (slotProfile = [<br>\n[0,0],<br>\n[slotBaseRadius,0],<br>\n[slotBaseRadius, slotBaseCatchDepth],<br>\n[slotSkinRadius, slotBaseCatchDepth + slotBaseToSkinChamferDepth],<br>\n[slotSkinRadius, slotBaseCatchDepth + slotBaseToSkinChamferDepth + slotSkinDepth],<br>\n[0, slotBaseCatchDepth + slotBaseToSkinChamferDepth + slotSkinDepth]<br>\n])<br>\nunion() {<br>\n//octagonal top. difference on union because we need to support the dimples cut in.<br>\ndifference(){<br>\n//union of top and rail.<br>\nunion(){<br>\nscale([octogonScale,1,octogonScale])<br>\nrotate(a = [90,67.5,0,])<br>\nrotate_extrude($fn=8)<br>\npolygon(points = slotProfile);<br>\n//long slot<br>\ntranslate(v = [0,0,0])<br>\nrotate(a = [180,0,0])<br>\nlinear_extrude(height = totalHeight+1)<br>\nunion(){<br>\npolygon(points = slotProfile);<br>\nmirror([1,0,0])<br>\npolygon(points = slotProfile);<br>\n}<br>\n}<br>\n//dimples on each catch point<br>\nif (!slotQuickRelease){<br>\nfor(z = [1:On_Ramp_Every_X_Slots:totalHeight/distanceBetweenSlots ])<br>\n{<br>\necho(&quot;building on z&quot;, z);<br>\nyMultipointSlotDimples(z, slotBaseRadius, distanceBetweenSlots, distanceOffset);<br>\n}<br>\n}<br>\n}<br>\n//on-ramp<br>\nif(onRampEnabled)<br>\nunion(){<br>\nfor(y = [1:On_Ramp_Every_X_Slots:totalHeight/distanceBetweenSlots])<br>\n{<br>\n// create the main entry hexagons<br>\ntranslate(v = [0,-5,(-y*distanceBetweenSlots)+distanceOffset])<br>\nscale([octogonScale,1,octogonScale])<br>\nrotate(a = [-90,67.5,0])<br>\ncylinder(h=5, r=slotBaseRadius, $fn=8);</p>\n<p>// make the required &quot;pop-in&quot; locking channel dimples.<br>\nxSlotDimples(y, slotBaseRadius, distanceBetweenSlots, distanceOffset);<br>\nmirror([1,0,0])<br>\nxSlotDimples(y, slotBaseRadius, distanceBetweenSlots, distanceOffset);<br>\n}<br>\n}<br>\n}<br>\n}</p>\n<p>module xSlotDimples(y, slotBaseRadius, distanceBetweenSlots, distanceOffset){<br>\n//Multipoint dimples are truncated (on top and side) pyramids<br>\n//this function makes one pair of them<br>\ndimple_pitch = 4.5 / 2; //distance between locking dimples<br>\ndifference(){<br>\ntranslate(v = [slotBaseRadius-0.01,0,(-y<em>distanceBetweenSlots)+distanceOffset+dimple_pitch])<br>\nrotate(a = [90,45,90])<br>\nrotate_extrude($fn=4)<br>\npolygon(points = [[0,0],[0,1.5],[1.7,0]]);<br>\ntranslate(v = [slotBaseRadius+.75, -2, (-y</em>distanceBetweenSlots)+distanceOffset-1])<br>\ncube(4);<br>\ntranslate(v = [slotBaseRadius-2, 0.01, (-y<em>distanceBetweenSlots)+distanceOffset-1])<br>\ncube(7);<br>\n}<br>\ndifference(){<br>\ntranslate(v = [slotBaseRadius-0.01,0,(-y</em>distanceBetweenSlots)+distanceOffset-dimple_pitch])<br>\nrotate(a = [90,45,90])<br>\nrotate_extrude($fn=4)<br>\npolygon(points = [[0,0],[0,1.5],[1.7,0]]);<br>\ntranslate(v = [slotBaseRadius+.75, -2.01, (-y<em>distanceBetweenSlots)+distanceOffset-3])<br>\ncube(4);<br>\ntranslate(v = [slotBaseRadius-2, 0.01, (-y</em>distanceBetweenSlots)+distanceOffset-5])<br>\ncube(10);<br>\n}<br>\n}<br>\nmodule yMultipointSlotDimples(z, slotBaseRadius, distanceBetweenSlots, distanceOffset){<br>\n//This creates the multipoint point out dimples within the channel.<br>\noctogonScale = 1/sin(67.5);<br>\ndifference(){<br>\ntranslate(v = [0,0.01,((-z+.5)*distanceBetweenSlots)+distanceOffset])<br>\nscale([octogonScale,1,octogonScale])<br>\nrotate(a = [-90,67.5,0])<br>\nrotate_extrude($fn=8)<br>\npolygon(points = [[0,0],[0,-1.5],[5,0]]);<br>\ntranslate(v = [0,0,((-z+.5)*distanceBetweenSlots)+distanceOffset])<br>\ncube([10,3,3], center=true);<br>\ntranslate(v = [0,0,((-z+.5)*distanceBetweenSlots)+distanceOffset])<br>\ncube([3,3,10], center=true);<br>\n}<br>\n}</p>","has_more":false},"deferred":false}
